
山地强盗 - 错误信息已修复
山の盗賊と遭遇した場合に出るエラーメッセージを修正したdllです。ファイル書き換えると都合が悪い方はファイルを直接弄ってください。全く問題なく動作してますけど、何か違ってたら適当にフォローしてください。
查看大图TaleWorlds.CampaignSystem.dll [之前] List list = new List(); List list2 = new List(); List list3 = new List(); List list4 = new List(); for (int i = 1; i <= 6; i++) { TextObject item; if (GameTexts.TryGetText("str_robbery_threat", out item, i.ToString())) { list.Add(item); list2.Add(GameTexts.FindText("str_robbery_pay_agreement", i.ToString())); list3.Add(GameTexts.FindText("str_robbery_conclusion", i.ToString())); list4.Add(GameTexts.FindText("str_robbery_start_fight", i.ToString())); } } for (int j = 1; j <= 6; j++) { string variation = encounteredParty.MapFaction.StringId + "_" + j.ToString(); TextObject item2; if (GameTexts.TryGetText("str_robbery_threat", out item2, variation)) { for (int k = 0; k < 3; k++) { list.Add(item2); list2.Add(GameTexts.FindText("str_robbery_pay_agreement", variation)); list3.Add(GameTexts.FindText("str_robbery_conclusion", variation)); list4.Add(GameTexts.FindText("str_robbery_start_fight", variation)); } } } int index = MBRandom.RandomInt(0, list.Count); MBTextManager.SetTextVariable("ROBBERY_THREAT", list[index], false); MBTextManager.SetTextVariable("ROBBERY_PAY_AGREEMENT", list2[index], false); MBTextManager.SetTextVariable("ROBBERY_CONCLUSION", list3[index], false); MBTextManager.SetTextVariable("ROBBERY_START_FIGHT", list4[index], false);
[之后] List list = new List(); List list2 = new List(); List list3 = new List(); List list4 = new List(); for (int i = 1; i <= 6; i++) { TextObject item; TextObject item2; TextObject item3; TextObject item4; if (GameTexts.TryGetText("str_robbery_threat", out item, i.ToString()) && GameTexts.TryGetText("str_robbery_pay_agreement", out item2, i.ToString()) && GameTexts.TryGetText("str_robbery_conclusion", out item3, i.ToString()) && GameTexts.TryGetText("str_robbery_start_fight", out item4, i.ToString())) { list.Add(item); list2.Add(item2); list3.Add(item3); list4.Add(item4); } } for (int j = 1; j <= 6; j++) { string variation = encounteredParty.MapFaction.StringId + "_" + j.ToString(); TextObject item5; TextObject item6; TextObject item7; TextObject item8; if (GameTexts.TryGetText("str_robbery_threat", out item5, variation) && GameTexts.TryGetText("str_robbery_pay_agreement", out item6, variation) && GameTexts.TryGetText("str_robbery_conclusion", out item7, variation) && GameTexts.TryGetText("str_robbery_start_fight", out item8, variation)) { for (int k = 0; k < 3; k++) { list.Add(item5); list2.Add(item6); list3.Add(item7); list4.Add(item8); } } } int index = MBRandom.RandomInt(0, list.Count); MBTextManager.SetTextVariable("ROBBERY_THREAT", list[index], false); MBTextManager.SetTextVariable("ROBBERY_PAY_AGREEMENT", list2[index], false); MBTextManager.SetTextVariable("ROBBERY_CONCLUSION", list3[index], false); MBTextManager.SetTextVariable("ROBBERY_START_FIGHT", list4[index], false);
[问题说明] 土匪种类大致分为6种:
- 掠夺者 - Looters
- 山地强盗 - MountainBandits
- 沙漠强盗 - DesertBandit
- 草原强盗 - SteppeBandits
- 森林强盗 - ForestBandits
- 海寇 - SeaRaiders
其中,掠夺者的台词有6种变体,首先在第一个FOR循环中被添加到列表中。 每种变体准备了4种台词:
str_robbery_threat:遭遇时的台词str_robbery_pay_agreement:选择交易时的台词str_robbery_conclusion:交易成功时的台词str_robbery_start_fight:选择战斗或交易失败时的台词
接下来的FOR循环中,将掠夺者之外的单位所拥有的原始台词添加到列表中。
- 山地强盗有3种
- 沙漠强盗有2种
- 草原强盗有2种
- 森林强盗有2种
- 海寇有2种
由于嵌套的FOR循环重复了3次,原始台词会重复3次添加到列表中。
因此,最终每个列表存储的元素数量为:
- 掠夺者:6
- 山地强盗:6(掠夺者台词)+ 3×3(重复3次)= 15
- 山地强盗以外的单位:6(掠夺者台词)+ 2×3(重复3次)= 12
最后,从这些列表中随机选择一个输出。 内部FOR循环重复3次的原因可能是: 为了避免总是抽到掠夺者重复使用的台词,将原始台词的抽选率提高了3倍,使其各占一半几率。 外部FOR循环其实重复3次(考虑到后续提到的错误,实际为2次)就够了,但开发者可能计划将来也为其他种类准备6种台词。 检查音频文件夹后发现,有些音频在当前阶段并未使用。
至于为何只有山地强盗会报错: 原因在于,山地强盗以外的单位的台词只有2种,但山地强盗却莫名其妙准备了3种。 更奇怪的是,在:
str_robbery_threat:遭遇时的台词str_robbery_pay_agreement:选择交易时的台词str_robbery_conclusion:交易成功时的台词str_robbery_start_fight:选择战斗或交易失败时的台词
这4种中,只准备了遭遇时的台词 str_robbery_threat。
由于IF条件判断的是 str_robbery_threat(通过 TryGetText),结果为TRUE,因此其他3种未准备的台词也被添加到列表中,导致除了遭遇台词外,所有其他台词都会报错。
如果将 str_robbery_threat 替换为其他任意台词,由于其他台词并未准备,结果为FALSE,因而不会添加到列表中。
或者,将第二个FOR循环的重复次数改为2次,也可以避免错误。有问题的台词是 _3,因此重复2次就不会被调用(string variation = encounteredParty.MapFaction.StringId + "_" + j.ToString();)。
不过个人认为,正确的做法是在全部检查后再添加到列表中,因此采用了上述修正方案。
*这些信息可随意使用。
如果使用 dnSpy 进行编辑,在搜索框中输入 str_robbery_threat,类型选择 Number/String,即可找到此位置。
找到后,右键选择 Edit Method(C#) 即可进行编辑。
请注意,必须在 Win64_Shipping_Client 文件夹内进行编辑,否则会出错。
正在加载版本记录…

正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。