Friday, May 23, 2008

All Heros in Kam Yung 's Stories -- 苍龙逐日 复刻版

此版本仅是复刻版,所有情节,设置等与小小猪制作的DOS版《苍龙逐日》基本一致。
需要下载exe文件和DLL文件放到原目录。
需要kaiu.ttf和consola.ttf两个字体文件。

与原来版本的不同:

没有初始密码;
不能刷武功;
结尾动画不全;
战斗中某些公式与原版不一致;
无防御拐点的设置,所以初期可能比原版要难;
对修改器支持不好;
场景内动态效果有问题,所以屏蔽了;
无大地图飘云效果;
大地图少数贴图有错误;
可能存在未知的BUG;
可以使用鼠标,但是不推荐走路时使用;
可以使用mp3文件代替mid文件作为背景音乐;
可以升级到60;
我私自作了一张简单的图作为标题画面。

2008-5-25
升级时中毒和受伤清零;
更正万鳄岛战斗时跳出;
更正解毒时不显示数字;
更正AI在使用面攻击类武功的错误;
更正物品选单光标在选单外面的错误;
微调速度。

2008-5-27
更新抗毒效果;
更新了修改事件的效率;
重写RLE8绘制子程,从分别绘制改为对基本过程的封装;
用可变记录封装R属性,这可能会降低效率,因此可能会引发未知的bug;
可用FishEdit修改存档;
当名字为某个特殊字串时可获得全满的起始属性。

更正显示状态时防御与轻功顺序错误;
更正离队事件错误;
不再支持mid格式;
更正修炼药品的错误。

2008-5-28
更正大地图某些显示的错误;
更正抗毒过高时中毒值为负的错误;
更正已有此项武功时,可能不能修炼对应秘笈的错误;
更正自动战斗时增加武功级别的错误;
更正品德可能为负的错误;
大地图加入主角动作;
修正某些事件触发位置的错误*;
增加主角走动效果。

【*】:这个是原游戏本身的bug,在修改事件的时候如果修改了坐标,但是并不在当前场景,会导致S文件与D文件中记录的坐标位置不一致,而《苍龙逐日》恰好有数条语句满足这个条件,却导致了正确的结果。
在使用正确逻辑之后,却反而会使某些事件无法触发。

2008-5-30
分辨率改为640*440;
调整部分选单的显示位置;
增加开头和结局的字幕(均是作者原文)。

Font files.

DLL files.

Executable files.

 

image

image

image

image

Sunday, May 11, 2008

All Heros in Kam Yung's Story 复刻测试版


四川发生地震,呼吁大家关心此事。用行动支援我们的同胞。

游戏已经有两个复刻版,分别是SwimmingFish用VB和tianua用SDL制作的。但是现在这两个复刻版都存在着很多不足。其中最大的就是不能支持MOD以及没有继续发展的空间。

此次复刻的目的是用新的技术复刻整个游戏,在某些地方使用新的技术,并且提供对新指令的解释。

图像引擎:基本不会变化,但是文字的显示直接使用ttf字体。
音频引擎:添加对其他音频格式(主要是mp3文件)的支持。
事件系统:对原有指令和扩充指令基本完整复刻,少数难以实现的就不支持了。

下载地址:Click here.

需要合并场景贴图文件,不知道是什么的就到这里下载:http://swimmingfish.ys168.com/

我不清楚Google的空间是否有流量限制,如果你喜欢的话,欢迎提供转载和分流。但请保留SDL引擎的版权信息。

测试版已经完成大部分功能。还有一些与原版不同:

韦小宝去其他客栈这个事件我嫌麻烦,就让他一直呆在一个地方卖所有的物品。
少数复杂的动画暂时不支持。有些动画可能有贴图上的错误,主要是什么时候有主角,什么时候没主角我还没搞清楚怎么判断。
内场景的动态效果,主地图的飘云效果暂时不支持。
武林大会相关指令基本完成,但是判断是否放好天书这个指令我偷了懒,游戏能正常结束。
未设定需要自宫的物品。
公式和原版并不完全一致,主要是我比较懒。
可以使用鼠标,但是用鼠标走路不太方便。其实这种45度视角游戏并不适合用鼠标走路,但是选物品和战斗时会方便一点。
基本支持全部50指令,包括扩展战斗指令,不包括直接读写内存的两个指令。
敌人的AI很简单,基本是猛攻,我方的也一样。自动战斗的时候连点ESC可以回到手动状态。
背景音乐放弃了对原有格式的支持,改用MP3格式。把你喜欢的音乐放在游戏目录里面,命名为1.mp3,2.mp3……即可在游戏中作为背景音乐。
标题画面实际上是游戏目录下面的open.bmp文件,你可以自己编辑,但是注意给文字留出位置。
可能存在未知BUG,所以你的重要存档就不要用它了。

注意事项:

此复刻版使用SDL作为基本引擎,因此压缩包里面有很多SDL相关的DLL文件,有些可能是无用的。
默认使用的字体:中文是标楷体,英文是Consolas,压缩包里面已经包含了这些字体。文字的位置是特别对这两种字体优化的,可以换成其他字体,但是位置会有些问题。
使用effect.bin,leave.bin,levelup.bin,match.bin保存游戏中的列表。实际上是把z.dat中的对应部分复制了出来。这4个列表均对应原版。
输入姓名时请直接输入繁体中文。尽管游戏实际的内码是Unicode,但是存档文件中仍是Big5码,是没有简体中文字符的。
虽然有5个位置可以存储进度,但是一开始读取进度4、5会出错。你需要先把进度保存到这两个位置才能读取。

截图:

image

image

image

image

《笑梦游记》系统增强补丁


看状态能看到更多,可以显示物品的属性,伤害公式略有调整(可自行修改)。

仅能用于1.11版,置于游戏目录直接运行z1.exe即可,推荐使用dosbox。

可能有音效文件的bug,但不确定是否存在以及产生原因。

 

Click here.

Thursday, May 08, 2008

All Heros in KYS 复刻计划


计划是使用新的引擎复刻整个游戏,包含对新添加指令的支持。

贴图系统保留,增加对其他格式的支持;
音频系统重写;
战斗系统基本保留;
指令系统保留,可以扩充;
文字系统直接使用TTF格式。

这是对话的效果,使用的字体是标楷(好像英文标准名是DF-Kai,文件名是KaiU.ttf)。

image

Thursday, May 01, 2008

稀疏矩阵



从生成到计算,有很多无聊的记法。CG,GMRES都可以试试,但是没有一个效率高的。


Thursday, April 24, 2008

改变游戏中的字体

游戏里面用的字体文件有两个:font3.e16和font3.c16。第一个是128个ASCII字符,点阵大小为16*8;后一个为BIG5码的汉字,点阵大小为16*16。

使用工具可以将系统中的字体转为游戏可用的格式,但并不是所有字体都合适。一般字体在9pt时如果仍能够保持锐利,那么在游戏中就会有比较好的效果。最常见的这类字体就是细明体和宋体(楷体GB2312也可以,但是繁体字库不全),如果你知道其他适合的字体或者好的建议,欢迎告诉我们知道。

这个是更换了英文字体,英文字体最好是等宽的:

z_048

这个是把原来的细明体改小了一号:

z_050

这个是标楷体,效果很模糊:

z_043

这个是微软正黑,也不怎么样:

z_042

这里是我生成字库使用的工具和一个教程。

使用ts2.exe,选择字体,要选择台湾中文(Big5)。

clip_image002

调整好汉字的位置,然后高度改成32,把“上下”加上16。

clip_image004

点“生成”,即可生成点阵字库。

因软件是未注册版,所以每个字都会多出一个斜线,而使用32*16的尺寸可以使汉字刚好避开斜线。

clip_image006

使用这个程序会将字体上半部分去掉,生成font3.c16文件,可以直接用在游戏中。

这类工具的算法都很清楚,但这个软件注册费的性价比实在不怎么高,何况我只需要其中的一小部分,而不注册的话生成的字会有删除线,所以我想了一个办法避开删除线。

google的审查好严,居然禁止这个文件,可能是文件中含有木马。

Tuesday, April 22, 2008

多重循环的代码



像弯月一样。要是连续写几个,就像苏州的锦带桥。


Sunday, April 20, 2008

有关“插入事件改写系统”的碎语


这个post不是什么技术相关的,大概算是一个无聊碎语的集合。

我以前编写过一个新的伤害公式,那时是完全用十六进制代码写的,首先将汇编代码译成十六进制代码,call和jmp指令的地址还都要自己计算出来,非常麻烦也容易出错。

使用物品直接触发事件是谁最早提出来的已经搞不清楚了,最早跟我提这个的是Guest。战斗中调用事件其实也不知最早是谁的主意,总之用事件修改伤害公式也是很早之前就有人想过(但那时想怎么改,直接改汇编代码么?那样还是有很大限制的)。

用物品调用事件,就可以任意增加大地图事件了。那么自然就会想到,战斗中能不能调用事件?如果能的话,需要什么样的事件?

我看反汇编的代码时,发现有一个子程似乎是控制选择攻击目标的,这就是有了战斗指令的最早构思。最开始是想有一个选择目标的也许就够了,但后来越想越复杂。

最初只构思了法宝,后来发现也许只有法宝还是不够的,于是又增加了武功调用事件,这样有些功能就必须直接操作内存才能用,但是这时已经是战斗指令搞出来一个多月了。所以从0.10到0.20,指令没有增加,却有了非常大的变化。

后来所想的就是找许多适当的位置插入事件了,这样系统许多功能就完全可以自定,随作者的想法了。

不过我自己倒是没开放太多地方,z.dat文件里面的空间其实还有很多,插几十个事件还不成问题,但插在哪却要好好想一想。如果选的地方好可以事半功倍,选的地方糟糕就有可能没有效果甚至导致游戏功能出错。

无论如何,“插入事件”总算开了个花,希望能看到结果的那天。

Thursday, April 17, 2008

Vista SP1



看来不错。


Monday, April 14, 2008

扩展战斗指令0.20

因为目前对战斗的了解已经比刚开始计划战斗指令时深入得多,所以此次对战斗指令进行了大规模改写。

战斗指令的变化非常大:

28:这条指令用处不大,但暂时保留。
29:判定人物回合是否结束的方式有所改变。为简化武功事件增加可以跳过选择目标画面的选项(4.15)。
30:取人物R序号改为取人物战斗属性,可以获取更多的战斗属性。与原指令不兼容。
31:取人物敌友信息改为写人物战斗属性。原功能用30指令(偏移2)代替。此指令实际上在以前的版本中是错误的。

44:播放效果增强功能。
45:闪烁改为显示数字。
46:显示人物属性改为设定效果层。原功能需用49指令代替。
47:改变人物改为回复人物静止贴图。原功能用31指令(偏移0)代替。

49:不变。

此外对上个版本中插入事件导致战斗跳出的错误作了修正。添加了几个新的插入事件。
说明文档中的示例有些是较早时编写,所以某些位置可能并没使用新指令,而是直接写内存。在说明文档中附带了一个反噬效果的实现方案,可以作为增加状态效果的参考。

如果您已经开始利用原来的指令编写一些事件,那么我为此次更新对您造成的不便表示歉意。

此版本仍是测试版,主要是某些事件插入的最佳时机尚不完全确定。


4.16,增添载入进度预处理事件,测试时使用KG的改调色版指令基本成功。版本号未更改。

BattleKDEF0.20.zip

Friday, April 11, 2008

扩大队伍人数?

理论上可以把队伍的人数扩大一倍,就是把以前读字的语句改成读字节。

问题是人的名字可能没处放,战斗需要改得多些,不一定真的有用。

z_032

Sunday, April 06, 2008

反汇编z文件


我以前找到的反汇编结果可能是游泳的鱼最早注释的。

画面引擎,声音的部分基本是不可能修改的。文件后段有一大堆子程根本不知是什么鬼东西,有可能是编译器自己加上去的。

比较清晰的几个地方是:

  • 系统菜单;
  • 进入场景;
  • 事件系统;
  • 战斗系统。

这些其实也是大家最关心的几个地方,还有比较重要的是主角在大地图上行走的部分,但这个似乎没什么好改的。

Saturday, April 05, 2008

49号指令应用:“从队伍中选择一个队员”选单


下面的指令片段可以生成一个选择队员的选单,在制作新型装备的时候可以用到。


;Kdefnum=1023
50 0 0 2 0 0 0 0 ; 50(32):变量赋值 [X0]=2
数字2改成所需选单的样式,含义见下面
50 49 8336 2 0 1 0 0 ; 50(32):调用任意子程
50 48 0 1 0 0 0 0 ; 50(32):调试指令,显示变量 [X0] -- [X0]
0 ; 0(0)::空语句(清屏)
-1 ; -1(FFFF):事件结束

 

此事件直接调用游戏中22090子程,该子程有一个自变量,表示选单的样式:

0-医疗,1-解毒,2-状态,3-装备,4-修炼,5-使用,6-离队。

返回值为队伍内序号,范围是0~5,如按了esc键,返回值为-1。

如果需要一个通用的选单,建议将原版中“要谁离队”4个字改为“选择队友”,需要选择队友时即调用6号样式的选单。尽管真实的离队选单也会有相同变化,但不会产生误解。

49号指令应用:任意转换场景


目前转换场景多是用动态改写跳转口的方法。经测试,以下指令可以比较方便地改变场景,工作量小了许多。
这里没有改写大地图坐标和场景内坐标。


;Kdefnum=1022
  1 0 0 0                        ;  1(1):[xxx]说: 小兄弟,我们现在去桃花岛。
这句是对话指令,无关紧要。
  50 25 0 0 10590 29 75 0        ;  50(32):保存给定地址数据 [1D-295E+0]=75(Int)
75为桃花岛的编号,根据实际需求修改。
  50 25 0 1 -27969 2 195 0       ;  50(32):保存给定地址数据 [2-92BF+0]=195(Byte)
  50 49 -28218 2 0 1 0 0         ;  50(32):新指令,暂时没有解释
  50 25 0 1 -27969 2 233 0       ;  50(32):保存给定地址数据 [2-92BF+0]=233(Byte)
  0                              ;  0(0)::空语句(清屏)
  -1                             ;  -1(FFFF):事件结束

Thursday, April 03, 2008

修改对话框每行字数的源码

在对话框调整器里面有这个功能。对话框每行字数并不是由程序自身决定的,而是在对话文件中写的“*”决定换行的位置。

对话文件talk.grp和talk.idx的格式非常简单,talk.grp文件只要把全部内容按位取反就是Big5的明码,星号表示换行而0表示一条结束。talk.idx里面保存的是每条对话的长度,也可以认为是下一条的起始位置。

我在重整对话文件“*”位置时使用的是如下的方法。算法本身很简单,根据读入的第一个字节判断字符是否是Big5码里面的,这时需要把2个字节作为一个字符处理,idx文件就直接生成一个新的。

这个算法是用 Object Pascal 写的,一些不太关键的代码略去了,注意这里并没有先取反,而是直接操作的。

file0:=Fileopen(edit2.text,fmOpenread);
//file0用来打开原始的talk.grp文件

length:=Fileseek(file0,0,2);
filegrp:=filecreate('talk1.grp');
fileidx:=filecreate('talk1.idx');
i:=0;
fileseek(file0,0,0);
while i<length do
begin   
  fileread(file0,ch,1);
  i:=i+1;
  if (c=0) and (ch>=128) and (ch<>213) then
  begin
    filewrite(filegrp,ch,1);
    p:=p+1;
    x:=x+1;
    c:=0;
  end;
  //以上是对字符为标准ASCII字符的处理

if ch=213 then
  begin
  end;
  if (c=0) and (ch<127) and (ch>0) then
  begin
    filewrite(filegrp,ch,1);
    fileread(file0,ch,1);
    i:=i+1;
    filewrite(filegrp,ch,1);
    p:=p+1;
    x:=x+2;
  end;
  //以上是对Big5字符的处理

if (p>=p0) and (ch<>0) then
  begin
    p:=0;
    ch1:=213;
    Filewrite(filegrp,ch1,1);
    x:=x+1;
  end;
  //在适当位置添加星号

if (ch=0) then
  begin
    x:=x+1;
    filewrite(fileidx,x,4);
    Filewrite(filegrp,ch,1);
    p:=0;
  end;
  //重新编制索引

end;

有兴趣的朋友可以据此减少重复工作的时间。