private void CaravanDelivery()
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction   = SignedFaction.Faction,
                groupKind = PawnGroupKindDefOf.Trader,
                points    = Rand.Range(300, 1000),
                tile      = Settlement.Tile
            };

            Caravan = CaravanAIMaker.MakeCaravan(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms), SignedFaction.Faction, Settlement.Tile, true, CaravanAIMaker.GetCaravanColor(SignedFaction.Faction, Faction.OfPlayer), true, true);
            TryGetRandomPawnGroupMaker(pawnGroupMakerParms, out PawnGroupMaker maker);

            foreach (var p in Caravan.PawnsListForReading)
            {
                p.inventory.innerContainer.Clear();
            }

            GenerateCarriers(pawnGroupMakerParms, maker, Items, Caravan);

            Items.ForEach(item =>
            {
                if (item is Pawn p)
                {
                    Find.WorldPawns.PassToWorld(p);
                    Caravan.AddPawn(p, false);
                }
            });
            Items.Clear();

            Caravan.pather.StartPath(DestinationMap.Tile, new CaravanArrivalAction_AIEnterCaravan(DestinationMap.Parent));

            Find.LetterStack.ReceiveLetter("TradeSchedulingAgreementComp_CaravanFormedTitle".Translate(), "TradeSchedulingAgreementComp_CaravanFormedDesc".Translate(), LetterDefOf.PositiveEvent, new LookTargets(Caravan));
        }
        public void GoBackToHome(Caravan caravan)
        {
            CaravanAI caravanAI = caravan as CaravanAI;

            if (caravanAI != null && caravanAI.Home != null)
            {
                caravanAI.AddQueueAction(new CaravanArrivalAction_AIBackToHome(caravanAI.Home), caravanAI.Home.Tile);
            }
            else
            {
                Find.WorldObjects.Remove(caravan);
            }
        }
        public void DoWinAttackers(Caravan caravan, float defendersPoints)
        {
            Find.WorldObjects.Remove(mapParent);

            CaravanAI caravanAI = caravan as CaravanAI;

            float damagePer100Power = defendersPoints / 100;

            AI.CaravanUtility.KillRandomPawns(caravan, damagePer100Power);

            AffectDepletionFromWar(caravan.Faction, (defendersPoints * DepletionMultiplier) * 0.6f, mapParent.Faction, defendersPoints * DepletionMultiplier);

            AI.CaravanUtility.CheckIfCaravanOverWeight(caravan);

            GoBackToHome(caravan);
        }
        protected override bool GiveWorkerTo(FactionArmy army, War war)
        {
            List <FactionInteraction> enemyis = war.GetEnemyList(army.Faction);

            if (enemyis != null)
            {
                if (Find.WorldObjects.Settlements.Where(x => x.Faction == army.Faction.Faction).TryRandomElement(out Settlement yourSettlement))
                {
                    //Settlement target = null;
                    //Observable.Start(() => TryFindEnemySettlement(yourSettlement, enemyis, out target)).ObserveOnMainThread().Subscribe(hasSettlement =>
                    //{
                    //    if (hasSettlement)
                    //    {
                    //        bool showCaravanInfo = (war.DeclaredWarFaction == war.PlayerInteraction && war.AssaultFactions.Contains(army.Faction))
                    //        || (war.DefendingFaction == war.PlayerInteraction && war.DefendingFactions.Contains(army.Faction));

                    //        float points = army.Faction.Faction.def.techLevel.ThreatRangeFor().RandomInRange * (1 - army.DepletionFromWar);

                    //        CaravanAI caravanAI = CaravanAIMaker.MakeCaravan(GeneratePawns(army, points), army.Faction.Faction, yourSettlement.Tile, true, CaravanAIMaker.GetCaravanColor(yourSettlement.Faction, target.Faction), showCaravanInfo, showCaravanInfo, false);
                    //        caravanAI.Threat = points;
                    //        caravanAI.Home = yourSettlement;

                    //        caravanAI.AddQueueAction(new CaravanArrivalAction_AIAttackSettlement(target, war), target.Tile);
                    //    }
                    //});

                    if (TryFindEnemySettlement(yourSettlement, enemyis, out Settlement target))
                    {
                        bool showCaravanInfo = (war.DeclaredWarFaction == war.PlayerInteraction && war.AssaultFactions.Contains(army.Faction)) ||
                                               (war.DefendingFaction == war.PlayerInteraction && war.DefendingFactions.Contains(army.Faction));

                        float points = army.Faction.Faction.def.techLevel.ThreatRangeFor().RandomInRange *(1 - army.DepletionFromWar);

                        CaravanAI caravanAI = CaravanAIMaker.MakeCaravan(GeneratePawns(army, points), army.Faction.Faction, yourSettlement.Tile, true, CaravanAIMaker.GetCaravanColor(yourSettlement.Faction, target.Faction), showCaravanInfo, showCaravanInfo, false);
                        caravanAI.Threat     = points;
                        caravanAI.Home       = yourSettlement;
                        caravanAI.ShowGizmos = false;

                        caravanAI.AddQueueAction(new CaravanArrivalAction_AIAttackSettlement(target, war), target.Tile);
                    }
                }
            }

            return(true);
        }
Пример #5
0
    //Use this for intialization
    void Start()
    {
        caravans = new Dictionary<int, List<Card>>();
        for (int i = 0; i != 6; i++)
        {
            caravans.Add(i, new List<Card>());
        }

        for (int i = 0; i != 2; i++)
        {
            decks[i] = getDeck();
            hands[i] = new List<Card>();
            for (int j = 0; j != 5; j++)
            {
                int srcPos = decks[i].Count - 1;
                Card cardToMove = decks[i][srcPos];
                decks[i].RemoveAt(srcPos);
                hands[i].Add(cardToMove);
            }
        }

        ai_instance = new CaravanAI(this);
    }