|
发表于 2005-1-9 21:34:31
|
显示全部楼层
惊喜又有一个玩家开始深入研究了。
呵呵,水天可以来说说。
我找的一些资料如下
下面是篇转帖,希望能激起大家研究妖人妖的精神:
不知道大家还记不记得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越高。 |
|