#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# DREAM controller for Save Files by Blizzard
# Version: 3.0b
# Type: Encryptor / Decryptor
# uses DREAM v4.1 or higher
# Date 22.7.2006
# Date v2.0: 25.1.2007
# Date v3.0: 20.8.2007
# Date v3.0b: 24.9.2007
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# This work is protected by the following license:
# #----------------------------------------------------------------------------
# #
# # Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# # (
http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #
# # You are free:
# #
# # to Share - to copy, distribute and transmit the work
# # to Remix - to adapt the work
# #
# # Under the following conditions:
# #
# # Attribution. You must attribute the work in the manner specified by the
# # author or licensor (but not in any way that suggests that they endorse you
# # or your use of the work).
# #
# # Noncommercial. You may not use this work for commercial purposes.
# #
# # Share alike. If you alter, transform, or build upon this work, you may
# # distribute the resulting work only under the same or similar license to
# # this one.
# #
# # - For any reuse or distribution, you must make clear to others the license
# # terms of this work. The best way to do this is with a link to this web
# # page.
# #
# # - Any of the above conditions can be waived if you get permission from the
# # copyright holder.
# #
# # - Nothing in this license impairs or restricts the author's moral rights.
# #
# #----------------------------------------------------------------------------
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# DO TOUCH THE VALUE BELOW! If you change the required version to a lower
# value your script WILL malfunction, because older DREAM version don't have
# all the methods and functions required by this script.
Required_DREAM_Version = 4.1
#
#
# Special Thanks to:
#
# - the makers of the XVI32 Hex Editor
# (without it, I couldn't have tested this script)
#
#
# Compatibility:
#
# 98% compatible with SDK 1.x. 90% compatible with SDK 2.x. 99% compatible
# with everything else. WILL corrupt your old savegames. Can cause
# incompatibility issues with custom save screens. NEEDS DREAM of the
# provided version or higher. Files will be saved into dream4 format with
# .dream4 extension. Cannot decode dream2 and dream3 files where extra data
# was added, but normal dream2 and dream3 files can be decoded.
#
#
# Features:
#
# - uses the Double Random Encryption Algorythm Module (DREAM) to encrypt
# important save data every time it is saved
# - makes it harder to hack saved files (even experienced hackers will have a
# hard time hacking important data from save files encrypted with DREAM)
# - great for RMXP MMORPGs as alternative for saving data on the server
#
# new in v2.0:
# - uses DREAM v3.0 which is far more powerful than DREAM v2.0, because the
# .dream3 format is a format in which ALL the saved data is encrypted
# - your savefiles will be saved into files with .dream3 extension
#
# new in v3.0:
# - uses the even more powerful DREAM v4.0
# - faster, better, safer:
# -> new, much faster algorithm which's speed doesn't depend on the chosen
# encryption pattern anymore
# -> re-coded to avoid the built-in RGSS bug with conditioning
# -> new additional encryption of encrypted data
# - your savefiles will be saved now into files with .dream4 extension
# - displays "File corrupted!" instead of crashing when files are corrupted
# - can decode dream2 and dream3 format
#
# new in v3.0b:
# - now uses DREAM v4.1
# - direct implementation into DREAM
# - now beta
#
#
# Configuration:
#
# Open the Scene_Title script and find these lines or similar:
#
# for i in 0..3
# if FileTest.exist?("Save#{i+1}.rxdata")
# @continue_enabled = true
# end
# end
#
# Change this line:
# if FileTest.exist?("Save#{i+1}.rxdata")
# into this one:
# if FileTest.exist?("#{SAVE_NAME}#{i+1}.dream4")
#
# Change SAVE_NAME to the name your savefiles should have. i.e. Making it
# "The Last_Elf" will make your savefiles look like "The Last_Elf.dream4".
#
# Find the part that needs to be configured and add additional data if you
# are using additional savedata. Include all additional data AS STRINGS in
# the array EXTRA_DATA. Example:
#
# EXTRA_DATA = ['$game_weapons', '$game_armors', '$game_items']
#
#
# IMPORTANT NOTES:
#
# This script will encrypt all save data and render them 100% unusable by any
# earlier version of your game that DOES NOT have this script. If you are
# using save-game update of earlier versions, this script will make further
# updates of old savegames IMPOSSIBLE, because they can't be loaded at all.
# Please use a DREAM save file converter to convert usual save files into a
# DREAM readable format. Note that this version of this script can also READ
# save files encrypted in dream2 and dream3 format only if their extension is
# being changed to .dream4 and their names are changed like configured below.
# Note that any extra data from dream2 and dream3 files will not be read.
# This script will save any files into .dream4 format. Changing this script
# can easily destroy your savefiles and it is not recommended.
#
#
# If you find any bugs, please report them here:
#
http://forum.chaos-project.com
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
EXTRA_DATA = []
SAVE_NAME = 'Save'
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#==============================================================================
# module DREAM
#==============================================================================
module DREAM
def self.self_extract
data = load_data('Data/DREAM_ext.rb')
file = File.open('DREAM_ext.rb', 'wb')
file.write(data)
file.close
require File.expand_path('DREAM_ext.rb')
load_DREAM
end
end
DREAM.self_extract
#==============================================================================
# Scene_File
#==============================================================================
class Scene_File
def make_filename(file_index)
return "#{SAVE_NAME}#{file_index + 1}.dream4"
end
end
#==============================================================================
# Scene_Save
#==============================================================================
class Scene_Save < Scene_File
def write_save_data(file)
DREAM.save_game(file)
end
end
#==============================================================================
# Scene_Load
#==============================================================================
class Scene_Load < Scene_File
def read_save_data(file)
DREAM.load_game(file)
end
end
#==============================================================================
# Window_SaveFile
#==============================================================================
class Window_SaveFile < Window_Base
def initialize(file_index, filename)
super(0, 64 + file_index%4*104, 640, 104)
self.contents = Bitmap.new(width - 32, height - 32)
if $fontface != nil
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
elsif $defaultfonttype != nil
self.contents.font.name = $defaultfonttype
self.contents.font.size = $defaultfontsize
end
@file_index, @filename = file_index, "#{SAVE_NAME}#{file_index + 1}.dream4"
@time_stamp, @file_exist = Time.at(0), FileTest.exist?(@filename)
if @file_exist
begin
file = File.open(@filename, 'r')
@time_stamp = file.mtime
@characters, @frame_count, @game_system, @game_switches,
@game_variables, @game_party, @game_map, @game_player = DREAM.data(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
refresh
rescue
@file_exist = false
refresh
self.contents.draw_text(4, 20, 600, 32, 'File corrupted!', 1)
time_string = @time_stamp.strftime('%Y/%m/%d %H:%M')
self.contents.draw_text(4, 40, 600, 32, time_string, 2)
end
else
refresh
end
@selected = false
end
end