elona吧 关注:76,081贴子:1,131,008

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 21:50:49
      广告
      于是先简单开个头好了。
      【经验计算公式】
      因为最近比较关注几个采集技能的成长,所以查了查相关的代码。
      目前分析出的情况是:
      经验子程序:#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
        回复
          【自家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 21:44:49
                  广告
                  诶,我也是傻了。魔法学校就在使用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
                  收起回复
                    【关于宠物的训练费】
                    嘿嘿嘿,这回凭借自己的力量解决了一个搁置很久的小问题。(大雾)
                    宠物的训练费,更新日志上明确写明是和INIT有关。但是具体公式为何,前人并未说过。
                    所以就有了 /p/4889518466 16L @每日c的花生 列举的特殊情况。
                    简单的找了下,发现对应公式如下。
                    训练费a=属性INIT*8+速度INIT*10 (就是属性界面里INIT那两项)
                    训练费b=训练费a-宠物魅力*5
                    然后再从 训练费a/2 与 训练费b 中选取大者,作为最终训练费。
                    由此可知,在魅力很低时,1点魅力可以节省5GP
                    此时训练费为 属性INIT*8+速度INIT*10-宠物魅力*5
                    在魅力足够高时(既魅力大于 速度INIT+0.8属性 INIT),训练费固定为最低值。
                    此时训练费为 属性INIT*4+速度INIT*5
                    形象来说,用了链接之网(速度INIT50 属性INIT 258-600)的宠物大概训练费就是1082-2859。
                    而用链接之网之前的喵神(速度INIT240 属性INIT 2552)在魅力1000的情况下依然是17816。
                    所以INIT好重要呀(点头)


                    IP属地:湖南20楼2017-01-09 22:48
                    收起回复
                      【魔法系列】01
                      源码版本:V1.64
                      测试环境:1.62Custom
                      首先是施法威力,位置在:#defcfunc calcspellpower int prm_983, int prm_984
                      prm_983代表魔法/技能编号,984代表施放角色
                      对于非魔法(编号大于600的技能)
                      如果PC的相应技能等级大于0,则威力=技能等级*6+10,否则为100
                      如果施放角色为PC(prm_984=0):
                      那么威力=魔法等级*10+50
                      在特殊情况下(var_64(175) == 666,看不懂),如果吟唱等级*6+10大于上述威力,则威力更变为吟唱等级*6+10
                      如果施放角色为NPC:
                      施法角色吟唱等级为0,且非队友时,威力=角色等级*6+10
                      其他情况威力一律=吟唱等级*7+10
                      一个简单的结论是,2000级NPC无吟唱无加成时,施法威力为12010,相当于:
                      (a)有1714级吟唱的队友,或
                      (b)1196级魔法,但无任何加成的PC
                      (c)496级魔法,封顶2.4倍加成的PC
                      这4倍的差距多少算是个优势吧...
                      然后是BUFF魔法,位置在开头:#deffunc calcbuff int prm_270, int prm_271, int prm_272
                      270代表施放目标,271代表BUFF类型,272代表施法威力
                      每个BUFF中,var_78代表有效期,var_79代表效果值(下文用A表示)
                      (a)羽化(prm_271 == 31)
                      介绍说明为:DV 10% + A 上升/轻装备 20% 上升/重力耐性/漂浮
                      BUFF有效期=20+威力/15 回合
                      轻装备20%上升check√
                      重力耐性check√ (重力BUFF 赋值为0)
                      漂浮check√ (漂浮Bit 赋值为1)
                      DV首先上升为1.1倍
                      然后继续增加A,A的计算公式为:
                      A=25+威力/8,最低取1,最高取1000
                      羽化魔法在320级时,A值可达到上限1000,此时有效期为540回合
                      在1000级时,A值不变,有效期上升为1628回合
                      这里和魔法表1.53版已有不同,应该是作者在后续版本中延长了有效期所致(同时增加了上限?)。
                      *注:如未特殊说明,所有魔法增幅皆以1.62版本中2.4倍最大值为准。


                      IP属地:湖南24楼2017-01-13 10:50
                      收起回复
                        【魔法系列】02
                        (b)集中(prm_271 == 43)
                        介绍说明为:感知与意志 10% + A 上升/耐睡眠/耐混乱
                        BUFF有效期=20+威力/10 回合
                        耐睡眠/耐混乱check√ (睡眠,混乱BUFF 赋值为0)
                        感知和意志首先上升为1.1倍
                        然后继续增加A,A的计算公式为:
                        A=5+威力/30
                        集中魔法没有上限,1000级时,A值可达809,有效期2432回合
                        2000级时,A值为1609,有效期为4832回合。
                        (c) 智者的加护(prm_271 == 12)
                        介绍说明为:学习与魔力 10% + A 上升,读书 10% + B 上升
                        BUFF有效期=20+威力/10 回合
                        学习与魔力首先上升为1.1倍
                        然后继续增加A,A的计算公式为:
                        A=10+威力/40
                        读书首先上升为1.1倍
                        然后继续增加B,B的计算公式为:
                        B=3+威力/100
                        智者的加护魔法没有上限,1000级时,A值可达613,B值为244,有效期2432回合
                        2000级时,A值为1213,B值为484,有效期为4832回合。
                        (d) 神圣之盾(prm_271 == 1)
                        介绍说明为:PV 10% + A 上升/盾 20% 上升/恐怖耐性
                        BUFF有效期=20+威力/15 回合
                        盾20%上升check√
                        耐恐怖check√ (恐怖BUFF 赋值为0)
                        PV首先上升为1.1倍
                        然后继续增加A,A的计算公式为:
                        A=25+威力/8,最低取1,最高取1000
                        神圣之盾魔法在320级时,A值可达到上限1000,此时有效期为540回合
                        在1000级时,A值不变,有效期上升为1628回合
                        这里和魔法表1.53版已有不同,改动同羽化魔法。
                        (e) 再生(prm_271 == 3)
                        介绍说明为:强化了体力与耐力的回复
                        BUFF有效期=10+威力/10,最低11,最高200 回合
                        该魔法效果只有一个,就是将治愈技能增加A
                        A=(30+威力/20)/2
                        再生魔法没有上限,1000级时,A值可达618,有效期200回合
                        2000级时,A值为1218,有效期不变。
                        另外,目测再生BUFF可以每10回合恢复4SP,所以平时累不累的都可以考虑随时来一发。
                        *注:每次除法都要取整,下同。


                        IP属地:湖南26楼2017-01-13 11:37
                        收起回复
                          【魔法系列】03
                          源码版本:V1.64
                          测试环境:1.62Custom
                          (f)属性保护(prm_271 == 4)
                          介绍说明为:火冷雷暗幻毒狱音神混抗性的获得
                          BUFF有效期=10+威力/20 回合
                          相应抗性(除魔法外全抗性,共10种)增加A
                          A=80+威力/20
                          属性保护魔法没有上限,1000级时抗性增加1286,持续1216回合。
                          2000级时抗性增加2486,持续2416回合。
                          (g)加速(prm_271 == 5)
                          介绍说明为:增加速度
                          BUFF有效期=8+威力/20 回合
                          速度增加A(最大值封顶800)
                          A=50+威力/10
                          加速魔法在308级时,A值可达到上限800,此时有效期为383回合。
                          在1000级时,A值不变,有效期上升为1214回合。
                          (h)振奋(prm_271 == 7)
                          介绍说明为:力量与灵巧 10% + A 上升/耐恐怖/耐混乱
                          BUFF有效期=20+威力/10 回合
                          耐恐怖/耐混乱check√ (恐怖,混乱BUFF 赋值为0)
                          力量与灵巧首先上升为1.1倍
                          然后继续增加A,A的计算公式为:
                          A=5+威力/30
                          振奋魔法没有上限,1000级时,A值可达809,有效期2432回合
                          2000级时,A值为1609,有效期为4832回合。
                          增幅数据同集中魔法。
                          (i)契约(prm_271 == 18)
                          介绍说明为:有A%几率使致命的伤害归0
                          BUFF有效期固定为66回合
                          A值最小取25,最大取80,计算公式为:
                          A=25+威力/17
                          契约魔法在34级时,即可封顶80%概率。
                          但由于每次使用后BUFF取消,实际上使用频率会意外的高...
                          那么BUFF魔法暂时就到此为止了,对PC而言,练好BUFF也是十分重要的属性提升方式哦。


                          IP属地:湖南27楼2017-01-13 19:41
                          收起回复
                            【经验获取完整版】
                            源码版本:V1.64
                            测试环境:1.62Custom
                            这个函数的作用在于将某个原始经验增加量(参考等级,潜力等各种因素)修正为实际增加量。
                            属性,技能,魔法的经验增加都由此函数控制。
                            值得一提的是,经验减少同样由该函数控制,此时增加量为负值。
                            位置:#deffunc skillexp int prm_623, int prm_624, int prm_625, int prm_626, int prm_627
                            其中prm_623代表技能编号,prm_624代表角色编号,prm_625代表原始经验增加量(以下简称原始增加量)
                            prm_626与技能对应属性经验获取有关,prm_627与EXP获取相关。
                            在本函数中,技能等级如未特殊说明,一律采用裸装等级。(考虑各种加成时描述为[有效技能/属性])
                            (01) 如果对应技能等级为0,那么完全不增加经验,程序结束。(就是说一定要先学技能才可以)
                            (02) 如果原始增加量为0,那么完全不增加经验,程序结束。(呃...好有道理我竟无言以对)
                            (03) 技能对应的属性,增加 prm_625 / (2 + prm_626) 经验。(以此处结果为原始增加量重新执行skillexp函数,增加对应属性经验)
                            (04) 如果对应技能潜力为0,那么完全不增加经验,程序结束。(该塞钱塞钱,该嗑药嗑药,你懂哒)
                            (05) 由此开始正式计算:
                            经验A=原始增加量*技能潜能/(100+技能等级*10)
                            <i>如果八维,速度,幸运处于成长期。(有效果为正整数m的BUFF),那么经验A(重新赋值为)=经验A*(100+m)/100
                            <ii>如果此时经验A为0,那么有int(技能等级/10)的概率,经验A上调为1,(程序继续)。否则完全不增加经验,程序结束。
                            此外,如果原始增加量为负值(即经验减少的情况),那么<i>-<ii>不参与计算,经验A直接=原始增加量(该值为负)。
                            <iii>如果身处巨蛋空间(当前map=35),或者身为分裂生物(bit23为1),那么经验A归0
                            <iv>如果技能编号大于99(非属性,技能or魔法),且 var_64(175) != 11111111 (对应gdata第175项数值)
                            那么执行奖励经验修正,奖励修正发生条件为rnd([有效学习属性]+50)>rnd(1000)。rnd(r)表示从0到r-1的随机整数。
                            效果为将经验A修正为经验A*B,其中B=int(sqrt([有效学习属性])/10)+2,B值下限为2,上限为5
                            <v>如果技能编号大于99且为队友,那么经验A扩大为4倍。
                            <vi>经验A大于20000时会修正为20000上限。
                            <vii>如果游戏模式为20倍经验模式,那么此时经验A扩大为20倍。
                            <viii>如果困倦度>49(似乎是达到红色睡眠提醒),那么PC和队友都不会增加经验。
                            <ix>(根据经验A做)一些关于EXP经验的修正,不重要,略过。
                            <x>最后,将当前技能的经验千分比(即等级后小数点后三位)叠加到经验A上。
                            (06)根据此时的经验A,对技能等级,经验千分比,潜力做调整。调整规律为:
                            <i>如果经验A满1000,达成升级条件,那么每升一级:
                            潜力*0.9处理,如果技能编号>=400(即魔法),则再次*0.9处理
                            如果此时潜力小于1,那么重置为1。
                            然后是一些文字输出提醒玩家有升级。
                            <ii> 如果经验A小于0,即达成降级条件,那么每降一级:
                            潜力*1.1+1处理(注意魔法降级没有再次*1.1,虽然比起魔法可能只有属性才会降级)。
                            如果潜力>400,则修正为400上限。
                            另外,降级最多只能降到1级,经验千分比为0的情况。
                            然后是一些文字输出提醒玩家有降级。
                            <iii>其他情况(不升级也不降级)时,直接将等级千分比赋值为经验A,实现了经验的获取。
                            此时没有文字输出。
                            以上便是skillexp的全部代码解析。
                            另外在测试时发现如果身为分裂生物,使用神谕时确实不增加经验,但是吃药草套餐(或面包料理)仍然有效。
                            而如果修改当前地图为编号35,那么两者皆不增加经验。
                            推测食物对于经验的变动由另一函数决定。(先mark之,后面研究食物代码的时候再看吧)


                            IP属地:湖南28楼2017-01-19 08:54
                            收起回复
                              2025-05-24 21:38:49
                              广告
                              诶,另外总是这样直接(很辛苦的)摆结论有点亏呀,不太符合楼主长(骗)期(回)水(复)的初衷
                              那么从现在开始把一些备忘也放上来好了。于是楼主从此走上了挖坑不填的幸福生活(大雾)
                              首先是魔道具,联动 /p/4768671993 30小时内 击杀1个里神
                              之前以为魔道具大削所以这个方法有些过时就没太留意。后来发现版本写的1.60fix再看了眼发帖时间觉得还是自己错过了好东西,所以就准备很积极的(并没有)研究起魔道具来。
                              目前的初步测试结果是:
                              (1) 对于魔法杖类,法术等级=魔道具等级+魔力加成。(前人帖子有提及,见楼中楼)
                              由于享受各种2倍加成(魔法装备加成无效),威力还是很可观的。算是当前版本练习魔道具的最大动力(至于文中提及的350魔道具打里神一发12W是否依然成立还有待研究)
                              (2) 对于药水类,法术等级=20+魔道具等级/2,但是不享受魔法威力加成。这就意味着,2000等级的魔道具,不过能额外提升振奋340点的力量和灵巧(而500级魔法等级已经是409的提升)。也就是说,药水类的BUFF,只能指望基础10%。即强力宠物大概能有个100-200的提升吧。
                              (3) 对于卷轴类,效果与魔道具无关,对此楼主只能表示:拔拔不想理你...
                              所以,就稍微攒一下药水好了。


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