Project1

标题: 如何制作一次性存档?(只可读1次) [打印本页]

作者: 天使喝可乐    时间: 2009-6-8 06:18
标题: 如何制作一次性存档?(只可读1次)
RMXP的存档有很多弊端,比如赌博前存,输了再读..打怪开箱前存,出装备就继续,出垃圾就读...
所以想弄一个一次性存档(很多游戏都用这个)
既:随地都可以存档,但是,存后只能读1次,然后该存档消失
当然,默认的存档功能不被磨灭的前提下的另一种功能...

哪位大大能给写个脚本吗?谢谢了~~
作者: 后知后觉    时间: 2009-6-8 06:38
class Scene_Load < Scene_File
  def on_decision(filename)
    unless FileTest.exist?(filename)
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    $game_system.se_play($data_system.load_se)
    file = File.open(filename, "rb")
    read_save_data(file)
    file.close
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    $game_map.update
    $scene = Scene_Map.new
###############################################
    File.delete(filename)
################################################
  end
end

这样的话所有的存档都是一次性的了
不过玩家还是可以存档后在磁盘里复制存档文件
这方法也就防那些大脑迟钝的小白而已- -!
而且要是什么时候别人忘记存档或者突然事情游戏被关闭了的话
就意味着要从头开始- -
{/fd}

另外一种好点的方法就是
在 $scene = nil 和 exit
这2个的时候自动保存存档 记录某些数据
比如时间什么的
在游戏里判断时间来决定要不要让玩家赌博

不过别人还是可以在磁盘里复制

反正单机游戏想控制这方面不大容易- -
作者: 天使喝可乐    时间: 2009-6-8 06:42
囧..有什么方法使一次性存档隐藏?
而且我不想把所有的都变一次性= =
作者: ycaong    时间: 2009-6-8 09:48
那尝试切换如何?

比如利用2楼的脚本达到目的后又恢复。这只是猜测性的,我是新手所以不敢确定。
作者: 紫苏    时间: 2009-6-9 13:43
首先文件是活生生的数据,只要它存在就不可能做到绝对的隐藏,以下方案也只不过防君子不防小人罢了:

1、将文件的隐藏属性打开,这个对于打开了资源管理器“显示隐藏文件”的人无效;

2、将文件放置到诡异的位置,比如系统临时文件夹内什么的;

3、判断文件的创建时间,复制的文件或连同文件的修改时间一同复制,只有这个创建时间变动了,所以根据这个属性来唯一标识文件~

你觉得哪种最好?
作者: 天使喝可乐    时间: 2009-6-9 20:06
第3种太麻烦了..我觉的第2种不错{/se}
作者: 紫苏    时间: 2009-6-9 21:17
把一次性存档文件放到临时文件夹中,读档后删除一次性存档,并在 Scene_Title 判断一次性存档是否存在
在 RANGE 那里设置需要一次性存档的索引范围(从 0 开始):
  1. #==============================================================================
  2. # ■ Scene_File
  3. #------------------------------------------------------------------------------
  4. #  存档画面及读档画面的超级类。
  5. #==============================================================================

  6. class Scene_File
  7.   RANGE = 0..1
  8.   @@path = " " * 512
  9.   Win32API.new("kernel32", "GetTempPathA", %w%L P%, 'L').call(512, @@path)
  10.   @@path.strip!
  11.   @@path.slice!(-1, 1)
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取临时文件夹路径
  14.   #--------------------------------------------------------------------------
  15.   def self.path
  16.     @@path
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 生成文件名
  20.   #     file_index : 文件名的索引 (0~3)
  21.   #--------------------------------------------------------------------------
  22.   def make_filename(file_index)
  23.     return (RANGE === file_index ? @@path : "") +
  24.       "Save#{file_index + 1}.rxdata"
  25.   end
  26. end


  27. #==============================================================================
  28. # ■ Window_SaveFile
  29. #------------------------------------------------------------------------------
  30. #  显示存档以及读档画面、保存文件的窗口。
  31. #==============================================================================

  32. class Window_SaveFile < Window_Base
  33.   #--------------------------------------------------------------------------
  34.   # ● 初始化对像
  35.   #     file_index : 存档文件的索引 (0~3)
  36.   #     filename   : 文件名
  37.   #--------------------------------------------------------------------------
  38.   def initialize(file_index, filename)
  39.     super(0, 64 + file_index % 4 * 104, 640, 104)
  40.     self.contents = Bitmap.new(width - 32, height - 32)
  41.     @file_index = file_index
  42.     @filename = filename
  43.     @time_stamp = Time.at(0)
  44.     @file_exist = FileTest.exist?(@filename)
  45.     if @file_exist
  46.       file = File.open(@filename, "r")
  47.       @time_stamp = file.mtime
  48.       @characters = Marshal.load(file)
  49.       @frame_count = Marshal.load(file)
  50.       @game_system = Marshal.load(file)
  51.       @game_switches = Marshal.load(file)
  52.       @game_variables = Marshal.load(file)
  53.       @total_sec = @frame_count / Graphics.frame_rate
  54.       file.close
  55.     end
  56.     refresh
  57.     @selected = false
  58.   end
  59. end


  60. #==============================================================================
  61. # ■ Scene_Load
  62. #------------------------------------------------------------------------------
  63. #  处理读档画面的类。
  64. #==============================================================================

  65. class Scene_Load < Scene_File
  66.   alias on_decision_old on_decision if !method_defined? :on_decision_old
  67.   #--------------------------------------------------------------------------
  68.   # ● 确定时的处理
  69.   #--------------------------------------------------------------------------
  70.   def on_decision(filename)
  71.     on_decision_old(filename)
  72.     File.delete(filename) if filename.include?(@@path)
  73.   end
  74. end

  75. #==============================================================================
  76. # ■ Scene_Title
  77. #------------------------------------------------------------------------------
  78. #  处理标题画面的类。
  79. #==============================================================================

  80. class Scene_Title
  81.   #--------------------------------------------------------------------------
  82.   # ● 主处理
  83.   #--------------------------------------------------------------------------
  84.   def main
  85.     # 战斗测试的情况下
  86.     if $BTEST
  87.       battle_test
  88.       return
  89.     end
  90.     # 载入数据库
  91.     $data_actors        = load_data("Data/Actors.rxdata")
  92.     $data_classes       = load_data("Data/Classes.rxdata")
  93.     $data_skills        = load_data("Data/Skills.rxdata")
  94.     $data_items         = load_data("Data/Items.rxdata")
  95.     $data_weapons       = load_data("Data/Weapons.rxdata")
  96.     $data_armors        = load_data("Data/Armors.rxdata")
  97.     $data_enemies       = load_data("Data/Enemies.rxdata")
  98.     $data_troops        = load_data("Data/Troops.rxdata")
  99.     $data_states        = load_data("Data/States.rxdata")
  100.     $data_animations    = load_data("Data/Animations.rxdata")
  101.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  102.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  103.     $data_system        = load_data("Data/System.rxdata")
  104.     # 生成系统对像
  105.     $game_system = Game_System.new
  106.     # 生成标题图形
  107.     @sprite = Sprite.new
  108.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  109.     # 生成命令窗口
  110.     s1 = "新游戏"
  111.     s2 = "继续"
  112.     s3 = "退出"
  113.     @command_window = Window_Command.new(192, [s1, s2, s3])
  114.     @command_window.back_opacity = 160
  115.     @command_window.x = 320 - @command_window.width / 2
  116.     @command_window.y = 288
  117.     # 判定继续的有效性
  118.     # 存档文件一个也不存在的时候也调查
  119.     # 有効为 @continue_enabled 为 true、无效为 false
  120.     @continue_enabled = false
  121.     for i in 0..3
  122.       if FileTest.exist?((Scene_File::RANGE === i ? Scene_File.path : "") +
  123.           "Save#{i+1}.rxdata")
  124.         @continue_enabled = true
  125.       end
  126.     end
  127.     # 继续为有效的情况下、光标停止在继续上
  128.     # 无效的情况下、继续的文字显示为灰色
  129.     if @continue_enabled
  130.       @command_window.index = 1
  131.     else
  132.       @command_window.disable_item(1)
  133.     end
  134.     # 演奏标题 BGM
  135.     $game_system.bgm_play($data_system.title_bgm)
  136.     # 停止演奏 ME、BGS
  137.     Audio.me_stop
  138.     Audio.bgs_stop
  139.     # 执行过渡
  140.     Graphics.transition
  141.     # 主循环
  142.     loop do
  143.       # 刷新游戏画面
  144.       Graphics.update
  145.       # 刷新输入信息
  146.       Input.update
  147.       # 刷新画面
  148.       update
  149.       # 如果画面被切换就中断循环
  150.       if $scene != self
  151.         break
  152.       end
  153.     end
  154.     # 装备过渡
  155.     Graphics.freeze
  156.     # 释放命令窗口
  157.     @command_window.dispose
  158.     # 释放标题图形
  159.     @sprite.bitmap.dispose
  160.     @sprite.dispose
  161.   end
  162. end
复制代码

作者: 奶油Da蛋糕    时间: 2009-6-9 21:37
没用的,人家可以存4次档,赌博前存4次,输了读,然后输了又读,如果输赢的几率是1:1的话,还是没用的。
作者: 八云紫    时间: 2009-6-9 21:46
记得 系统临时文件夹 里的东西在开机的时候会被清空的吧.
作者: 66rpg学习    时间: 2009-6-9 21:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-6-9 22:12
其实我感觉我存档文件放到 SE文件夹或者PICTURES等文件数量
非常多的地方 也不用设置为隐藏 就把后缀名改了就差不多了- -!
在保存文件名的时候特殊处理一下让存档文件之间从文件名上看不出关联
不会麻烦到哪里去- -!

放在SE文件夹就把后缀名改成wav 放到PICTURES就改成jpg/png

{/fd}
作者: 66rpg学习    时间: 2009-6-9 22:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: hitlerson    时间: 2009-6-9 22:25
搞个variables不就好了
读档时
判断
if variables >= 1
  p "此存档已经过期"
  exit
else
  variables += 1
end

防止忘记存档,只能在正常退出的时候都加上自动存档
作者: tommay    时间: 2009-6-9 22:39
以下引用66rpg学习于2009-6-9 14:14:20的发言:

但是不管什么什么什么高深的方法....必须前提,游戏加密,且不能被解开,不然所有白费..

+1,事实上,这种加密方法是不存在的{/hx}


以下引用紫苏于2009-6-9 5:43:26的发言:

以下方案也只不过防君子不防小人罢了:

再+1,任何猫腻一旦工程被解开,便不成为“猫腻”了
作者: sizz123    时间: 2009-6-9 23:25
读了后把文件删除就好了
作者: zjx2005    时间: 2009-6-10 01:43
不懂脚本的人的个人想法.................

首先...改改普通存档画面...以默认的来说...把第4个存档的位置去了
第4个存档位置还在...只是在普通的存档界面里把它删了.普通存档存不到第4个
然后用其他方法可以存到第4个位置

每次读档时(读档不修改),条件分歧,看看是否是第4个存档被读取,是的话读完档后就把4号存档删了

然后在游戏的一些特殊地方不允许普通存档,有临时存档,使用临时存档的话就自动存到第4个位置

然后每次读第4个存档时都会被删除...
于是...一次性了...
作者: 后知后觉    时间: 2009-6-10 02:09
以下引用柳柳在一篇教程里的总结语句:

游戏不加密才是王道!
作者: 越前リョーマ    时间: 2009-6-10 02:11
那他多存几个档位不就好了…… - -
作者: 霜冻之狼    时间: 2009-6-10 02:23
以下引用hitlerson于2009-6-9 14:25:21的发言:
搞个variables不就好了

如果玩家在读档前找到那个存档文件并且复制....

作者: 天使喝可乐    时间: 2009-6-10 02:59
谢谢大家拉..不过还是没想到可行的方法..
我觉的后知后觉那个方法还可以...囧了 ..
看来只能去掉赌博功能和开箱了啊?= = 啊啊啊啊.........
作者: bloblo    时间: 2009-6-10 08:26
好贴啊 不错啊 谢谢楼主分享 拉 (*^__^*) 嘻嘻……                        
   
     
      
   
   
  
     
      
------------------------------------------------------------
蔡依林强化消腩丸赶行的脚步 ,而大地温厚的冬阳少林十三灸依然灿烂

作者: qqp987987    时间: 2009-6-10 15:37
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1