mkxp-sunshine/scripts/Persistent.rb
2026-05-03 17:54:37 +04:00

192 lines
3.8 KiB
Ruby

# Persistent data independent from save file.
# Stores settings and the like.
class LanguageCode
attr_accessor :full, :lang, :region
def initialize(str)
if str.nil?
str = 'en'
end
str = str.to_s
str = str.strip if str.respond_to?(:strip)
if str.length == 0
str = 'en'
end
parts = str.split(/[_-]/)
if parts.nil? || parts.length == 0
str = 'en'
parts = str.split(/[_-]/)
end
if parts.length == 1
@lang = parts[0].downcase.to_sym
@region = nil
@full = @lang
elsif parts.length == 2
@lang = parts[0].downcase.to_sym
@region = parts[1].upcase.to_sym
full_str = parts[0].downcase + '_' + parts[1].upcase
@full = full_str.to_sym
else
raise "malformed language code: #{str}"
end
end
end
class Persistent
attr_reader :lang
def initialize
steam_lang = nil
oneshot_lang = nil
begin
if defined?(Steam) && defined?(Steam::LANG)
steam_lang = Steam::LANG
end
rescue
steam_lang = nil
end
begin
if defined?(Oneshot) && defined?(Oneshot::LANG)
oneshot_lang = Oneshot::LANG
end
rescue
oneshot_lang = nil
end
lang_code = nil
if steam_lang && steam_lang.to_s.length > 0
lang_code = steam_lang
elsif oneshot_lang && oneshot_lang.to_s.length > 0
lang_code = oneshot_lang
else
lang_code = 'en'
end
begin
self.lang = LanguageCode.new(lang_code)
rescue
# Fallback
self.lang = LanguageCode.new('en')
end
begin
if File.exist?("zh_CN.ver")
self.lang = LanguageCode.new("zh_CN")
end
rescue
# ignore
end
begin
if defined?(Steam) && !Steam.enabled?
self.lang = LanguageCode.new("en")
end
rescue
# ignore
end
end
def lang=(val)
if val.nil?
@lang = LanguageCode.new('en')
elsif val.is_a?(LanguageCode)
@lang = val
else
@lang = LanguageCode.new(val)
end
begin
if defined?(Language)
Language.set(@lang)
end
rescue => e
print("[Scripts>Persistence] error: " + e.message)
end
end
def langcode
begin
return self.lang.full.to_s
rescue
return 'en'
end
end
# MARSHAL
def marshal_dump
[@lang]
end
def marshal_load(array)
begin
if array && array.length > 0 && array[0]
self.lang = array[0]
else
self.lang = LanguageCode.new('en')
end
rescue
self.lang = LanguageCode.new('en')
end
end
FILE_NAME = nil
def initialize_file_name
begin
if defined?(Oneshot) && defined?(Oneshot::SAVE_PATH)
@@file_name = Oneshot::SAVE_PATH + '/persistent.dat'
else
@@file_name = './persistent.dat'
end
rescue
@@file_name = './persistent.dat'
end
end
def save
begin
initialize_file_name if @@file_name.nil?
File.open(@@file_name, 'wb') do |file|
Marshal.dump($persistent, file)
end
rescue => e
print("[Scripts>Persistence>save] Saving error: " + e.message)
end
end
def self.load
begin
file_name = nil
begin
if defined?(Oneshot) && defined?(Oneshot::SAVE_PATH)
file_name = Oneshot::SAVE_PATH + '/persistent.dat'
else
file_name = './persistent.dat'
end
rescue
file_name = './persistent.dat'
end
if File.exist?(file_name)
begin
File.open(file_name, 'rb') do |file|
$persistent = Marshal.load(file)
end
rescue
$persistent = Persistent.new
end
else
$persistent = Persistent.new
end
rescue => e
print("[Scripts>Persistence] Error: " + e.message)
$persistent = Persistent.new
end
end
end