Inheritance: MonoBehaviour
Exemplo n.º 1
0
    private void MoveCaravan(Layer layer, Caravan caravan)
    {
        var d = layer.Sections[1].gameObject.transform.position.x * -1;
        Vector3 normal;
        float y;
        layer.Sections[1].GetAt(d, out normal, out y);
        caravan.Followers[0].SetPosition(new Vector3(0, layer.Sections[1].gameObject.transform.position.y + y, 0));
        caravan.Followers[0].SetRotation(new Vector3(0, 0, (float)(Mathf.Rad2Deg * Math.Atan2(normal.y, normal.x)) - 90));

        for (int i = 1; i < caravan.Followers.Count; i++)
        {
            var del = (layer.Sections[1].gameObject.transform.position.x * -1) - i * 1.5f;
            if (del >= 0)
            {
                d = del;
                layer.Sections[1].GetAt(d, out normal, out y);
                caravan.Followers[i].SetPosition(new Vector3(0 - i * 1.5f, layer.Sections[1].gameObject.transform.position.y + y, 0));
                caravan.Followers[i].SetRotation(new Vector3(0, 0,
                    (float) (Mathf.Rad2Deg*Math.Atan2(normal.y, normal.x)) - 90));
            }
            else
            {
                d = layer.SectionLength + del;
                layer.Sections[0].GetAt(d, out normal, out y);
                caravan.Followers[i].SetPosition(new Vector3(0 - i * 1.5f, layer.Sections[0].gameObject.transform.position.y + y, 0));
                caravan.Followers[i].SetRotation(new Vector3(0, 0,
                    (float) (Mathf.Rad2Deg*Math.Atan2(normal.y, normal.x)) - 90));
            }
        }
    }
Exemplo n.º 2
0
    void Start()
    {
        Random = new System.Random();
        Caravan = new Caravan();
        Layers = new List<Layer>();

        Layers.Add(new Layer(100, 200, 40, 20, 20, 0, Color.green, new Vector3(-0.2f, 0, 0)));
        Layers.Add(new Layer(50, 200, 20, 5, 25, 3, Color.yellow, new Vector3(-0.1f, 0, 0)));
        Layers.Add(new Layer(50, 200, 15, 15, 25, 5, Color.magenta, new Vector3(-0.05f, 0, 0)));
        Layers.Add(new Layer(25, 200, 50, 5, 7, 7, Color.gray, new Vector3(-0.005f, 0, 0)));
    }
 public static IEnumerable <FloatMenuOption> GetFloatMenuOptions(Caravan caravan, MapParent mapParent)
 {
     return(CaravanArrivalActionUtility.GetFloatMenuOptions(() => CanEnter(caravan, mapParent), () => new CaravanArrivalAction_VisitRealRuinsPOI(mapParent), "EnterMap".Translate(mapParent.Label), caravan, mapParent.Tile, mapParent));
 }
Exemplo n.º 4
0
    /*
     * Purpose:                Interact with caravan (Add and Remove Parts).
     * Effects:                Effects from AddToCaravan() and RemoveFromCaravan().
     * Input/Output:           Keyboard input "E" to add & "R" to remove. Output N/A.
     * Global Variables Used:  caravan_tf, part_slot_tf, caravan, char_control (Class InteractWithCaravan),
     *                      transform, parts_tf (Class Caravan), transform (Class Part), has_object (Class CharacterControl).
     */
    void OnTriggerStay(Collider c)
    {
        if (c.gameObject.tag == "Caravan")
        {
            canInteract = true;

            caravan_tf = c.gameObject.transform;

            caravan = caravan_tf.GetComponentInParent <Caravan>();

            health = caravan.GetComponent <Health>();

            if (Input.GetButtonDown(interact_botton_str) && gameObject.tag == "Player" && p_inv.CaravanPart != 0)
            {
                if (char_control.has_part)
                {
                    AddToCaravan();
                }
            }
            else if (Input.GetKeyDown(KeyCode.R))
            {
                if (gameObject.name == "Player_2")
                //if (!char_control.has_part)
                {
                    RemoveFromCaravan();
                }
            }

            /*
             * Purpose:                Temporary shop code
             * Effects:                Allows Player to buy equipment and bandages from the shop
             * Input/Output:           Keyboard input "T" to deposit wood, "Y" to buy a trap, "U" to buy bandages
             * Global Variables Used:  Player_Inventory.wood, Caravan_Inventory.wood, Player_Inventory.GP, Player_Inventory.Trap1 & Trap2,
             *                      Player_Inventory.Bandage, Caravan_Inventory.bandages
             */
            else if (Input.GetButtonDown(char_control.interact_botton_str) && p_inv.wood > 0)
            {
                if (p_inv.wood > 0)
                {
                    c_inv.wood  += p_inv.wood;
                    p_inv.Score += 3 * p_inv.wood;
                    p_inv.wood   = 0;
                }
            }
            else if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                if (p_inv.GP > 4 && c_inv.traps > 0)
                {
                    if (p_inv.Trap1 < 1)
                    {
                        p_inv.GP    = p_inv.GP - 5;
                        p_inv.Trap1 = 1;
                    }
                    else if (p_inv.Trap1 > 0 && p_inv.Trap2 < 1)
                    {
                        p_inv.GP    = p_inv.GP - 5;
                        p_inv.Trap2 = 1;
                    }
                    else if (p_inv.Trap1 > 0 && p_inv.Trap2 > 0)
                    {
                        Debug.Log("I'm sorry friend, but you're carrying too much right now");
                    }
                }
                else if (p_inv.GP < 5)
                {
                    Debug.Log("I'm sorry friend, but it looks like you're a little light on coin");
                }
                else if (c_inv.traps < 1)
                {
                    Debug.Log("I'm sorry friend, but it looks like I'm fresh out of stock");
                }
            }
            else if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                if (p_inv.GP > 0 && c_inv.bandages > 0)
                {
                    p_inv.GP       -= 1;
                    p_inv.Bandage  += 1;
                    c_inv.bandages -= 1;
                }
            }
        }
    }
Exemplo n.º 5
0
 private static CaravanJob CurJob(Caravan c)
 {
     return(Find.World.GetComponent <CaravanJobGiver>().CurJob(c));
 }
Exemplo n.º 6
0
 public static Show CaravanChoice(Caravan unit, City city) => new Show(new CaravanChoice(unit, city));
Exemplo n.º 7
0
 public static bool HasFuel(this Caravan caravan)
 {
     return(caravan.AllThings.Any((Thing thing) => thing.def == ThingDefOf.Chemfuel && thing.stackCount > 0));
 }
Exemplo n.º 8
0
 public CaravanJob CurJob(Caravan caravan)
 {
     NullHandler(caravan);
     //Log.Message("JecsTools :: CaravanJobGiver :: CurJob Called");
     return(jobTrackers.FirstOrDefault(x => x.Caravan == caravan).curJob);
 }
 public static float ApproxDaysWorthOfWater(Caravan caravan)
 {
     return(DaysWorthOfWaterCalculator.ApproxDaysWorthOfWater(caravan.PawnsListForReading, null, IgnorePawnsInventoryMode.DontIgnore));
 }
        public static void CheckVision(Pawn pawn)
        {
            // Basically a copy of the function in PawnObserver
            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Sight) || pawn.needs.mood == null)
            {
                return;
            }
            // caravans have some different management
            Caravan caravan = pawn.GetCaravan();

            if (caravan != null)
            {
                // inside caravan
                // see other
                foreach (Pawn potentialOther in caravan.PawnsListForReading)
                {
                    Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther);
                }
                // see dead
                foreach (Thing thing in CaravanInventoryUtility.AllInventoryItems(caravan))
                {
                    Corpse potentialCorpse = thing as Corpse;
                    if (potentialCorpse != null)
                    {
                        Pawn deadPawn = potentialCorpse.InnerPawn;
                        Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn);
                    }
                }
                return;
            }
            Map map = pawn.Map;

            if (map == null)
            {
                return;
            }
            MapPawns pawns        = pawn.Map.mapPawns;
            IntVec3  selfPosition = pawn.Position;

            // seen alive
            foreach (Pawn potentialOther in pawns.AllPawnsSpawned)
            {
                if (GenSight.LineOfSight(selfPosition, potentialOther.Position, map, skipFirstCell: true))
                {
                    // can see!
                    float distanceSq = selfPosition.DistanceToSquared(potentialOther.Position);
                    if (distanceSq > 25)
                    {
                        // distance radius > 5, excluded
                        continue;
                    }
                    Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther);
                }
            }
            // seen corpse
            for (int i = 0; (float)i < 100f; i++)
            {
                IntVec3 intVec = pawn.Position + GenRadial.RadialPattern[i];
                if (!intVec.InBounds(map) || !GenSight.LineOfSight(intVec, pawn.Position, map, skipFirstCell: true))
                {
                    continue;
                }
                List <Thing> thingList = intVec.GetThingList(map);
                for (int j = 0; j < thingList.Count; j++)
                {
                    Corpse potentialCorpse = thingList[j] as Corpse;
                    if (potentialCorpse != null)
                    {
                        Pawn deadPawn = potentialCorpse.InnerPawn;
                        Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn);
                    }
                }
            }
            // tick the stuff
            Find.World.GetComponent <FriendshipMemoryGlobalTracker>().GetFriendshipMemoryTrackerForSubject(pawn)?.Notify_TickOnce(TickIntervalVision);
        }
Exemplo n.º 11
0
 public CaravanBattlePlacePlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize)
 {
     this.caravanAI     = caravanAI;
     this.playerCaravan = playerCaravan;
     MapSize            = mapSize;
 }
Exemplo n.º 12
0
        protected override string GetLetterText(Pawn anyPawn, IncidentParms parms)
        {
            Caravan caravan = parms.target as Caravan;

            return(string.Format(this.def.letterText, (caravan == null) ? "yourCaravan".Translate() : caravan.Name, parms.faction.def.pawnsPlural, parms.faction.Name).CapitalizeFirst());
        }
Exemplo n.º 13
0
        /*
         * Based on the Caravan's resources, Pawns & the road's cost (modified by terrain) :
         * - Determine the amount of work done in a tick
         * - Consume the caravan's resources
         * - Return whether or not the Caravan must now stop because it ran out of resources
         * - NOTE : Does this need to be here ? Maybe better in Mod.cs
         * Returns TRUE if work finished
         * CALLED FROM : CompTick() of WorldObjectComp_Caravan
         */
        public static bool DoSomeWork(Caravan caravan, RoadConstructionSite site, out bool noMoreResources)
        {
            var caravanComp = caravan.GetComponent <WorldObjectComp_Caravan>();
            var siteComp    = site.GetComponent <WorldObjectComp_ConstructionSite>();

            _ = site.roadDef.GetModExtension <DefModExtension_RotR_RoadDef>();
            noMoreResources = false;
            var   useISR2G    = caravanComp.UseISR2G();
            var   available   = new Dictionary <string, int>();
            var   needed      = new Dictionary <string, int>();
            var   ratio       = new Dictionary <string, float>();
            float ratio_final = 1;

            //RoadsOfTheRim.DebugLog("[RotR] DEBUG ========== doSomeWork() ==========");
            //RoadsOfTheRim.DebugLog("[RotR] DEBUG ISR2G set to "+useISR2G);

            if (DebugSettings.godMode)
            {
                return(siteComp.FinishWork(caravan));
            }

            if (caravanComp.CaravanCurrentState() != CaravanState.ReadyToWork)
            {
                DebugLog("[RotR] DEBUG : doSomeWork() failed because the caravan can't work.");
                return(false);
            }

            // Percentage of total work that can be done in this batch, might be 0 if no pawn was found with enough skill
            var amountOfWork = caravanComp.AmountOfWork(true);

            // Work was 0 (not enough skill)
            if (Math.Abs(amountOfWork) < double.Epsilon)
            {
                Messages.Message("RoadsOfTheRim_CaravanNoWork".Translate(caravan.Name, site.roadDef.label),
                                 MessageTypeDefOf.RejectInput);
                caravanComp.StopWorking();
                return(false);
            }

            // calculate material present in the caravan
            foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources)
            {
                available[resourceName] = 0;
            }

            foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan))
            {
                foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources)
                {
                    if (IsThis(aThing.def, resourceName))
                    {
                        available[resourceName] += aThing.stackCount;
                    }
                }
            }

            // What percentage of work will remain after amountOfWork is done ?
            var percentOfWorkLeftToDoAfter = (siteComp.GetLeft("Work") - amountOfWork) / siteComp.GetCost("Work");

            // The amount of each resource left to spend in total is : percentOfWorkLeftToDoAfter * {this resource cost}
            // Materials that would be needed to do that much work
            foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources)
            {
                needed[resourceName] = (int)Math.Round(siteComp.GetLeft(resourceName) -
                                                       (percentOfWorkLeftToDoAfter * siteComp.GetCost(resourceName)));
                // Check if there's enough material to go through this batch. Materials with a cost of 0 are always OK
                // Don't check when ISR2G is in use for this resource, don't check for work
                if (DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G) || resourceName == "Work")
                {
                    continue;
                }

                ratio[resourceName] = needed[resourceName] == 0
                    ? 1f
                    : Math.Min(available[resourceName] / (float)needed[resourceName], 1f);
                if (ratio[resourceName] < ratio_final)
                {
                    ratio_final = ratio[resourceName];
                }
            }

            // The caravan didn't have enough resources for a full batch of work. Use as much as we can then stop working
            if (ratio_final < 1f)
            {
                Messages.Message("RoadsOfTheRim_CaravanNoResource".Translate(caravan.Name, site.roadDef.label),
                                 MessageTypeDefOf.RejectInput);
                foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources)
                {
                    needed[resourceName] = (int)(needed[resourceName] * ratio_final);
                }

                caravanComp.StopWorking();
            }
            //RoadsOfTheRim.DebugLog("[RotR] ISR2G DEBUG ratio final = " + ratio_final);

            // Consume resources from the caravan
            _ = site.roadDef.defName ==
                "DirtPathBuilt"; // Always consider resources have been consumed when the road is a dirt path
            foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan))
            {
                foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources)
                {
                    if (!DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G))
                    {
                        if (needed[resourceName] <= 0 || !IsThis(aThing.def, resourceName))
                        {
                            continue;
                            //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty consumed = " + amountUsed);
                        }

                        var amountUsed = aThing.stackCount > needed[resourceName]
                            ? needed[resourceName]
                            : aThing.stackCount;
                        aThing.stackCount -= amountUsed;
                        // Reduce how much of this resource is needed
                        needed[resourceName] -= amountUsed;
                        siteComp.ReduceLeft(resourceName, amountUsed);
                    }
                    else
                    {
                        if (needed[resourceName] <= 0)
                        {
                            continue;
                        }

                        //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty freely awarded = " + needed[resourceName]);
                        siteComp.ReduceLeft(resourceName, needed[resourceName]);
                        needed[resourceName] = 0;
                    }
                }

                if (aThing.stackCount == 0)
                {
                    aThing.Destroy();
                }
            }

            caravanComp.TeachPawns(ratio_final); // Pawns learn some construction
            // HARDCODED : ISR2G divides work done by 4 , AISR2G by 2 for all roads except dirt path
            if (useISR2G > 0 && site.roadDef.defName != "DirtPathBuilt")
            {
                amountOfWork = amountOfWork * 0.25f * useISR2G;
            }

            // Update amountOfWork based on the actual ratio worked & finally reducing the work & resources left
            amountOfWork = ratio_final * amountOfWork;
            return(siteComp.UpdateProgress(amountOfWork, caravan));
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            parms.points *= 1.5f;
            Caravan caravan = (Caravan)parms.target;
            bool    result;

            if (!PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(parms.points, out parms.faction, null, false, false, false, true))
            {
                result = false;
            }
            else
            {
                PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, false);
                defaultPawnGroupMakerParms.generateFightersOnly            = true;
                defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true;
                List <Pawn> attackers = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
                if (attackers.Count == 0)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Caravan demand incident couldn't generate any enemies even though min points have been checked. faction=",
                        defaultPawnGroupMakerParms.faction,
                        "(",
                        (defaultPawnGroupMakerParms.faction == null) ? "null" : defaultPawnGroupMakerParms.faction.def.ToString(),
                        ") parms=",
                        parms
                    }), false);
                    result = false;
                }
                else
                {
                    List <Thing> demands = this.GenerateDemands(caravan);
                    if (demands.Count == 0)
                    {
                        result = false;
                    }
                    else
                    {
                        CameraJumper.TryJumpAndSelect(caravan);
                        DiaNode   diaNode   = new DiaNode(this.GenerateMessageText(parms.faction, attackers.Count, demands, caravan));
                        DiaOption diaOption = new DiaOption("CaravanDemand_Give".Translate());
                        diaOption.action = delegate()
                        {
                            this.ActionGive(caravan, demands, attackers);
                        };
                        diaOption.resolveTree = true;
                        diaNode.options.Add(diaOption);
                        DiaOption diaOption2 = new DiaOption("CaravanDemand_Fight".Translate());
                        diaOption2.action = delegate()
                        {
                            this.ActionFight(caravan, attackers);
                        };
                        diaOption2.resolveTree = true;
                        diaNode.options.Add(diaOption2);
                        string text = "CaravanDemandTitle".Translate(new object[]
                        {
                            parms.faction.Name
                        });
                        WindowStack windowStack        = Find.WindowStack;
                        DiaNode     nodeRoot           = diaNode;
                        Faction     faction            = parms.faction;
                        bool        delayInteractivity = true;
                        string      title = text;
                        windowStack.Add(new Dialog_NodeTreeWithFactionInfo(nodeRoot, faction, delayInteractivity, false, title));
                        Find.Archive.Add(new ArchivedDialog(diaNode.text, text, parms.faction));
                        result = true;
                    }
                }
            }
            return(result);
        }
 private string GenerateMessageText(Faction enemyFaction, int attackerCount, List <Thing> demands, Caravan caravan)
 {
     return("CaravanDemand".Translate(new object[]
     {
         caravan.Name,
         enemyFaction.Name,
         attackerCount,
         GenLabel.ThingsLabel(demands),
         enemyFaction.def.pawnsPlural
     }).CapitalizeFirst());
 }
Exemplo n.º 16
0
 public override IEnumerable <Gizmo> GetCaravanGizmos(Caravan caravan)
 {
     return(base.GetCaravanGizmos(caravan: caravan));
 }
Exemplo n.º 17
0
 public Order(int vicPoint, Caravan value)
 {
     victoryPoint = vicPoint;
     requiredGems = value;
 }
Exemplo n.º 18
0
 // Token: 0x06000048 RID: 72 RVA: 0x0000509D File Offset: 0x0000329D
 public static void PawnOnCaravanTakeDrug(Caravan caravan, Pawn pawn, Thing drug, Pawn owner)
 {
     caravan.needs.IngestDrug(pawn, drug, owner);
 }
Exemplo n.º 19
0
        internal static void CityProduction(City city)
        {
            if (city == null || city.Size == 0 || city.Tile == null)
            {
                return;
            }

            Player      player     = Game.GetPlayer(city.Owner);
            IProduction production = null;

            // Create 2 defensive units per city
            if (player.HasAdvance <LaborUnion>())
            {
                if (city.Tile.Units.Count(x => x is MechInf) < 2)
                {
                    production = new MechInf();
                }
            }
            else if (player.HasAdvance <Conscription>())
            {
                if (city.Tile.Units.Count(x => x is Riflemen) < 2)
                {
                    production = new Riflemen();
                }
            }
            else if (player.HasAdvance <Gunpowder>())
            {
                if (city.Tile.Units.Count(x => x is Musketeers) < 2)
                {
                    production = new Musketeers();
                }
            }
            else if (player.HasAdvance <BronzeWorking>())
            {
                if (city.Tile.Units.Count(x => x is BronzeWorking) < 2)
                {
                    production = new Phalanx();
                }
            }
            else
            {
                if (city.Tile.Units.Count(x => x is Militia) < 2)
                {
                    production = new Militia();
                }
            }

            // Create city improvements
            if (production == null)
            {
                if (!city.HasBuilding <Barracks>())
                {
                    production = new Barracks();
                }
                else if (player.HasAdvance <Pottery>() && !city.HasBuilding <Granary>())
                {
                    production = new Granary();
                }
                else if (player.HasAdvance <CeremonialBurial>() && !city.HasBuilding <Temple>())
                {
                    production = new Temple();
                }
                else if (player.HasAdvance <Masonry>() && !city.HasBuilding <CityWalls>())
                {
                    production = new CityWalls();
                }
            }

            // Create Settlers
            if (production == null)
            {
                if (city.Size > 4 && !city.Units.Any(x => x is Settlers) && player.Cities.Length < 10)
                {
                    production = new Settlers();
                }
            }

            // Create some other unit
            if (production == null)
            {
                if (city.Units.Length < 4)
                {
                    if (player.Government is Republic || player.Government is Democratic)
                    {
                        if (player.HasAdvance <Writing>())
                        {
                            production = new Diplomat();
                        }
                    }
                    else
                    {
                        if (player.HasAdvance <Automobile>())
                        {
                            production = new Armor();
                        }
                        else if (player.HasAdvance <Metallurgy>())
                        {
                            production = new Cannon();
                        }
                        else if (player.HasAdvance <Chivalry>())
                        {
                            production = new Knights();
                        }
                        else if (player.HasAdvance <TheWheel>())
                        {
                            production = new Chariot();
                        }
                        else if (player.HasAdvance <HorsebackRiding>())
                        {
                            production = new Cavalry();
                        }
                        else if (player.HasAdvance <IronWorking>())
                        {
                            production = new Legion();
                        }
                    }
                }
                else
                {
                    if (player.HasAdvance <Trade>())
                    {
                        production = new Caravan();
                    }
                }
            }

            // Set random production
            if (production == null)
            {
                IProduction[] items = city.AvailableProduction.ToArray();
                production = items[Common.Random.Next(items.Length)];
            }

            city.SetProduction(production);
        }
        public static IEnumerable <FloatMenuOption> GetFloatMenuOptions <T>(Func <FloatMenuAcceptanceReport> acceptanceReportGetter, Func <T> arrivalActionGetter, string label, CompLaunchableSRTS representative, int destinationTile, Caravan car) where T : TransportPodsArrivalAction
        {
            FloatMenuAcceptanceReport rep = acceptanceReportGetter();

            if (rep.Accepted || !rep.FailReason.NullOrEmpty() || !rep.FailMessage.NullOrEmpty())
            {
                if (!rep.FailReason.NullOrEmpty())
                {
                    yield return(new FloatMenuOption(label + " (" + rep.FailReason + ")", null));
                }
                else
                {
                    yield return(new FloatMenuOption(label, (Action)(() =>
                    {
                        FloatMenuAcceptanceReport acceptanceReport = acceptanceReportGetter();
                        if (acceptanceReport.Accepted)
                        {
                            representative.TryLaunch(destinationTile, (TransportPodsArrivalAction)arrivalActionGetter(), car);
                        }
                        else
                        {
                            if (acceptanceReport.FailMessage.NullOrEmpty())
                            {
                                return;
                            }
                            Messages.Message(acceptanceReport.FailMessage, (LookTargets) new GlobalTargetInfo(destinationTile), MessageTypeDefOf.RejectInput, false);
                        }
                    })));
                }
            }
        }
Exemplo n.º 21
0
        protected override bool TryCastShot()
        {
            bool result = false;
            CompAbilityUserMagic comp = this.CasterPawn.GetComp <CompAbilityUserMagic>();
            Pawn soulPawn             = comp.soulBondPawn;

            if (soulPawn != null && !soulPawn.Dead && !soulPawn.Destroyed)
            {
                if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
                {
                    ModCheck.GiddyUp.ForceDismount(soulPawn);
                }
                bool drafted         = soulPawn.Drafted;
                bool soulPawnSpawned = soulPawn.Spawned;
                Map  map             = soulPawn.Map;
                if (map == null)
                {
                    Hediff bondHediff = soulPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("TM_SoulBondPhysicalHD"), false);
                    if (bondHediff != null)
                    {
                        HediffComp_SoulBondHost compS = bondHediff.TryGetComp <HediffComp_SoulBondHost>();
                        if (compS != null && compS.polyHost != null && !compS.polyHost.DestroyedOrNull() && !compS.polyHost.Dead)
                        {
                            soulPawnSpawned = true;
                            soulPawn        = compS.polyHost;
                        }
                    }

                    bondHediff = soulPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("TM_SoulBondMentalHD"), false);
                    if (bondHediff != null)
                    {
                        HediffComp_SoulBondHost compS = bondHediff.TryGetComp <HediffComp_SoulBondHost>();
                        if (compS != null && compS.polyHost != null && !compS.polyHost.DestroyedOrNull() && !compS.polyHost.Dead)
                        {
                            soulPawnSpawned = true;
                            soulPawn        = compS.polyHost;
                        }
                    }
                    if (soulPawn.ParentHolder != null && soulPawn.ParentHolder is Caravan)
                    {
                        //Log.Message("caravan detected");
                        //p.DeSpawn();
                        Caravan van = soulPawn.ParentHolder as Caravan;
                        van.RemovePawn(soulPawn);
                        GenPlace.TryPlaceThing(soulPawn, this.CasterPawn.Position, this.CasterPawn.Map, ThingPlaceMode.Near);
                        if (van.PawnsListForReading != null && van.PawnsListForReading.Count <= 0)
                        {
                            CaravanEnterMapUtility.Enter(van, this.CasterPawn.Map, CaravanEnterMode.Center, CaravanDropInventoryMode.DropInstantly, false);
                        }

                        //Messages.Message("" + p.LabelShort + " has shadow stepped to a caravan with " + soulPawn.LabelShort, MessageTypeDefOf.NeutralEvent);
                        goto fin;
                    }
                }
                IntVec3 casterCell = this.CasterPawn.Position;
                IntVec3 targetCell = soulPawn.Position;
                if (soulPawnSpawned)
                {
                    try
                    {
                        soulPawn.DeSpawn();
                        GenSpawn.Spawn(soulPawn, casterCell, this.CasterPawn.Map);
                        if (drafted)
                        {
                            soulPawn.drafter.Drafted = true;
                        }
                    }
                    catch
                    {
                        Log.Message("Exception occured when trying to summon soul bound pawn - recovered pawn at original position");
                        GenSpawn.Spawn(soulPawn, targetCell, map);
                    }
                }
                else
                {
                    Messages.Message("TM_BondedPawnNotSpawned".Translate(
                                         soulPawn.LabelShort), MessageTypeDefOf.RejectInput);
                }
                //this.Ability.PostAbilityAttempt();
                result = true;
            }
            else
            {
                Log.Warning("No soul bond found to shadow call.");
            }
            fin :;
            this.burstShotsLeft = 0;
            //this.ability.TicksUntilCasting = (int)base.UseAbilityProps.SecondsToRecharge * 60;
            return(result);
        }
        public static IEnumerable <FloatMenuOption> GetATKFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car)
        {
            Func <FloatMenuAcceptanceReport> acceptanceReportGetter1 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement));
            Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter1 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.EdgeDrop));

            foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter1, arrivalActionGetter1, "AttackAndDropAtEdge".Translate(settlement.Label), representative, settlement.Tile, car))
            {
                FloatMenuOption f = floatMenuOption;
                yield return(f);

                f = null;
            }
            Func <FloatMenuAcceptanceReport> acceptanceReportGetter2 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement));
            Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter2 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.CenterDrop));

            foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter2, arrivalActionGetter2, "AttackAndDropInCenter".Translate(settlement.Label), representative, settlement.Tile, car))
            {
                FloatMenuOption f2 = floatMenuOption;
                yield return(f2);

                f2 = null;
            }
        }
Exemplo n.º 23
0
 private static Caravan_JobTracker CurTracker(Caravan c)
 {
     return(Find.World.GetComponent <CaravanJobGiver>().Tracker(c));
 }
 public static IEnumerable <FloatMenuOption> GetGIFTFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car)
 {
     if (settlement.Faction == Faction.OfPlayer)
     {
         return(Enumerable.Empty <FloatMenuOption>());
     }
     return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_GiveGift>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_GiveGift.CanGiveGiftTo(pods, settlement)), (Func <TransportPodsArrivalAction_GiveGift>)(() => new TransportPodsArrivalAction_GiveGift(settlement)), "GiveGiftViaTransportPods".Translate(settlement.Faction.Name, FactionGiftUtility.GetGoodwillChange(pods, settlement).ToStringWithSign()), representative, settlement.Tile, car));
 }
Exemplo n.º 25
0
 void Start()
 {
     char_control = GetComponent <Character_interaction>();
     caravan      = GameObject.FindGameObjectWithTag("Caravan").GetComponent <Caravan>();
     p_inv        = GetComponent <Player_Inventory>();
 }
 public static IEnumerable <FloatMenuOption> GetVisitFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car)
 {
     return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_VisitSettlement>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_VisitSettlement.CanVisit(pods, settlement)), (Func <TransportPodsArrivalAction_VisitSettlement>)(() => new TransportPodsArrivalAction_VisitSettlement(settlement)), "VisitSettlement".Translate(settlement.Label), representative, settlement.Tile, car));
 }
 public static FloatMenuAcceptanceReport CanEnter(Caravan caravan, MapParent mapParent)
 {
     //worldObject.GetComponent<EnterCooldownComp>()?.DaysLeft ?? 0f add message
     return(!(mapParent.GetComponent <EnterCooldownComp>()?.BlocksEntering ?? false));
 }
Exemplo n.º 28
0
        private static bool AnyPawnOutOfWater(Caravan c, out string worstDehydrationText)
        {
            // キャラバンの全所持品の水アイテムリスト作成
            var tmpInvWater = CaravanInventoryUtility.AllInventoryItems(c).FindAll(t => t.CanGetWater());

            var allFoundWaterItem = true;

            // キャラバン内の全ポーンをチェック
            foreach (var pawn in c.PawnsListForReading)
            {
                // 水分要求なし→水不要
                if (pawn.needs.Water() == null)
                {
                    continue;
                }

                // 心情ステータス無し、キャラバンの地形に水がある→アイテムがなくても水は飲める
                if (pawn.needs.mood == null && c.GetWaterTerrainType() != WaterTerrainType.NoWater)
                {
                    continue;
                }

                // そのポーンが飲める水があるなら良し
                if (tmpInvWater.Exists(t => CanEverGetWater(t.def)))
                {
                    continue;
                }

                // 適切な水アイテムを見つけられなかったポーンがいる
                allFoundWaterItem = false;
                break;
            }

            if (allFoundWaterItem)
            {
                // 全ポーンが水アイテムを見つけた
                // →脱水症状のテキストは不要
                worstDehydrationText = null;
                return(false);
            }

            // 適切なアイテムを見つけられなかったポーンがいる
            // →全ポーンの脱水症状をチェックして最悪の状態を調査、そのテキストを取得
            var    maxHediffStageIndex = -1;
            string maxHediffText       = null;

            foreach (var pawn in c.PawnsListForReading)
            {
                // 脱水症状の健康状態を持っているか
                var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(MizuDef.Hediff_Dehydration);
                if (hediff == null)
                {
                    continue;
                }

                if (maxHediffText != null && maxHediffStageIndex >= hediff.CurStageIndex)
                {
                    continue;
                }

                // 最悪状態なら更新
                maxHediffStageIndex = hediff.CurStageIndex;
                maxHediffText       = hediff.LabelCap;
            }

            // 最悪の脱水症状テキストを返す
            worstDehydrationText = maxHediffText;
            return(true);
        }
Exemplo n.º 29
0
 public ShuttleSenderCaravan(int Tile, Caravan caravan, WorldSettlementFC settlementFC) : base(Tile, settlementFC)
 {
     this.caravan = caravan;
 }
Exemplo n.º 30
0
 private static bool HasPowerUsers(Caravan caravan)
 {
     return(caravan.pawns.Any <Pawn>(PartUtility.HasPoweredParts));
 }
Exemplo n.º 31
0
        private static bool Prefix(Pawn_HealthTracker __instance, DamageInfo?dinfo, Hediff hediff, Caravan caravan)
        {
            Pawn value = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();
            bool flag  = value.kindDef == MOARANDROIDS.PawnKindDefOf.MicroScyther;

            return(!flag);
        }
Exemplo n.º 32
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            bool result;

            if (parms.target is Map)
            {
                result = IncidentDefOf.TravelerGroup.Worker.TryExecute(parms);
            }
            else
            {
                Caravan caravan = (Caravan)parms.target;
                Faction faction;
                if (!this.TryFindFaction(out faction))
                {
                    result = false;
                }
                else
                {
                    CameraJumper.TryJumpAndSelect(caravan);
                    List <Pawn> pawns      = this.GenerateCaravanPawns(faction);
                    Caravan     metCaravan = CaravanMaker.MakeCaravan(pawns, faction, -1, false);
                    string      text       = "CaravanMeeting".Translate(new object[]
                    {
                        caravan.Name,
                        faction.Name,
                        PawnUtility.PawnKindsToCommaList(metCaravan.PawnsListForReading, true)
                    }).CapitalizeFirst();
                    DiaNode diaNode = new DiaNode(text);
                    Pawn    bestPlayerNegotiator = BestCaravanPawnUtility.FindBestNegotiator(caravan);
                    if (metCaravan.CanTradeNow)
                    {
                        DiaOption diaOption = new DiaOption("CaravanMeeting_Trade".Translate());
                        diaOption.action = delegate()
                        {
                            Find.WindowStack.Add(new Dialog_Trade(bestPlayerNegotiator, metCaravan, false));
                            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(metCaravan.Goods.OfType <Pawn>(), "LetterRelatedPawnsTradingWithOtherCaravan".Translate(new object[]
                            {
                                Faction.OfPlayer.def.pawnsPlural
                            }), LetterDefOf.NeutralEvent, false, true);
                        };
                        if (bestPlayerNegotiator == null)
                        {
                            diaOption.Disable("CaravanMeeting_TradeIncapable".Translate());
                        }
                        diaNode.options.Add(diaOption);
                    }
                    DiaOption diaOption2 = new DiaOption("CaravanMeeting_Attack".Translate());
                    diaOption2.action = delegate()
                    {
                        LongEventHandler.QueueLongEvent(delegate()
                        {
                            Pawn t                   = caravan.PawnsListForReading[0];
                            Faction faction2         = faction;
                            Faction ofPlayer         = Faction.OfPlayer;
                            FactionRelationKind kind = FactionRelationKind.Hostile;
                            string reason            = "GoodwillChangedReason_AttackedCaravan".Translate();
                            faction2.TrySetRelationKind(ofPlayer, kind, true, reason, new GlobalTargetInfo?(t));
                            Map map = CaravanIncidentUtility.GetOrGenerateMapForIncident(caravan, new IntVec3(100, 1, 100), WorldObjectDefOf.AttackedNonPlayerCaravan);
                            IntVec3 playerSpot;
                            IntVec3 enemySpot;
                            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out playerSpot, out enemySpot);
                            CaravanEnterMapUtility.Enter(caravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(playerSpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, true);
                            List <Pawn> list = metCaravan.PawnsListForReading.ToList <Pawn>();
                            CaravanEnterMapUtility.Enter(metCaravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(enemySpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, false);
                            LordMaker.MakeNewLord(faction, new LordJob_DefendAttackedTraderCaravan(list[0].Position), map, list);
                            Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
                            CameraJumper.TryJumpAndSelect(t);
                            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(list, "LetterRelatedPawnsGroupGeneric".Translate(new object[]
                            {
                                Faction.OfPlayer.def.pawnsPlural
                            }), LetterDefOf.NeutralEvent, true, true);
                        }, "GeneratingMapForNewEncounter", false, null);
                    };
                    diaOption2.resolveTree = true;
                    diaNode.options.Add(diaOption2);
                    DiaOption diaOption3 = new DiaOption("CaravanMeeting_MoveOn".Translate());
                    diaOption3.action = delegate()
                    {
                        this.RemoveAllPawnsAndPassToWorld(metCaravan);
                    };
                    diaOption3.resolveTree = true;
                    diaNode.options.Add(diaOption3);
                    string text2 = "CaravanMeetingTitle".Translate(new object[]
                    {
                        caravan.Label
                    });
                    WindowStack windowStack        = Find.WindowStack;
                    DiaNode     nodeRoot           = diaNode;
                    Faction     faction3           = faction;
                    bool        delayInteractivity = true;
                    string      title = text2;
                    windowStack.Add(new Dialog_NodeTreeWithFactionInfo(nodeRoot, faction3, delayInteractivity, false, title));
                    Find.Archive.Add(new ArchivedDialog(diaNode.text, text2, faction));
                    result = true;
                }
            }
            return(result);
        }