铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 2409|回复: 7

[通用] 让引擎适应游戏的杂事

[复制链接]
发表于 2009-9-9 00:27 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
让引擎适应游戏是一件很麻烦的事情。
据说微软曾经为了一个游戏《猎鹿人》运行不了就推迟了Windows XP SP2一个测试版本的发布。当然我们这些做山寨游戏的不能跟微软比。如果你看过《Windows编程启示录》(这本书的名字听起来很高深,但纯粹是一本八卦集锦)的话,你也能体会到微软很多时候的无奈。其实Windows不是那么糟糕的系统,把它搞乱的是那些糟糕的软件。

1. 《苍龙逐日》的错误语句
看过复刻版事件部分源码的朋友应该知道我在3号指令那里写了一段注释:
  1.   //这里应该是原本z文件的bug, 如果不处于当前场景, 在连坐标值一起修改时, 并不会同时
  2.   //对S数据进行修改. 而<苍龙逐日>中有几条语句无意中符合了这个bug而造成正确的结果
复制代码
这个错误实在很令人抓狂。因为它仅仅出现了三四次,而且全都是邪线。

2. 《再破菠萝》的跳转口
在内场景主循环中处理跳转口的语句是在《笑梦游记》之后才弄清楚的。原版处理跳转的逻辑实在是莫名其妙,如果能一切重新开始,那么我会选择用一个指令进行跳转,但是在复刻原版和MOD的时候,你必须去适应已有的事件。
  1.     if ((sx = RScence[CurScence].JumpX1) and (sy = RScence[CurScence].JumpY1)) and (RScence[CurScence].JumpScence >= 0) then
  2.     begin
  3.       PreScence := CurScence;
  4.       CurScence := Rscence[CurScence].JumpScence;
  5.       if RScence[PreScence].MainEntranceX1 <> 0 then
  6.       begin
  7.         Sx := RScence[CurScence].EntranceX;
  8.         Sy := RScence[CurScence].EntranceY;
  9.       end
  10.       else
  11.       begin
  12.         Sx := RScence[CurScence].JumpX2;
  13.         Sy := RScence[CurScence].JumpY2;
  14.       end;
  15.       InitialScence;
  16.       Drawscence;
  17.       ShowScenceName(CurScence);
  18.       CheckEvent3;

  19.     end;
复制代码
至今甚至很多制作人也没能完全弄清原版的逻辑。

3. 内存相关指令
50指令中的25和26都是内存相关指令,在内存的诸多应用被破译之后,这两个指令的相关事件也多了起来。而复刻版无疑是不能支持这两个指令的。
源码中50指令的25和26部分都是特殊处理,在26指令中有一个类似下面的列表:
  1.           $1D295E: x50[e5] := CurScence;
  2.           $1D295A: x50[e5] := Sx;
  3.           $1D295C: x50[e5] := Sy;
  4.           $1C0B88: x50[e5] := Mx;
  5.           $1C0B8C: x50[e5] := My;
  6.           //$1D2956: x50[e5] := Cx;
  7.           //$1D2958: x50[e5] := Cy;
  8.           $05B53A: x50[e5] := 1;
  9.           $0544F2: x50[e5] := Sface;
  10.           $1E6ED6: x50[e5] := x50[28100];
  11.           $556DA: x50[e5] := Ax;
  12.           $556DC: x50[e5] := Ay;
复制代码
而在25指令中,情况更加复杂,因为部分指令是直接读取内存获得物品的信息。

4. 特殊子程
在没有复刻版之前,一些特殊功能的子程是通过带参数的50 43来实现的。其中最重要的应用是新的获取物品和新的对话。
在测试《笑梦游记》的复刻的时候,我发现跳转时代的执行效率非常低,后来经调试锁定问题在新的获取物品指令上。这个指令似乎是直接读内存,在DOS版中效率很高,但是在复刻版中由于执行机制变得效率极低。后来我在43指令中添加了一个列表,即如果发现要执行的子程是“获取物品”,就直接用2号指令代替,因为2号指令我扩充过功能,更加强于50指令编写的事件,更重要的是效率更高。
在猪3中的这个列表似乎更复杂了。

5. 直接执行内部子程
这个就是50 49指令。我认为在我添加的9个50指令中,49指令是最伟大的(吹吹牛)。而在我的说明书中的那个任意转换场景的例子,实际上包含了非常复杂的汇编原理。
但是相比25、26和43,49指令是绝对没可能移植的,甚至给出一个列表也是非常麻烦,因为参数的个数就是很棘手的问题。所以如果你的MOD真的使用了50 49指令,那么在不修改事件的前提下进行移植,基本上是不可能完成的任务。
所幸50 49还未传开。
下面就是50 49的源码,以此记念这个特殊时期的产物。
  1. ; 调用系统子程
  2. _instruct_32_31_CallProcedure proc near ; DATA XREF: dseg02:0005D0C8o
  3. pusha
  4. mov     eax, [esp+20h+arg_4]
  5. shl     eax, 10h
  6. xor     ebx, ebx
  7. mov     bx, [esp+20h+arg_0]
  8. add     eax, ebx
  9. add     eax, (offset set_textmode-20000h)
  10. mov     ebp, eax
  11. mov     ecx, [esp+20h+arg_8]
  12. mov     esi, [esp+20h+arg_C]
  13. imul    edi, esi, 4
  14. cmp     esi, 0
  15. jz      short loc_5E6A8
  16. loc_5E698:
  17. movsx   eax, ds:word_120000[ecx*2] ; 变量空间
  18. push    eax
  19. inc     ecx
  20. dec     esi
  21. cmp     esi, 0
  22. jnz     short loc_5E698
  23. loc_5E6A8:
  24. call    ebp
  25. add     esp, edi
  26. mov     ecx, [esp+24h+arg_C]
  27. mov     ds:word_120000[ecx*2], ax ; 变量空间
  28. popa
  29. retn
复制代码

[ 本帖最后由 weyl 于 2009-9-9 01:42 编辑 ]

评分

参与人数 1声望 +15 收起 理由
黄顺坤 + 15 最近bt小宇宙爆发…准备复出?

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-9 00:45 | 显示全部楼层
多谢weyl大指导,发一个帖子编辑4次也不容易啊~

本来也想发表一下感想的,但发完之后才发觉weyl又编辑过了,连源码都贴上了,就不班门弄斧了~~

[ 本帖最后由 winson7891 于 2009-9-9 00:57 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-9 06:49 | 显示全部楼层
很多东西没看懂
但还是认真读了一便

[发帖际遇]: killer_zingy勾结杨康抢夺武穆遗书,行动失败,损失银两47.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-9 11:31 | 显示全部楼层
50 49真的很伟大……
之所以没有传开的原因是因为作者不久之后就发布了复刻版,49还未能被使用就已经被遗忘了……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-9 11:43 | 显示全部楼层
造成第一个错误的原因,就是fish里面的3号指令,默认的xy是0,0而不是-2,-2。习惯上坐标始终是不变的,所以常常忘记改这两个值。同场景的在测试中就能发现问题,而不同场景的在测试中是正常的,所以根本发现不了。
曾经要小黄把默认值改成-2,这家伙居然嫌麻烦……

至于猪3,哦,天啊,但愿以后不会需要移植它,前期用DOS方式解决问题,后期用复刻方式来做,有的用50实现,有的用源码实现,事件和代码都乱的一塌糊涂……

[发帖际遇]: 小小猪去天宁寺抢夺连城宝藏,侥幸抢到无毒的宝藏,卖掉得到银两40。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-18 09:29 | 显示全部楼层

不错啊

听大佬们唠叨老大,这些代码都是有血有肉的了

[发帖际遇]: else在牢房助狄云逃脱,获赠《神照经》,翻译成英语版《god bless you》贩卖后获利银两28。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-4-30 22:33 | 显示全部楼层
2. 《再破菠萝》的跳转口
在内场景主循环中处理跳转口的语句是在《笑梦游记》之后才弄清楚的。


终于,在成功的搞定笑梦游戏lua复课里的跳转场景功能后,我也搞清楚了....lua脚本里默认的场景跳转是有bug的,虽然大多数情况下就没问题。

[发帖际遇]: jy02785317跟韦小宝赌钱,识破千术,韦小宝乖乖奉上银两28两。



感谢bt的源码和指导,要不然还不知道得花多久
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-5-1 18:38 | 显示全部楼层

ru

膜拜……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-19 07:05

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表