mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-19 13:29:54 +00:00
192 lines
3.8 KiB
Ruby
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
|