elona吧 关注:76,079贴子:1,131,308

E+代码分析讨论

只看楼主收藏回复

虽然起了一个高大上的标题,但是楼主只是想在系列贴外开个能长期水的帖子(大雾)
因为楼主是程序小白,所以帖子性质介于(向大神)求助或者(小白们)互助。
代码的来源为E+1.62 custom,下载传送门会放到楼下 (custom自带游戏源码,文件为source.hsp但是可以用txt甚至浏览器打开)
虽然基本完全看不懂。不过楼主还是会努力在平时慢慢刷“抛砖”技能,更新一些自己看代码及相关验证的记录和疑惑。如果有其他朋友也愿意来一起研究研究自己感兴趣的部分,欢迎一起探讨哈w能从讨论中把大家的“宝石”不断引出来就实现帖子的初衷啦~
当然,更欢迎懂程序的前辈大大们能来答疑解惑,指点楼主这样的小白们一些E学经验。


IP属地:湖南1楼2016-12-30 20:16回复
    Elonaplus Custom作为elona衍生作品elonaplus的衍生作品,是由国外有爱的女生AnnaBannana牵头制作的。这个作品主要弥补了自原版以来,英文版elona在剧情方面的严重不足。具体的介绍我会在系列贴第三篇后单讲,这里主要是占个楼给出下载地址,方便大家获取游戏源码。
    因为是个人向作品,所以更新不一定很及时。目前的版本对应1.62,因此大家下载custom后,能够看到的源码也是1.62版本的。后续版本对源码的变动还是要等新的custom版本或者保持关注贴吧的最新帖子啦。


    IP属地:湖南2楼2016-12-30 20:24
    收起回复
      2025-05-24 07:15:14
      广告
      于是先简单开个头好了。
      【经验计算公式】
      因为最近比较关注几个采集技能的成长,所以查了查相关的代码。
      目前分析出的情况是:
      经验子程序:#deffunc skillexp int prm_623, int prm_624, int prm_625, int prm_626, int prm_627
      其中623 对应技能/属性/魔法编号,624未知,625对应经验增长。
      比如在每次采集后,程序都会执行:
      skillexp 180, 0, 50
      意思就是编号为180 的技能获得 50 初始经验
      然后这个50初始经验就要通过 skillexp子程序来做修正。
      首先会做一个var_82(0, prm_623) != 0 的判定 (没看懂w),如果成立则经验减半
      然后是重点:
      实际经验=初始经验*潜能/(100+等级*10)
      如果技能编号处于10-19之间,且var_57(270 + prm_623 - 10, prm_624) > 0 成立
      那么实际经验还要再次修正
      实际经验2=实际经验*(100+var_57(270 + prm_623 - 10, prm_624))/100
      如果算到这里的实际经验=0,那么会有一定几率调整为1(概率近似10/等级)
      然后就是奖励经验的计算。有一定几率根据学习技能来获得一个2-5倍的经验加成。这部分以后再说w


      IP属地:湖南3楼2016-12-30 20:37
      收起回复
        【经验计算公式-测试】
        126级的技能(基因工程,下同),56%潜力做测试。(学习技能超过1000,奖励经验固定为5倍)
        理论上是50*56/(100+126*10)=2.05经验,实际获得2经验,奖励经验时实际获得10经验。
        6级技能,其他条件不变。
        理论获得17.5经验,实际获得18经验,奖励时获得90经验。
        10级技能,其他条件不变。
        理论获得14经验,实际获得14经验,奖励时获得70经验。
        12级技能,其他条件不变。
        理论获得12.7经验,实际获得13经验,奖励时获得65经验。
        【结论】
        1 公式确实成立,地方找对了。
        2 此处取整非向下取整,而是采用四舍五入取整。
        3 从初始经验到实际经验会进行一次取整,奖励经验时采取取整后的实际经验。
        大概就是这样啦


        IP属地:湖南4楼2016-12-30 20:44
        回复
          啊…如果有什么不明白的地方 我想我可以提供一些帮助


          来自Android客户端5楼2016-12-30 21:33
          收起回复
            前排留个名
            程序国内下载不下来
            先mark等开学没(上)事(课)再看


            IP属地:加拿大6楼2016-12-30 22:12
            收起回复
              话说这引擎是日本的,中文版使用手册估计没有吧,难道要肯英文?


              IP属地:加拿大7楼2016-12-30 22:20
              收起回复
                百度搜索elona反编译 能找到反编译与编译elona的教程 这样的话就可以获取到最新的代码而且可以魔改代码进行测试了


                来自Android客户端8楼2016-12-30 22:20
                收起回复
                  2025-05-24 07:09:14
                  广告
                  常用的变量的含义
                  var_81(A, B)B单位的A技能等级
                  var_83(A, B)B技能的var_83中的第A+1个数值
                  注var_83的五个数值分别为:技能对应的属性、技能的类别、技能的消耗、技能的对象、魔法的难易度
                  var_243施术者
                  var_244受术者
                  注0代表PC,1-15代表PC的宠物
                  var_57(A, B)B单位的编号为A的数值
                  比如38为等级、34为名声、35为经验、36为升级所需要的经验、70为PV、71为DV……


                  10楼2016-12-31 12:07
                  收起回复
                    常用的函数的含义
                    与技能经验有关的函数skillexp
                    skillexp 获得经验的技能, 获得经验的单位, 原始经验, 与对应属性经验的获得有关的系数, 与升级经验获得有关的系数
                    与物理伤害计算有关的函数calcattackdmg
                    与物理攻击命中有关的函数calcattackhit
                    检查某BUFF是否存在的函数findbuff
                    计算BUFF效果的函数calcbuff
                    与伤害有关的函数dmghp
                    dmghp 受到伤害的单位, 原始伤害, 伤害的施加者, 伤害的属性, 与异常相关的数值


                    11楼2016-12-31 12:25
                    回复
                      【自家NPC招募相关】
                      最近被提醒到自家可以多招募魔法店方便刷药水和卷轴,于是涉及到如何多招同类型店的问题。
                      招募的代码位置大概在:
                      txt_select lang("誰を雇用する?", "Who do you want to hire ....
                      这行附近,大致看了下,发现看不懂。
                      所以果断GOOGLE求解。大概机翻后的理解是:
                      首先回执行10次循环,每次循环中,
                      1 根据当前日与某参数A生成一个随机数
                      2 根据1 50%的概率生成
                      3 第一次循环生成女仆,后面的循环生成随机职业
                      4 再次重复步骤1,重新随机
                      5 根据4生成一个店主,规模为1-15。 (武器店,杂货店,魔法店,万事屋,武器店,黑店六选一)
                      6 如果存在同名NPC,则消除该生成店主(重要!)
                      参数A在某个时间段,是固定的。于是很多在游戏中的现象就好解释了。
                      1 如果直接S/L告示牌,招募列表基本不变。(因为参数A固定)
                      2 S/L的时候经常是某个角色会变动职业,但是只是在两种职业中来回生成。(与步骤2相关)
                      3 日期变动,招募列表也会有变动,天数过的越多变动越大。(参考步骤1)
                      于是,想要全魔法店,全女店主之类的朋友,我们应该怎么做呢?
                      1 《确保你的当前日招募列表中存在你想要的店主类型。》
                      具体方法是,每天看看告示牌招募列表,如果有一天出现 女性魔法店主,OK,恭喜你已经成功了一大半。
                      (如果等不及也可以用Eloname修改日(day),注意修改月和年是没用的,只改日就可以,改一下翻一下告示牌,直到生成理想类型为止。

                      2 《招募需要的店主,然后i键干涉他/她改个名字。》
                      这步十分重要,很多玩家就是栽在这步。所以经常抱怨:为什么我招不到第2个魔法店...我最多只能招到N个(N<3,N<4)之类。如果你招了人后立马改名,再看告示牌就会发现完全一样的店主还在招募列表里待着。所以还能继续招,继续改名。以此循环往复。
                      至于为什么必须改名,其实可以参考步骤6。因为我们说某段时间内参数A是固定的,所以如果当前日会生成某类型店主,那么该店主的名称也是由这个固定的参数A决定,因此名称必然相同。如果不改名,那么根据步骤6,生成的店主会被chara_vanquish消除,于是在招募列表就看不到了,让玩家误以为该类店主无法再生成。
                      以上便是招募同类店主的具体办法,亲测有效。最后,祝各位刷刷刷刷刷!
                      (附个人成果,眼熟的话悄悄握个手



                      IP属地:湖南12楼2017-01-04 01:05
                      收起回复
                        感谢 @农农酱 10L的指点。
                        目前已把相关属性技能魔法等数据整理完毕。
                        源码版本:V1.64

                        下载地址见楼中楼。


                        IP属地:湖南13楼2017-01-07 18:55
                        收起回复
                          【魔法消耗】
                          源码版本:V1.64
                          测试环境:1.62Custom
                          本来是想找幸运神魔法学校的,但是没找到,就拿这个先练手了。
                          另外今后统一注明版本,因为发现版本不同,源码的变量编号也会变...
                          魔法消耗子程序:#defcfunc calcspellcostmp int prm_987, int prm_988
                          987代表魔法编号(编号对应魔法,基础消耗资料见楼上),988代表施放角色(0为PC)
                          (a) 如果是PC施放魔法,那么魔法消耗为:
                          INT((INT(基础消耗*(100+魔法等级*3)/100)+INT(魔法等级/8))*0.9)
                          另外,Oracle ,Resurrection,Door Creation ,Wall Creation ,Teleport Other ,Teleport,Short Teleport以及Gravity 8个魔法直接取基础消耗不参与上式计算。
                          (b) 如果是非玩家施放魔法,那么魔法消耗为:
                          INT(基础消耗*(50+角色等级*3)/100)
                          最后,如果施放角色职业为法师,那么最终消耗*0.9后取整。
                          就是这样了。
                          P.S.1. 这里贴吧魔法表V1.53那个版本写的是咏唱等级,实际上是错的,应该是角色等级。
                          P.S.2. 魔法风暴84级时消耗可达150,因为神谕固定消耗150,也就是说之后拿魔法风暴刷经验更好。


                          IP属地:湖南14楼2017-01-07 22:26
                          收起回复
                            【库存消耗】
                            源码版本:V1.64
                            测试环境:1.62Custom
                            本来可以接上楼,鉴于贴吧的坑人机制,所以拆成两部分。其实在代码里两者就是连在一起的。
                            库存消耗子程序:#defcfunc calcspellcoststock int prm_989, int prm_990
                            989代表魔法编号,990代表施放角色 (话说回来除了PC外其他人还有哪门子的库存呀...)
                            库存消耗a=INT(基础消耗*200/(魔法等级*3+100))
                            然后如果 库存消耗a< INT(基础消耗/5), 那么修正为INT(基础消耗/5)
                            接下来,
                            库存消耗b=(1 到 库存消耗a/6 之间的一个随机整数)+INT(库存消耗a/6)
                            如果库存消耗b小于1,那么修正为1。
                            综上,魔法等级达到300级后,库存消耗a达到下限,下限为基础消耗/5
                            此时施放一个魔法,需要消费的库存为 基础消耗/30 到 基础消耗/15 之间的一个随机整数。
                            呃,换句话说...这时候基本上大部分魔法就是1点消耗,没几个魔法能耗到5的...
                            即使是陨石魔法每次消耗的库存也不过是8-15而已...
                            (原谅楼主智商感人...同一段内容修改3遍才搞定...)
                            放个300级预测截图聊表歉意...

                            漏了几个没截上图,不过没关系以后会直接给出文件的。


                            IP属地:湖南17楼2017-01-08 09:35
                            收起回复
                              2025-05-24 07:03:14
                              广告
                              诶,我也是傻了。魔法学校就在使用calcspellcostmp函数的后面。
                              效果是将魔法消耗变为 2 到 2+int(实际消耗*1.4) 之间的一个整数。
                              也就是说如果原来计算后的实际消耗很大,那么随机后的修正消耗就可以非常小。当然也可能非常大。
                              但平均期望在实际消耗的0.7倍,所以感觉上就经常是消耗变少而不是变多。
                              不过又查到的一个问题是,库存消耗那里按照公式计算后如果结果大于1的数A,那么程序里给出的结果是A-1
                              假如400级支配库存消耗是5-9,那么实际测试库存消耗就是4-8,费解啊。
                              当然像1-1这样的自然是实测1-1了。
                              虽然不太明白,不过不管了。


                              IP属地:湖南18楼2017-01-09 19:14
                              收起回复