private void ResolveCannons() { if (!this.Pawn.Drafted && broadsideFire.Count > 0) { broadsideFire.Clear(); } if (broadsideFire?.Count > 0) { for (int i = 0; i < broadsideFire.Count; i++) { SPTuple <Stack <int>, CannonHandler> side = broadsideFire[i]; int tick = broadsideFire[i].Third; if (broadsideFire[i].Third % side.Second.TicksPerShot == 0) { FireCannonBroadside(side.Second, side.First.Pop()); } tick++; broadsideFire[i].Third = tick; if (!side.First.AnyNullified()) { broadsideFire.RemoveAt(i); } } } if (multiFireCannon?.Count > 0) { for (int i = 0; i < multiFireCannon.Count; i++) { SPTuple2 <int, int> PairedData = multiFireCannon[i].Third; if (PairedData.First <= 0) { FireTurretCannon(multiFireCannon[i].Second, ref PairedData); PairedData.Second++; multiFireCannon[i].First--; PairedData.First = multiFireCannon[i].Second.TicksPerShot; if (multiFireCannon[i].First == 0) { if (multiFireCannon[i].Second.targetPersists) { multiFireCannon[i].Second.SetTargetConditionalOnThing(LocalTargetInfo.Invalid); } else { multiFireCannon[i].Second.SetTarget(LocalTargetInfo.Invalid); } multiFireCannon.RemoveAt(i); continue; } } else { PairedData.First--; } multiFireCannon[i].Third = PairedData; } } }
public static Rot4 ClosestEdge(Pawn pawn, Map map) { IntVec2 mapSize = new IntVec2(map.Size.x, map.Size.z); IntVec2 position = new IntVec2(pawn.Position.x, pawn.Position.z); SPTuple <Rot4, int> hDistance = Math.Abs(position.x) < Math.Abs(position.x - mapSize.x) ? new SPTuple <Rot4, int>(Rot4.West, position.x) : new SPTuple <Rot4, int>(Rot4.East, Math.Abs(position.x - mapSize.x)); SPTuple <Rot4, int> vDistance = Math.Abs(position.z) < Math.Abs(position.z - mapSize.z) ? new SPTuple <Rot4, int>(Rot4.South, position.z) : new SPTuple <Rot4, int>(Rot4.North, Math.Abs(position.z - mapSize.z)); return(hDistance.Second <= vDistance.Second ? hDistance.First : vDistance.First); }
public static void CalculateSelectionBracketPositionsWorldForMultiCellPawns <T>(Vector3[] bracketLocs, T obj, Vector3 worldPos, Vector2 worldSize, Dictionary <T, float> dict, Vector2 textureSize, float pawnAngle = 0f, float jumpDistanceFactor = 1f) { float num; float num2; if (!dict.TryGetValue(obj, out num)) { num2 = 1f; } else { num2 = Mathf.Max(0f, 1f - (Time.realtimeSinceStartup - num) / 0.07f); } float num3 = num2 * 0.2f * jumpDistanceFactor; float num4 = 0.5f * (worldSize.x - textureSize.x) + num3; float num5 = 0.5f * (worldSize.y - textureSize.y) + num3; float y = AltitudeLayer.MetaOverlays.AltitudeFor(); bracketLocs[0] = new Vector3(worldPos.x - num4, y, worldPos.z - num5); bracketLocs[1] = new Vector3(worldPos.x + num4, y, worldPos.z - num5); bracketLocs[2] = new Vector3(worldPos.x + num4, y, worldPos.z + num5); bracketLocs[3] = new Vector3(worldPos.x - num4, y, worldPos.z + num5); switch (pawnAngle) { case 45f: for (int i = 0; i < 4; i++) { float xPos = bracketLocs[i].x - worldPos.x; float yPos = bracketLocs[i].z - worldPos.z; SPTuple <float, float> newPos = RotatePointClockwise(xPos, yPos, 45f); bracketLocs[i].x = newPos.First + worldPos.x; bracketLocs[i].z = newPos.Second + worldPos.z; } break; case -45: for (int i = 0; i < 4; i++) { float xPos = bracketLocs[i].x - worldPos.x; float yPos = bracketLocs[i].z - worldPos.z; SPTuple <float, float> newPos = RotatePointCounterClockwise(xPos, yPos, 45f); bracketLocs[i].x = newPos.First + worldPos.x; bracketLocs[i].z = newPos.Second + worldPos.z; } break; } }
public override IEnumerable <Gizmo> CompGetGizmosExtra() { if (this.Pawn.Drafted) { if (Cannons.Count > 0) { if (Cannons.Any(x => x.cannonDef.weaponType == WeaponType.Rotatable)) { int i = 0; foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Turret)) { Command_TargeterCooldownAction turretCannons = new Command_TargeterCooldownAction(); turretCannons.cannon = cannon; turretCannons.comp = this; turretCannons.defaultLabel = "TestFire".Translate(cannon.cannonDef.label) + i; turretCannons.icon = cannon.GizmoIcon; if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { turretCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } turretCannons.targetingParams = new TargetingParameters { //Buildings, Things, Animals, Humans, and Mechs default to targetable canTargetLocations = true }; i++; yield return(turretCannons); } } if (Cannons.Any(x => x.cannonDef.weaponType == WeaponType.Static)) { if (Cannons.Any(x => x.cannonDef.weaponLocation == WeaponLocation.Port)) { foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Port)) { Command_CooldownAction portSideCannons = new Command_CooldownAction(); portSideCannons.cannon = cannon; portSideCannons.comp = this; portSideCannons.defaultLabel = "CannonLabel".Translate(cannon.cannonDef.label); if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { portSideCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } portSideCannons.icon = cannon.GizmoIcon; if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { portSideCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } portSideCannons.action = delegate() { SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.cannonDef.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { portSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, handler.role.label)); } } yield return(portSideCannons); } } if (Cannons.Any(x => x.cannonDef.weaponLocation == WeaponLocation.Starboard)) { foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Starboard)) { Command_CooldownAction starboardSideCannons = new Command_CooldownAction(); starboardSideCannons.cannon = cannon; starboardSideCannons.comp = this; starboardSideCannons.defaultLabel = "CannonLabel".Translate(cannon.cannonDef.label); if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { starboardSideCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } starboardSideCannons.icon = cannon.GizmoIcon; starboardSideCannons.action = delegate() { SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.cannonDef.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { starboardSideCannons.Disable("NotEnoughCannonCrew".Translate(Pawn.LabelShort, handler.role.label)); } } yield return(starboardSideCannons); } } if (Cannons.Any(x => x.cannonDef.weaponLocation == WeaponLocation.Bow)) { foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Bow)) { Command_CooldownAction bowSideCannons = new Command_CooldownAction(); bowSideCannons.cannon = cannon; bowSideCannons.comp = this; bowSideCannons.defaultLabel = "CannonLabel".Translate(cannon.cannonDef.label); if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { bowSideCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } bowSideCannons.icon = cannon.GizmoIcon; bowSideCannons.action = delegate() { SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.cannonDef.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { bowSideCannons.Disable("NotEnoughCannonCrew".Translate(Pawn.LabelShort, handler.role.label)); } } yield return(bowSideCannons); } } if (Cannons.Any(x => x.cannonDef.weaponLocation == WeaponLocation.Stern)) { foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Starboard)) { Command_CooldownAction sternSideCannons = new Command_CooldownAction(); sternSideCannons.cannon = cannon; sternSideCannons.comp = this; sternSideCannons.defaultLabel = "CannonLabel".Translate(cannon.cannonDef.label); if (!string.IsNullOrEmpty(cannon.cannonDef.gizmoDescription)) { sternSideCannons.defaultDesc = cannon.cannonDef.gizmoDescription; } sternSideCannons.icon = cannon.GizmoIcon; sternSideCannons.action = delegate() { SPTuple <Stack <int>, CannonHandler, int> tmpCannonItem = new SPTuple <Stack <int>, CannonHandler, int>(new Stack <int>(), cannon, 0); List <int> cannonOrder = Enumerable.Range(0, cannon.cannonDef.numberCannons).ToList(); if (RimShipMod.mod.settings.shuffledCannonFire) { cannonOrder.Shuffle(); } foreach (int i in cannonOrder) { tmpCannonItem.First.Push(i); } this.broadsideFire.Add(tmpCannonItem); }; foreach (ShipHandler handler in this.CompShip.handlers) { if (!RimShipMod.mod.settings.debugDraftAnyShip && handler.role.handlingType == HandlingTypeFlags.Cannons && handler.handlers.Count < handler.role.slotsToOperate) { sternSideCannons.Disable("NotEnoughCannonCrew".Translate(Pawn.LabelShort, handler.role.label)); } } yield return(sternSideCannons); } } Command_SetRange range = new Command_SetRange(); range.defaultLabel = "SetRange".Translate(); range.icon = TexCommand.Attack; range.activeCannons = Cannons.FindAll(x => x.cannonDef.weaponType == WeaponType.Static); range.cannonComp = this; yield return(range); } } } }