|
本帖最后由 liyun_1981 于 2023-3-2 16:44 编辑
如题,这游戏是《咒语力量》系列的新作肯定要支持一下,我今天刚在论坛里下了最新学习版,体验了下感觉很不错,故打算制作下此游戏的等级上限mod。
开此贴的主要目的是想跟水友们讨论下等级上限相关问题,以及向已通关的水友收集下等级上限相关信息。
目前我有两个相关问题:
1、这游戏的角色最高等级是多少?
2、升级时技能点水友们觉得改为多少合适?
MOD制作进度通报:
至今已经把这游戏的资源获得数、行动点数、移动点数、战利品获得率、角色升级时能重置可选技能、角色升级时能显示更多的可选技能,以及三系同修都搞好了,唯独修改等级上限有点难搞,有懂修改的水友可以回帖一起分享讨论下。
关于等级上限修改我目前已摸索出来的信息及思路:
1、修改等级验证范围,OwnedByGravity.Game.Logic.LootTables.ALevelUpEntry类的ValidForLevelRange字段,将public Vector2 ValidForLevelRange = new Vector2(1f, 15f);改为public Vector2 ValidForLevelRange = new Vector2(0f, 30f);
2、修改等级对象列表,OwnedByGravity.Game.Logic.Units.UnitLevel类的构造方法
public UnitLevel(
ContentReference<UnitProgressionDefinition> reference,
IContentManager contentManager),已知游戏中是通过读取Asset资源文件数据后将反序列化的对象集合List<UnitProgressionDefinition.UnitLevel>赋值给UnitLevel类的Levels字段;我的思路是等程序赋值完Levels后,直接通过Levels.add方法添加15个等级对象进去,我在构造方法最后添加的代码如下:
List<UnitProgressionDefinition.UnitLevel> levels = this.Levels;
int index = levels.Count - 1;
UnitProgressionDefinition.UnitLevel unitLevel1 = levels[index];
int from = unitLevel1.From;
XPLevelDefinition xpLevelDefinition = unitLevel1.XPLevelDefinition;
for (; index < 29; ++index)
{
UnitProgressionDefinition.UnitLevel unitLevel2 = new UnitProgressionDefinition.UnitLevel();
unitLevel2.XPLevelDefinition = xpLevelDefinition;
from += 1000;
unitLevel2.From = from;
this.Levels.Add(unitLevel2);
}
这段代码的意思是:等程序自动把预定义好的15个等级对象添加到Levels集合后,这段代码负责把16~30级的等级对象再添加到Levels集合中去;这段代码编译能正确通过,可进游戏并读取游戏存档时,总是卡在加载界面不能加载完成,程序也没有崩溃报错,我估计很可能是上面那段代码中标红的那一句代码的问题,那行代码是new出来的UnitProgressionDefinition.UnitLevel类对象,而程序原始业务逻辑中是读取资源文件后反序列化得到的对象,其中的字段数据是不同的,可能导致别的方法中读取该对象数据时出逻辑问题,这个比较蛋痛。
2023年3月1日更新:
今天重写了等级上限修改的代码,已经能正确读档进游戏了,但升级还是有点问题,貌似只能升到16级,我稍后会把mod发出来,欢迎水友们一起测试和讨论。
目前等级上限修改的代码逻辑主要是修改UnitLevel类的构造方法,如下:
public UnitLevel(
ContentReference<UnitProgressionDefinition> reference,
IContentManager contentManager)
{
if (!reference.IsSet<UnitProgressionDefinition>())
return;
this.Progression = contentManager.LoadAssetAsContent<UnitProgressionDefinition>(reference, "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Units\\UnitLevel.cs", 27);
if (!this.Progression.IsSet<UnitProgressionDefinition>())
return;
List<UnitProgressionDefinition.UnitLevel> source = new List<UnitProgressionDefinition.UnitLevel>();
foreach (UnitProgressionDefinition.UnitLevel level in this.Progression.Asset.Levels)
source.Add(level);
this.Levels = source.OrderBy<UnitProgressionDefinition.UnitLevel, int>((Func<UnitProgressionDefinition.UnitLevel, int>) (l => l.From)).ToList<UnitProgressionDefinition.UnitLevel>();
if (this.Levels.Count == 0)
return;
List<UnitProgressionDefinition.UnitLevel> levels = this.Levels;
int from = levels[levels.Count - 1].From;
this.Progression = contentManager.LoadAssetAsContent<UnitProgressionDefinition>(reference, "T:\\JenkinsAgent\\workspace\\SF_SF_Steam_trunk\\Unity\\SF\\Assets\\OwnedByGravity\\Game\\Logic\\Units\\UnitLevel.cs", 27);
if (!this.Progression.IsSet<UnitProgressionDefinition>())
return;
source.Clear();
foreach (UnitProgressionDefinition.UnitLevel level in this.Progression.Asset.Levels)
source.Add(level);
foreach (UnitProgressionDefinition.UnitLevel unitLevel in source.OrderBy<UnitProgressionDefinition.UnitLevel, int>((Func<UnitProgressionDefinition.UnitLevel, int>) (l => l.From)).ToList<UnitProgressionDefinition.UnitLevel>())
{
from += 1000;
unitLevel.From = from;
this.Levels.Add(unitLevel);
}
}
此方法的蓝色部分是游戏原始业务逻辑,红色部分是我添加的逻辑,意思是等游戏读去资源文件并反序列化得到1~15级的等级对象后,我再读取一遍得到新的15个等级对象,再把这15个对象的经验值分别设置为16~30级,即16级比15级所需经验值多1000,此后每一级所需经验值比前一级多1000,最后再把这15个对象添加到Levels集合中。
2023年3月2日更新:
今天重写了等级上限修改的代码,等级上限30级已经没问题了,只是目前强化技能在16级出不来,还要研究下,尽请期待!
其实我第一次实现的逻辑是对的,只是XPLevelDefinition xpLevelDefinition = unitLevel1.XPLevelDefinition这行代码写错了,
把它改为XPLevelDefinition xpLevelDefinition = unitLevel1.Level就正确了,手写真他丫容易出错,哈哈。。。
|
|