铁血丹心

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

关于50 49指令:调用任意子程

[复制链接]
发表于 2009-7-19 21:54 | 显示全部楼层 |阅读模式

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

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

x
在50指令中,有一条连修改器狂人黄顺坤称为神一般的指令,那就是调用任意子程。

    SFE里只写了自己领悟。

    但我领悟不了……

    谁领悟得了的请教一教我

    我看过weyl调用某个子程能变换任意场景

    也看过凶神大大调用某个子程能搞出队友选单

    怎么看调用哪个能出现哪个东西?

[发帖际遇]: 参与红花会陈家洛的计划:行动失败,遭清廷缉捕损失银两14.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-19 22:13 | 显示全部楼层
我那个49事件也是从weyl的说明文档里面搞来的……
打开SFE中的50 49指令指导,需要填写只有四项:子程序内存地址、参数起始编号、参数个数和返回值。
子程序内存地址可以通过查看汇编获得,参数起始编号是指存放子程序所需数据(堆栈)的变量起始编号,参数个数是指所使用变量的个数(变量根据堆栈入栈的顺序依次排列),返回值用来存放此子程序返回(出栈?)的数据。
我不太会用这个,貌似有些版本的SFE修改此指令有BUG,具体哪个版本没问题,问黄顺坤大大……
例子以后再举……

评分

参与人数 1声望 +10 收起 理由
黄顺坤 + 10 甚好,回家吃饭去吧

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-19 22:16 | 显示全部楼层
sfe0.72.17sp3+以后没有bug了
无色,妈妈叫你回家吃饭。。。

[发帖际遇]: 黄顺坤去辽东拜祭胡一刀,碰到袁紫衣,帮忙转告消息,袁紫衣赠送银两6。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-19 22:27 | 显示全部楼层
示例:
;Kdefnum=1543
  50 0 9000 15 0 0 0 0           ;  50(32):变量赋值 [X9000]=15
  50 0 9001 22 0 0 0 0           ;  50(32):变量赋值 [X9001]=22
  50 49 -10632 2 9000 2 9002 0   ;  50(32):传说中的调用任意子程 [2-D678]起始编号[X9000] 个数2=[X9002]
  -1                             ;  -1(FFFF):事件结束
作用:得到15颗黄连解毒丸(原版中22号物品)
如此使用49可以轻松实现一次性得到多个任意指定物品
解说:2D678是Z中2号指令(得到物品)的地址,通过查看汇编发现需要读取4个堆栈值,头两个是物品数量与物品编号,所以在9000与9001中保存了这两个数值,为什么用两个而非四个我也不知道,请weyl解释吧……

[发帖际遇]: 凶神恶煞去长白山捉火蟾,送给韦一笑,得感谢费银两18.


[ 本帖最后由 凶神恶煞 于 2009-7-19 22:30 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 16:43 | 显示全部楼层
看了楼上的解释,我有个比较小白的问题

为什么赋值变量要用X9000,X9001

为什么不用X1,X2之类的?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 19:39 | 显示全部楼层
dseg02:0002D678 var_284         = dword ptr -284h
dseg02:0002D678 var_44          = dword ptr -44h
dseg02:0002D678 arg_0           = dword ptr  4
dseg02:0002D678 arg_4           = dword ptr  8

上面的两个不知是干什么的,并不是刚才进入堆栈的数据。
一个子程有几个参数,可以用调用这个子程的清栈指令判断。
dseg02:0002C3FD                 movsx   eax, ds:word_1D9E94[ebx*2] ; jumptable 0002C561 case 2
dseg02:0002C405                 push    eax
dseg02:0002C406                 movsx   eax, ds:word_1D9E92[ebx*2]
dseg02:0002C40E                 push    eax
dseg02:0002C40F                 call    _instruct_2_GetItem ; 获得物品
dseg02:0002C414
dseg02:0002C414 loc_2C414:                              ; CODE XREF: _CallEvent+367j
dseg02:0002C414                                         ; _CallEvent+3BCj ...
dseg02:0002C414                 add     esp, 8

在调用之后,立刻执行的是add esp, 8,每个参数都是4字节的整数,这就表示参数是两个。

[发帖际遇]: weyl用胡萝卜、白萝卜、玉米粒、葱花等材料仿制侠客岛“腊八粥”,获利银两11.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 21:23 | 显示全部楼层
问weyl:为什么是4个字节,金群的参数不都是2字节的么,进入堆栈的都必需是32位的数据?
回5楼:用9000、9001之类的变量只是习惯而已,避免与其它人惯用的变量名冲突。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-7-21 22:51 | 显示全部楼层
因为没有源码,所以只能推测。
原来的代码据说是使用Watcom C++编译,而程序员很可能在大量函数中使用了int这个短小的关键字,而实际数据的定义为了减少资源占用,使用的都是短整数。
当时的情况下尽管号称DOS4GW可以利用4G内存,可是实际上仍是硬盘为主的虚拟内存。物理内存不能耗费过多,否则将严重影响效率,这游戏的效率在当时实在不怎么样。R数据是完整保留在内存中的,短整数要省去一半空间。为了节省内存,S数据和D数据并不是保留在内存中而是磁盘上的(这实际上是事件回溯的原因)。
但是实际上也有这样一种可能:编译器将整数扩展为4位以方便编译。我不懂编译原理,如果有懂的可以推测一下。Watcom的编译器是当年最强的编译器,也可能会有这方面的优化。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-11-16 04:22

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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