其实这是一个把数据库存入数据库的例程,不过从此功能我们可以联想到把脚本(藏脚本的话需要对game.exe加工一下)数据库等重要的数据进行特殊加密方式让破解变的不那么简单,当然我这里只是用到了数据库,至于用什么那就是你的事情了,必竟这只是一种加密思路而已。
上面说的是题外话,下面说正题:
1.此数据库为sqlite数据库,如果想查看数据库里的内容可以使用SQLite Developer
2.sql.dll是自己写的动态函数库,只是为了方便操作sqlite而已。。。
3.想打开工程查看的话把data里的数据库解压出来放入工程文件夹(只运行游戏不需要此压缩文件)
以下为工程加入的所有额外代码:
- # ————————————————————————————————————# 本脚本来自www.66rpg.com,转载请保留此信息# ————————————————————————————————————class Scene_Title #打开数据库(参数1:数据库名,参数2:指定一个全局数据库ID[后续操作用,取值范围(1-255)]) #当数据库不存在时会创建一个新的数据库并打开,返回数据库句柄 $ConnSql = Win32API.new("sql", "ConnSql", "P", "I") #打开数据库中的相应表(参数1:表名,参数2:数据库句柄),返回表操作句柄 $OpenTable = Win32API.new("sql", "OpenTable", "PI", "I") #取表字段内容(参数1:数据库句柄,参数2:表操作句柄,参数3:第X条记录,参数4:字段名, #参数5:字段类型)[0文本型 1整数型] $GetTableDate = Win32API.new("sql", "GetTableDate", "IIIPI", "P") #取表内记录数(参数1:数据库句柄,参数2:表操作句柄) $GetTableCount = Win32API.new("sql", "GetTableCount", "II", "I") #创建数据库表(参数1:数据库句柄,参数2:表名,参数3:字段名[多个字段用,号分开]) #参数4:字段类型[多个字段用,号分开][-1主键,0文本型,1整数型,2字节集型] $CreateTable = Win32API.new("sql", "CreateTable", "IPPP", "I") #关闭数据库(参数1:数据库句柄[当此数小于1或大于255时关闭所有打开的数据库]) $Close = Win32API.new("sql", "Close", "I", "V") #写表内字段值(参数1:数据库句柄,参数2:表操作句柄, #参数3:写第X条记录[小于1时为插入新记录],参数4:字段名,参数5:字段值) $DumpTableData = Win32API.new("sql", "DumpTableData", "IIIPP", "I") #压缩数据库(参数1:数据库句柄) $ShrinkDB = Win32API.new("sql", "ShrinkDB", "I", "I") #数据库删除表(参数1:数据库句柄,参数2:表名) $DropTable = Win32API.new("sql", "DropTable", "IP", "I") #取表字节集型字段内容并把取到的内容写到文件(参数1:数据库句柄,参数2:表操作句柄,参数3:第X条记录, #参数4:字段名,参数5:文件名) $GetTableBin = Win32API.new("sql", "GetTableBin", "IIIPP", "I") #写表内字节集型字段内容(参数1:数据库句柄,参数2:表操作句柄, #参数3:写第X条记录[小于1时为插入新记录],参数4:字段名,参数5:文件名) $DumpTableBin = Win32API.new("sql", "DumpTableBin", "IIIPP", "I") #删除文件 $DeleteFile = Win32API.new("sql", "DeleteFile", "P", "V") #把数据库存入数据库 def EnCryptFile(reset = true) name = "Actors,Classes,Skills,Items,Weapons,Armors,Enemies,Troops,States,Animations,Tilesets,CommonEvents,System" type = "2,2,2,2,2,2,2,2,2,2,2,2,2" if !FileTest.exist?("data.db") connid = $ConnSql.call("data.db") $CreateTable.call(connid,"main","id,"+name,"-1,"+type) rsid = $OpenTable.call("main",connid) tempname = name.gsub(/^,/, '').split(",") for i in 1..tempname.size $DumpTableBin.call(connid,rsid,1,tempname[i-1],"Data/"+tempname[i-1]+".rxdata") $DeleteFile.call("Data/"+tempname[i-1]+".rxdata") if reset end $Close.call(0) command_shutdown end end #删除读出的数据库 def DnDeleteFile(reset = true) name = "Actors,Classes,Skills,Items,Weapons,Armors,Enemies,Troops,States,Animations,Tilesets,CommonEvents,System" tempname = name.gsub(/^,/, '').split(",") # 载入数据库 $data_actors = load_data("Data/"+tempname[0]+".rxdata") $data_classes = load_data("Data/"+tempname[1]+".rxdata") $data_skills = load_data("Data/"+tempname[2]+".rxdata") $data_items = load_data("Data/"+tempname[3]+".rxdata") $data_weapons = load_data("Data/"+tempname[4]+".rxdata") $data_armors = load_data("Data/"+tempname[5]+".rxdata") $data_enemies = load_data("Data/"+tempname[6]+".rxdata") $data_troops = load_data("Data/"+tempname[7]+".rxdata") $data_states = load_data("Data/"+tempname[8]+".rxdata") $data_animations = load_data("Data/"+tempname[9]+".rxdata") $data_tilesets = load_data("Data/"+tempname[10]+".rxdata") $data_common_events = load_data("Data/"+tempname[11]+".rxdata") $data_system = load_data("Data/"+tempname[12]+".rxdata") if reset for i in 0..tempname.size-1 $DeleteFile.call("Data/"+tempname[i]+".rxdata") end end end #从数据库里读出数据库 def DnCryptFile name = "Actors,Classes,Skills,Items,Weapons,Armors,Enemies,Troops,States,Animations,Tilesets,CommonEvents,System" if $data_actors==nil connid = $ConnSql.call("data.db") rsid = $OpenTable.call("main",connid) tempname = name.gsub(/^,/, '').split(",") for i in 1..tempname.size $GetTableBin.call(connid,rsid,1,tempname[i-1],"Data/"+tempname[i-1]+".rxdata") end $Close.call(0) DnDeleteFile() end end def main # 战斗测试的情况下 if $BTEST battle_test return end #第一次运行时使用,把数据库存入数据库 #EnCryptFile() #把数据库存入之后就可以使用这句调用了 DnCryptFile() # 生成系统对像 $game_system = Game_System.new # 生成标题图形 @sprite = Sprite.new @sprite.bitmap = RPG::Cache.title($data_system.title_name) # 生成命令窗口 s1 = "新游戏" s2 = "继续" s3 = "退出" @command_window = Window_Command.new(192, [s1, s2, s3]) @command_window.back_opacity = 160 @command_window.x = 320 - @command_window.width / 2 @command_window.y = 288 # 判定继续的有效性 # 存档文件一个也不存在的时候也调查 # 有効为 @continue_enabled 为 true、無効为 false @continue_enabled = false for i in 0..3 if FileTest.exist?("Save#{i+1}.rxdata") @continue_enabled = true end end # 继续为有效的情况下、光标停止在继续上 # 无效的情况下、继续的文字显示为灰色 if @continue_enabled @command_window.index = 1 else @command_window.disable_item(1) end # 演奏标题 BGM $game_system.bgm_play($data_system.title_bgm) # 停止演奏 ME、BGS Audio.me_stop Audio.bgs_stop # 执行过渡 Graphics.transition # 主循环 loop do # 刷新游戏画面 Graphics.update # 刷新输入信息 Input.update # 刷新画面 update # 如果画面被切换就中断循环 if $scene != self break end end # 装备过渡 Graphics.freeze # 释放命令窗口 @command_window.dispose # 释放标题图形 @sprite.bitmap.dispose @sprite.dispose end end复制代码
复制代码
本帖来自P1论坛作者盈盈,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=212143 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。