protected bool IsNotFullWater(IBillGiver giver, DefExtension_WaterRecipe ext, List <ThingAmount> chosen)
        {
            if (ext == null)
            {
                return(true);
            }

            if (giver == null)
            {
                return(false);
            }

            var thing = giver as Thing;

            if (thing == null)
            {
                return(false);
            }

            switch (ext.recipeType)
            {
            case DefExtension_WaterRecipe.RecipeType.DrawFromTerrain:
                return(true);

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterPool:
                return(true);

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterNet:
                return(true);

            case DefExtension_WaterRecipe.RecipeType.PourWater:
            {
                var building = thing as Building_WaterNetWorkTable;
                if (building == null)
                {
                    return(false);
                }

                var totalWaterVolume = 0f;
                foreach (var ta in chosen)
                {
                    var sourceComp = ta.thing.TryGetComp <CompWaterSource>();
                    if (sourceComp != null)
                    {
                        totalWaterVolume += sourceComp.WaterVolume * ta.count;
                    }
                }
                if (GetTotalAmountCanAccept(building) < totalWaterVolume)
                {
                    return(false);
                }

                return(true);
            }

            default:
                Log.Error("recipeType is Undefined");
                return(false);
            }
        }
        protected static Job CreateNewJob(DefExtension_WaterRecipe ext)
        {
            if (ext == null)
            {
                return(new Job(JobDefOf.DoBill));
            }

            switch (ext.recipeType)
            {
            case DefExtension_WaterRecipe.RecipeType.DrawFromTerrain:
                return(new Job(MizuDef.Job_DrawFromTerrain));

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterPool:
                return(new Job(MizuDef.Job_DrawFromWaterPool));

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterNet:
                return(new Job(MizuDef.Job_DrawFromWaterNet));

            case DefExtension_WaterRecipe.RecipeType.PourWater:
                return(new Job(MizuDef.Job_PourWater));

            default:
                Log.Error("recipeType is Undefined");
                return(null);
            }
        }
        protected bool IsFoundWater(IBillGiver giver, DefExtension_WaterRecipe ext, List <ThingAmount> chosen)
        {
            if (ext == null)
            {
                return(true);
            }

            if (giver == null)
            {
                return(false);
            }

            var thing = giver as Thing;

            if (thing == null)
            {
                return(false);
            }

            switch (ext.recipeType)
            {
            case DefExtension_WaterRecipe.RecipeType.DrawFromTerrain:
            {
                // 水質チェック
                return(ext.needWaterTerrainTypes != null && ext.needWaterTerrainTypes.Contains(thing.Map.terrainGrid.TerrainAt(thing.Position).GetWaterTerrainType()));
            }

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterPool:
            {
                var waterGrid = thing.Map.GetComponent <MapComponent_ShallowWaterGrid>();
                var pool      = waterGrid.GetPool(thing.Map.cellIndices.CellToIndex(thing.Position));

                // 水質条件チェック
                if (!ext.needWaterTypes.Contains(pool.WaterType))
                {
                    return(false);
                }

                // 入力水道網の水の種類から水アイテムの種類を決定
                var waterThingDef = MizuUtility.GetWaterThingDefFromWaterType(pool.WaterType);
                if (waterThingDef == null)
                {
                    return(false);
                }

                // 水アイテムの水源情報を得る
                var compprop = waterThingDef.GetCompProperties <CompProperties_WaterSource>();
                if (compprop == null)
                {
                    return(false);
                }

                // 水量チェック
                if (pool.CurrentWaterVolume < compprop.waterVolume * ext.getItemCount)
                {
                    return(false);
                }

                return(true);
            }

            case DefExtension_WaterRecipe.RecipeType.DrawFromWaterNet:
            {
                var workTable = giver as Building_WaterNetWorkTable;
                if (workTable == null || workTable.InputWaterNet == null)
                {
                    return(false);
                }

                var targetWaterType   = WaterType.NoWater;
                var targetWaterVolume = 0.0f;

                if (ext.canDrawFromFaucet)
                {
                    // 蛇口から汲むレシピ
                    targetWaterType   = workTable.InputWaterNet.StoredWaterTypeForFaucet;
                    targetWaterVolume = workTable.InputWaterNet.StoredWaterVolumeForFaucet;
                }
                else
                {
                    // 自身から汲むレシピ(水箱など)
                    targetWaterType   = workTable.TankComp.StoredWaterType;
                    targetWaterVolume = workTable.TankComp.StoredWaterVolume;
                }

                // 水質チェック
                if (!ext.needWaterTypes.Contains(targetWaterType))
                {
                    return(false);
                }

                // 入力水道網の水の種類から水アイテムの種類を決定
                var waterThingDef = MizuUtility.GetWaterThingDefFromWaterType(targetWaterType);
                if (waterThingDef == null)
                {
                    return(false);
                }

                // 水アイテムの水源情報を得る
                var compprop = waterThingDef.GetCompProperties <CompProperties_WaterSource>();
                if (compprop == null)
                {
                    return(false);
                }

                // 水量チェック
                if (targetWaterVolume < compprop.waterVolume * ext.getItemCount)
                {
                    return(false);
                }

                return(true);
            }

            case DefExtension_WaterRecipe.RecipeType.PourWater:
                return(true);

            default:
                Log.Error("recipeType is Undefined");
                return(false);
            }
        }