Files
BuYuHouDuan/CommonDomain/FishSpawnExtractor.cs
T

184 lines
7.8 KiB
C#
Raw Normal View History

2026-10-12 16:22:04 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using CommonDomain.BaseModel;
using CommonDomain.Enum;
using Microsoft.Extensions.Logging;
namespace CommonDomain
{
public static class FishSpawnExtractor
{
public static string ExtractToJson(GameConfig gameConfig, ILogger logger = null)
{
var model = Extract(gameConfig, logger);
if (model == null || model.Levels.Count == 0)
{
return "{}";
}
var json = JsonSerializer.Serialize(model, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false
});
return json;
}
public static FishSpawnConfigStoreModel Extract(GameConfig gameConfig, ILogger logger = null)
{
var result = new FishSpawnConfigStoreModel();
if (gameConfig?.RoomConfigs == null || gameConfig.RoomConfigs.Count == 0)
{
return result;
}
var fishTypeDict = gameConfig.FishTypeConfigs?
.Where(f => f != null && !string.IsNullOrWhiteSpace(f.FishNumber))
.ToDictionary(f => f.FishNumber, f => f)
?? new Dictionary<string, FishTypeConfig>();
var fishArrayDict = gameConfig.FishArrayConfigs?
.Where(a => a != null && !string.IsNullOrWhiteSpace(a.FishArrayNumber))
.ToDictionary(a => a.FishArrayNumber, a => a)
?? new Dictionary<string, FishArrayConfig>();
foreach (var roomCfg in gameConfig.RoomConfigs)
{
if (roomCfg == null) continue;
var roomFishCfg = gameConfig.RoomFishConfigs?
.FirstOrDefault(r => r.GameType == roomCfg.GameType);
if (roomFishCfg == null)
{
continue;
}
int roomLevel = roomCfg.RoomLevel;
var levelKey = $"{(int)roomCfg.GameType}:{roomLevel}";
if (result.Levels.ContainsKey(levelKey)) continue;
var levelConfig = new FishSpawnLevelConfig
{
GameType = (int)roomCfg.GameType,
RoomLevel = roomLevel
};
if (roomFishCfg.RoomFishProbabilityList != null)
{
foreach (var prob in roomFishCfg.RoomFishProbabilityList)
{
if (prob == null || prob.RoomLevel != roomLevel) continue;
levelConfig.Probabilities.Add(new FishSpawnProbability
{
Type = prob.Type,
FishType = (int)prob.FishType,
FirstFishCountMin = prob.FirstFishCountRange != null && prob.FirstFishCountRange.Count > 0 ? prob.FirstFishCountRange[0] : 0,
FirstFishCountMax = prob.FirstFishCountRange != null && prob.FirstFishCountRange.Count > 1 ? prob.FirstFishCountRange[1] : 0,
TimeMin = prob.TimeRange != null && prob.TimeRange.Count > 0 ? prob.TimeRange[0] : 3,
TimeMax = prob.TimeRange != null && prob.TimeRange.Count > 1 ? prob.TimeRange[1] : 8,
CountMin = prob.CountRange != null && prob.CountRange.Count > 0 ? prob.CountRange[0] : 1,
CountMax = prob.CountRange != null && prob.CountRange.Count > 1 ? prob.CountRange[1] : 3,
MaxCountMin = prob.MaxCountRange != null && prob.MaxCountRange.Count > 0 ? prob.MaxCountRange[0] : 5,
MaxCountMax = prob.MaxCountRange != null && prob.MaxCountRange.Count > 1 ? prob.MaxCountRange[1] : 20
});
}
}
var processedFishNumbers = new HashSet<string>();
if (roomFishCfg.RoomFishLevelList != null)
{
foreach (var fish in roomFishCfg.RoomFishLevelList)
{
if (fish == null || fish.RoomLevel != roomLevel) continue;
if (fish.Type != 1) continue;
if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue;
processedFishNumbers.Add(fish.FishNumber);
fishTypeDict.TryGetValue(fish.FishNumber, out var ft);
levelConfig.Fishes.Add(new FishSpawnFish
{
FishNumber = fish.FishNumber,
FishWeight = fish.FishWeight,
Times = fish.Times,
MaxCount = fish.MaxCount,
FishType = ft != null ? (int)ft.FishType : 0,
PathList = ft?.PathList ?? new List<int>()
});
}
}
if (roomFishCfg.NormalFishList != null)
{
foreach (var fish in roomFishCfg.NormalFishList)
{
if (fish == null || fish.Type != 1) continue;
if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue;
if (processedFishNumbers.Contains(fish.FishNumber)) continue;
processedFishNumbers.Add(fish.FishNumber);
fishTypeDict.TryGetValue(fish.FishNumber, out var ft);
levelConfig.Fishes.Add(new FishSpawnFish
{
FishNumber = fish.FishNumber,
FishWeight = fish.FishWeight > 0 ? fish.FishWeight : 1,
Times = fish.Times > 0 ? fish.Times : 8,
MaxCount = fish.MaxCount > 0 ? fish.MaxCount : 20,
FishType = ft != null ? (int)ft.FishType : 0,
PathList = ft?.PathList ?? new List<int>()
});
}
}
var processedArrayNumbers = new HashSet<string>();
if (roomFishCfg.RoomFishLevelList != null)
{
foreach (var fish in roomFishCfg.RoomFishLevelList)
{
if (fish == null || fish.RoomLevel != roomLevel) continue;
if (fish.Type != 2) continue;
if (string.IsNullOrWhiteSpace(fish.FishNumber)) continue;
if (!fishArrayDict.TryGetValue(fish.FishNumber, out var arrayCfg)) continue;
if (processedArrayNumbers.Contains(fish.FishNumber)) continue;
processedArrayNumbers.Add(fish.FishNumber);
levelConfig.FishArrays.Add(new FishSpawnArray
{
FishArrayNumber = fish.FishNumber,
ArrayNumber = arrayCfg.ArrayNumber ?? string.Empty,
FishNumber = arrayCfg.FishNumber ?? string.Empty,
BossFishNumber = arrayCfg.BossFishNumber ?? string.Empty,
FishCount = arrayCfg.FishCount,
BossCount = arrayCfg.BoosCount,
GenerateFrequency = arrayCfg.GenerateFrequency
});
}
}
if (levelConfig.Probabilities.Count > 0 || levelConfig.Fishes.Count > 0)
{
result.Levels[levelKey] = levelConfig;
}
}
return result;
}
}
}