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); }
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); } }
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); }
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); } }
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); } } }