Пример #1
0
        public static Toil FinishDrinkTerrain(TargetIndex terrainVecIndex)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn       actor      = toil.actor;
                Need_Water need_water = actor.needs.water();

                float numWater = need_water.MaxLevel - need_water.CurLevel;

                TerrainDef       terrain          = actor.Map.terrainGrid.TerrainAt(actor.CurJob.GetTarget(terrainVecIndex).Cell);
                WaterTerrainType drankTerrainType = terrain.GetWaterTerrainType();

                if (actor.needs.mood != null)
                {
                    // 直接飲んだ
                    if (actor.CanManipulate())
                    {
                        actor.needs.mood.thoughts.memories.TryGainMemory(MizuDef.Thought_DrankScoopedWater);
                    }
                    else
                    {
                        actor.needs.mood.thoughts.memories.TryGainMemory(MizuDef.Thought_SippedWaterLikeBeast);
                    }

                    ThoughtDef thoughtDef = MizuUtility.GetThoughtDefFromTerrainType(drankTerrainType);
                    if (thoughtDef != null)
                    {
                        // 水の種類による心情
                        actor.needs.mood.thoughts.memories.TryGainMemory(thoughtDef);
                    }
                }

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

                if (!actor.Dead)
                {
                    actor.needs.water().CurLevel += numWater;
                }
                actor.records.AddTo(MizuDef.Record_WaterDrank, numWater);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Instant;
            return(toil);
        }
Пример #2
0
        public static ThoughtDef GetThoughtDefFromTerrainType(WaterTerrainType waterTerrainType)
        {
            // 地形タイプ→心情
            switch (waterTerrainType)
            {
            case WaterTerrainType.MudWater:
                return(MizuDef.Thought_DrankMudWater);

            case WaterTerrainType.SeaWater:
                return(MizuDef.Thought_DrankSeaWater);

            default:
                return(null);
            }
        }
Пример #3
0
        public static WaterTerrainType GetWaterTerrainType(this Caravan caravan)
        {
            if (caravan.Tile < 0)
            {
                return(WaterTerrainType.NoWater);
            }

            Tile tile = Find.WorldGrid[caravan.Tile];

            WaterTerrainType result = WaterTerrainType.NoWater;

            // バイオーム
            string biomeDefName = tile.biome.defName;

            if (biomeDefName.Contains("Desert"))
            {
                // 砂漠Desert、極限の砂漠ExtremeDesertは水なし
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.NoWater);
            }
            else if (biomeDefName.Contains("SeaIce"))
            {
                // 海氷SeaIceは海水
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.SeaWater);
            }
            else if (biomeDefName.Contains("ColdBog") || biomeDefName.Contains("Swamp"))
            {
                // 寒冷湿地ColdBog、温帯湿地TemperateSwamp、熱帯湿地TropicalSwampは泥水
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.MudWater);
            }
            else
            {
                // それ以外は真水
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.RawWater);
            }

            if (tile.VisibleRivers != null && tile.VisibleRivers.Count > 0)
            {
                // 川があれば真水が飲める(凍ってるか等はチェックしないことにする)
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.RawWater);
            }
            if (Find.World.CoastDirectionAt(caravan.Tile).IsValid)
            {
                // 海岸線があるなら海水が飲める
                result = (WaterTerrainType)Mathf.Max((int)result, (int)WaterTerrainType.SeaWater);
            }

            return(result);
        }
Пример #4
0
        public static ThingDef GetWaterThingDefFromTerrainType(WaterTerrainType waterTerrainType)
        {
            // 地形タイプ→水アイテム
            switch (waterTerrainType)
            {
            case WaterTerrainType.RawWater:
                return(MizuDef.Thing_RawWater);

            case WaterTerrainType.MudWater:
                return(MizuDef.Thing_MudWater);

            case WaterTerrainType.SeaWater:
                return(MizuDef.Thing_SeaWater);

            default:
                return(null);
            }
        }
Пример #5
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);
                }
            }
        }