什么是FLASH游戏(用于写论文)

Stasi关于vb编程的游戏修改器

我过去常常为自己服务。我改了很多游戏,写了很多修改本,发表了很多修改本,比如轩辕剑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:祝大家新年快乐!