コード例 #1
0
 /// <summary>
 /// Strafe option for combat aerial vehicles targeting open maps
 /// </summary>
 /// <param name="vehicle"></param>
 /// <param name="parent"></param>
 public static FloatMenuOption StrafeFloatMenuOption(VehiclePawn vehicle, MapParent parent)
 {
     if (parent.EnterCooldownBlocksEntering())
     {
         return(new FloatMenuOption($"{"AerialStrafeRun".Translate(parent.Label)} ({"EnterCooldownBlocksEntering".Translate()})", null));
     }
     return(new FloatMenuOption("AerialStrafeRun".Translate(parent.Label), delegate()
     {
         if (vehicle.Spawned)
         {
             vehicle.CompVehicleLauncher.TryLaunch(parent.Tile, null, true);
         }
         else
         {
             AerialVehicleInFlight aerial = VehicleWorldObjectsHolder.Instance.AerialVehicleObject(vehicle);
             if (aerial is null)
             {
                 Log.Error($"Attempted to launch into existing map where CurrentMap is null and no AerialVehicle with {vehicle.Label} exists.");
                 return;
             }
             List <FlightNode> flightPath = new List <FlightNode>(LaunchTargeter.FlightPath);
             aerial.OrderFlyToTiles(flightPath, aerial.DrawPos);
             aerial.flightPath.ReconCircleAt(parent.Tile);
             vehicle.CompVehicleLauncher.inFlight = true;
         }
     }));
 }
コード例 #2
0
 protected override void LeaveMap()
 {
     if (!createWorldObject)
     {
         base.LeaveMap();
         return;
     }
     if (flightPath.Any(node => node.tile < 0))
     {
         Log.Error("AerialVehicle left the map but has a flight path Tile that is invalid. Removing node from path.");
         flightPath.RemoveAll(node => node.tile < 0);
         if (flightPath.NullOrEmpty())
         {
             //REDO - Handle better here
             return;
         }
     }
     Messages.Message($"{vehicle.LabelShort} LEFT", MessageTypeDefOf.PositiveEvent);
     if (createWorldObject)
     {
         AerialVehicleInFlight flyingVehicle = (AerialVehicleInFlight)WorldObjectMaker.MakeWorldObject(WorldObjectDefOfVehicles.AerialVehicle);
         flyingVehicle.vehicle = vehicle;
         flyingVehicle.Tile    = Map.Tile;
         flyingVehicle.SetFaction(vehicle.Faction);
         flyingVehicle.OrderFlyToTiles(new List <FlightNode>(flightPath), Find.WorldGrid.GetTileCenter(Map.Tile), arrivalAction);
         if (orderRecon)
         {
             flyingVehicle.flightPath.ReconCircleAt(flightPath.LastOrDefault().tile);
         }
         flyingVehicle.Initialize();
         Find.WorldObjects.Add(flyingVehicle);
     }
     Destroy(DestroyMode.Vanish);
 }
コード例 #3
0
        protected virtual void ExitMap()
        {
            AerialVehicleInFlight flyingVehicle = (AerialVehicleInFlight)WorldObjectMaker.MakeWorldObject(WorldObjectDefOfVehicles.AerialVehicle);

            flyingVehicle.vehicle = vehicle;
            flyingVehicle.Tile    = Map.Tile;
            flyingVehicle.SetFaction(vehicle.Faction);
            flyingVehicle.OrderFlyToTiles(aerialVehicle.flightPath.Path, Find.WorldGrid.GetTileCenter(Map.Tile), aerialVehicle.arrivalAction);
            //Recon edge case?
            flyingVehicle.Initialize();
            Find.WorldObjects.Add(flyingVehicle);
            Destroy();
        }
コード例 #4
0
 public override IEnumerable <FloatMenuOption> GetFloatMenuOptionsAt(int tile)
 {
     if (AerialVehicleArrivalAction_FormVehicleCaravan.CanFormCaravanAt(vehicle, tile) && !Find.WorldObjects.AnySettlementBaseAt(tile) && !Find.WorldObjects.AnySiteAt(tile))
     {
         yield return(new FloatMenuOption("FormCaravanHere".Translate(), delegate()
         {
             if (vehicle.Spawned)
             {
                 vehicle.CompVehicleLauncher.TryLaunch(tile, new AerialVehicleArrivalAction_FormVehicleCaravan(vehicle));
             }
             else
             {
                 AerialVehicleInFlight aerial = VehicleWorldObjectsHolder.Instance.AerialVehicleObject(vehicle);
                 aerial.OrderFlyToTiles(LaunchTargeter.FlightPath, aerial.DrawPos, new AerialVehicleArrivalAction_FormVehicleCaravan(vehicle));
             }
         }, MenuOptionPriority.Default, null, null, 0f, null, null));
     }
     else if (Find.WorldObjects.MapParentAt(tile) is MapParent parent)
     {
         if (CanLandInSpecificCell(parent))
         {
             yield return(new FloatMenuOption("LandInExistingMap".Translate(vehicle.Label), delegate()
             {
                 Current.Game.CurrentMap = parent.Map;
                 CameraJumper.TryHideWorld();
                 LandingTargeter.Instance.BeginTargeting(vehicle, this, delegate(LocalTargetInfo target, Rot4 rot)
                 {
                     if (vehicle.Spawned)
                     {
                         vehicle.CompVehicleLauncher.TryLaunch(tile, new AerialVehicleArrivalAction_LandSpecificCell(vehicle, parent, tile, this, target.Cell, rot));
                     }
                     else
                     {
                         AerialVehicleInFlight aerial = VehicleWorldObjectsHolder.Instance.AerialVehicleObject(vehicle);
                         if (aerial is null)
                         {
                             Log.Error($"Attempted to launch into existing map where CurrentMap is null and no AerialVehicle with {vehicle.Label} exists.");
                             return;
                         }
                         aerial.arrivalAction = new AerialVehicleArrivalAction_LandSpecificCell(vehicle, parent, tile, this, target.Cell, rot);
                         aerial.OrderFlyToTiles(LaunchTargeter.FlightPath, aerial.DrawPos, new AerialVehicleArrivalAction_LandSpecificCell(vehicle, parent, tile, this, target.Cell, rot));
                         vehicle.CompVehicleLauncher.inFlight = true;
                         CameraJumper.TryShowWorld();
                     }
                 }, null, null, null, vehicle.VehicleDef.rotatable && landingProperties.forcedRotation is null);
             }, MenuOptionPriority.Default, null, null, 0f, null, null));
         }
         if (vehicle.CompVehicleLauncher.ControlInFlight)
         {
             yield return(MapHelper.ReconFloatMenuOption(vehicle, parent));
         }
         if (vehicle.CompVehicleLauncher.ControlInFlight && vehicle.CompCannons != null)                 //REDO - strafe specific properties
         {
             yield return(new FloatMenuOption("VehicleStrafeRun".Translate(), delegate()
             {
                 if (vehicle.Spawned)
                 {
                     LaunchTargeter.Instance.ContinueTargeting(vehicle, new Func <GlobalTargetInfo, float, bool>(ChoseWorldTarget), vehicle.Map.Tile, true, VehicleTex.TargeterMouseAttachment, true, null,
                                                               (GlobalTargetInfo target, List <FlightNode> path, float fuelCost) => TargetingLabelGetter(target, tile, path, fuelCost));
                 }
                 else
                 {
                     AerialVehicleInFlight aerialVehicle = vehicle.GetAerialVehicle();
                     if (aerialVehicle is null)
                     {
                         Log.Error($"Unable to launch strafe run. AerialVehicle is null and {vehicle.LabelCap} is not spawned.");
                         return;
                     }
                     LaunchTargeter.Instance.ContinueTargeting(vehicle, new Func <GlobalTargetInfo, float, bool>(aerialVehicle.ChoseTargetOnMap), aerialVehicle, true, VehicleTex.TargeterMouseAttachment, false, null,
                                                               (GlobalTargetInfo target, List <FlightNode> path, float fuelCost) => vehicle.CompVehicleLauncher.launchProtocol.TargetingLabelGetter(target, aerialVehicle.Tile, path, fuelCost));
                 }
                 CameraJumper.TryShowWorld();
                 LaunchTargeter.Instance.RegisterActionOnTile(tile, new AerialVehicleArrivalAction_StrafeMap(vehicle, parent));
             }, MenuOptionPriority.Default, null, null, 0f, null, null));
         }
     }
     if (Find.WorldObjects.SettlementAt(tile) is Settlement settlement)
     {
         if (settlement.Faction.def.techLevel <= TechLevel.Industrial)
         {
             yield return(new FloatMenuOption("LandVehicleHere".Translate(), delegate()
             {
                 if (vehicle.Spawned)
                 {
                     vehicle.CompVehicleLauncher.TryLaunch(tile, new AerialVehicleArrivalAction_FormVehicleCaravan(vehicle));
                 }
                 else
                 {
                     AerialVehicleInFlight aerial = VehicleWorldObjectsHolder.Instance.AerialVehicleObject(vehicle);
                     aerial.OrderFlyToTiles(LaunchTargeter.FlightPath, aerial.DrawPos, new AerialVehicleArrivalAction_VisitSettlement(vehicle, settlement));
                 }
             }, MenuOptionPriority.Default, null, null, 0f, null, null));
         }
         foreach (FloatMenuOption option in AerialVehicleArrivalAction_AttackSettlement.GetFloatMenuOptions(vehicle, this, settlement))
         {
             yield return(option);
         }
     }
 }