/// <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; } })); }
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); }
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(); }
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); } } }