=begin
###############################################################################
# #
# Валюта (Game Currency) #
# #
###############################################################################
Автор: Денис Кузнецов (http://vk.com/id8137201)
Группа ВК: https://vk.com/scriptsrpgmakervxace
Версия: 1.1
Релиз от: 14.08.15
Первый релиз: 13.08.15
Что нового в этой версии:
- Добавил новый вызов скрита
- Добавил сохранение/загрузку одной настройки вместе с игрой
- Убрал коэффициенты
- Изменено название одного вызова скрипта, а также некоторые параметры вызовов
- Баг фикс Window_Gold, Window_Window_ShopNumber и Scene_Shop
Инструкция:
Получить текущее количество денег текущей валюты:
get_game_currency_value
Получить номер текущей валюты:
get_game_currency_type
Получить номер валюты, использованной в предыдущий раз:
get_game_last_currency_type
Установить значение для текущей валюты:
set_game_currency_value(value)
Установить номер валюты для использования:
set_game_currency_type(currency_type)
Перенести деньги с одной валюты на другую:
type1 - откуда перенести
type2 - куда перенести
rate - значение коэффициента переноса (type1 * rate) (по-умолчанию равен 1)
game_exchange_currency(type1, type2, rate)
Увеличить значение валюты:
currency_type - номер валюты
amount - значение
game_gain_currency(currency_type, amount)
Уменьшить значение валюты:
game_lose_currency(currency_type, amount)
Установить отображение только текущей валюты в окне золота (Window_Gold):
setup - true или false (только текущее значение или нет)
set_game_window_gold_current_currency(setup)
Для справки о совместимости с другими скриптами:
В данном скрипте переписаны/дополнены стандартные классы
### module Vocab ###
Переписанные методы:
self.currency_unit(currency_type = nil)
### class Game_Party ###
Новые методы:
init_currency
currency_value=(currency_value)
currency_type=(currency_type)
exchange_currency(type1, type2, rate)
gold
Дополненные методы:
initialize
Переписанные методы:
gain_gold(amount)
### class Window_Gold ###
Новые методы:
value_width
type
Дополненные методы:
initialize
update
draw_currency_value(value, unit, x, y, width)
Переписанные методы:
value
currency_unit
### class Window_ShopNumber ###
Дополненные методы:
initialize(x, y, height)
set(item, max, price, currency_unit = nil)
draw_currency_value(value, unit, x, y, width)
Переписанные методы:
currency_unit=(currency_unit)
### class Scene_Shop ###
Переписанные методы:
money
currency_unit
=end
module Currency_Settings
# Какую валюту использовать в начале игры ?
GAME_CURRENCY_START_TYPE = 0
# Настройка валют
# номер_валюты => { :name => "символ_валюты", :start_value => значение (количество валюты в начале игры (можно не указывать этот параметр)) }
GAME_CURRENCY = {
0 => { :name => "Gil" },
1 => { :name => "$", :start_value => 5000 },
2 => { :name => "€", :start_value => 2000 }
}
# Настройка иконок для отображения в окне денег
# Если не указана иконка, то будет отображаться символ валюты
# номер_валюты => номер_иконки
# GAME_CURRENCY_WINDOW_GOLD_ICON = { } чтобы не использовать
GAME_CURRENCY_WINDOW_GOLD_ICON = {
0 => 341,
1 => 361,
#~ 2 => 360
}
# Отображать только используемую на данный момент валюту ?
# true - да, false - нет
$GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY = false
end # module Currency_Settings
module Vocab
def self.currency_unit(currency_type = nil)
if currency_type.nil?
Currency_Settings::GAME_CURRENCY[$game_party.currency_type][:name]
else
Currency_Settings::GAME_CURRENCY[currency_type][:name]
end
end
end # module Vocab
class Game_Party < Game_Unit
include Currency_Settings
attr_reader :last_currency_type
attr_reader :currency_type
attr_reader :currency
alias denis_kyznetsov_game_currency_game_party_initialize initialize
def initialize
denis_kyznetsov_game_currency_game_party_initialize
@last_currency_type = GAME_CURRENCY_START_TYPE
@currency_type = GAME_CURRENCY_START_TYPE
init_currency
end
def init_currency
return if !@currency.nil?
@currency = {}
GAME_CURRENCY.keys.each do |index|
value = GAME_CURRENCY[index].has_key?(:start_value) ? GAME_CURRENCY[index][:start_value] : 0
@currency[index] = value
end
end
def currency_value=(currency_value)
@currency[@currency_type] = currency_value
end
def currency_type=(currency_type)
@last_currency_type = @currency_type
@currency_type = currency_type
end
def exchange_currency(type1, type2, rate)
@currency[type2] += (@currency[type1] * rate).to_i
@currency[type1] = 0
end
def gold
return @currency[@currency_type]
end
def gain_gold(amount)
@currency[@currency_type] = [[@currency[@currency_type] + amount, -max_gold].max, max_gold].min
end
end # class Game_Party < Game_Unit
class Game_Interpreter
include Currency_Settings
def set_game_window_gold_current_currency(setup)
$GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY = setup
end
def get_game_currency_value
return $game_party.gold
end
def get_game_currency_type
return $game_party.currency_type
end
def get_game_last_currency_type
return $game_party.last_currency_type
end
def set_game_currency_value(value)
$game_party.currency_value = value
end
def set_game_currency_type(currency_type)
return if !GAME_CURRENCY.has_key?(currency_type)
$game_party.currency_type = currency_type
end
def game_exchange_currency(type1, type2, rate = 1)
return if !GAME_CURRENCY.has_key?(type1) || !GAME_CURRENCY.has_key?(type2)
$game_party.exchange_currency(type1, type2, rate)
end
def game_gain_currency(currency_type, amount)
return if !GAME_CURRENCY.has_key?(currency_type)
last_currency = $game_party.currency_type
game_currency_type(currency_type)
$game_party.gain_gold(amount)
game_currency_type(last_currency)
end
def game_lose_currency(currency_type, amount)
game_gain_currency(currency_type, -amount)
end
end # class Game_Interpreter
$imported = {} if $imported.nil?
$imported["DenKyz_Game_Currency"] = true
class Window_Gold < Window_Base
include Currency_Settings
alias denis_kyznetsov_game_currency_window_gold_initialize initialize
def initialize
@currency_keys_type = 0 # номер ключа массива валют
denis_kyznetsov_game_currency_window_gold_initialize
self.arrows_visible = false
self.ox = -value_width if !$GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY && GAME_CURRENCY.size > 1
end
alias denis_kyznetsov_game_currency_window_gold_update update
def update
denis_kyznetsov_game_currency_window_gold_update
if !$GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY && GAME_CURRENCY.size > 1
self.ox += 1
if self.ox > contents.width
@currency_keys_type += 1
@currency_keys_type %= $game_party.currency.keys.size
self.ox = -value_width
refresh
end
elsif $GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY && self.ox != 0
self.ox = 0
refresh
end
end
def value_width # ширина значения вместе с иконкой или текстом
val_width = 24 # отступ
val_width += text_size(currency_unit).width if !GAME_CURRENCY_WINDOW_GOLD_ICON.has_key?(type) # ширина названия валюты, если нет иконки
val_width += text_size(value).width # ширина значения
return val_width
end
def value # значение валюты
if $GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY
$game_party.gold
else
$game_party.currency[type]
end
end
def type # получить тип валюты из ключей
if $GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY
$game_party.currency_type
else
$game_party.currency.keys[@currency_keys_type]
end
end
def currency_unit # символ валюты
Vocab::currency_unit(type)
end
alias denis_kyznetsov_game_currency_window_gold_draw_currency_value draw_currency_value
def draw_currency_value(value, unit, x, y, width)
return denis_kyznetsov_game_currency_window_gold_draw_currency_value(value, unit, x, y, width) if !GAME_CURRENCY_WINDOW_GOLD_ICON.has_key?(type)
change_color(normal_color)
draw_text(x, y, width - 16 - 2, line_height, value, 2)
draw_icon(GAME_CURRENCY_WINDOW_GOLD_ICON[type], width - 16, y)
end
end # class Window_Gold < Window_Base
class Window_ShopNumber < Window_Selectable
include Currency_Settings
alias denis_kyznetsov_game_currency_window_shop_number_initialize initialize
def initialize(x, y, height)
denis_kyznetsov_game_currency_window_shop_number_initialize(x, y, height)
@currency_unit = $game_party.currency_type
end
alias denis_kyznetsov_game_currency_window_shop_number_set set
def set(item, max, price, currency_unit = nil)
denis_kyznetsov_game_currency_window_shop_number_set(item, max, price, currency_unit)
@currency_unit = $game_party.currency_type if currency_unit
refresh
end
def currency_unit=(currency_unit)
@currency_unit = $game_party.currency_type
refresh
end
alias denis_kyznetsov_game_currency_window_shop_number_draw_currency_value draw_currency_value
def draw_currency_value(value, unit, x, y, width)
if !GAME_CURRENCY_WINDOW_GOLD_ICON.has_key?(unit)
unit = Vocab::currency_unit
return denis_kyznetsov_game_currency_window_shop_number_draw_currency_value(value, unit, x, y, width)
end
change_color(normal_color)
draw_text(x, y, width - 16 - 2, line_height, value, 2)
draw_icon(GAME_CURRENCY_WINDOW_GOLD_ICON[unit], width - 16, y)
end
end # class Window_ShopNumber < Window_Selectable
class Scene_Shop < Scene_MenuBase
def money
$game_party.gold
end
def currency_unit
$game_party.currency_type
end
end # class Scene_Shop < Scene_MenuBase
module DataManager
class << self
alias denis_kyznetsov_game_currency_data_manager_make_save_contents make_save_contents
alias denis_kyznetsov_game_currency_data_manager_extract_save_contents extract_save_contents
end
def self.make_save_contents
contents = denis_kyznetsov_game_currency_data_manager_make_save_contents
contents[:GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY] = $GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY
contents
end
def self.extract_save_contents(contents)
denis_kyznetsov_game_currency_data_manager_extract_save_contents(contents)
$GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY = contents[:GAME_CURRENCY_WINDOW_GOLD_CURRENT_CURRENCY]
end
end # module DataManager