投票
标题:dos三国英杰传 支持键盘补丁--附带制作过程
waklin
无名的旅人
Rank: 1



UID 9190
精华 0
积分 6
帖子 4
狼毛 0 根
阅读权限 10
注册 2005-11-22
状态 离线
发表于 2008-5-26 18:23 资料 短消息  加为好友 
dos三国英杰传 支持键盘补丁--附带制作过程

下载地址,将附件解压后替换到游戏目录下,即可用键盘的空格键代替鼠标左键,ESC代替鼠标右键 (没有再db4的环境下测试,理论上没有问题)。
[url]http://pickup.mofile.com/1817884968502331[/url]


这个游戏相信很多朋友都玩过吧,这是我接触pc后第一个真正意义上的游戏,99年那时我大一,还不知道编程是什么的时候,便偷偷的用软盘将游戏和存档copy到机房的机器上,从机房开门一直玩到管机房的老师下班,当时真的是废寝忘食,比后来在网吧通宵玩传奇是有过之而无不及,但是奇怪我这么努力却一直没有将这个游戏打通关,可能是存档丢了无数次,然后无数次的重来耽误太多宝贵时间的缘故,游戏记录也一直停留在博望坡一役。
  记得当时好像有两个游戏供选择,一个是三国志V和三国英杰传,由于前者需要两张软盘才装的下,想当时一张软盘要5元,1M折合RMB要3.47元,再看看现在的存储设备真是便宜,真的感觉自己是生在"旧社会"。所以选择了后者,但是从此也就和这个游戏结下了不解之缘。
   
   
  想法初现:
  人总有些怀旧的情怀,工作了以后也试图几次自我突破要将这个游戏通关以弥补当年的遗憾,但是均已失败告终。经过分析有三大原因导致:
  1.游戏太难了,不适合我?
  2.游戏不能随时存档,有时一场战役输了,需要从前面很远的地方重新来过,无疑是对人毅力极大的考验。
  3.游戏全程只能用鼠标操作,要知道一直点鼠标左键是件很痛苦的事情,连游戏过程中的过场对白都无法用键盘跳过,需要用鼠标单击,无疑是对食指极大的考验 可能鼠标点到博望坡已经是我食指的极限了。   
  我也针对每个原因寻找对策
  1.网络发达了,可以到网络上找攻略,到论坛看看高手的心得,哇,原来高手这么多,将所有武将练到99级的大侠比比皆是,论智慧,论武功我都都不比他们差o(∩_∩)o...,我怎么就不行呢?看来这个不是原因。
  2.后来听说gba上的版本比较简单,而且可以随时存档,这下爽啦,于是在psp上装上gba模拟器,但是进入游戏发现和pc版本还是有一定区别,我还是对pc版的画面情有独钟,玩了一阵就没有继续下去了。
  3.自己动手,丰衣足食,让游戏支持键盘操作。
     
  开始动手:
   
  首次碰壁:
  1.其实早在多年前就有了这个想法,刚开始有这个计划时以为很简单。无非就是模拟鼠标操作:安装全局键盘钩子,当拦截到空格键按下便向游戏窗口发送鼠标左键单击的消息。早在玩diablo(暗黑破坏神),就因为alt键需要一直按下才能显示地上掉落的物品写过一个辅助的程序,按一下alt键显示掉落物品,再按一下alt键不显示。这个应当跟那个也差不多。
  但是实际操作中才发现挑战才刚刚开始,由于dos的游戏在windows下运行其实相当于windows中虚拟了一个dos环境,可以认为是个虚拟机,然后在这个虚拟dos中运行dos程序,就象我们编程中编写的控制台程序(console application),是没有消息循环的。所以向它发送消息等于对牛弹琴。
  这下麻烦了,就象我只会开汽车,现在要我去开手扶拖拉机,虽然都是开车,但我发现原来车没有方向盘我是不会的,只好作罢。用外挂的方式是搞不定了,只能修改游戏本身了,但是受技术所限,感觉就向拿个苍蝇拍打苍蝇,突然要去对付一只大象,根本不知道如何下手,只好悻悻的作罢。但是心中一直有一个疙瘩在。  


  卷土重来:
  (注意:此节部分文字有几分演绎的成分,如果你有头晕呕吐的现象请直接跳到下一节,本人不对上述现象产生的后果承担任何责任)
  就这样经过了很多年,忽然有一天因为对破解感兴趣重新拾起汇编开始学习的时候,当看到"中断"那一章的时候,突然灵光一现,那感觉就想黑暗夜空中划过的一道闪电,对,就是"键盘中断",经历过dos时代编程的人都应该对中断了如指掌,那感情就象我们现在和windows的Api函数一样,虽然你可能感受不到,但它却无处不在。但是象我这个时代接触编程的时候就已经是win98了。 那时dos基本上已经扔进垃圾箱,但是掌握基本的dos命令在当时那还是相当有面子的事情,在给女同学重装系统或格式化、分区的时候她们对你那种钦佩的眼神绝对会让你虚荣心得到极大满足^_^。
    但是一切就象王朝更替一样,在掌握了dos时代编程的人当然会反对windows的到来,因为他们的地位受到了动摇,本来是领先的,现在却要站在同一起跑线上。一个新的时代就要到来,也终将会到来。这让我想起了<兵临城下>电影里瓦西里被问到:"战争结束后你会去干什么?"的感觉一样,集所有荣誉为一身的民族英雄又要和平凡人一样为了生活奔波,那种落差……
     
  有点跑题了,其实刚才就像"中断",我突然想去抒发一下感想,抒发完感想后继续回到我的主题。在搞清楚了中断是怎么回事后,仿佛看到了通往成功的道路已经出现一点光亮了,但是也仅仅是一点点。原因如下
  1.要想实现目的必须要修改游戏文件,在游戏文件中改变其"键盘中断向量"为我自己的"键盘中断处理程序"入口,在我自己的"键盘中断处理程序"中拦截按键的扫描码,然后触发鼠标按下的操作。而这一切都要在游戏运行中完成(游戏运行时我才能知道"键盘中断向量"保存的原始"键盘中断处理程序"地址,因为在我自己的"键盘中断处理程序"中还要调用原始的"键盘中断处理程序",听起来有点绕,但是的确如此,找不到更易理解的描述,用windows角度看就向我们安装的钩子要callnexthook一样),但是由于游戏是dos格式,而我对dos环境的文件格式一无所知。希望比windows的pe格式简单。
  2.如何触发鼠标按下的操作,本来以为这一步很简单,事实证明这才是整个程序的重中之重,难中之难(对我而言) ,因为涉及到鼠标中断及鼠标事件处理程序的处理。
  3.需要用dos时代的16位汇编进行上述代码的编写,想到要处理段寄存器,偏移地址就头疼。
   
  当时的情况让我想起一句话,有困难要上,没有困难创造困难也要上,还是一步一步来吧。
   
  大功告成:
  思路已经有了,但是如何实现呢?首先从dos文件格式入手,很庆幸,这个游戏的入口文件是个.COM格式的文件(REKO3IBM.COM),COM文件是一种单段执行结构,起源于CPM-86操作系统,其执行文件代码和执行时内存影象完全相同,其始执行偏移地址为100H,对应于文件的偏移0。这下好办了
     
  用汇编写一段中间代码,代码实现的主要功能如下:
   1.我的"键盘中断处理程序"的代码
    拦截键盘的扫描码,如果是空格键那么修改我维护的鼠标按键状态
    调用原始的"键盘中断处理程序"  

   2.我的"鼠标中断处理程序"的代码
    拦截游戏调用3号功能获取鼠标信息,将自己维护的鼠标状态返回
    拦截游戏中调用12号功能替换“鼠标事件处理程序”,将“鼠标事件处理程序”换成自己的,同时保存游戏的“鼠标事件处理程序”入口地址
   
   3.我的"鼠标事件处理程序"的代码
    将鼠标状态(纵、横坐标,按键状态,偏移量)记录到我维护的内存单元中
    调用游戏的“鼠标事件处理程序”
   
   4.安装以上三段代码到指定的的内存中(我用的是0:200h处)
   
   5.将键盘中断、鼠标中断的入口改为我的,保存原有的入口地址。
      
   5.恢复游戏的开头几个字节并跳转到游戏开头运行。
   
  将中间代码编译成exe文件(mid.exe)后, 用vc写一个文件读写的工具,将mid.exe的内容(实际上是一堆二进制的指令)写入到REKO3IBM.COM的末尾,下面要做的工作就是让游戏运行时首先跳到我附加的代码处开始执行,只要修改REKO3IBM.COM的开头5个字节,跳转到我的代码执行完毕后又将控制权交还给游戏。这样就完成了偷天换日,实际上很多木马程序就是这么干的。
   
  终于在一个周末的下午将上述功能全部搞定,测试成功的那一刻很难形容当时的感觉,本来打算主要写一写技术细节方面的东西,谁知道洋洋洒洒写了这么多无关紧要的东西,很多实现过程的中很多细节都没有描述到,等有时间再整理整理,重点把实现过程写出来。

[[i] 本帖最后由 waklin 于 2008-5-26 06:29 PM 编辑 [/i]]

 顶部
XING
地上的月影
Rank: 3Rank: 3Rank: 3



UID 6727
精华 0
积分 373
帖子 202
狼毛 0 根
阅读权限 20
注册 2005-8-23
状态 离线
发表于 2008-5-26 18:37 资料 短消息  加为好友 
楼主是高手啊,多谢!

 顶部
linjing1978
地上的月影
Rank: 3Rank: 3Rank: 3



UID 23907
精华 0
积分 249
帖子 198
狼毛 0 根
阅读权限 20
注册 2007-1-19
状态 离线
发表于 2008-5-26 18:40 资料 短消息  加为好友 
不是我打击LZ,三国英杰传不是有2个win版吗?

 顶部
plumtreeli
路旁的落叶
Rank: 2Rank: 2



UID 10120
精华 0
积分 83
帖子 43
狼毛 0 根
阅读权限 10
注册 2005-12-19
状态 离线
发表于 2008-5-27 08:48 资料 短消息  加为好友 
好东西,先顶再慢慢看
即使有win版也没用,不能即时存档的,更不要说支持键盘了······

 顶部
grape0915 (grape)
万物创造者
Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9
自己玩


论坛达人  百目惠识  
UID 6757
精华 7
积分 253268
帖子 8395
狼毛 512158 根
阅读权限 110
注册 2005-8-24
来自 canton
状态 离线
发表于 2008-5-27 10:44 资料 短消息  加为好友 
一鼠走天下是英杰传的特色,我通了5次以上都不觉得点鼠标麻烦,反而天翔记点得更多

 顶部
wphoto2003 (马力)
圣洁的灵魂
Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7
往事随风 开始新的生活


论坛之王【顶级】  热情火山  神奇法师  百目惠识  热情号角  
UID 60
精华 10
积分 45874
帖子 1379
狼毛 9826 根
阅读权限 90
注册 2004-5-13
来自 天津
状态 离线
发表于 2008-5-27 10:55 资料 短消息  加为好友 QQ
但是除了对话时候点鼠标比较烦以外 战斗用鼠标还是很方便的

 顶部
hongqizhen
欢喜的慈雨
Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5
闲杂人等


UID 6900
精华 0
积分 1590
帖子 753
狼毛 10 根
阅读权限 40
注册 2005-8-31
状态 离线
发表于 2008-5-27 12:23 资料 短消息  加为好友 
佩服楼主,这些修改说起来很容易,但是只有做的人才知道有多难!
收下了,谢谢!

 顶部
linkzzy
呢喃的歌声
Rank: 2Rank: 2


UID 60845
精华 0
积分 147
帖子 131
狼毛 69 根
阅读权限 10
注册 2007-10-28
状态 离线
发表于 2008-5-29 00:22 资料 短消息  加为好友 
有win版的话是不是可以找个现成键盘映射程序就行了,楼主也搞定及时存档了,太强大了。
虽然不会汇编,不过又想起了当年拼命从DOS配置文件里挤出一点内存来,舒坦啊。





I Have No Mouth,And I Must Scream.
 顶部
longsun
奔跑的春风
Rank: 3Rank: 3Rank: 3


UID 6672
精华 0
积分 475
帖子 132
狼毛 2999 根
阅读权限 20
注册 2005-7-19
状态 离线
发表于 2008-5-30 08:21 资料 短消息  加为好友 
佩服楼主的毅力和决心~~~虽然我也曾经有过想找DOS下键盘替代鼠标的程序(类似于window里面的键盘模拟鼠标的辅助功能),因为我有一台很老的笔记本,没有鼠标插口,在windows 98下有驱动使用触摸屏的,但DOS下没鼠标,许多游戏不能玩。
但是终究没找到,也没想过自己开发…………楼主有时间有兴趣的话,或许可以尝试一下完善补丁的功能,开发DOS下键盘模拟鼠标一切动作的程序,直接解决其他游戏的类似需要。
运行游戏前先预载入内存(类似FPE),然后游戏进行的时候可以随时使用键盘控制鼠标的移动和点击。





 顶部
 



当前时区 GMT+8, 现在时间是 2025-5-12 22:34
苏ICP备2024131517号

Powered by Discuz! 5.5.0 © 2001-2007
Processed in 0.008970 second(s), 10 queries, Gzip enabled

清除 Cookies - 联系我们 - 狼窝 - Archiver - WAP