总体评价: 3 星
“可加入既有存档、无需重开;卸载时可先取消 SoldiersLifeEvolution 保留本体,操作前建议在大地图另存副本。”
具体如何只卸载SoldiersLifeEvolution 保留本体呢?需要本体更新到3.05解决晋升同伴装备技能问题!
总体评价: 5 星
最近在玩华夏帝国mod,所以我增加了华夏文化的士兵命名,全部使用百家姓,且命名格式为[姓][名字],另外我修改了人头击杀数分配规则,根据【近战最高熟练度+远程最高熟练度】(远程杀人往往更多)以及阶级(体现装备差异)权重随机分配,这样比帝国新兵和巴弓一起轮换吃大锅饭合理的多。如果作者愿意授权的话我把修改后的发出来
总体评价: 5 星
说实话,击杀数轮换分配非常不合理,一个帝国农民和顶级精锐一起吃“大锅饭”?
我修改了一下你的分配代码: // ---- 击杀分配:加权随机分配,高级兵与射手权重更高 ----
if (enemyCasualties > 0 && healthyBeforeBattle.Count > 0)
{
// 只在幸存的健康士兵中分配(排除本场阵亡者)
List killers = new List();
for (int i = 0; i < healthyBeforeBattle.Count; i++)
{
if (healthyBeforeBattle.StatusEnum != SoldierStatus.Killed)
killers.Add(healthyBeforeBattle);
}
if (killers.Count > 0)
{
// 计算每个士兵的权重
Dictionary weights = new Dictionary();
int totalWeight = 0;
for (int i = 0; i < killers.Count; i++)
{
SoldierRecord s = killers;
int weight = 0;
// 阶级保底权重
weight += s.CurrentTier * 30;
CharacterObject troop = ResolveTroop(s.TroopStringId);
if (troop != null)
{
// 近战三系取最高,双手 ×1.2
int meleeMax = Math.Max(
troop.GetSkillValue(DefaultSkills.OneHanded),
Math.Max(
(int)(troop.GetSkillValue(DefaultSkills.TwoHanded) * 1.2),
troop.GetSkillValue(DefaultSkills.Polearm)
)
);
weight += meleeMax;
// 远程三系取最高,弓 ×1.2、投掷 ×0.8
int rangedMax = Math.Max(
(int)(troop.GetSkillValue(DefaultSkills.Bow) * 1.2),
Math.Max(
troop.GetSkillValue(DefaultSkills.Crossbow),
(int)(troop.GetSkillValue(DefaultSkills.Throwing) * 0.8)
)
);
weight += rangedMax;
}
if (weight < 1) weight = 1;
weights[s.Id] = weight;
totalWeight += weight;
}
Dictionary killsThisBattle = new Dictionary();
// 加权随机分配:每次抽一个士兵,权重越高越容易被抽中
for (int k = 0; k < enemyCasualties; k++)
{
int roll = _random.Next(totalWeight);
int cumulative = 0;
SoldierRecord chosen = killers[0];
for (int i = 0; i < killers.Count; i++)
{
cumulative += weights[killers.Id];
if (roll < cumulative)
{
chosen = killers;
break;
}
}
chosen.TotalKills++;
int c;
killsThisBattle.TryGetValue(chosen.Id, out c);
killsThisBattle[chosen.Id] = c + 1;
}
foreach (KeyValuePair kc in killsThisBattle)
{
SoldierRecord s = GetSoldier(kc.Key);
if (s != null && kc.Value > s.BestKillsInBattle)
s.BestKillsInBattle = kc.Value;
}
}
}
