gsky1986 发表于 2011-4-11 08:29

[ElonaEXE*研究系列*之(一)]找出属性和技能的成长公式

本帖最后由 gsky1986 于 2011-4-12 02:15 编辑

本文长,很长,非常长,如果你想在游戏之外找点乐子,比如接触技术,不妨看看。

感谢whiteling 童鞋 提出质疑,公式得到再次修正:)。
   
目前此公式并不十分完善,已知的适用范围还是仅限于打怪带来的成长,吃肉、喝药的还待于继续研究:)。

Elona很好玩,不是么,连我这个上了岁数的老人都对其痴迷不已,想修改?想Mod?,源代码没公布怎么办?

   嗯....在这残酷的时刻,我们只能慢慢研究它的EXE,看看能不能发现些什么。

   本文旨在抛砖引玉,希望坛子里的达人们能火爆研究,打造自己的MOD。{:3_162:}

   有错的地方也请指出哈!

   开场!










>>Elona技能和属性等等的数据格式

   先看看角色属性图:

   

   红色标记的力量(Str),再看看内存中的数据:

   

嗯,红色部分,就代表力量的有关数据,我们划分一下:

->:

其中Head很好理解,就是我们属性栏显示的部分,那Middle和Last又分别代表什么呢?

看看技能的图:



和相关的内存数据:



对比下即可发现Last = 414 代表潜能,多对比一下其他技能即可确认。

那么剩下Middle是干什么的呢?

纠结啊,Middle其实是个很神奇的数据,有多神奇?

嗯....喝口水先.{:3_153:}

Middle = 836 神奇在它是个小数!{:3_164:}

为了让我们的属性和技能有所成长,靠小数是不行的,不靠小数更是万万不行的,小数们勇往直前,总有一天会成为整数的,苏格拉底说...............

咳咳,走神了,既然它这么神奇,我们就看看它是怎么影响属性成长的吧。为了尽量通俗,系列1中代码部分不做过分强调。












>>Elona,属性、技能成长逻辑

看图说话:



嗯这个数值貌似很熟悉哈,不错,它就是我们的 解剖学技能的数据。

一段微小的运行后,看看内存:



好神奇,变成了44!44是什么呢?聪明的你,一定想到这就是 Head!(额,恶心了)

嗯,代码如下:

0040200C > \8B06 MOV EAX,DWORD PTR DS: ; 拿到 44836414
0040200E . 99 CDQ
0040200F . F7F9 IDIV ECX ; 得到44,您就当(44836414-836414)/1000000 = 44
00402011 . 8906 MOV DWORD PTR DS:,EAX ;44进入内存


原来Head = 44是这么来的,汗,不复杂么!不复杂?好,继续走着:



嗯嗯,Last = 414出来了哈!小样想干嘛?



注意!注意!注意!(我为什么连说3个呢?{:3_187:} )

绿色部分是414,红色变成了4140!我勒个去,差了10倍啊!怎么着?来点代码?

00401FE6 > \8B16 MOV EDX,DWORD PTR DS: ; 拿到414
00401FE8 . 0FAFD1 IMUL EDX,ECX ; 414*10 = 4140(为啥是乘以10?嗯....这牵扯到一个很复杂的Swich...Case....)
00401FEB . 8916 MOV DWORD PTR DS:,EDX ; 4140入内存


要是人民币能这么乘多好!嗯,人民币确实是好东西,可以买烟买酒买小妹妹....................咳咳,权且记下来:

temp1 = Last*10

嗯,接着走:



注意!注意!注意!注意!(额,为啥老衲如此师太!)

Head = 44和一个神秘力量,哦不,是数据15出现了!

此时,4140 和 44 还有这个神秘的不知神马来头的龌龊数据相会了!他们之间将会发生什么样的暧昧情节?喔,这个真是太恶心了.................



嗯,他们合体了?他们生出个金刚葫芦娃 = 660?

远目之后,还是回到660上来,你懂的,代码依然在下面:

00401FE6 > \8B16 MOV EDX,DWORD PTR DS: ; 把44交出来,想干嘛?
00401FE8 . 0FAFD1 IMUL EDX,ECX ; 不要哇,44*15 = ? =? =660!!
00401FEB . 8916 MOV DWORD PTR DS:,EDX ;


惊天动地、地动山摇、摇钱树般的合体啊,合出个660,嗯,权且记下:

temp2 = Head*15












接下来的故事想听么?想就挺住,刺激的在后面:



注意!嗯,这次我很拿得住哦,Good for me,又出现了另一个神秘数据 760!

o(︶︿︶)o 唉,复杂的1-13啊,代码:

00401FDA > \010E ADD DWORD PTR DS:,ECX ;弱弱的660被100夹了之后,弱弱的变成了760....惨不忍睹....


   一句代码也复杂?嗯,其实真的很复杂.................此处略去xx字。












   temp3 = Head*15+100

   为啥是+100?为啥?为啥为啥?

   还记得前面的图里有个100么,不记得?翻去。

   其实它就是个常量而已。{:3_160:}

   不要纠结,继续走着:

   

   发现什么了?什么?发现了个5?5姑娘...{:3_140:}

   嗯,这个5不是一般的5,它来自遥远的................遥远的Elona............解开你的枷锁............我瘦了

   且看:

   0040200C > \8B06 MOV EAX,DWORD PTR DS: ; 4140
0040200E . 99 CDQ
0040200F . F7F9 IDIV ECX ; 4140/760 取商 = 5
00402011 . 8906 MOV DWORD PTR DS:,EAX



   嗯,这个 5 的来头搞清了,就是4140一杠子打到760头上,760 一巴掌煽到4140脸上的那个印子....什么?760有6个指头?我去..............

5要干什么呢?你想知道,我也想知道,那咱继续往下看:



出来了836?836?嗯,Middle = 836?什么?你不知道?我也才知道嘛。。



嗯,出来了1000000,摇奖机子中奖1000000!



嗯,神奇的地方来了,841*1000000 = 841000?

不对,那1000000是给老大准备的,841就是836+5,你还费解么?

841000就是841*1000,你还费解么?费解?我少截图一章1000的,你就费解了?嗯...............我不是解释.............我瘦了............





有趣吗?哈哈,












44*1000000+(836+5)*1000 = 44841000

嗯,老大Head和我们口耐小数836姑娘以及神秘力量5开始合体了,遗传学Max啊!!!!



注意!注意!注意!(额,又没刹住) 我们的Last = 414再次华丽出现!


抢镜中!




Bingo!
    ->: 44*1000000+(836+5)*1000 + 414 = 44841414

Formular:

newAttr = Head*1000000 + (Middle+Math.Floor(Last*OneOf(0,10]/(Head*15+100) ?Rand))*1000 + Last.

Last代表潜力,Head代表整数部分,Middle代表小数,Math.Floor代表向下取整(取商),OneOf(0,10]代表从0到10取一个整数。?代表为0时,随机选取0到1,随机规则比较复杂,以后再研究。
到底,一段惊天动地、地震海啸、哮天犬的故事结束,我们完成了由44836414到44841414的创举!

Hoorai(y?)!

gsky1986 发表于 2011-4-11 08:38

占楼备用.{:3_152:}

siyan12 发表于 2011-4-11 08:38

沙发,楼主技术啊,可惜看不懂,

gsky1986 发表于 2011-4-11 08:40

回复 3# siyan12


    其实就是些图片拉,呵呵,你可以看看下面的公式就好拉:)

x115152134 发表于 2011-4-11 08:43

{:3_134:}
天啊

gsky1986 发表于 2011-4-11 08:50

回复 5# x115152134


    挺住 {:3_161:}

mozia1989 发表于 2011-4-11 09:10

技术流。。。{:3_190:}

gsky1986 发表于 2011-4-11 09:13

回复 7# mozia1989


    国内研究Elona的还很少,感谢支持。

sxooxs 发表于 2011-4-11 09:42

虽然我很努力的看了下去,,可....完全不懂啊混蛋,,

最近在玩1.22 还加了个MOD,,也是用更换EXE启动程序实现的,,,

所以...好怀念LZ的法术消耗1/4和白金币双倍的效果,,,

想在别人的MOD上添加这个功能可实在是力不从心啊....

gsky1986 发表于 2011-4-11 09:45

回复 9# sxooxs


    :) 1.22还没接触,有什么新的地方吗?我连1.16都没玩过半,哈哈。

sxooxs 发表于 2011-4-11 10:53

回复sxooxs


    :) 1.22还没接触,有什么新的地方吗?我连1.16都没玩过半,哈哈。 ...
gsky1986 发表于 2011-4-11 09:45 http://bbs.blacksheepgame.com/images/common/back.gif


   
1.22有个MOD显示几乎所有数值,,比如人物潜力可视 抗性数值化 魔法经验数值化 装备技能加成数值化 耐力数值化 食物腐烂倒计时 宠物训练具体项目烹饪结果可选等等,,
挺中意这些功能的...还有个MOD可以简单的调节宠物攻击模式比如待机啊 防守啊 主动攻击啊默认的AI很多怪不打特别是做收获任务老是被小怪打扰 但因为MOD都是直接内嵌入启动文件,,所以不能共用,,只能选最实用的MOD了,,

然后1.22还能用很多自制NPC,,我非常喜欢那些极具特点的自制NPC,,,培养自己的后宫团是我游戏的最大乐趣了...原版的妹子太少了,,而且AI都差不多..

不过1.22基本没有新内容 游戏流程跟1.16基本一样,,所以即使是日文玩起来也没什么障碍...唯一可惜的是你的微调MOD我还没爽2天就不能用了...

好了我继续与命运抗争去了...


对了我用的那个MOD还能直接训练属性潜力价格跟技能一样算法,,,我50魔力想训练一次潜力要12个白金币....因此白金币价值更高了...于是每天几个城市轮着跑就为了多赚点白金币培养自己的角色...
最坑爹的是速度潜力妖精初始速度是120算120级的技能训练1次速度潜力要26个白金币.......

菜肉包包 发表于 2011-4-11 11:18

太复杂了,话说找到内存,直接改就行了。

sunmoon55555 发表于 2011-4-11 11:31

好厉害...{:3_121:}这个是修改吗?

wayalisn 发表于 2011-4-11 12:34

whiteling 发表于 2011-4-11 13:08

Bingo!
    ->: 44*1000000+(836+5)*1000 + 414 = 44841000

此处是不是漏了414?

另外Math.Floor(Last*OneOf(0,10]/(Head*15+100))
这个..中间懒了下没看= = 直接看结论了..0-10的范围真的没问题么?..向下取整的话..
假设潜力50 最高取到500 (500-100)/15=26.XX 就是说到27级就一直是0了?

gsky1986 发表于 2011-4-11 18:16

回复 15# whiteling


    不是那样计算。

   (Last*OneOf(0,10]/Head*15+100)等于0的条件只有你的潜力为0,即Last=0时才会满足。

   (0,10]左边是开括号。


   嗯,的确漏了414,呵呵,疏忽。谢谢补正。

gsky1986 发表于 2011-4-11 18:18

本帖最后由 gsky1986 于 2011-4-11 18:23 编辑

回复 12# 菜肉包包


    内存是变化的,你可以试试看技能计算数据的内存交换区(而不是技能数据存储区域)能不能改,除非你抓住那个特定的时刻。


   否则你要更多的寄存器条件来判定。。


   一次直接改内存和动态增量有联系,但更多的是区别。


   而且Mod这事只关乎内存么?呵呵。只有数据而没有逻辑的那不叫Mod。

   elona不仅仅是你技能成长时会访问技能存储区域,可以说它时时刻刻在循环扫描那个区域。


   这也说明了elona的图像引擎很渣。{:3_162:} 个人浅见。

gsky1986 发表于 2011-4-11 18:31

回复 13# sunmoon55555


    这个在于打开Elona逻辑的冰山一角:)。

gsky1986 发表于 2011-4-11 18:34

回复 11# sxooxs


    哇,这么强大,呵呵,作者应该对1.22加入了支持吧。

烙印 发表于 2011-4-11 18:41

技術貼,看不懂{:3_185:}
純支持{:3_123:}

璜獅淲︷の 发表于 2011-4-11 18:54

此贴必须顶,留名以后学习{:3_193:}

rip555 发表于 2011-4-11 19:07

说实话~~没看懂~~

Messiath 发表于 2011-4-11 19:17

LZ果然有深度~~~~~~

gsky1986 发表于 2011-4-12 00:44

回复 20# 烙印


    感谢支持~

gsky1986 发表于 2011-4-12 00:44

回复 21# 璜獅淲︷の


    共同进步~{:3_136:}

gsky1986 发表于 2011-4-12 00:44

回复 22# rip555


    关注就是支持,谢谢:P

gsky1986 发表于 2011-4-12 00:45

回复 23# Messiath


    抛砖引玉:P

whiteling 发表于 2011-4-12 00:50

本帖最后由 whiteling 于 2011-4-12 01:04 编辑

回复whiteling


    不是那样计算。

   (Last*OneOf(0,10]/Head*15+100)等于0的条件只有你的潜力为0, ...
gsky1986 发表于 2011-4-11 18:16 http://bbs.blacksheepgame.com/images/common/back.gif


    抱歉 还是没弄懂...
    不是向下取整么?那么不是小于1就取到0么?小于1的话不是只要除号左边小于右边么?

    因为帖子里的例子是414*10/(44*15+100)=4140/760=5.XX向下取整到5
    那么要是潜力为41 就成了41*10/(44*15+100)=410/760=0.XX向下只能取到0 这样理解哪里出了问题?= =

gsky1986 发表于 2011-4-12 02:01

本帖最后由 gsky1986 于 2011-4-12 02:07 编辑

回复 28# whiteling

    刚才又跟了一遍,刻意取了一个可以得到0的数。

    没错:P,最后还会有个增量,+1,游戏的概率性很强,随机的东西跟起来十分的麻烦,这个增量是怎么来的比较复杂。

    这个公式应该以后还会修正的,先提出来:P。

wtoe022 发表于 2011-4-12 08:54

完全不懂······
页: [1] 2
查看完整版本: [ElonaEXE*研究系列*之(一)]找出属性和技能的成长公式