示例#1
0
        public override void DoWindowContents(Rect inRect)
        {
            //grab before anchor/font
            GameFont   fontBefore   = Text.Font;
            TextAnchor anchorBefore = Text.Anchor;

            //top label
            Text.Font   = GameFont.Small;
            Text.Anchor = TextAnchor.MiddleCenter;



            Text.Anchor = TextAnchor.MiddleLeft;

            int i = 0;

            foreach (FCPrisoner prisoner in prisoners)
            {
                Rect Box;
                Rect PawnIcon;
                Rect PawnName;
                Rect PawnHealth;
                Rect PawnUnrest;
                Rect PawnWorkload;
                Rect ButtonInfo;
                Rect ButtonAction;

                Box          = optionBox;
                PawnIcon     = optionPawnIcon;
                PawnName     = optionPawnName;
                PawnHealth   = optionPawnHealth;
                PawnUnrest   = optionPawnUnrest;
                PawnWorkload = optionPawnWorkload;
                ButtonInfo   = optionButtonInfo;
                ButtonAction = optionButtonAction;

                Box.y          += scroll + optionHeight * i;
                PawnIcon.y     += scroll + optionHeight * i;
                PawnName.y     += scroll + optionHeight * i;
                PawnHealth.y   += scroll + optionHeight * i;
                PawnUnrest.y   += scroll + optionHeight * i;
                PawnWorkload.y += scroll + optionHeight * i;
                ButtonInfo.y   += scroll + optionHeight * i;
                ButtonAction.y += scroll + optionHeight * i;


                //display stuff now
                Widgets.DrawMenuSection(Box);
                //on every other box
                if (i % 2 == 0)
                {
                    Widgets.DrawHighlight(Box);
                }

                //show pawn;
                Widgets.ThingIcon(PawnIcon, prisoner.prisoner);
                //Pawn Name
                Widgets.Label(PawnName, prisoner.prisoner.Name.ToString());
                //Pawn Health
                Widgets.Label(PawnHealth, "Health".Translate().CapitalizeFirst() + " " + prisoner.health);
                //Pawn Unrest
                //Widgets.Label(PawnUnrest, "Unrest".Translate().CapitalizeFirst() + " " + prisoner.unrest);



                //Pawn Workload
                string workload;
                switch (prisoner.workload)
                {
                case FCWorkLoad.Heavy:
                    workload = "FCHeavy".Translate().CapitalizeFirst();
                    break;

                case FCWorkLoad.Medium:
                    workload = "FCMedium".Translate().CapitalizeFirst();
                    break;

                case FCWorkLoad.Light:
                    workload = "FCLight".Translate().CapitalizeFirst();
                    break;

                default:
                    workload = "null";
                    break;
                }
                if (Widgets.ButtonText(PawnWorkload, "FCWorkload".Translate().CapitalizeFirst() + ": " + workload))
                {
                    List <FloatMenuOption> list = new List <FloatMenuOption>();
                    list.Add(new FloatMenuOption("FCHeavy".Translate().CapitalizeFirst() + " - " + "FCHeavyExplanation".Translate(), delegate
                    {
                        prisoner.workload = FCWorkLoad.Heavy;
                    }));
                    list.Add(new FloatMenuOption("FCMedium".Translate().CapitalizeFirst() + " - " + "FCMediumExplanation".Translate(), delegate
                    {
                        prisoner.workload = FCWorkLoad.Medium;
                    }));
                    list.Add(new FloatMenuOption("FCLight".Translate().CapitalizeFirst() + " - " + "FCLightExplanation".Translate(), delegate
                    {
                        prisoner.workload = FCWorkLoad.Light;
                    }));
                    FloatMenu menu = new FloatMenu(list);
                    Find.WindowStack.Add(menu);
                }

                //Info Button
                if (Widgets.ButtonTextSubtle(ButtonInfo, "ViewInfo".Translate()))
                {
                    Pawn pawn = new Pawn();
                    pawn = prisoner.prisoner;

                    if (prisoner.healthTracker != null)
                    {
                        prisoner.prisoner.health = prisoner.healthTracker;
                    }
                    else
                    {
                        prisoner.prisoner.health = new Pawn_HealthTracker(prisoner.prisoner);
                        prisoner.healthTracker   = new Pawn_HealthTracker(prisoner.prisoner);
                    }

                    pawn.health = prisoner.healthTracker;


                    Find.WindowStack.Add(new Dialog_InfoCard(pawn));
                }

                //Action button
                if (Widgets.ButtonTextSubtle(ButtonAction, "Actions".Translate()))
                {
                    List <FloatMenuOption> list = new List <FloatMenuOption>();

                    list.Add(new FloatMenuOption("SellPawn".Translate() + " $" + prisoner.prisoner.MarketValue + " " + "SellPawnInfo".Translate(), delegate

                    {
                        settlement.addSilverIncome(prisoner.prisoner.MarketValue);

                        //reset window
                        prisoners.Remove(prisoner);
                        WindowUpdate();
                        return;
                    }));

                    list.Add(new FloatMenuOption("ReturnToPlayer".Translate(), delegate
                    {
                        if (prisoner.healthTracker != null)
                        {
                            prisoner.prisoner.health = prisoner.healthTracker;
                        }
                        else
                        {
                            prisoner.prisoner.health = new Pawn_HealthTracker(prisoner.prisoner);
                            prisoner.healthTracker   = new Pawn_HealthTracker(prisoner.prisoner);
                        }
                        HealthUtility.DamageUntilDowned(prisoner.prisoner, false);
                        if (prisoner.prisoner.guest == null)
                        {
                            prisoner.prisoner.guest = new Pawn_GuestTracker();
                        }
                        prisoner.prisoner.guest.isPrisonerInt = true;
                        FieldInfo hostFaction = typeof(Pawn_GuestTracker).GetField("hostFactionInt", BindingFlags.NonPublic | BindingFlags.Instance);
                        hostFaction.SetValue(prisoner.prisoner.guest, Find.FactionManager.OfPlayer);

                        List <Thing> things = new List <Thing>();
                        things.Add(prisoner.prisoner);
                        Map map = faction.returnCapitalMap();
                        if (map != null)
                        {
                            DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(map), Find.CurrentMap, things);
                        }

                        //reset window
                        prisoners.Remove(prisoner);
                        WindowUpdate();
                        return;
                    }));


                    FloatMenu menu = new FloatMenu(list);
                    Find.WindowStack.Add(menu);
                }



                //increment i
                i++;
            }

            Text.Font   = fontBefore;
            Text.Anchor = anchorBefore;

            if (Event.current.type == EventType.ScrollWheel)
            {
                scrollWindow(Event.current.delta.y);
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(spot: out IntVec3 dropSpot, map: (Map)parms.target))
            {
                return(false);
            }
            if (!FindAlliedWarringFaction(faction: out Faction faction))
            {
                return(false);
            }
            if (faction == null)
            {
                return(false);
            }

            bool   bamboozle           = false;
            string arrivalText         = string.Empty;
            int    factionGoodWillLoss = MFI_DiplomacyTunings
                                         .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            IncidentParms raidParms =
                StorytellerUtility.DefaultParmsNow(incCat: IncidentCategoryDefOf.ThreatBig, target: (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(other: Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(chance: 0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(format: raidParms.raidArrivalMode.textEnemy, arg0: raidParms.faction.def.pawnsPlural, arg1: raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(groupKind: PawnGroupKindDefOf.Combat, parms: raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points: defaultPawnGroupMakerParms.points, raidArrivalMode: raidParms.raidArrivalMode, raidStrategy: raidParms.raidStrategy, faction: defaultPawnGroupMakerParms.faction, groupKind: PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(parms: defaultPawnGroupMakerParms).ToList();
            List <Thing> pawnlist = new List <Thing>();

            for (int i = 0; i < this.pawnstoSpawn.RandomInRange; i++)
            {
                PawnGenerationRequest request = new PawnGenerationRequest(kind: pawnKinds.RandomElement(), faction: faction, allowDowned: true, allowDead: true, mustBeCapableOfViolence: true);
                Pawn woundedCombatant         = PawnGenerator.GeneratePawn(request: request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                ThingDef weapon = Rand.Bool ? DefDatabase <ThingDef> .AllDefsListForReading.Where(predicate : x => x.IsWeaponUsingProjectiles).RandomElement() : null;

                ThingDef  usedWeaponDef = weapon;
                DamageDef damageDef     = usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile?.damageDef; //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }
                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(p: woundedCombatant, allowBleedingWounds: true, damageDef: damageDef, weapon: usedWeaponDef);
                //todo: maybe add some storylogging.
                pawnlist.Add(item: woundedCombatant);
            }

            string  initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            DiaNode diaNode        = new DiaNode(text: initialMessage);

            DiaOption diaOptionOk = new DiaOption(text: "OK".Translate())
            {
                resolveTree = true
            };

            DiaOption diaOptionAccept = new DiaOption(text: "RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(parms: raidParms);
                    }
                    else
                    {
                        IntVec3 intVec = IntVec3.Invalid;

                        List <Building> allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist.Where(predicate: x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        for (int i = 0; i < allBuildingsColonist.Count; i++)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(center: allBuildingsColonist[index: i].Position, map: (Map)parms.target, result: out intVec, allowFogged: false, canRoofPunch: false))
                            {
                                break;
                            }
                        }
                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot(map: (Map)parms.target);
                        }
                        DropPodUtility.DropThingsNear(dropCenter: intVec, map: (Map)parms.target, things: pawnlist, openDelay: 180, leaveSlag: true, canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                }
            };
            string  bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string  commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            DiaNode acceptDiaNode         = new DiaNode(text: bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(item: diaOptionAccept);
            acceptDiaNode.options.Add(item: diaOptionOk);

            DiaOption diaOptionRejection = new DiaOption(text: "RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(other: Faction.OfPlayer, goodwillChange: factionGoodWillLoss, canSendMessage: false);
                    }
                }
            };
            string  rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string  bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            DiaNode rejectionDiaNode         = new DiaNode(text: bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(item: diaOptionRejection);
            rejectionDiaNode.options.Add(item: diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(window: new Dialog_NodeTreeWithFactionInfo(nodeRoot: diaNode, faction: faction, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(archivable: new ArchivedDialog(text: diaNode.text, title: title, relatedFaction: faction));
            return(true);
        }
示例#3
0
        public override void GenerateIntoMap(Map map)
        {
            if (Find.GameInitData == null)
            {
                return;
            }
            List <List <Thing> > list = new List <List <Thing> >();

            foreach (Pawn item in Find.GameInitData.startingAndOptionalPawns)
            {
                list.Add(new List <Thing>
                {
                    item
                });
            }
            List <Thing> list2 = new List <Thing>();

            foreach (ScenPart scenPart in Find.Scenario.AllParts)
            {
                list2.AddRange(scenPart.PlayerStartingThings());
            }
            int num = 0;

            for (int i = 0; i < list2.Count; i++)
            {
                Thing thing = list2[i];
                if (thing.def.CanHaveFaction)
                {
                    thing.SetFactionDirect(Faction.OfPlayer);
                }
                list[num].Add(thing);
                num++;
                if (num >= list.Count)
                {
                    num = 0;
                }
            }
            PlayerPawnsArriveMethod method = (PlayerPawnsArriveMethod)AccessTools.Field(typeof(ScenPart_PlayerPawnsArriveMethod), "method").GetValue(this);

            Log.Message("method = " + method.ToStringHuman() + " dropship: " + (DropshipDef != null));
            if (DropshipDef != null && method == PlayerPawnsArriveMethod.DropPods)
            {
                Thing        ship     = ThingMaker.MakeThing(this.DropshipDef);
                CompDropship dropship = ship.TryGetCompFast <CompDropship>();
                if (dropship != null)
                {
                    foreach (List <Thing> item in list)
                    {
                        if (item.Contains(ship))
                        {
                            item.Remove(ship);
                        }
                        dropship.Transporter.innerContainer.TryAddRangeOrTransfer(item);
                    }
                    dropship.autodustoff = AutoDustoff;
                    if (DropCellFinder.TryFindDropSpotNear(MapGenerator.PlayerStartSpot, map, out IntVec3 spot, false, false, false, ship.def.Size))
                    {
                        GenPlace.TryPlaceThing(SkyfallerMaker.MakeSkyfaller(ThingDef.Named(ship.def.defName + "_Incoming"), ship), spot, map, ThingPlaceMode.Near, null, null, default(Rot4));
                    }
                    else
                    {
                        GenPlace.TryPlaceThing(SkyfallerMaker.MakeSkyfaller(ThingDef.Named(ship.def.defName + "_Incoming"), ship), MapGenerator.PlayerStartSpot, map, ThingPlaceMode.Near, null, null, default(Rot4));
                    }
                    return;
                }
            }
示例#4
0
 public static void DropThingGroupsNear_NewTmp(IntVec3 dropCenter, Map map, List <List <Thing> > thingsGroups, int openDelay = 110, bool instaDrop = false, bool leaveSlag = false, bool canRoofPunch = true, bool forbid = true, bool allowFogged = true)
 {
     foreach (List <Thing> thingsGroup in thingsGroups)
     {
         if (!DropCellFinder.TryFindDropSpotNear(dropCenter, map, out IntVec3 result, allowFogged, canRoofPunch) && (canRoofPunch || !DropCellFinder.TryFindDropSpotNear(dropCenter, map, out result, allowFogged, canRoofPunch: true)))
         {
             Log.Warning("DropThingsNear failed to find a place to drop " + thingsGroup.FirstOrDefault() + " near " + dropCenter + ". Dropping on random square instead.");
             result = CellFinderLoose.RandomCellWith((IntVec3 c) => c.Walkable(map), map);
         }
         if (forbid)
         {
             for (int i = 0; i < thingsGroup.Count; i++)
             {
                 thingsGroup[i].SetForbidden(value: true, warnOnFail: false);
             }
         }
         if (instaDrop)
         {
             foreach (Thing item in thingsGroup)
             {
                 GenPlace.TryPlaceThing(item, result, map, ThingPlaceMode.Near);
             }
         }
         else
         {
             ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo();
             foreach (Thing item2 in thingsGroup)
             {
                 activeDropPodInfo.innerContainer.TryAdd(item2);
             }
             activeDropPodInfo.openDelay = openDelay;
             activeDropPodInfo.leaveSlag = leaveSlag;
             MakeDropPodAt(result, map, activeDropPodInfo);
         }
     }
 }
示例#5
0
        public static void DropThingGroupsNear(IntVec3 dropCenter, Map map, List <List <Thing> > thingsGroups, int openDelay = 110, bool instaDrop = false, bool leaveSlag = false, bool canRoofPunch = true, DeepStrikeType strikeType = DeepStrikeType.DropPod, bool scatters = true)
        {
            foreach (List <Thing> list in thingsGroups)
            {
                List <Thing>        list2     = list.Where(x => x.def.thingClass == typeof(Pawn) && (x.Faction != null && x.Faction.def.HasModExtension <FactionDefExtension>())).ToList();
                FactionDefExtension extension = list2.NullOrEmpty() ? null : list2.RandomElement().Faction.def.GetModExtensionFast <FactionDefExtension>();
                if (!DropCellFinder.TryFindDropSpotNear(dropCenter, map, out IntVec3 intVec, true, canRoofPunch) || !scatters)
                {
                    if (scatters)
                    {
                        Log.Warning(string.Concat(new object[]
                        {
                            "DropThingsNear failed to find a place to drop ",
                            list.FirstOrDefault <Thing>(),
                            " near ",
                            dropCenter,
                            ". Dropping on random square instead."
                        }), false);
                    }
                    intVec = CellFinderLoose.RandomCellWith((IntVec3 c) => c.Walkable(map) && (c.Roofed(map) && c.GetRoof(map) != RoofDefOf.RoofRockThick), map, 1000);
                }
                for (int i = 0; i < list.Count; i++)
                {
                    list[i].SetForbidden(true, false);
                }
                if (instaDrop)
                {
                    foreach (Thing thing in list)
                    {
                        GenPlace.TryPlaceThing(thing, intVec, map, ThingPlaceMode.Near, null, null);
                    }
                }
                else
                {
                    ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo();
                    foreach (Thing item in list)
                    {
                        activeDropPodInfo.innerContainer.TryAddOrTransfer(item, true);
                    }
                    activeDropPodInfo.openDelay = openDelay;
                    activeDropPodInfo.leaveSlag = leaveSlag;

                    switch (strikeType)
                    {
                    /*
                     * case DeepStrikeType.DropPara:
                     *  DeepStrikeUtility.MakeDropParaAt(intVec, map, activeDropPodInfo, extension);
                     *  break;
                     * case DeepStrikeType.DropShip:
                     *  DeepStrikeUtility.MakeDropShipLandAt(intVec, map, activeDropPodInfo, extension);
                     *  break;
                     */
                    case DeepStrikeType.Fly:
                        DeepStrikeUtility.MakeFlyerLandAt(intVec, map, activeDropPodInfo, extension);
                        break;

                    case DeepStrikeType.Teleport:
                        DeepStrikeUtility.MakeTeleportAt(intVec, map, activeDropPodInfo, extension);
                        break;

                    case DeepStrikeType.Tunnel:
                        DeepStrikeUtility.MakeTunnelAt(intVec, map, activeDropPodInfo, extension);
                        break;

                    default:
                        DeepStrikeUtility.MakeDropPodAt(intVec, map, activeDropPodInfo, extension);
                        break;
                    }
                }
            }
        }
示例#6
0
        public static bool TryFindShipDropSpotNear(ShipBase ship, IntVec3 center, Map map, out IntVec3 result, bool allowFogged, bool canRoofPunch)
        {
            if (DebugViewSettings.drawDestSearch)
            {
                map.debugDrawer.FlashCell(center, 1f, "center");
            }

            Predicate <IntVec3> validatingExistingShips = (IntVec3 c) =>
            {
                Vector2      drawSize = ship.def.graphicData.drawSize;
                List <Thing> ships    = map.listerThings.AllThings.FindAll(x => x is ShipBase_Traveling || x.GetType().IsAssignableFrom(typeof(ShipBase)));
                for (int i = 0; i < ships.Count; i++)
                {
                    if (GenAdj.OccupiedRect(ships[i]).Overlaps(GenAdj.OccupiedRect(ship).ExpandedBy(1)))
                    {
                        return(false);
                    }
                }
                return(true);
            };

            Predicate <IntVec3> validator = (IntVec3 c) => validatingExistingShips(c) && DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) && map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly) && GenAdj.OccupiedRect(c, ship.Rotation, ship.def.Size).InBounds(map);
            int num = 5;

            while (!CellFinder.TryFindRandomCellNear(center, map, num, validator, out result))
            {
                num += 3;
                if (num > 29)
                {
                    result = center;
                    Log.Error("NoDropPoint found");
                    return(false);
                }
            }
            return(true);
        }
        public override bool TryExecute(IncidentParms parms)
        {
            Map     map = (Map)parms.target;
            IntVec3 spawnSpot;

            if (!CellFinder.TryFindRandomEdgeCellWith(c => map.reachability.CanReachColony(c), map, out spawnSpot))
            {
                return(false);
            }

            #region CHANGED

            Func <Pawn, bool> selector = other => other.RaceProps.Humanlike && other.Faction != null && other.Faction.HostileTo(Faction.OfPlayer) && HasGroupMakers(other.Faction);

            Pawn refugee = GenericUtility.GetAnyRelatedWorldPawn(selector, 100);
            if (refugee == null)
            {
                // Just ANYONE
                Find.WorldPawns.AllPawnsAlive.Where(selector).TryRandomElement(out refugee);
            }
            if (refugee == null)
            {
                return(false);
            }

            refugee.relations.everSeenByPlayer = true;
            Faction enemyFac = refugee.Faction;

            string text = "RefugeeChasedInitial".Translate(new object[]
            {
                refugee.Name.ToStringFull,
                refugee.GetTitle().ToLower(),
                enemyFac.def.pawnsPlural, enemyFac.Name,
                refugee.ageTracker.AgeBiologicalYears
            });

            text = text.AdjustedFor(refugee);
            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, refugee);
            DiaNode   diaNode   = new DiaNode(text);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());
            diaOption.action = delegate
            {
                if (refugee == enemyFac.leader)
                {
                    enemyFac.GenerateNewLeader();
                }

                Find.WorldPawns.RemovePawn(refugee);
                var canDrop = enemyFac.def.techLevel >= TechLevel.Spacer;

                if (canDrop)
                {
                    spawnSpot = DropCellFinder.TradeDropSpot(map);
                    TradeUtility.SpawnDropPod(spawnSpot, map, refugee);
                }
                else
                {
                    GenSpawn.Spawn(refugee, spawnSpot, map);
                }

                refugee.SetFaction(Faction.OfPlayer);
                Find.CameraDriver.JumpTo(spawnSpot);
                IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentCategory.ThreatBig, map);
                incidentParms.forced          = true;
                incidentParms.faction         = enemyFac;
                incidentParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
                incidentParms.raidArrivalMode = canDrop ? PawnsArriveMode.CenterDrop : PawnsArriveMode.EdgeWalkIn;
                incidentParms.spawnCenter     = spawnSpot;
                incidentParms.points         *= RaidPointsFactor;
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, incidentParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string text2 = "RefugeeChasedRejected".Translate(new object[]
            {
                refugee.NameStringShort
            });
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());
            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());
            diaOption3.action = delegate
            {
                HealthUtility.GiveInjuriesToKill(refugee);
                //Log.Message(refugee.Name + " dead? " + refugee.Dead);
                //Find.WorldPawns.PassToWorld(refugee,PawnDiscardDecideMode.Discard);
            };
            #endregion
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            Find.WindowStack.Add(new Dialog_NodeTree(diaNode, true, true));
            return(true);
        }
示例#8
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map target = (Map)parms.target;

            if (!TryFindFactions(out Faction faction) || !TryFindStravingPawns(out IEnumerable <Pawn> enumerableFood, target) || !TryFindInjuredPawns(out IEnumerable <Pawn> enumerableInjured, target))
            {
                return(false);
            }

            List <Thing> thingList = GenerateRewards(faction, enumerableFood.Count(), enumerableInjured.Count(), parms);

            DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(target), target, thingList, 110, false, true, true);
            Find.LetterStack.ReceiveLetter("FFE_LetterLabelAid".Translate(), "FFE_Aid".Translate(faction.leader, faction.def.leaderTitle, faction, GenLabel.ThingsLabel(thingList, string.Empty))
                                           , LetterDefOf.PositiveEvent, new TargetInfo(DropCellFinder.TradeDropSpot(target), target, false), faction, null);
            return(true);
        }
示例#9
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;
            List <TargetInfo> list        = new List <TargetInfo>();
            List <Thing>      list3       = ThingSetMakerDefOf.Meteorite.root.Generate();
            ThingDef          shipPartDef = def?.mechClusterBuilding;
            IntVec3           intVec      = FindDropPodLocation(map, (IntVec3 spot) => CanPlaceAt(spot));

            if (intVec == IntVec3.Invalid)
            {
                return(false);
            }
            float       points = Mathf.Max(parms.points * 0.9f, 300f);
            List <Pawn> list2  = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms
            {
                groupKind = PawnGroupKindDefOf.Combat,
                tile      = map.Tile,
                faction   = Faction.OfMechanoids,
                points    = points
            }).ToList();
            Thing thing = ThingMaker.MakeThing(shipPartDef);

            thing.SetFaction(Faction.OfMechanoids);
            LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_SleepThenMechanoidsDefend(new List <Thing>
            {
                thing
            }, Faction.OfMechanoids, 28f, intVec, canAssaultColony: false, isMechCluster: false), map, list2);
            DropPodUtility.DropThingsNear(intVec, map, list2.Cast <Thing>());
            foreach (Pawn item in list2)
            {
                item.TryGetComp <CompCanBeDormant>()?.ToSleep();
            }
            list.AddRange(list2.Select((Pawn p) => new TargetInfo(p)));
            GenSpawn.Spawn(SkyfallerMaker.MakeSkyfaller(ThingDefOf.MeteoriteIncoming, thing), intVec, map);
            list.Add(new TargetInfo(intVec, map));
            SendStandardLetter(parms, list);
            return(true);

            bool CanPlaceAt(IntVec3 loc)
            {
                CellRect cellRect = GenAdj.OccupiedRect(loc, Rot4.North, shipPartDef.Size);

                if (loc.Fogged(map) || !cellRect.InBounds(map))
                {
                    return(false);
                }
                if (!DropCellFinder.SkyfallerCanLandAt(loc, map, shipPartDef.Size))
                {
                    return(false);
                }
                foreach (IntVec3 item2 in cellRect)
                {
                    RoofDef roof = item2.GetRoof(map);
                    if (roof != null && roof.isNatural)
                    {
                        return(false);
                    }
                }
                return(GenConstruct.CanBuildOnTerrain(shipPartDef, loc, map, Rot4.North));
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if ((from x in DefDatabase <TraderKindDef> .AllDefs
                 where x.orbital
                 select x).TryRandomElement(out TraderKindDef def))
            {
                TradeShip           tradeShip = new TradeShip(def);
                List <Thing>        list      = new List <Thing>();
                ThingSetMakerParams Trader    = default(ThingSetMakerParams);
                Trader.traderDef = tradeShip.def;
                Trader.tile      = map.Tile;
                list             = ThingSetMakerDefOf.TraderStock.root.Generate(Trader);
                List <Thing> tempList = new List <Thing>();
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    bool flag = true;
                    if (list[i] is Pawn pawn)
                    {
                        if (Rand.Chance(0.6f))
                        {
                            list.Remove(list[i]);
                            flag = false;
                        }
                        else
                        {
                            HealthUtility.DamageUntilDowned(pawn);
                        }
                    }
                    else
                    {
                        if (list[i].stackCount == 1)
                        {
                            if (Rand.Chance(0.6f))
                            {
                                list.Remove(list[i]);
                                //list[i].Destroy();
                                flag = false;
                            }
                        }
                        else
                        {
                            list[i].stackCount = Mathf.RoundToInt(list[i].stackCount * 0.3f);
                            if (list[i].stackCount < 1)
                            {
                                list.Remove(list[i]);
                                //list[i].Destroy();
                                flag = false;
                            }
                        }
                    }
                    if (flag)
                    {
                        for (int j = list[i].stackCount; j > list[i].def.stackLimit; j -= list[i].def.stackLimit)
                        {
                            list[i].stackCount -= list[i].def.stackLimit;
                            Thing tempThing = ThingMaker.MakeThing(list[i].def);
                            tempThing.stackCount = list[i].def.stackLimit;
                            if (tempThing is MinifiedThing && (tempThing as MinifiedThing).InnerThing == null)
                            {
                                continue;
                            }
                            tempList.Add(tempThing);
                        }
                    }
                }

                /*foreach (Thing thing in list)
                 * {
                 *  if (thing is Pawn pawn)
                 *      HealthUtility.DamageUntilDowned(pawn);
                 *  for (int i = thing.stackCount; i > thing.def.stackLimit; i -= thing.def.stackLimit)
                 *  {
                 *      thing.stackCount -= thing.def.stackLimit;
                 *      Thing tempThing = ThingMaker.MakeThing(thing.def);
                 *      tempThing.stackCount = thing.def.stackLimit;
                 *      if (tempThing is MinifiedThing && (tempThing as MinifiedThing).InnerThing == null) continue;
                 *      tempList.Add(tempThing);
                 *
                 *  }
                 * }*/
                list.AddRange(tempList);

                IntVec3 intVec = DropCellFinder.RandomDropSpot(map);
                DropPodUtility.DropThingsNear(intVec, map, list, 110, false, true, true);
                Find.LetterStack.ReceiveLetter(tradeShip.def.LabelCap + " " + "PolarisTitleTradeShipPodCrash".Translate(), "PolarisTradeShipPodCrash".Translate(tradeShip.name, tradeShip.def.label), LetterDefOf.PositiveEvent, new TargetInfo(intVec, map, false), null);
                return(true);
            }
            throw new InvalidOperationException();
        }
示例#11
0
 public static bool IsGoodDropSpot(IntVec3 c, Map map, bool allowFogged, bool canRoofPunch)
 {
     return(DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) &&
            !Mod.ShieldManager.ImpactShield(map, Common.ToVector2(c)));
 }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            var    map       = parms.target as Map;
            float  chance    = Rand.Range(1, 100);
            var    container = new List <Thing>();
            string label     = "LetterLabelRefugeePodCrash".Translate();
            string text      = "RefugeePodCrash".Translate();


            //Get a random cell.
            var intVec = DropCellFinder.RandomDropSpot(map);
            //Set the faction of the dude.
            var faction = Find.FactionManager.FirstFactionOfDef(FactionDefOf.Ancients
                                                                );

            ////Chance of generating soldiers
            //for (int i = 0; i < (int)Rand.Range(0, 2); i++)
            //{
            //    PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceSoldier, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, true, 20f, false, true, true, null, null, null, null, null, null);
            //    Pawn pawn = PawnGenerator.GeneratePawn(request);
            //    Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f);
            //    container.TryAdd(pawn);
            //}
            ////Chance of generating survivors. One is required to start the pod!
            //for (int i = 0; i < (int)Rand.Range(1, 2); i++)
            //{
            //    PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null);
            //    Pawn pawn = PawnGenerator.GeneratePawn(request);
            //    Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f);
            //    container.TryAdd(pawn);
            //}
            //Chance of generating downed survivors.
            //for (int i = 0; i < (int)Rand.Range(0, 2); i++)
            //{
            //    PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null);
            //    Pawn pawn = PawnGenerator.GeneratePawn(request);
            //    Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f);
            //    HealthUtility.GiveInjuriesToForceDowned(pawn);
            //    container.TryAdd(pawn);
            //}
            //Chance of generating dead bodies
            //for (int i = 0; i < (int)Rand.Range(0, 3); i++)
            //{
            //    PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null);
            //    Pawn pawn = PawnGenerator.GeneratePawn(request);
            //    HealthUtility.GiveInjuriesToKill(pawn);
            //    container.TryAdd(pawn);
            // }
            //What kind of trade ship was it?

            //Combat Supplier
            if (chance > 66)
            {
                label = "LetterLabelForcedCrashCombatSuplier".Translate();
                text  = "ForcedCrashCombatSuplier".Translate();

                container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(40, 60)));             //Orig 4000-6000
                container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-1, 10)));    //Original -1~10
                container.AddRange(ThingsToAdd(ThingDefOf.Shell_HighExplosive, Rand.Range(5, 10))); //Original 30-60
                container.AddRange(ThingsToAdd(ThingDefOf.MedicineUltratech, Rand.Range(1, 3)));    //Original 30-50
                AddThingsToContainerByTag(container, "BodyPartOrImplant", Rand.Range(-8, 2));       //Original 0~5
                AddThingsToContainerByTag(container, "Drugs", Rand.Range(-2, 2));                   //Original 0~5
                var randomInRange = Rand.Range(3, 6);                                               //Orig 4~8 guns
                //Weapons Ranged
                for (var i = 0; i < randomInRange; i++)
                {
                    if (!(from t in DefDatabase <ThingDef> .AllDefs
                          where t.IsRangedWeapon && t.tradeability != Tradeability.None &&
                          t.techLevel <= TechLevel.Archotech && t.BaseMarketValue <= 500
                          select t).TryRandomElement(out var def))
                    {
                        break;
                    }

                    ThingDef stuff = null;
                    if (def.MadeFromStuff)
                    {
                        stuff = (from st in DefDatabase <ThingDef> .AllDefs
                                 where st.IsStuff && st.stuffProps.CanMake(def)
                                 select st).RandomElementByWeight(st => st.stuffProps.commonality);
                    }

                    var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff);
                    container.Add(thingWithComps);
                }

                //Weapons Melee
                randomInRange = Rand.Range(1, 3); //Orig 3~5 guns
                for (var i = 0; i < randomInRange; i++)
                {
                    if (!(from t in DefDatabase <ThingDef> .AllDefs
                          where t.IsRangedWeapon && t.tradeability != Tradeability.None &&
                          t.techLevel <= TechLevel.Archotech
                          select t).TryRandomElement(out var def))
                    {
                        break;
                    }

                    ThingDef stuff = null;
                    if (def.MadeFromStuff)
                    {
                        stuff = (from st in DefDatabase <ThingDef> .AllDefs
                                 where st.IsStuff && st.stuffProps.CanMake(def)
                                 select st).RandomElementByWeight(st => st.stuffProps.commonality);
                    }

                    var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff);
                    container.Add(thingWithComps);
                }

                //Armor
                randomInRange = Rand.Range(1, 2); //Orig 2~4 armor
                for (var i = 0; i < randomInRange; i++)
                {
                    if (!(from t in DefDatabase <ThingDef> .AllDefs
                          where t.IsApparel && t.tradeability != Tradeability.None &&
                          t.techLevel <= TechLevel.Archotech &&
                          (t.GetStatValueAbstract(StatDefOf.ArmorRating_Blunt) > 0.15f ||
                           t.GetStatValueAbstract(StatDefOf.ArmorRating_Sharp) > 0.15f)
                          select t).TryRandomElement(out var def))
                    {
                        break;
                    }

                    ThingDef stuff = null;
                    if (def.MadeFromStuff)
                    {
                        stuff = (from st in DefDatabase <ThingDef> .AllDefs
                                 where st.IsStuff && st.stuffProps.CanMake(def)
                                 select st).RandomElementByWeight(st => st.stuffProps.commonality);
                    }

                    var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff);
                    container.Add(thingWithComps);
                }

                //Clothes
                randomInRange = Rand.Range(1, 2); //Orig 4~8 clothes
                for (var i = 0; i < randomInRange; i++)
                {
                    if (!(from t in DefDatabase <ThingDef> .AllDefs
                          where t.IsApparel && t.tradeability != Tradeability.None && t.techLevel <= TechLevel.Archotech
                          select t).TryRandomElement(out var def))
                    {
                        break;
                    }

                    ThingDef stuff = null;
                    if (def.MadeFromStuff)
                    {
                        stuff = (from st in DefDatabase <ThingDef> .AllDefs
                                 where st.IsStuff && st.stuffProps.CanMake(def)
                                 select st).RandomElementByWeight(st => st.stuffProps.commonality);
                    }

                    var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff);
                    container.Add(thingWithComps);
                }
            }

            else if (chance > 33 && chance <= 66)
            {
                label = "LetterLabelForcedCrashBulkGoods".Translate();
                text  = "ForcedCrashBulkGoods".Translate();

                //Basic Stuff
                container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(20, 100)));            //Original 4000-6000
                container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(5, 15))); //Original 5-30
                container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-5, 5)));     //Original 5-30
                container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100)));             //Original 800-1500

                //Luxury Goods
                container.AddRange(ThingsToAdd(ThingDefOf.Gold, Rand.Range(5, 50)));        //Original 500-2000
                container.AddRange(ThingsToAdd(CultsDefOf.Neutroamine, Rand.Range(5, 15))); //Original 400-800
                container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(5, 15)));    //Original 300-700
                container.AddRange(ThingsToAdd(ThingDefOf.Beer, Rand.Range(-70, 30)));      //Original -700-2000
                container.AddRange(ThingsToAdd(ThingDefOf.Chocolate, Rand.Range(-70, 30))); //Original -700-2000
                AddThingsToContainerByTag(container, "Furniture", Rand.Range(0, 1));        //(0-3 kinds) Furniture -1~2

                //Sensitive Materials
                container.AddRange(ThingsToAdd(ThingDefOf.Cloth, Rand.Range(-20, 50)));            //Original -200-600
                container.AddRange(ThingsToAdd(ThingDefOf.MedicineIndustrial, Rand.Range(1, 5)));  //Original 10-30
                container.AddRange(ThingsToAdd(ThingDefOf.MedicineUltratech, Rand.Range(-10, 5))); //Original 10-30
                AddThingsToContainerByTag(container, "Apparel", Rand.Range(4, 8));                 //Original 10-20
                container.AddRange(ThingsToAdd(ThingDefOf.WoodLog, Rand.Range(10, 60)));           //Original 800-1500

                //Foodstuffs
                container.AddRange(ThingsToAdd(ThingDef.Named("Pemmican"), Rand.Range(-20, 40))); //NA
                container.AddRange(ThingsToAdd(ThingDef.Named("Kibble"), Rand.Range(-20, 40)));   //NA
                //Food meals 2-4
                //AddThingsToContainerByTag(container, "", Rand.Range(0, 1)); //ResourcesRaw 1500 - 3000
                //AddThingsToContainerByTag(container, "", Rand.Range(0, 1)); //(2-8 kinds) FoodRaw 1600 - 5000
                //Animals Original - 2-4 types, 10-20 number, max wildness 0.70
                AddThingsToContainerByTag(container, "Drugs", Rand.Range(2, 4)); //Original 2-4 types, max price of 8000

                //Textiles - Original 2200 - 4000.
                //New Range - 270 - 1100
                container.AddRange(ThingsToAdd(CultsDefOf.BlocksSlate, Rand.Range(-100, 200)));
                container.AddRange(ThingsToAdd(CultsDefOf.BlocksLimestone, Rand.Range(-100, 200)));
                container.AddRange(ThingsToAdd(CultsDefOf.BlocksMarble, Rand.Range(-100, 200)));
                container.AddRange(ThingsToAdd(ThingDef.Named("BlocksGranite"), Rand.Range(-100, 200)));
                container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(-20, 20)));
                container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(-100, 200)));
            }
            //Exotic
            else
            {
                label = "LetterLabelForcedCrashExotic".Translate();
                text  = "ForcedCrashExotic".Translate();

                container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(50, 100)));            //Original 1500-3000
                container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(6, 20))); //Original 6-20
                container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-20, 5)));    //Original 6-20
                container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(10, 30)));           //Original 50-150
                container.AddRange(ThingsToAdd(ThingDefOf.Gold, Rand.Range(10, 20)));               //Original 100-300
                container.AddRange(ThingsToAdd(CultsDefOf.Neutroamine, Rand.Range(5, 20)));         //Original 25-100
                container.AddRange(ThingsToAdd(CultsDefOf.Penoxycyline, Rand.Range(-25, 25)));      //Original (0)
                container.AddRange(ThingsToAdd(ThingDef.Named("Telescope"), Rand.Range(-3, 2)));    //Original -2 - 2
                //AddThingsToContainerByTag(container, "Television", Rand.Range(-2, 2)); //Original -2~2
                AddThingsToContainerByTag(container, "BodyPartOrImplant", Rand.Range(1, 2));        //Original 2~4
                //AddThingsToContainerByTag(container, "StandardAnimal", Rand.Range(1, 2));  //Animals - Original 1-3 kinds, 2-6 number. Wildness 0.6
                AddThingsToContainerByTag(container, "Furniture",
                                          Rand.Range(0, 3));                         //Furniture - Original 0-3 kinds, -1-3 number
                AddThingsToContainerByTag(container, "Apparel", Rand.Range(1, 2));   //Original 1-2, 3-4 duplicates
                AddThingsToContainerByTag(container, "Artifact", Rand.Range(-2, 1)); //Original 1-1
                AddThingsToContainerByTag(container, "Drugs", Rand.Range(2, 4));     //Original 2-4
                AddThingsToContainerByTag(container, "Exotic", Rand.Range(1, 2));    //Original 2-4 kinds, 1-2
                //Art not included, due to crash.
            }


            //Misc ship crash pieces.
            container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100)));
            container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(10, 20)));
            container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-20, 5)));
            container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100)));

            //PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, ref label, pawn);

            Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.PositiveEvent, new TargetInfo(intVec, map));
            var adpInfo = new ActiveDropPodInfo();

            foreach (var thing in container)
            {
                adpInfo.innerContainer.TryAdd(thing);
            }

            DropPodUtility.MakeDropPodAt(intVec, map, adpInfo);
            Utility.ApplyTaleDef("Cults_SpellOrbitalInsanityWave", map);
            return(true);
        }
示例#13
0
        public static bool TryFindShipDropSpotNear(ShipBase ship, IntVec3 center, Map map, out IntVec3 result, bool allowFogged, bool canRoofPunch)
        {
            if (DebugViewSettings.drawDestSearch)
            {
                map.debugDrawer.FlashCell(center, 1f, "center");
            }

            Predicate <IntVec3> validatingExistingShips = (IntVec3 c) =>
            {
                Vector3      drawSize = ship.def.graphicData.drawSize;
                List <Thing> ships    = map.listerThings.AllThings.FindAll(x => x is ShipBase_Traveling || x is ShipBase);
                for (int i = 0; i < ships.Count; i++)
                {
                    if (ships[i].Position.InHorDistOf(c, Math.Max(drawSize.x, drawSize.z)))
                    {
                        return(false);
                    }
                }
                return(true);
            };


            Predicate <IntVec3> validator = (IntVec3 c) => validatingExistingShips(c) && DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) && map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly);
            int num = 5;

            while (!CellFinder.TryFindRandomCellNear(center, map, num, validator, out result))
            {
                num += 3;
                if (num > 29)
                {
                    result = center;
                    Log.Error("NoDropPoint found");
                    return(false);
                }
            }
            return(true);
        }
示例#14
0
        public override bool TryExecute(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }

            IntVec3 dropCenter;

            dropCenter = DropCellFinder.FindRaidDropCenterDistant(map);

            this.ResolveRaidStrategy(parms);
            this.ResolveRaidArriveMode(parms);
            this.ResolveRaidSpawnCenter(parms);
            IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo      target = new TargetInfo(dropCenter, map);
            List <ShipBase> ships  = DropShipUtility.CreateDropShips(list, parms.faction);

            DropShipUtility.DropShipGroups(dropCenter, map, ships, TravelingShipArrivalAction.EnterMapAssault);

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn current2 in list)
            {
                string str = (current2.equipment == null || current2.equipment.Primary == null) ? "unarmed" : current2.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(current2.KindLabel + " - " + str);
            }
            string letterLabel = this.GetLetterLabel(parms);
            string letterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString());
            if (this.GetLetterDef() == LetterDefOf.BadUrgent)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            this.ResolveRaidParmOptions(parms);
            Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list);

            //Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, true, true, true), map, list);
            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn pawn = list[i];
                    if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
            {
                Log.Message(string.Concat(new object[]
                {
                    "Market value threshold to start stealing: ",
                    StealAIUtility.StartStealingMarketValueThreshold(lord),
                    " (colony wealth = ",
                    map.wealthWatcher.WealthTotal,
                    ")"
                }));
            }
            return(true);
        }
示例#15
0
        public bool SendPawnBackToMap(Pawn pawn, Map map)
        {
            IntVec3 dropSpot        = IntVec3.Invalid;
            bool    dropSpotIsValid = false;

            // Check orbital relay is powered on.
            Building_OrbitalRelay orbitalRelay = Util_OrbitalRelay.GetOrbitalRelay(map);

            if (orbitalRelay == null)
            {
                return(false);
            }
            if (orbitalRelay.powerComp.PowerOn == false)
            {
                return(false);
            }
            // Look for an available landing pad.
            Building_LandingPad landingPad = Util_LandingPad.GetBestAvailableLandingPad(map);

            if (landingPad == null)
            {
                return(false);
            }
            // Get a nearby drop spot.
            dropSpotIsValid = DropCellFinder.TryFindDropSpotNear(landingPad.Position, map, out dropSpot, false, false);

            if (dropSpot.IsValid)
            {
                string hisHerIts = GenderUtility.GetPossessive(pawn.gender);
                string heSheIt   = GenderUtility.GetPronoun(pawn.gender);
                string himHerIt  = GenderUtility.GetObjective(pawn.gender);

                // Restore needs level.
                pawn.needs.SetInitialLevels();
                pawn.needs.roomsize.CurLevel = 0f; // Droppod is quite cramped.

                ActiveDropPodInfo dropPodInfo = new ActiveDropPodInfo();
                bool healingSuccessful        = (Rand.Value < 0.98f);
                if (healingSuccessful)
                {
                    string orbitalHealingSuccessfulText = "-- Comlink with MiningCo. --\n\n"
                                                          + "\"Healing of " + pawn.Name.ToStringShort + " is now finished. Everything went fine during the treatment.\n"
                                                          + "We just launched " + hisHerIts + " drop pod toward your colony.\n\n"
                                                          + "I hope you are satisfied of our services.\n\n"
                                                          + "MiningCo. medibay officer out.\"\n\n"
                                                          + "-- End of transmission --";
                    Find.LetterStack.ReceiveLetter("Orbital healing finished", orbitalHealingSuccessfulText, LetterDefOf.PositiveEvent, new TargetInfo(dropSpot, map));
                }
                else
                {
                    // Dying pawn with heart attack.
                    string orbitalHealingFailedText = "-- Comlink with MiningCo. --\n\n"
                                                      + "\"Though we did our best to heal " + pawn.Name.ToStringShort + ", it seems " + hisHerIts + " metabolism was disturbed by the last injection.\n\n"
                                                      + "I am affraid that we need to immediately send " + himHerIt + " back to you as our rules strictly forbid civilian bodies storage.\n\n"
                                                      + "Please accept those silvers as a compensation.\n\n"
                                                      + "MiningCo. medibay officer out.\"\n\n"
                                                      + "-- End of transmission --";
                    Find.LetterStack.ReceiveLetter("Orbital healing interrupted", orbitalHealingFailedText, LetterDefOf.NegativeEvent, new TargetInfo(dropSpot, map));
                    pawn.health.AddHediff(HediffDef.Named("HeartAttack"));
                    pawn.health.AddHediff(HediffDefOf.Anesthetic);
                    Thing compensation = ThingMaker.MakeThing(ThingDefOf.Silver);
                    compensation.stackCount = Mathf.RoundToInt(0.5f * Util_Spaceship.orbitalHealingCost);
                    dropPodInfo.innerContainer.TryAdd(compensation);
                }
                dropPodInfo.innerContainer.TryAdd(pawn);
                dropPodInfo.leaveSlag = true;
                DropPodUtility.MakeDropPodAt(dropSpot, map, dropPodInfo);
                return(true);
            }
            return(false);
        }
示例#16
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve(terraformerIndex));

            yield return(Toils_Goto.GotoCell(terraformerIndex, PathEndMode.InteractionCell).FailOnDestroyed(terraformerIndex));

            yield return(Toils_General.Wait(240).FailOnDestroyed(terraformerIndex));

            Toil scytherScoutsArrivalToil = new Toil()
            {
                initAction = () =>
                {
                    IntVec3     spawningCell;
                    List <Pawn> scytherScoutsList = new List <Pawn>();
                    for (int scytherIndex = 0; scytherIndex < 4; scytherIndex++)
                    {
                        bool validDropPodCellIsFound = DropCellFinder.TryFindDropSpotNear(this.TargetThingA.InteractionCell, out spawningCell, true, true);
                        if (validDropPodCellIsFound)
                        {
                            Faction faction      = Faction.OfMechanoids;
                            Pawn    scytherScout = PawnGenerator.GeneratePawn(PawnKindDef.Named("Scyther"), faction);
                            scytherScoutsList.Add(scytherScout);
                            DropPodUtility.MakeDropPodAt(spawningCell, new DropPodInfo
                            {
                                SingleContainedThing = scytherScout,
                                openDelay            = 600,
                                leaveSlag            = false
                            });
                        }
                    }
                    StateGraph stateGraph = GraphMaker.MechanoidsDefendShipGraph(this.TargetThingA, defensiveRadiusAroundTerraformer);
                    BrainMaker.MakeNewBrain(Faction.OfMechanoids, stateGraph, scytherScoutsList);
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            yield return(scytherScoutsArrivalToil);

            Toil pawnEscapingToil = new Toil()
            {
                initAction = () =>
                {
                    (this.TargetThingA as Building_MechanoidTerraformer).reverseEngineeringState = Building_MechanoidTerraformer.ReverseEngineeringState.BuildingNotSecured;

                    ThingRequest thingRequest = new ThingRequest();
                    thingRequest.singleDef = ThingDefOf.CommsConsole;
                    Thing commsConsole = GenClosest.ClosestThingReachable(pawn.Position, thingRequest, PathEndMode.InteractionCell, TraverseParms.For(pawn));
                    if (commsConsole != null)
                    {
                        pawn.pather.StartPath(commsConsole, PathEndMode.InteractionCell);
                    }
                    else
                    {
                        // The player has no comms console. He should move his colonist manually... and fast!
                        pawn.pather.StartPath(pawn.Position, PathEndMode.OnCell);
                    }

                    string herHimOrIt = "it";
                    string sheHeOrIt  = "it";
                    if (pawn.gender == Gender.Female)
                    {
                        herHimOrIt = "her";
                        sheHeOrIt  = "she";
                    }
                    else if (pawn.gender == Gender.Male)
                    {
                        herHimOrIt = "him";
                        sheHeOrIt  = "he";
                    }
                    string eventText = "   " + pawn.Name.ToStringShort + " is just arriving near the strange building when " + sheHeOrIt + " hears the loud noise of incoming drop pods.\n\n"
                                       + "You should better take " + herHimOrIt + " to safety... and fast!\n";
                    Find.LetterStack.ReceiveLetter("Drop pods", eventText, LetterType.BadUrgent, this.pawn.Position);
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            yield return(pawnEscapingToil);

            yield return(Toils_Reserve.Release(terraformerIndex));
        }
示例#17
0
 private void Arrived()
 {
     if (this.arrived)
     {
         return;
     }
     this.arrived = true;
     if (this.arrivalAction == null || !this.arrivalAction.StillValid(this.pods.Cast <IThingHolder>(), this.destinationTile))
     {
         this.arrivalAction = null;
         List <Map> maps = Find.Maps;
         for (int i = 0; i < maps.Count; i++)
         {
             if (maps[i].Tile == this.destinationTile)
             {
                 this.arrivalAction = new TransportPodsArrivalAction_LandInSpecificCell(maps[i].Parent, DropCellFinder.RandomDropSpot(maps[i]));
                 break;
             }
         }
         if (this.arrivalAction == null)
         {
             if (TransportPodsArrivalAction_FormCaravan.CanFormCaravanAt(this.pods.Cast <IThingHolder>(), this.destinationTile))
             {
                 this.arrivalAction = new TransportPodsArrivalAction_FormCaravan();
             }
             else
             {
                 List <Caravan> caravans = Find.WorldObjects.Caravans;
                 for (int j = 0; j < caravans.Count; j++)
                 {
                     if (caravans[j].Tile == this.destinationTile && TransportPodsArrivalAction_GiveToCaravan.CanGiveTo(this.pods.Cast <IThingHolder>(), caravans[j]))
                     {
                         this.arrivalAction = new TransportPodsArrivalAction_GiveToCaravan(caravans[j]);
                         break;
                     }
                 }
             }
         }
     }
     if (this.arrivalAction != null && this.arrivalAction.ShouldUseLongEvent(this.pods, this.destinationTile))
     {
         LongEventHandler.QueueLongEvent(delegate
         {
             this.DoArrivalAction();
         }, "GeneratingMapForNewEncounter", false, null);
     }
     else
     {
         this.DoArrivalAction();
     }
 }
示例#18
0
        public static void RequestVassalOptions(Faction faction, DiaNode diaNode1)
        {
            DiaNode vassalInfo = new DiaNode("FactionVasalageInfo".Translate(faction));

            vassalInfo.options.Add(new DiaOption("Disconnect".Translate())
            {
                resolveTree = true
            });

            DiaNode tributaryInfo = new DiaNode("FactionTributaryInfo".Translate(faction));

            tributaryInfo.options.Add(new DiaOption("\"" + "Disconnect".Translate() + "\"")
            {
                resolveTree = true
            });

            if (Utilities.FactionsWar().GetByFaction(faction).vassalage == 0)
            {
                DiaOption vassalage = new DiaOption("FactionVassalage".Translate())
                {
                    link = vassalInfo,

                    action = new Action(() =>
                    {
                        Utilities.FactionsWar().GetByFaction(faction).vassalage = 2;
                        faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Ally);
                    })
                };

                if (!Prefs.DevMode || faction.def.permanentEnemy || (Utilities.FactionsWar().GetByFaction(faction).resources < 2000 && Utilities.FactionsWar().GetByFaction(faction).resources >= Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal || Utilities.FactionsWar().GetByFaction(faction).resources / Math.Min(Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal, 10000) > 0.25f - Utilities.FactionsWar().GetByFaction(faction).disposition / 100))
                {
                    DiaOption vassalagediaOption = new DiaOption("FactionVassalage".Translate());
                    if (faction.def.permanentEnemy)
                    {
                        vassalagediaOption.Disable("FactionVassalageDisabledEnemy".Translate());
                    }
                    else
                    {
                        vassalagediaOption.Disable("FactionVassalageDisabled".Translate());
                    }
                    diaNode1.options.Add(vassalagediaOption);
                }
                else
                {
                    diaNode1.options.Add(vassalage);
                }

                DiaOption tribute = new DiaOption("FactionTributary".Translate())
                {
                    link = tributaryInfo,

                    action = new Action(() =>
                    {
                        Utilities.FactionsWar().GetByFaction(faction).vassalage = 1;
                        faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Neutral);
                    })
                };

                if (!Prefs.DevMode || faction.def.permanentEnemy || (Utilities.FactionsWar().GetByFaction(faction).resources < 3000 && Utilities.FactionsWar().GetByFaction(faction).resources >= Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal || Utilities.FactionsWar().GetByFaction(faction).resources / Math.Min(Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal, 10000) > 0.5f - Utilities.FactionsWar().GetByFaction(faction).disposition / 100))
                {
                    DiaOption tributarydiaOption = new DiaOption("FactionTributary".Translate());
                    if (faction.def.permanentEnemy)
                    {
                        tributarydiaOption.Disable("FactionTributaryDisabledEnemy".Translate());
                    }
                    else
                    {
                        tributarydiaOption.Disable("FactionTributaryDisabled".Translate());
                    }
                    diaNode1.options.Add(tributarydiaOption);
                }
                else
                {
                    diaNode1.options.Add(tribute);
                }
            }
            else if (Utilities.FactionsWar().GetByFaction(faction).vassalage == 2)
            {
                if (Find.TickManager.TicksGame > Utilities.FactionsWar().GetByFaction(faction).vassalageResourseCooldown)
                {
                    DiaOption vassalage = new DiaOption("FactionVassalDemandResources".Translate())
                    {
                        resolveTree = true,

                        action = new Action(() =>
                        {
                            if (!DefDatabase <ThingDef> .AllDefs.Where(x => x.CountAsResource && x.IsStuff && x.BaseMarketValue >= 5 && x.PlayerAcquirable && !x.CanHaveFaction).TryRandomElement(out ThingDef def))
                            {
                                Log.Error("No def found");
                                return;
                            }

                            Thing thing      = ThingMaker.MakeThing(def);
                            thing.stackCount = new IntRange(75, 100).RandomInRange;
                            DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(Find.AnyPlayerHomeMap), Find.AnyPlayerHomeMap, new List <Thing>()
                            {
                                thing
                            }, 110, false, false, false);
                            Utilities.FactionsWar().GetByFaction(faction).vassalageResourseCooldown = Find.TickManager.TicksGame + Global.DayInTicks * 3;
                        })
                    };
                    diaNode1.options.Add(vassalage);
                }
                else
                {
                    DiaOption vassalage = new DiaOption("FactionVassalDemandResources".Translate());
                    vassalage.Disable("FactionVassalDemandResourcesDisabled".Translate());
                    diaNode1.options.Add(vassalage);
                }
                if (faction.def.techLevel < TechLevel.Industrial)
                {
                    return;
                }
                RequestInvestmentsNode(faction, diaNode1);
            }
        }