Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
            }
        }
Ejemplo n.º 4
0
        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);
                    }
                }
            }
        }