#******************************************************************************
#
# ? ??????????
#
# --------------------------------------------------------------------------
# ????? ? 1.0.5
# ? ? ? RPG????VX : RGSS2
# ? ? ? ? ?????
# ? ? ? ? http://cacaosoft.web.fc2.com/
# --------------------------------------------------------------------------
# == ?? ==
#
# ? ??????????????????
#
# --------------------------------------------------------------------------
# == ???? ==
#
# ? ?????????????Cacao Base Script ??????
# ? ??????????????????????????????
#
# --------------------------------------------------------------------------
# == ???? ==
#
# ? ????????
# 144 x 24 ????ShopIcon?? "Graphics/System" ?????????
# ? ?????????????????
#
#
#******************************************************************************
#/////////////////////////////////////////////////////////////////////////////#
# #
# ???????????????????? #
# #
#/////////////////////////////////////////////////////////////////////////////#
module CAO::KSHOP
# ???????????
FILE_ITME_ICON = "ShopIcon"
# ??????????????
SE_PAGE = ["Audio/SE/Book", 90, 150]
# ??????????????
NUM_ALIGN = 2
# ???????
TEXT_SELL = "?????"
TEXT_HAVE = "????"
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
def self.get_sell_price(price)
return price / 2
end
#--------------------------------------------------------------------------
# ? KGC[????]???
#--------------------------------------------------------------------------
def self.in_kgc_equip_ext?
return Hash === $imported && $imported["EquipExtension"]
end
#--------------------------------------------------------------------------
# ? ???????????
#--------------------------------------------------------------------------
def self.item_max
if in_kgc_equip_ext?
return KGC::EquipExtension::EQUIP_TYPE.uniq.size + 2
else
return 6 # ????, ??, ?, ?, ??, ??
end
end
#--------------------------------------------------------------------------
# ? ???????????
#--------------------------------------------------------------------------
def self.item_index(item)
case item
when RPG::Item
index = 0
when RPG::Weapon
index = 1
when RPG::Armor
if in_kgc_equip_ext?
index = 2 + KGC::EquipExtension::EQUIP_TYPE.index(item.kind)
else
index = 2 + item.kind
end
end
return index
end
end
class Window_ShopIcon < Window_Base
#--------------------------------------------------------------------------
# ? ??????????
#--------------------------------------------------------------------------
attr_accessor :index #
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
def initialize
super(0, 56, 384, 56)
@item_max = CAO::KSHOP.item_max
@index = 0
@img_icon = Cache.system(CAO::KSHOP::FILE_ITME_ICON)
refresh
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def refresh
self.contents.clear
cw = self.contents.width / @item_max
for i in 0...@item_max
x = cw * i + (cw - 24) / 2
rect = Rect.new(24 * i, 0, 24, 24)
self.contents.blt(x, 0, @img_icon, rect, (@index == i ? 255 : 128))
end
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def update
super
if Input.trigger?(Input::LEFT)
@index = (@index - 1 + @item_max) % @item_max
end
if Input.trigger?(Input::RIGHT)
@index = (@index + 1) % @item_max
end
end
end
class Window_ShopBuy < Window_Selectable
#--------------------------------------------------------------------------
# ? ??????????
#--------------------------------------------------------------------------
attr_accessor :item_index #
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
alias _cao_initialize_kshop initialize
def initialize(x, y)
@item_index = 0
_cao_initialize_kshop(x, y)
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
def item
return @data[@item_index][self.index]
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def refresh
@data = Array.new(CAO::KSHOP.item_max) { [] }
for goods_item in @shop_goods
case goods_item[0]
when 0
item = $data_items[goods_item[1]]
when 1
item = $data_weapons[goods_item[1]]
when 2
item = $data_armors[goods_item[1]]
end
if item != nil
@data[CAO::KSHOP.item_index(item)].push(item)
end
end
@item_max = @data[@item_index].size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# ? ?????
# index : ????
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[@item_index][index]
number = $game_party.item_number(item)
enabled = (item.price <= $game_party.gold and number < 99)
rect = item_rect(index)
self.contents.clear_rect(rect)
draw_item_name(item, rect.x, rect.y, enabled)
rect.width -= 4
self.contents.draw_text(rect, item.price, 2)
end
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
def update_help
item = self.item
@help_window.set_text(item == nil ? "" : item.description)
end
end
class Window_ShopSell < Window_Item
#--------------------------------------------------------------------------
# ? ??????????
#--------------------------------------------------------------------------
attr_accessor :item_index #
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super(x, y, width, height)
@column_max = 1
@item_index = 0
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def refresh
@data = []
for item in $game_party.items
next unless include?(item)
@data.push(item)
if item.is_a?(RPG::Item) and item.id == $game_party.last_item_id
self.index = @data.size - 1
end
end
@data.push(nil) if include?(nil)
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# ? ?????
# index : ????
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
item = @data[index]
if item != nil
number = $game_party.item_number(item)
enabled = enable?(item)
draw_item_name(item, rect.x, rect.y, enabled)
self.contents.font.color = system_color
self.contents.draw_text(244, rect.y, 95, WLH, CAO::KSHOP::TEXT_SELL)
self.contents.draw_text(413, rect.y, 75, WLH, CAO::KSHOP::TEXT_HAVE)
self.contents.font.color = normal_color
price = CAO::KSHOP.get_sell_price(item.price)
align = CAO::KSHOP::NUM_ALIGN
self.contents.draw_text(339, rect.y, 70, WLH, price, align)
self.contents.draw_text(488, rect.y, 20, WLH, number, align)
end
end
#--------------------------------------------------------------------------
# ?
#--------------------------------------------------------------------------
def include?(item)
return false if item == nil
return @item_index == CAO::KSHOP.item_index(item)
end
#--------------------------------------------------------------------------
# ? ????????
# item : ???? (????????????)
# x : ??? X ??
# y : ??? Y ??
# enabled : ??????false ?????????
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true)
if item != nil
draw_icon(item.icon_index, x, y, enabled)
self.contents.font.color = normal_color
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(x + 24, y, 240, WLH, item.name)
end
end
end
class Window_ShopNumber < Window_Base
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, 304, 304)
@item = nil
@max = 1
@price = 0
@index = 1
@number = 1
@digits_max = 2
end
#--------------------------------------------------------------------------
# ? ???????????????
#--------------------------------------------------------------------------
def set(item, max, price)
@item = item
@max = max
@price = price
@number = 1
@index = 1
refresh
update_cursor
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def refresh
y = 96
self.contents.clear
draw_item_name(@item, 0, y)
self.contents.font.color = normal_color
self.contents.draw_text(212, y, 20, WLH, "×")
s = sprintf("%0*d", @digits_max, @number)
for i in 0...@digits_max
self.contents.draw_text(240 + i * 14, y, 14, WLH, s[i,1], 1)
end
draw_currency_value(@price * @number, 4, y + WLH * 2, 264)
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def update
super
if self.active
if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
Sound.play_cursor
place = 10 ** (@digits_max - 1 - @index)
n = @number / place % 10
@number -= n * place
n = (n + 1) % 10 if Input.repeat?(Input::UP)
n = (n + 9) % 10 if Input.repeat?(Input::DOWN)
@number += n * place
@number = [@number, @max].min
refresh
end
last_index = @index
if Input.repeat?(Input::RIGHT)
if @index < @digits_max - 1 or Input.trigger?(Input::RIGHT)
@index = (@index + 1) % @digits_max
end
end
if Input.repeat?(Input::LEFT)
if @index > 0 or Input.trigger?(Input::LEFT)
@index = (@index + @digits_max - 1) % @digits_max
end
end
if @index != last_index
Sound.play_cursor
end
update_cursor
end
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
def update_cursor
self.cursor_rect.set(240 + @index * 14, 96, 14, WLH)
end
end
class Scene_Shop < Scene_Base
#--------------------------------------------------------------------------
# ? ????
#--------------------------------------------------------------------------
def start
super
create_menu_background
create_command_window
@help_window = Window_Help.new
@gold_window = Window_Gold.new(384, 56)
@dummy_window = Window_Base.new(0, 112, 544, 304)
@buy_window = Window_ShopBuy.new(0, 112)
@buy_window.active = false
@buy_window.visible = false
@buy_window.help_window = @help_window
@sell_window = Window_ShopSell.new(0, 112, 544, 304)
@sell_window.active = false
@sell_window.visible = false
@sell_window.help_window = @help_window
@number_window = Window_ShopNumber.new(0, 112)
@number_window.active = false
@number_window.visible = false
@status_window = Window_ShopStatus.new(304, 112)
@status_window.visible = false
end
#--------------------------------------------------------------------------
# ? ????
#--------------------------------------------------------------------------
alias _cao_start_kshop start
def start
_cao_start_kshop
@icon_window = Window_ShopIcon.new
@icon_window.active = false
@icon_window.visible = false
end
#--------------------------------------------------------------------------
# ? ????
#--------------------------------------------------------------------------
alias _cao_terminate_kshop terminate
def terminate
_cao_terminate_kshop
@icon_window.dispose
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def update
super
update_menu_background
@help_window.update
@command_window.update
@gold_window.update
@dummy_window.update
@buy_window.update
@sell_window.update
@number_window.update
@status_window.update
if @command_window.active
update_command_selection
elsif @buy_window.active
update_buy_selection
update_item_kind
elsif @sell_window.active
update_sell_selection
update_item_kind
elsif @number_window.active
update_number_input
end
end
#--------------------------------------------------------------------------
# ? ????????????
#--------------------------------------------------------------------------
def create_command_window
s1 = Vocab::ShopBuy
s2 = Vocab::ShopSell
s3 = Vocab::ShopCancel
@command_window = CAO::Window_Command.new(0, 56, 384, 56, [s1,s2,s3], 1, 3)
if $game_temp.shop_purchase_only
@command_window.draw_item(1, false)
end
end
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
def update_command_selection
if Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
elsif Input.trigger?(Input::C)
case @command_window.index
when 0
Sound.play_decision
@command_window.active = false
@command_window.visible = false
@icon_window.active = true
@icon_window.visible = true
@icon_window.refresh
@dummy_window.visible = false
@buy_window.active = true
@buy_window.visible = true
@buy_window.refresh
@status_window.visible = true
when 1
if $game_temp.shop_purchase_only
Sound.play_buzzer
else
Sound.play_decision
@command_window.active = false
@command_window.visible = false
@icon_window.active = true
@icon_window.visible = true
@icon_window.refresh
@dummy_window.visible = false
@sell_window.active = true
@sell_window.visible = true
@sell_window.refresh
end
when 2
Sound.play_decision
$scene = Scene_Map.new
end
end
end
#--------------------------------------------------------------------------
# ? ???????????
#--------------------------------------------------------------------------
def update_item_kind
last_index = @icon_window.index
@icon_window.update
if @icon_window.index != last_index
Audio.se_play(*CAO::KSHOP::SE_PAGE)
@icon_window.refresh
@buy_window.index = 0
@sell_window.index = 0
@buy_window.item_index = @icon_window.index
@sell_window.item_index = @icon_window.index
if @buy_window.active
@buy_window.refresh
elsif @sell_window.active
@sell_window.refresh
end
end
end
#--------------------------------------------------------------------------
# ? ???????????
#--------------------------------------------------------------------------
def update_buy_selection
@status_window.item = @buy_window.item
if Input.trigger?(Input::B)
Sound.play_cancel
@command_window.active = true
@command_window.visible = true
@icon_window.active = false
@icon_window.visible = false
@dummy_window.visible = true
@buy_window.active = false
@buy_window.visible = false
@status_window.visible = false
@status_window.item = nil
@help_window.set_text("")
elsif Input.trigger?(Input::C)
@item = @buy_window.item
number = $game_party.item_number(@item)
if @item == nil or @item.price > $game_party.gold or number == 99
Sound.play_buzzer
else
Sound.play_decision
max = @item.price == 0 ? 99 : $game_party.gold / @item.price
max = [max, 99 - number].min
@buy_window.active = false
@buy_window.visible = false
@number_window.set(@item, max, @item.price)
@number_window.active = true
@number_window.visible = true
end
end
end
#--------------------------------------------------------------------------
# ? ???????????
#--------------------------------------------------------------------------
def update_sell_selection
if Input.trigger?(Input::B)
Sound.play_cancel
@command_window.active = true
@command_window.visible = true
@icon_window.active = false
@icon_window.visible = false
@dummy_window.visible = true
@sell_window.active = false
@sell_window.visible = false
@status_window.item = nil
@help_window.set_text("")
elsif Input.trigger?(Input::C)
@item = @sell_window.item
@status_window.item = @item
if @item == nil or @item.price == 0
Sound.play_buzzer
else
Sound.play_decision
max = $game_party.item_number(@item)
@sell_window.active = false
@sell_window.visible = false
@number_window.set(@item, max, CAO::KSHOP.get_sell_price(@item.price))
@number_window.active = true
@number_window.visible = true
@status_window.visible = true
end
end
end
end