Exemple #1
0
        protected List <Pawn> SpawnPawns(IncidentParms parms, int spawnPointSpread)
        {
            Map map = (Map)parms.target;

            if (parms.spawnRotation != Rot4.East)
            {
                if (Prefs.DevMode)
                {
                    Log.Message("[Carnivale] Spawn centre for CarnivalArrives was not precomputed. Resolving now.");
                }

                IntVec3 tempSpot = parms.spawnCenter;

                if (CarnCellFinder.BestCarnivalSpawnSpot(map, out tempSpot))
                {
                    parms.spawnCenter = tempSpot;
                }
                else if (Prefs.DevMode)
                {
                    Log.Warning("[Carnivale] Failed to resolve spawn center for CarnivalArrives. Defaulting.");
                }

                int feePerColonist = CarnUtils.CalculateFeePerColonist(parms.points);
                CarnUtils.Info.feePerColonist = -feePerColonist;
            }

            PawnGroupMakerParms defaultMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms);

            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(this.PawnGroupKindDef, defaultMakerParms, false).ToList();

            foreach (Pawn p in list)
            {
                IntVec3 spawnPoint = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, spawnPointSpread, null);
                GenSpawn.Spawn(p, spawnPoint, map);
            }

            parms.faction.leader.skills.GetSkill(SkillDefOf.Shooting).levelInt = 9;

            return(list);
        }
Exemple #2
0
        public override bool TryExecute(IncidentParms parms)
        {
            Map     map = (Map)parms.target;
            IntVec3 spawnSpot;
            int     durationDays = Mathf.RoundToInt(this.def.durationDays.RandomInRange);

            if (Prefs.DevMode)
            {
                Log.Message("[Carnivale] Calculating spawn centre:");
            }

            if (!CarnCellFinder.BestCarnivalSpawnSpot(map, out spawnSpot))
            {
                if (Prefs.DevMode)
                {
                    Log.Warning("[Carnivale] Tried to execute incident CarnivalApproaches, failed to find reachable spawn spot.");
                }
                return(false);
            }

            if (!FindCarnivalFaction(out parms.faction))
            {
                if (Prefs.DevMode)
                {
                    Log.Warning("[Carnivale] Tried to execute incident CarnivalApproaches, failed to find valid faction.");
                }
                return(false);
            }

            // Calculate fe
            int feePerColonist = CarnUtils.CalculateFeePerColonist(parms.points);

            // Main dialog node
            string  title       = "CarnivalApproachesTitle".Translate(parms.faction.Name);
            DiaNode initialNode = new DiaNode("CarnivalApproachesInitial".Translate(new object[]
            {
                parms.faction.Name,
                durationDays,
                feePerColonist + " " + ThingDefOf.Silver.label,
                map.info.parent.Label == "Colony" ? "your colony" : map.info.parent.Label
            }));

            // Accept button
            DiaOption acceptOption = new DiaOption("CarnivalApproachesAccept".Translate());

            acceptOption.action = delegate
            {
                // Do accept action
                parms.faction.AffectGoodwillWith(Faction.OfPlayer, acceptanceBonus);

                IncidentParms arrivalParms = StorytellerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentCategory.AllyArrival, map);
                //arrivalParms.forced = true; // forcing not necessary
                arrivalParms.faction     = parms.faction;
                arrivalParms.spawnCenter = spawnSpot;
                arrivalParms.points      = parms.points; // Do this?

                // This is so it can be determined that the spawnpoint was precomputed.
                Rot4 sneakyValueForSpawnpointResolved = Rot4.East;
                arrivalParms.spawnRotation = sneakyValueForSpawnpointResolved;

                // This is super cheaty, but there is no other field to pass this to.
                arrivalParms.raidPodOpenDelay = durationDays;
                // End cheaty.

                // Assign fee per colonist to CarnivalInfo
                CarnUtils.Info.feePerColonist = -feePerColonist;

                QueuedIncident qi = new QueuedIncident(new FiringIncident(_DefOf.CarnivalArrives, null, arrivalParms), Find.TickManager.TicksGame + GenDate.TicksPerDay);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            initialNode.options.Add(acceptOption);

            // Accept thank you message
            DiaNode acceptedMessage = new DiaNode("CarnivalApproachesAcceptMessage".Translate(new object[]
            {
                parms.faction.leader.Name.ToStringFull
            }));
            DiaOption ok = new DiaOption("OK".Translate());

            ok.resolveTree = true;
            acceptedMessage.options.Add(ok);
            acceptOption.link = acceptedMessage;

            // Reject button
            DiaOption rejectOption = new DiaOption("CarnivalApproachesReject".Translate());

            rejectOption.action = delegate
            {
                // Do reject action
                parms.faction.AffectGoodwillWith(Faction.OfPlayer, rejectionPenalty);
            };
            initialNode.options.Add(rejectOption);

            // Reject f**k you message (TODO: randomise response)
            DiaNode rejectedMessage = new DiaNode("CarnivalApproachesRejectMessage".Translate(new object[]
            {
                parms.faction.leader.Name.ToStringShort
            }));
            DiaOption hangup = new DiaOption("HangUp".Translate());

            hangup.resolveTree = true;
            rejectedMessage.options.Add(hangup);
            rejectOption.link = rejectedMessage;

            // Draw dialog
            Find.WindowStack.Add(new Dialog_NodeTree(initialNode, true, true, title));

            return(true);
        }