搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 把数据库藏起来: Project1.rar

把数据库藏起来: Project1.rar

 

把数据库藏起来:
其实这是一个把数据库存入数据库的例程,不过从此功能我们可以联想到把脚本(藏脚本的话需要对game.exe加工一下)数据库等重要的数据进行特殊加密方式让破解变的不那么简单,当然我这里只是用到了数据库,至于用什么那就是你的事情了,必竟这只是一种加密思路而已。

上面说的是题外话,下面说正题:
1.此数据库为sqlite数据库,如果想查看数据库里的内容可以使用SQLite Developer
2.sql.dll是自己写的动态函数库,只是为了方便操作sqlite而已。。。
3.想打开工程查看的话把data里的数据库解压出来放入工程文件夹(只运行游戏不需要此压缩文件)

以下为工程加入的所有额外代码:
  1. # ————————————————————————————————————# 本脚本来自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在线咨询功能删除,谢谢。
Loading...

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-11-24 07:02 , Processed in 0.049662 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部