|
潜了那么久的水,突然想上来冒个泡。在我的印象里,现在的CMER太懒了,整天只知道泡在论坛里灌水,几天下来也看不见一篇有建设性的帖子。不过让我略感欣慰的是,前几天看了madtoad的《关于球员能力、潜力的计算问题。》一文,发现至少还是有那么一些勤于思考的CMER的。仅以此文献给这些还在绞尽脑汁为推动CM游戏水平进步的可爱CMER。
不知道大家还记不记得CM3的时候有一款Graeme Kelly开发的CM3 Series SaveGame Editor存盘编辑器,其实用过它就大概知道球员的属性和能力值大概是个什么关系 了,下面就以我最喜欢的Giggs为例给大家讲解一下。
先做一下名词解释,如图所示:
RA:球员各项属性的实际能力;范围:1-255
FA:球员各项属性的最终体现值,也就是我们所看见的球员属性,范围:1-20
CA:球员的当前能力,范围:1-200
PA:球员的潜力,范围1-200
球员的属性分类两类:一类是Acceleration、Aggression等FA和RA相等的属性,这类属性不受CA影响,主要集中在球员的身体属性、部分精神属性和隐藏属性;另一类是Anticipation、Crossing等FA和RA不相等的属性,这类属性要受到CA的影响,主要集中在球员的技术属性和部分精神属性。
我们可以用表示FA=f(RA,CA)表示这三者之间的函数关系。经过测试发现,f是一个在(1,127)(128,255)两个区间分别递增的函数,但当CA一定的时候,FA和RA是非线性的关系,当RA一定的时候,FA和CA也是非线性的关系。我不是数学系出身,想要仅以几个采样值来求出这个二元函数几乎是不可能的,于是剩下唯一的办法就是去源程序里找了。我也不是学编程的,更没有faster那种把Diablo反编译的精神与体力,幸好CMScout的作者Nygreen给我们提供了他的源文件,让我们找到这个二元函数。大家有兴趣的可以到http://prdownloads.sourceforge.n ... t-v3.10-source.zip?去下载这个源文件。
程序中有如下一段:
procedure TCM4PlayingData.ConvertRelativeAbilities(Ability: SmallInt);
begin
if Goalkeeper < POSITION_THRESHOLD then
begin
FCrossing:=HighConvert(Ability, Crossing);
FDribbling:=HighConvert(Ability, Dribbling);
FFinishing:=HighConvert(Ability, Finishing);
FHeading:=HighConvert(Ability, Heading);
FLongShots:=HighConvert(Ability, LongShots);
FMarking:=HighConvert(Ability, Marking);
FOffTheBall:=HighConvert(Ability, OffTheBall);
FPassing:=HighConvert(Ability, Passing);
FPenalties:=HighConvert(Ability, Penalties);
FTackling:=HighConvert(Ability, Tackling);
FCreativity:=HighConvert(Ability, Creativity);
FHandling:=LowConvert(Ability, Handling);
FAerialAbility:=LowConvert(Ability, AerialAbility);
FCommandOfArea:=LowConvert(Ability, CommandOfArea);
FCommunication:=LowConvert(Ability, Communication);
FKicking:=LowConvert(Ability, Kicking);
FThrowing:=LowConvert(Ability, Throwing);
end
else
begin
FCrossing:=LowConvert(Ability, Crossing);
FDribbling:=LowConvert(Ability, Dribbling);
FFinishing:=LowConvert(Ability, Finishing);
FHeading:=LowConvert(Ability, Heading);
FLongShots:=LowConvert(Ability, LongShots);
FMarking:=LowConvert(Ability, Marking);
FOffTheBall:=LowConvert(Ability, OffTheBall);
FPassing:=LowConvert(Ability, Passing);
FPenalties:=LowConvert(Ability, Penalties);
FTackling:=LowConvert(Ability, Tackling);
FCreativity:=LowConvert(Ability, Creativity);
FHandling:=HighConvert(Ability, Handling);
FAerialAbility:=HighConvert(Ability, AerialAbility);
FCommandOfArea:=HighConvert(Ability, CommandOfArea);
FCommunication:=HighConvert(Ability, Communication);
FKicking:=HighConvert(Ability, Kicking);
FThrowing:=HighConvert(Ability, Throwing);
end;
FAnticipation:=HighConvert(Ability, Anticipation);
FDecisions:=HighConvert(Ability, Decisions);
FOneOnOnes:=HighConvert(Ability, OneOnOnes);
FPositioning:=HighConvert(Ability, Positioning);
FReflexes:=HighConvert(Ability, Reflexes);
FThrowIns:=HighConvert(Ability, ThrowIns);
FFirstTouch:=HighConvert(Ability, FirstTouch);
FTechnique:=HighConvert(Ability, Technique);
end;
我来解释一下,FCrossing等就是我所说的FA,Ability就是我所说的CA,而Crossing等就是我所说的RA。这里有两个函数:HighConvert和LowConvert。当球员不是守门员的时候,他的非守门属性和共有属性由HighConvert决定,而他的守门属性由LowConvert决定;而当一个球员是守门员的时候,他的守门属性和共有属性由HighConvert函数决定,而他的非守门属性由LowConvert决定。其中HighConvert起主导作用。
HighConvert和LowConvert分别是如下定义的:
其中:Ability=CA,value=RA,Result=FA
function TCM4PlayingData.HighConvert(Ability: SmallInt;
value: ShortInt): ShortInt;
var
Temp: Double;
begin
Temp:=(((value * 2) + Ability) * 0.05) + 10;
Temp:=((((Temp * Temp) * 0.1) + Temp) * (1/3)) + 0.5;
if Temp < 1 then
Result:=1
else if Temp > 20 then
Result:=20
else
Result:=Trunc(Temp);
end;
function TCM4PlayingData.LowConvert(Ability: SmallInt;
value: ShortInt): ShortInt;
var
Temp: Double;
begin
Temp:=(((Ability * 0.1) + (value * 2)) * 0.05) + 10;
Temp:=((((Temp * Temp) * 0.1) + Temp) * (1/3)) + 0.5;
if Temp < 1 then
Result:=1
else if Temp > 20 then
Result:=20
else
Result:=Trunc(Temp);
end;
由此我们可以看出,f是一个二元二次函数。要注意的是Ability的类型是SmallInt,它的范围是(-127,127),这也就解释了f为什么分别在两个区间递增,因为我们看到的(128,255)其实代表的是(-127,-1)。
综上所述,非守门员的Crossing,Dribbling,Finishing,Heading,LongShots,Marking,OffTheBall,Passing,Penalties,Tackling,Creativity和守门员的Handling,AerialAbility,CommandOfArea,Communication,Kicking,Throwing以及两者共有的Anticipation,Decisions,OneOnOnes,Positioning,Reflexes,ThrowIns,FirstTouch,Technique是由函数HighConvert决定的。
通过上面的公式我们也可以部分解释妖人存在的原因了。我们可以看到绝大多数球员的RA都在(-127,-1)区间内,就连堂堂Giggs也只有Dribbling一项属性在(1,127)区间内。而妖人的属性如果在(1,127)内的话,那么即便他的CA很低,他的FA依然可以很高。例如当RA=127时,即便CA=1,依然可以得到FA=20。
以上就是我对FA、RA、CA三者之间关系的解释,感谢各位耐心看完。不过看看就完了,不要深究,CM是一款足球经理游戏,不要过分看重这些数据了,不然到最后我们面前的就只是一堆数字而已,还有什么意思。和现实相结合,才是玩CM的最大乐趣。
2月18日更新
上面的内容大家反映有点复杂,我再抛开程序部分,通俗的为大家解释一下:
还是以上图为例,四类值分别是:
RA:球员各项属性的实际能力,这个值也是游戏中实际存在的,无论是初始数据库还是存盘文件,球员的各项属性都是以这个值的形式保存的;显示范围:(1,255),但由于RA的数据类型是SmallInt,所以实际的范围是:(-127,127)
FA:球员各项属性的最终体现值,也就是我们在游戏中所看见的球员属性,范围:(1,20)
CA:球员的当前能力,范围:(1,200)
PA:球员的潜力,范围(1,200)
CA和PA的关系,我想大家都知道,就是CA总是在(1,PA)这个范围内浮动,这里我就不多说了。
下面主要介绍一下RA、PA、CA三者之间的关系:
球员的属性分为两类:
一类是FA与RA相等,这类属性不受CA影响,主要属性有(CM0304中):
精神属性 非守门员属性 守门员属性 共同属性
Adaptability LeftFoot Eccentricity Acceleration
Ambition RightFoot RushingOut SetPieces
Loyalty Flair TendencyToPunch Strength
Pressure Corners Stamina
Professionalism Teamwork Pace
Sportsmanship WorkRate Jumping
Temperament LongThrows Influence
Controversy Dirtiness
Balance
Bravery
Consistency
Aggression
Agility
ImportantMatches
Injury Proneness
Versatility
Natural Fitness
Determination
这类属性不作重点讨论。
另一类是FA和RA不相等,这类属性要受到CA的影响,主要的属性有(CM0304中):
非守门员属性 守门员属性 共同属性
Crossing Handling Anticipation
Dribbling AerialAbility Decisions
Finishing CommandOfArea OneOnOnes
Heading Communication Positioning
LongShots Kicking Reflexes
Marking Throwing ThrowIns
OffTheBall FirstTouch
Passing Technique
PenaltyTaking
Tackling
Creativity
这类属性可以用函数FA=HighConvert(RA,CA)表示
其中HighConvert可以表示为:
Temp1=(((RA * 2) + CA) * 0.05) + 10
FA=((((Temp1 * Temp1) * 0.1) + Temp1) * (1/3)) + 0.5
如果FA<1,则FA=1
如果FA>20,则FA=20
如果1<FA<20,则FA为上面结果的整数部分
因此,我们将RA和CA带入上述函数,就能得到相应的FA。
这个函数在CA一定的时候,在(-127,127)范围内随RA递增,在RA一定的时候,在(1,200)范围内随CA递增。也就是CA越高,FA越高;RA越高,FA越高。
知道这些对我们有什么用:
一、可以部分解释妖人存在的原因。
当CA=1的时候,由RA=97和RA=127都可以得到FA=20,而由RA=97时得到的FA=20会随着RA的衰减到96而迅速衰减到FA=19,可以说它处在一个不稳定状态,而由RA=127得到的FA=20,要一直RA衰减到96时才能得到FA=19,可以说它相对的处在一个稳定的状态。这就是为什么我们修改出来的属性全为20的球员会很快状态下降,而游戏里的妖人的一些状态可以稳定的保持在20。因为我们现在的修改器,都只能修改FA而不能修改RA。
二、RA和CA那个重要
由(RA * 2) + CA可以看出,在单项属性上RA的影响力要比CA大。(由(Temp1 * Temp1)可知,其影响力不只2倍)但是,由于CA一共影响了19项属性(非守门员),而且都是很重要的技术属性,因此个人认为,在RA和CA都有很大上升空间的情况下,CA显得更为重要。
三、选拔年轻球员的原则
由于第一类属性FA不受CA影响,因此这类属性只能靠训练提高,增加的比较缓慢。因此我喜欢挑选这些属性都比较高,潜力也比较高的年轻球员,即便他们的技术都非常烂。但随着CA的提高,他们的技术一般都会飞速提高。
以上都是我的一些个人观点,还望大家海涵。另外还有什么好的提议,也请大家不吝赐教。 |
|