コード例 #1
0
        public override IEnumerable <Gizmo> CompGetGizmosExtra()
        {
            if (this.Pawn.Drafted)
            {
                if (Cannons.Count > 0)
                {
                    if (Cannons.AnyNullified(x => x.cannonDef.weaponType == WeaponType.Rotatable))
                    {
                        int i = 0;
                        foreach (CannonHandler cannon in Cannons.Where(x => x.cannonDef.weaponLocation == WeaponLocation.Turret))
                        {
                            if (cannon.manualTargeting)
                            {
                                Command_TargeterCooldownAction turretCannons = new Command_TargeterCooldownAction();
                                turretCannons.cannon       = cannon;
                                turretCannons.comp         = this;
                                turretCannons.defaultLabel = !string.IsNullOrEmpty(cannon.gizmoLabel) ? cannon.gizmoLabel : cannon.cannonDef.LabelCap + 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++;
                                foreach (VehicleHandler relatedHandler in CompVehicle.GetAllHandlersMatch(HandlingTypeFlags.Cannon, cannon.key))
                                {
                                    if (!VehicleMod.mod.settings.debugDraftAnyShip && relatedHandler?.handlers.Count < relatedHandler?.role.slotsToOperate)
                                    {
                                        turretCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, relatedHandler.role.label));
                                        break;
                                    }
                                }
                                yield return(turretCannons);
                            }
                        }
                    }
                    if (Cannons.AnyNullified(x => x.cannonDef.weaponType == WeaponType.Static))
                    {
                        if (Cannons.AnyNullified(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 (VehicleMod.mod.settings.shuffledCannonFire)
                                    {
                                        cannonOrder.Shuffle();
                                    }
                                    foreach (int i in cannonOrder)
                                    {
                                        tmpCannonItem.First.Push(i);
                                    }
                                    this.broadsideFire.Add(tmpCannonItem);
                                };
                                foreach (VehicleHandler relatedHandler in CompVehicle.GetAllHandlersMatch(HandlingTypeFlags.Cannon, cannon.key))
                                {
                                    if (!VehicleMod.mod.settings.debugDraftAnyShip && relatedHandler?.handlers.Count < relatedHandler?.role.slotsToOperate)
                                    {
                                        portSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, relatedHandler.role.label));
                                    }
                                }
                                yield return(portSideCannons);
                            }
                        }
                        if (Cannons.AnyNullified(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 (VehicleMod.mod.settings.shuffledCannonFire)
                                    {
                                        cannonOrder.Shuffle();
                                    }
                                    foreach (int i in cannonOrder)
                                    {
                                        tmpCannonItem.First.Push(i);
                                    }
                                    this.broadsideFire.Add(tmpCannonItem);
                                };
                                foreach (VehicleHandler relatedHandler in CompVehicle.GetAllHandlersMatch(HandlingTypeFlags.Cannon, cannon.key))
                                {
                                    if (!VehicleMod.mod.settings.debugDraftAnyShip && relatedHandler?.handlers.Count < relatedHandler?.role.slotsToOperate)
                                    {
                                        starboardSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, relatedHandler.role.label));
                                    }
                                }
                                yield return(starboardSideCannons);
                            }
                        }
                        if (Cannons.AnyNullified(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 (VehicleMod.mod.settings.shuffledCannonFire)
                                    {
                                        cannonOrder.Shuffle();
                                    }
                                    foreach (int i in cannonOrder)
                                    {
                                        tmpCannonItem.First.Push(i);
                                    }
                                    this.broadsideFire.Add(tmpCannonItem);
                                };
                                foreach (VehicleHandler relatedHandler in CompVehicle.GetAllHandlersMatch(HandlingTypeFlags.Cannon, cannon.key))
                                {
                                    if (!VehicleMod.mod.settings.debugDraftAnyShip && relatedHandler?.handlers.Count < relatedHandler?.role.slotsToOperate)
                                    {
                                        bowSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, relatedHandler.role.label));
                                    }
                                }
                                yield return(bowSideCannons);
                            }
                        }
                        if (Cannons.AnyNullified(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 (VehicleMod.mod.settings.shuffledCannonFire)
                                    {
                                        cannonOrder.Shuffle();
                                    }
                                    foreach (int i in cannonOrder)
                                    {
                                        tmpCannonItem.First.Push(i);
                                    }
                                    this.broadsideFire.Add(tmpCannonItem);
                                };
                                foreach (VehicleHandler relatedHandler in CompVehicle.GetAllHandlersMatch(HandlingTypeFlags.Cannon, cannon.key))
                                {
                                    if (!VehicleMod.mod.settings.debugDraftAnyShip && relatedHandler?.handlers.Count < relatedHandler?.role.slotsToOperate)
                                    {
                                        sternSideCannons.Disable("NotEnoughCannonCrew".Translate(this.Pawn.LabelShort, relatedHandler.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);
                    }
                }
            }
        }