使用CheatEngine修改游戏《电竞俱乐部》

游戏《电竞俱乐部》的中后期非常无聊,这里展示了如何使用CheatEngine修改游戏里电竞打手的参数,包括选手星星数、潜力(星星上限)、年龄、耐力、MOBA英雄池深度、粉丝数等。这些参数大多难以通过常规方法修改。

近期开启了暑假模式,除了猛汉王外偶然在WeGame上打折2元入了一款小作坊单机《电竞俱乐部》。这款游戏前期还是非常新鲜的,但到了中后期就非常枯燥无聊,然而不体验到最后秒天秒地秒空气的一刻又感觉很蛋疼,于是只好采用修改器加快游戏进程。

类似CheatEngine的内存修改器的基本用法这里不再赘述,其原理基本上就是根据一个游戏数值的变化来追踪到其在内存中的地址从而实现直接修改到想要的数值。对于《电竞俱乐部》这款游戏来说,我们可以很容易地修改金钱、杯赛积分、信用币,以及电竞打手的粉丝数、英雄理解等属性。不过,对于游戏中更重要的、电竞打手的内在属性却很难修改:一些属性是恒定不变的,例如,耐力英雄池深度;另一些属性可能只是由其它一些不可见参数实时换算得到的、因而无法直接从字面数值搜索得到,例如星星数潜力年龄

但是车到山前必有路,没路也得走条路。既然这篇日志发了出来,自然表明上述的问题最后都得到了解决。这里展示了如何使用CheatEngine修改游戏《电竞俱乐部》,修改属性包括选手星星数潜力(星星上限)年龄耐力MOBA英雄池深度等。你可以从下面的锚点快速定位到你感兴趣的部分:

分析工作

粉丝数修改

耐力、英雄池深度、潜力修改

年龄修改

星星数(能力值)修改


分析工作

这一节描述了前期的分析工作,如不感兴趣可以跳过。

我一开始打算的是修改选手的潜力,毕竟按照游戏本身的进度打完一场杯赛只能给0.08的星星上线提升,这要打多少年才能把全队都升到4.5星以上?一开始尝试用CheatEngine的浮点数查找,无果,然后考虑到潜力和星星都保留了2位小数尝试了整数查找,依然无果。一时间万念俱灰,知道找到了下面的突破口,因为我发现这个游戏果然——是Unity开发的!

C#编译成的IL码很容易被反编译成源码,只要找到对应的类就可以非常直白地看出想要修改的数值究竟是以怎样的数据类型定义的,接下来再修改岂不是小事一桩?于是乎,使用ILSpy进行反编译后,找到了下面的EMTeamMember类:

可以看出,一个电竞打手的星星数(OverallStar)和潜力(Potential)分别是从OverallAbility和_data.potential计算得到的,因此显然直接查找游戏中显示的数字无异于缘木求鱼。OverallAbility,展开下面的属性定义可以看到,是选手的能力值(MOBA模式下的单杀、团战、发育、意识、判断五项)之和。而_data,我们可以跳转到对应的类定义,其代码如下:

[Serializable]
public class TeamMemberData : EMData
{
	public int id;

	public int dataRandomId;

	public EMGameType game;

	public string firstName;

	public string lastName;

	public string nickName;

	public string figure = "head2_hair1_glass1_bread0";

	public string customfigure = string.Empty;

	public string name = "hu jianglong";

	public string fullname = "hu 'sky' jianglong";

	public EMNation nation;

	public string region;

	public string birth = "1986.1.1";

	public int teamId;

	public int fans;

	public float bodyEndurance;

	public float mentalEndurance;

	protected float[] ability;

	private float[] _ability;

	public string[] position;

	public string[] style;

	public int potential;

	public int experienceMax;

	public int endurance;

	public float personality;

	public int[] characteristic;

	public int patience;

	public int contractAttitude;

	public int[] teamClaim;

	public int[] upgradeClaim;

	public int[] upgradePotential;

	public int conversationPoolID;

	private int _skillLimit;

    //以下省略
}

直到这里,那些不好修改属性的信息基本上已经明了了。基于这些信息进行一些实验后,最后我总结出来的结果如下:

  1. 能力值ability、_ability是float数组,能力值之和决定了选手的星星数OverallStar。
  2. 潜力potential是一个int类型的数据,这个数值乘以一个系数后得到了0.00~5.00星表示的形式。
  3. 粉丝数fans、耐力endurance、英雄池深度_skillLimit都是int类型,且定义在同一个类中。
  4. 年龄是通过string类型的生日birth计算得到的。

粉丝数修改

这个修改比较常规,因此不会详细描述。考虑如下图所示的打手:

当前粉丝数为18858,我带他打完一场比赛后增加到了128236,两次筛选后确定到了内存地址0x40D50F38,如图所示:

注意这个地址!!对接下来的修改很重要!!


耐力、英雄池深度、潜力修改

一个选手的耐力、英雄池深度和潜力很难直接搜索得到。不过,前面分析里我们得知这些数据和粉丝数定义在同一个类中,因此粉丝数的内存附近必然这些数据!

前面得到粉丝数地址为0x40D50F38,右键地址,选择Browse this memory region,在新窗口的下方右键,Display Type,选择4 Byte Decimal。对粉丝数地址做相应的偏移,我们可以找到耐力、英雄池深度、潜力对应的地址,如图所示:

前面看到这位大兄弟的潜力大概为4星,为什么这里潜力是295呢?正如前面分析里提到的,游戏里显示的潜力是一个整数乘以一个系数到0.00~5.00之间,这里370的潜力大概对应的满的5星潜力。接下来,修改潜力为370,耐力为24,英雄池深度为180,如图所示:

返回游戏,即可看到这位大兄弟已经脱胎换骨了:


年龄修改

年龄在《电竞俱乐部》这款游戏中也算至关重要的参数,因为超过24岁的打手会变得开始慢慢变菜。前面分析里我们知道,年龄是通过生日计算得到的,而生日是以字符串形式存储的,字符串的地址同样在粉丝数地址的附近,如图所示。

右键生日地址,选择Follow(或者左键生日地址,按快捷键Space),可以跳转到生日的字符串处:

这里将生日修改到2004年,注意最好在右侧一个个地修改数字,不要误伤到数字前后的“.”,否则将变成非法的Unicode字符。如图所示:

回到游戏,发现这位大兄弟已经焕然一新。


星星数(能力值)修改

前面分析里我们知道,打手的星星数是由能力值之和决定的。刚才发现,在8月24日的新更新中,打手的星星数的显示不会超过潜力,因此要想得到一个5星打手还必须先修改其潜力为5星

考虑到5个能力值是在一个浮点数组中,一个较快的方法是使用CheatEngine的联合查询。选择Value Type为Grouped,然后搜索:

f:52.94 f:56.73 f:73.15 f:38.87 f:54.13

这5个数字分别就是5项能力值的界面显示数字(注意顺序)。得到的结果如下:

接下来大胆的把上面所有数据全部修改为100.0。考虑到一个个改非常繁琐,这里推荐一个有效率的操作:

  1. 全选所有结果;
  2. 右键,Add selected addresses to addresslist;
  3. 全选下面的addresslist;
  4. 右键,change record,value,输入100.0.

回到游戏,这位大兄弟已经脱胎换骨了:


后记

《电竞俱乐部》一开始的游戏体验很惊艳的,不过到后面却越来越无聊,这时候修改器玩法也是一种不错的游戏玩法吧。这款游戏目前还在不断地更新中,希望它在今后能够越来越好。

称谓(*)
邮箱
留言(*)