private static int BestEverGetWaterIndexFor(List <ThingDefCount> water)
        {
            var num  = -1;
            var num2 = 0f;

            for (var i = 0; i < water.Count; i++)
            {
                if (water[i].Count <= 0)
                {
                    continue;
                }

                var thingDef = water[i].ThingDef;
                if (!MizuCaravanUtility.CanEverGetWater(thingDef))
                {
                    continue;
                }

                var waterScore = MizuCaravanUtility.GetWaterScore(thingDef);
                if (num >= 0 && !(waterScore > num2))
                {
                    continue;
                }

                num  = i;
                num2 = waterScore;
            }

            return(num);
        }
Beispiel #2
0
 static void Prefix(List <Thing> ___playerCaravanAllPawnsAndItems, List <Tradeable> ___cachedTradeables)
 {
     if (___playerCaravanAllPawnsAndItems != null)
     {
         MizuCaravanUtility.DaysWorthOfWater_Trade(___playerCaravanAllPawnsAndItems, ___cachedTradeables);
     }
 }
        public static bool TryGetBestWater(Caravan caravan, Pawn forPawn, out Thing water, out Pawn owner)
        {
            List <Thing> inventoryThings = CaravanInventoryUtility.AllInventoryItems(caravan);
            Thing        foundThing      = null;
            float        bestScore       = float.MinValue;

            // キャラバンの全所持品をチェック
            foreach (var thing in inventoryThings)
            {
                // それが飲めるものかどうか
                if (!MizuCaravanUtility.CanNowGetWater(thing, forPawn))
                {
                    continue;
                }

                float waterScore = MizuCaravanUtility.GetWaterScore(thing, forPawn);

                // 今まで見つけたベストスコアを超えたか
                if (bestScore >= waterScore)
                {
                    continue;
                }

                foundThing = thing;
                bestScore  = waterScore;
            }

            if (foundThing != null)
            {
                // 何かしらの水が見つかった
                water = foundThing;
                // 水が個人の所持品に含まれている場合は持ち主が誰かを調べておく
                owner = CaravanInventoryUtility.GetOwnerOf(caravan, foundThing);
                return(true);
            }

            water = null;
            owner = null;
            return(false);
        }
        private static int BestEverGetWaterIndexFor(Pawn pawn, List <ThingCount> water)
        {
            int   num  = -1;
            float num2 = 0f;

            for (int i = 0; i < water.Count; i++)
            {
                if (water[i].Count > 0)
                {
                    ThingDef thingDef = water[i].ThingDef;
                    if (MizuCaravanUtility.CanEverGetWater(thingDef, pawn))
                    {
                        float waterScore = MizuCaravanUtility.GetWaterScore(thingDef, pawn);
                        if (num < 0 || waterScore > num2)
                        {
                            num  = i;
                            num2 = waterScore;
                        }
                    }
                }
            }
            return(num);
        }
Beispiel #5
0
 static void Prefix(List <TransferableOneWay> ___transferables)
 {
     MizuCaravanUtility.DaysWorthOfWater_LoadTransporters(___transferables);
 }
Beispiel #6
0
        static void Postfix(Caravan ___caravan)
        {
            // キャラバンのポーンの水分要求の処理
            foreach (Pawn pawn in ___caravan.pawns)
            {
                if (pawn.needs == null)
                {
                    continue;
                }

                Need_Water need_water = pawn.needs.water();
                if (need_water == null)
                {
                    continue;
                }

                // 喉が渇いてない場合は飲まない
                if (need_water.CurCategory <= ThirstCategory.Healthy)
                {
                    continue;
                }

                // タイルが0以上(?)、死んでない、ローカルではなく惑星マップ上にいる(キャラバンしてる)、そのポーンが地形から水を飲める(心情がある/ない、脱水症状まで進んでいる/いない、など)
                if (pawn.Tile >= 0 && !pawn.Dead && pawn.IsWorldPawn() && pawn.CanDrinkFromTerrain())
                {
                    WaterTerrainType drankTerrainType = ___caravan.GetWaterTerrainType();

                    // 水を飲めない場所
                    if (drankTerrainType == WaterTerrainType.NoWater)
                    {
                        continue;
                    }

                    // 地形から水を飲む
                    need_water.CurLevel = 1.0f;

                    if (drankTerrainType == WaterTerrainType.SeaWater)
                    {
                        // 海水の場合の健康状態悪化
                        pawn.health.AddHediff(HediffMaker.MakeHediff(MizuDef.Hediff_DrankSeaWater, pawn));
                    }

                    // 心情要求がなければここで終了
                    if (pawn.needs.mood == null)
                    {
                        continue;
                    }

                    // 直接水を飲んだ心情付加
                    if (pawn.CanManipulate())
                    {
                        pawn.needs.mood.thoughts.memories.TryGainMemory(MizuDef.Thought_DrankScoopedWater);
                    }
                    else
                    {
                        pawn.needs.mood.thoughts.memories.TryGainMemory(MizuDef.Thought_SippedWaterLikeBeast);
                    }

                    // キャラバンのいる地形に応じた心情を付加
                    ThoughtDef thoughtDef = MizuUtility.GetThoughtDefFromTerrainType(drankTerrainType);
                    if (thoughtDef != null)
                    {
                        // 水の種類による心情
                        pawn.needs.mood.thoughts.memories.TryGainMemory(thoughtDef);
                    }
                    continue;
                }

                // 水アイテムを探す
                Thing waterThing;
                Pawn  inventoryPawn;

                // アイテムが見つからない
                if (!MizuCaravanUtility.TryGetBestWater(___caravan, pawn, out waterThing, out inventoryPawn))
                {
                    continue;
                }

                // アイテムに応じた水分を摂取&心情変化&健康変化
                float numWater = MizuUtility.GetWater(pawn, waterThing, need_water.WaterWanted, false);
                need_water.CurLevel += numWater;
                pawn.records.AddTo(MizuDef.Record_WaterDrank, numWater);

                // 水アイテムが消滅していない場合(スタックの一部だけ消費した場合等)はここで終了
                if (!waterThing.Destroyed)
                {
                    continue;
                }

                if (inventoryPawn != null)
                {
                    // 誰かの所持品にあった水スタックを飲みきったのであれば、所持品欄から除去
                    inventoryPawn.inventory.innerContainer.Remove(waterThing);

                    // 移動不可状態を一旦リセット(して再計算させる?)
                    ___caravan.RecacheImmobilizedNow();

                    // 水の残量再計算フラグON
                    MizuCaravanUtility.daysWorthOfWaterDirty = true;
                }

                if (!MizuCaravanUtility.TryGetBestWater(___caravan, pawn, out waterThing, out inventoryPawn))
                {
                    // 飲んだことにより水がなくなったら警告を出す
                    Messages.Message(string.Format(MizuStrings.MessageCaravanRunOutOfWater.Translate(), ___caravan.LabelCap, pawn.Label), ___caravan, MessageTypeDefOf.ThreatBig);
                }
            }
        }
Beispiel #7
0
 static void Prefix(Dialog_FormCaravan __instance)
 {
     MizuCaravanUtility.DaysWorthOfWater_FormCaravan(__instance);
 }
 public static bool CanNowGetWater(Thing water, Pawn pawn)
 {
     return(!water.IngestibleNow && water.CanDrinkWaterNow() && MizuCaravanUtility.CanEverGetWater(water, pawn) && (pawn.needs.water().CurCategory >= ThirstCategory.Dehydration || water.GetWaterPreferability() > WaterPreferability.NeverDrink));
 }
        public static bool AnyPawnOutOfWater(Caravan c, out string worstDehydrationText)
        {
            // キャラバンの全所持品の水アイテムリスト作成
            List <Thing> tmpInvWater = CaravanInventoryUtility.AllInventoryItems(c).FindAll((t) => t.CanGetWater());

            bool 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) => MizuCaravanUtility.CanEverGetWater(t.def, pawn)))
                {
                    continue;
                }

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

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

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

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

                if (maxHediffText == null || maxHediffStageIndex < hediff.CurStageIndex)
                {
                    // 最悪状態なら更新
                    maxHediffStageIndex = hediff.CurStageIndex;
                    maxHediffText       = hediff.LabelCap;
                }
            }

            // 最悪の脱水症状テキストを返す
            worstDehydrationText = maxHediffText;
            return(true);
        }