什么是FLASH游戏(用于写论文)
我过去常常为自己服务。我改了很多游戏,写了很多修改本,发表了很多修改本,比如轩辕剑2和3,风景幻想,等等。关于这方面的文章不多,但我一直以为是一些肮脏的伎俩,但我刚刚在雪地里看到贝吉塔写的游戏修改器DIY,觉得很不错,就随便写了一些。vc的修饰语是贝吉塔写的,所以我主要写vb修饰语的要领。
游戏修改器有两种,一种是内存修改器,一种是存档修改器,大概还有其他类型。一时想不起来,但这是两种主要类型。
如何编写归档修饰符:
先说归档修改量类型的关键数据的简单搜索。所谓存档修改器,就是修改存档的方式,改变游戏数据,通常针对SLG、RPG、商务类、修炼类等。这种游戏一般不定时,可以随时存档,游戏数据以存档的形式保存,以便日后再次玩的时候读取。一般这类修改器比较好写,主要以磁盘文件的形式存档,放在硬盘上。一般可以通过修改存档文件来达到修改游戏数据的目的。
步骤:
一:首先确定要修改的游戏数据。一般只能确定一两种,比如经验,金钱等。太多的数据锁会影响存档的处理。获取游戏中的关键数据——这是制作游戏修改器的前提。其实在我看来,这部分是最难的地方,经常卡在这里。俗话说“巧妇难为无米之炊”,在这里过关是没用的,不管后面的手续能力有多强。
第二,记录当前比赛的数据,及时保存。
第三,修改当前游戏数据并保存。
四、归档文件的目录有时候很难找到:),主要是在游戏安装目录,那些:*save*。dat文件,国外的一些游戏档案,不是在游戏安装目录里,而是在我的文档里,比如:nba2003系列,古墓丽影系列,当然系统目录里也有,所以有时候需要仔细看才能配合系统快照。
五:比较两个档案的区别。一般winhex和ultraedit都有文件比较功能,差异会突出显示,很容易区分。
第六,尽量修改数据。这样做的目的很简单,因为比较起来有很多不同。所以要用启动游戏尝试修改并再次读入存档的方法,看看游戏的数据是否能达到预期的修改目的。
七:确定数据的存储地址和存储格式。
八:可以写修饰语。在vb中编写修饰符主要是利用二进制文件格式读取和修改的几个函数,主要掌握关于文件指针的seek语句。在我看来,只要熟练掌握以下功能,就能解决问题,没有什么技巧可言。
1)Open语句
能够输入/输出(I/O)文件。
语法
以[#]filenumber [Len=reclength]的形式打开模式[访问访问][锁定]的路径名
Open语句的语法由以下部分组成:
部分描述
路径名是必需的。指定文件名的字符串表达式,文件名可能还包括目录、文件夹和驱动器。
模式是必要的。关键字,指定文件方法,包括追加、二进制、输入、输出或随机。如果没有指定方法,则以随机访问方式打开文件。
访问是可选的。关键字,指示可以对打开的文件执行的操作,包括读、写或读写操作。
Lock是可选关键字,描述仅限于由其他进程打开的文件的操作,包括共享、锁读、锁写和锁读写操作。
Filenumber是必需的。有效的文件号,范围从1到511。使用FreeFile函数获取下一个可用的文件号。
Reclength是可选的。小于或等于32,767(字节)的数字。对于通过随机访问打开的文件,该值是记录长度。对于顺序文件,该值是缓冲字符的数量。
2)Get /Put语句
将打开的磁盘文件读入变量。
语法
Get/Put [#]filenumber,[recnumber],varname
Get/Put语句的语法由以下部分组成:
部分描述
Filenumber是必需的。任何有效的文件号。
Recnumber是可选的。变量(长型).记录号(随机文件)或字节数(二进制文件)表示读取数据从这里开始。
Varname是必需的。要将读取的数据放入的有效变量名。
3)寻求声明
在open语句打开的文件中,设置下一个读/写操作的位置。
语法
seek[#]文件编号,位置
Seek语句的语法由以下部分组成:
部分描述
Filenumber是必需的。任何有效的文件号。
位置是必须的。1-2,147,483,647之间的数字表示下一个读写操作将在哪里发生。
只要将上述函数组合起来,就可以编写任何需要的存档修饰符。容易吗?
接下来,我们来谈谈内存修饰符的写法:
步骤:
一:是金山游侠的使用,怎么用我就不说了。很多文章也很有用。不懂就要先懂。还可以看游戏修改器DIY二的第一部分,已经很详细了。
二:第一步的目的是获取数据在内存中的存储地址和存储格式。有了这两个,就可以通过vb写修饰符了。
常用的函数有:FindWindow、GetWindowThreadProcessID、OpenProcess、WriteProcessMemory、ReadProcessMemory、CloseHandle、CloseHandle、rmem、WMEM。我就把它们写在一起,这样你就可以把这个当做一个模块,想用就用。
Ps:下面有很多功能,有很多详细的参数。我已经在下面的例子中写了基本的必要参数和格式。其他功能我都举不出例子。平时注意编程的积累就可以了。
私有声明函数FindWindow Lib "user32 "别名" FindWindowA" (ByVal lpClassName为字符串,ByVal lpWindowName为字符串)为Long
私有声明函数GetWindowThreadProcessId Lib " user 32 "(ByVal hwnd为Long,lpdwProcessId为Long)为Long
私有声明函数open process Lib " kernel 32 "(ByVal dwDesiredAccess为Long,ByVal bInheritHandle为Long,ByVal dwProcessId为Long)为Long
私有声明函数WriteProcessMemory Lib " kernel 32 "(ByVal hProcess为Long,ByVal lpBaseAddress为Any,lpBuffer为Any,ByVal nSize为Long,lpNumberOfBytesWritten为Long)为Long
私有声明函数ReadProcessMemory Lib " kernel 32 "(ByVal hProcess为Long,ByVal lpBaseAddress为Any,lpBuffer为Any,ByVal nSize为Long,lpNumberOfBytesWritten为Long)为Long
私有声明函数CloseHandle Lib " kernel 32 "(ByVal hObject As Long)
私有常量PROCESS _ ALL _ ACCESS = & ampH1F0FFF
公共hProcess长
函数rMem(vAdd为Long,l为整数)为Long
Dim ret As Long
调用ReadProcessMemory(hProcess,vAdd,ret,l,0 & amp)
rMem = ret
结束功能
函数wMem(vAdd为长整型,value为长整型,l为整数型)
调用WriteProcessMemory(hProcess,vAdd,value,l,0 & amp)
结束功能
规范性修改者需要判断游戏是否已经开始:
这里我使用函数FindGame:
函数FindGame()为布尔值
Dim GameHwnd一样长,Pid一样长
hProcess = 0
game wnd = FindWindow(vbnullstring," * * * * * *")' * * * * * *是系统的进程名,是你运行游戏时看到的系统的进程名。
如果GameHwnd = 0那么退出函数‘游戏没有运行,你可以选择没有运行的东西,帮助它运行,或者给出错误提示。
GetWindowThreadProcessId GameHwnd,Pid
h PROCESS = open PROCESS(PROCESS _ ALL _ ACCESS,False,Pid)
如果(hProcess = 0)那么Exit函数'不能打开进程。
FindGame = True
结束功能
然后就是题目——阅读,修改,保存记忆。
构建一个命令和多个Text1,最好带索引,方便书写。这里有一个简单的例子:
数据读取:
私有子命令1_Click()
如果找到一个游戏
text 1(0)= rMem(& amp;H4700**,1)' & amp;H4700**是你要修改的内存地址,用十六进制修改。
text 1(1)= rMem(& amp;H4700**,1)'比如你要换十个地方,就这么写。
text 1(2)= rMem(& amp;H4700**,1) 'rMem函数上面已经说了,所以这里可以用。
text 1(3)= rMem(& amp;H4700**,1)
text 1(4)= rMem(& amp;H4700**,1)
text 1(5)= rMem(& amp;H4700**,1)
text 1(6)= rMem(& amp;H4700**,1)
text 1(7)= rMem(& amp;H4700**,1)
text 1(8)= rMem(& amp;H4700**,1)
text 1(9)= rMem(& amp;H4700**,1)
其他
MsgBox“请先运行游戏!”,vbinformation,“* * * * *”‘* * * * * *是系统的进程名,是你运行游戏时看到的系统的进程名。
如果…就会结束
末端接头
当然,如果你的编程习惯不错,可以把上面的地址写成const,这样也方便后期存储。
数据保存:
私有子命令2_Click()
如果找到一个游戏
呼叫wMem(& amp;H4700 * *,val (text 1 (0)),1)'只要注意和上面的对应就可以了,不对应后果很严重!
呼叫wMem(& amp;H4700**,Val(Text1(1)),1)
呼叫wMem(& amp;H4700**,Val(Text1(2)),1)
呼叫wMem(& amp;H4700**,Val(Text1(3)),1)
呼叫wMem(& amp;H4700**,Val(Text1(4)),1)
呼叫wMem(& amp;H4700**,Val(Text1(5)),1)
呼叫wMem(& amp;H4700**,Val(Text1(6)),1)
呼叫wMem(& amp;H4700**,Val(Text1(7)),1)
呼叫wMem(& amp;H4700**,Val(Text1(8)),1)
呼叫wMem(& amp;H4700**,Val(Text1(9)),1)
其他
MsgBox“请先运行游戏!”,vbInformation," ********* "
如果…就会结束
末端接头
//////////////////////////////////////////////////////////////////////////////////////////
以上代码在Win2000P+SP4+Vb6中测试通过。
三:最后在主界面上告诉用户这是修改什么,修改什么,写下数据的范围,就完成了!
总结:
以上是我的亲身经历。如果你能学到东西,就当是我给你的新年礼物吧。
先说游戏修改。我一般喜欢完美地玩游戏。想想,难得有时间玩游戏。无论大小,我总是要打一场著名的比赛。最强的结果是什么,最完美的结局是什么,我一般都要修改游戏,不然就是浪费时间!
最近有个朋友介绍我玩一个Insaniquarium Deluxe的小游戏,还不错。我建议你试一试。我修改了一下,游戏版www.chinadfcg.com里有我的截图。我觉得要打出这个成绩,得花我几年时间+几百只老鼠。:)你不妨试一试:)
Ps:祝大家新年快乐!