结算增加保底

This commit is contained in:
wuwenbo 2026-05-09 17:30:37 +08:00
parent 0453dd3ba8
commit cc521c7b0a
3 changed files with 188 additions and 6 deletions

View File

@ -1876,6 +1876,13 @@ namespace RuntimeData
// 用于使用指定地图的地图相关内容重生成
public void RegenerateMap(MapRecordData recordData)
{
foreach (var player in PlayerMap.PlayerDataList)
{
player.Alive = false;
player.DieMark = false;
player.IsSurrender = false;
}
foreach (var grid in GridMap.GridList)
{
if (recordData.GridMap.GetGridDataByPos(grid.Pos.X, grid.Pos.Y, out var recordGrid))
@ -1907,6 +1914,7 @@ namespace RuntimeData
if (p == null)
{
LogSystem.LogError($"RegenerateMap Error 找不到地图 {recordData.MapName} 的玩家文明信息 Civ={playerInfo.Civ} Force={playerInfo.Force}");
continue;
}
foreach (var cityInfo in playerInfo.Cities)
@ -1914,11 +1922,13 @@ namespace RuntimeData
if (!GridMap.GetGridDataByPos(cityInfo.X, cityInfo.Y, out var cityGrid))
{
LogSystem.LogError($"RegenerateMap Error 找不到地图 {recordData.MapName} 的城市格子信息 Pos=({cityInfo.X},{cityInfo.Y})");
continue;
}
//建设一个新城市
CityData c = AddCityData(cityGrid.Id, p.Id);
c.Level = cityInfo.Level;
p.Alive = true;
if (cityInfo.IsCapital)
{
//设置该城市为首都
@ -1932,6 +1942,7 @@ namespace RuntimeData
if (!GridMap.GetGridDataByPos(unitInfo.X, unitInfo.Y, out var unitGrid))
{
LogSystem.LogError($"RegenerateMap Error 找不到地图 {recordData.MapName} 的城市格子信息 Pos=({unitInfo.X},{unitInfo.Y})");
continue;
}
if (AddUnitData(unitGrid.Id, c.Id, unitInfo.UnitFullType, out var newUnit))
@ -1939,6 +1950,18 @@ namespace RuntimeData
}
}
}
foreach (var player in PlayerMap.PlayerDataList)
{
if (GetCityCount(player.Id) > 0)
{
player.Alive = true;
continue;
}
player.Alive = false;
player.DieMark = false;
}
}
// 用于使用指定地图进游戏的清理工作

View File

@ -231,7 +231,7 @@ namespace Logic.Editor
if (InspectorUtils.InspectorButtonWithTextWidth("添加玩家结算器"))
{
mapConfig.PlayerSettlements.Add(new PlayerSettlementInfo());
mapConfig.PlayerSettlements.Add(CreateDefaultPlayerSettlementInfo());
}
deleteIndex = -1;
@ -270,7 +270,7 @@ namespace Logic.Editor
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth("添加任务"))
{
var newTask = new PlayerTaskInfo();
var newTask = CreateDefaultPlayerTaskInfo();
settlementInfo.Tasks.Add(newTask);
}
EditorGUILayout.EndHorizontal();
@ -288,6 +288,31 @@ namespace Logic.Editor
return isDelete;
}
private static PlayerSettlementInfo CreateDefaultPlayerSettlementInfo()
{
return new PlayerSettlementInfo
{
SettlementType = PlayerSettlementType.AllSuccessOrFailure,
IsSettlement = false,
IsWin = false,
Tasks = new List<PlayerTaskInfo> { CreateDefaultPlayerTaskInfo() }
};
}
private static PlayerTaskInfo CreateDefaultPlayerTaskInfo()
{
return new PlayerTaskInfo
{
TaskType = PlayerTaskType.OtherDie,
IsSettlement = false,
IsSuccess = false,
Param1 = -1,
Param2 = 0,
Param3 = 0,
Param4 = UnitType.None
};
}
private bool OnGUITask(PlayerTaskInfo taskInfo, int index)
{
EditorGUILayout.BeginVertical(_whiteBoxStyle, GUILayout.Width(500));
@ -387,4 +412,4 @@ namespace Logic.Editor
return 0;
}
}
}
}

View File

@ -43,13 +43,15 @@ namespace TH1_Logic.MatchConfig
public void Init(MapData map, MapConfig config)
{
SettlementType = config.MatchSettlement;
SettlementType = config?.MatchSettlement ?? MatchSettlementType.None;
IsFinished = false;
PlayerSettlements ??= new Dictionary<uint, PlayerSettlementGroup>();
PlayerSettlements.Clear();
var protectedSettlements = BuildProtectedSettlements(config);
foreach (var player in map.PlayerMap.PlayerDataList)
{
PlayerSettlements[player.Id] = new PlayerSettlementGroup();
PlayerSettlements[player.Id].Init(config.PlayerSettlements);
PlayerSettlements[player.Id].Init(protectedSettlements);
}
}
@ -83,6 +85,138 @@ namespace TH1_Logic.MatchConfig
PlayerSettlements[kv.Key] = new PlayerSettlementGroup(kv.Value);
}
}
private static List<PlayerSettlementInfo> BuildProtectedSettlements(MapConfig config)
{
var protectedSettlements = new List<PlayerSettlementInfo>();
var sourceSettlements = config?.PlayerSettlements;
if (sourceSettlements != null)
{
foreach (var sourceSettlement in sourceSettlements)
{
if (sourceSettlement == null)
{
LogSystem.LogWarning("MatchSettlement.Init: 检测到空的 PlayerSettlementInfo已跳过。");
continue;
}
protectedSettlements.Add(BuildProtectedSettlement(
sourceSettlement,
config?.MatchSettlement ?? MatchSettlementType.None));
}
}
if (protectedSettlements.Count > 0) return protectedSettlements;
LogSystem.LogWarning(
$"MatchSettlement.Init: 结算配置为空或无效已注入默认结算任务。MatchType={config?.MatchSettlement}");
protectedSettlements.Add(CreateFallbackSettlement(config?.MatchSettlement ?? MatchSettlementType.None));
return protectedSettlements;
}
private static PlayerSettlementInfo BuildProtectedSettlement(
PlayerSettlementInfo sourceSettlement,
MatchSettlementType matchType)
{
var settlementType = sourceSettlement.SettlementType;
if (settlementType == PlayerSettlementType.None)
{
LogSystem.LogWarning("MatchSettlement.Init: SettlementType=None已自动修正为 AllSuccessOrFailure。");
settlementType = PlayerSettlementType.AllSuccessOrFailure;
}
var settlement = new PlayerSettlementInfo
{
SettlementType = settlementType,
IsSettlement = false,
IsWin = false,
Tasks = new List<PlayerTaskInfo>()
};
if (sourceSettlement.Tasks != null)
{
foreach (var sourceTask in sourceSettlement.Tasks)
{
if (sourceTask == null)
{
LogSystem.LogWarning("MatchSettlement.Init: 检测到空的 PlayerTaskInfo已跳过。");
continue;
}
if (sourceTask.TaskType == PlayerTaskType.None)
{
LogSystem.LogWarning("MatchSettlement.Init: TaskType=None已跳过该任务。");
continue;
}
settlement.Tasks.Add(new PlayerTaskInfo
{
TaskType = sourceTask.TaskType,
IsSettlement = false,
IsSuccess = false,
Param1 = sourceTask.Param1,
Param2 = sourceTask.Param2,
Param3 = sourceTask.Param3,
Param4 = sourceTask.Param4,
Param1Cur = 0,
Param2Cur = 0,
Param3Cur = 0
});
}
}
if (settlement.Tasks.Count > 0) return settlement;
LogSystem.LogWarning("MatchSettlement.Init: 结算器任务为空或无效,已注入默认任务。");
settlement.Tasks.Add(CreateFallbackTask(matchType));
return settlement;
}
private static PlayerSettlementInfo CreateFallbackSettlement(MatchSettlementType matchType)
{
return new PlayerSettlementInfo
{
SettlementType = PlayerSettlementType.AllSuccessOrFailure,
IsSettlement = false,
IsWin = false,
Tasks = new List<PlayerTaskInfo> { CreateFallbackTask(matchType) }
};
}
private static PlayerTaskInfo CreateFallbackTask(MatchSettlementType matchType)
{
// 教程/剧情默认给可收敛的生存任务其他模式默认给“其他玩家死亡”任务N-1
if (matchType == MatchSettlementType.Tutor || matchType == MatchSettlementType.Story)
{
return new PlayerTaskInfo
{
TaskType = PlayerTaskType.SurviveOrLoseMatch,
IsSettlement = false,
IsSuccess = false,
Param1 = 1,
Param2 = 0,
Param3 = 0,
Param4 = UnitType.None,
Param1Cur = 0,
Param2Cur = 0,
Param3Cur = 0
};
}
return new PlayerTaskInfo
{
TaskType = PlayerTaskType.OtherDie,
IsSettlement = false,
IsSuccess = false,
Param1 = -1,
Param2 = 0,
Param3 = 0,
Param4 = UnitType.None,
Param1Cur = 0,
Param2Cur = 0,
Param3Cur = 0
};
}
}
@ -278,4 +412,4 @@ namespace TH1_Logic.MatchConfig
info.IsFinished = true;
}
}
}
}