04-25-2007, 01:00 PM
(This post was last modified: 05-19-2017, 04:22 AM by DerVVulfman.)
FFTA Shop Menu
Version 0.87
by Chrono Cry
Apr 25, 2007
Introduction
Hello everbody and welcome to the Final Fantasy Tactics Advance Shop, i have recently just upgraded and messed around with it to make it look even more like the FFTA shop, there is still quiet a bit more to do but i have almost completely finished it, but to finish this completely i'm going to have to create my own skill equipment system -_-...a challenge! ^_^
Enjoy!
Bugs/Errors
Unknown Crashing Buy Item Error - FIXED
Sell Number Item Error - FIXED
Any more bugs? Please report them.
Script
Add above main.
To call on it, call this script and then after it call on the shop as you usually would do.
Required Images
The system 'USES' required images that belong in your Graphics\Pictures folder. The original forum's post no longer having on file.
They need to be graphics named "Shop Number", "Gold Window", "Shop Command" and "Shop Window"
Authors Notes
Credits to Bluescope for helping me with a String Error
Credits to SephirothSpawn for helping me tidy the code up
Version 0.87
by Chrono Cry
Apr 25, 2007
This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given. If you are the owner of the thread, please contact administration.
No support is given. If you are the owner of the thread, please contact administration.
Introduction
Hello everbody and welcome to the Final Fantasy Tactics Advance Shop, i have recently just upgraded and messed around with it to make it look even more like the FFTA shop, there is still quiet a bit more to do but i have almost completely finished it, but to finish this completely i'm going to have to create my own skill equipment system -_-...a challenge! ^_^
Enjoy!
Bugs/Errors
Unknown Crashing Buy Item Error - FIXED
Sell Number Item Error - FIXED
Any more bugs? Please report them.
Script
Add above main.
Code:
#----------------------------------------------------------------------------
# Final Fantasy Tactics Advance Shop System By Mac v. 0.7
#----------------------------------------------------------------------------
# Basically as it says in the title, this makes your shop system just like
# that of FFTA but due to being aliased you have the option at any point to
# switch it too and from the default system whenever you see fit.
#----------------------------------------------------------------------------
# Firstly to make this active in game you need to do a call script and call this:-
# $game_temp.call_fftshopsystem = true
#
# Then at any point you can call it again but with false to return it to the
# default shop system, or if you want this system to always stay on simply
# change the line:-
#
# @call_fftshopsystem = false
#
# Too:-
#
# @call_fftshopsystem = true
#----------------------------------------------------------------------------
#==============================================================================
# ** Game_Temp
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :call_fftshopsystem
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias_method :mac_fftshop_init, :initialize
def initialize
# Original Initialization
mac_fftshop_init
# Set Call FFT Shop False
@call_fftshopsystem = false
end
end
#==============================================================================
# ** Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# * Total Weapon Number
#--------------------------------------------------------------------------
def total_weapon_number(weapon_id)
n = weapon_number(weapon_id)
n += equipped_weapon_number(weapon_id)
return n
end
#--------------------------------------------------------------------------
# * Equipped Weapon Number
#--------------------------------------------------------------------------
def equipped_weapon_number(weapon_id)
n = 0
@actors.each do |actor|
n += 1 if actor.weapon_id == weapon_id
end
return n
end
#--------------------------------------------------------------------------
# * Total Armor Number
#--------------------------------------------------------------------------
def total_armor_number(armor_id)
n = armor_number(armor_id)
n += equipped_armor_number(armor_id)
return n
end
#--------------------------------------------------------------------------
# * Equipped Armor Number
#--------------------------------------------------------------------------
def equipped_armor_number(armor_id)
n = 0
@actors.each do |actor|
n += 1 if actor.armor1_id == armor_id
n += 1 if actor.armor2_id == armor_id
n += 1 if actor.armor3_id == armor_id
n += 1 if actor.armor4_id == armor_id
end
return n
end
end
#==============================================================================
# ** Scene_Shop
#==============================================================================
class Scene_Shop
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias_method :mac_fftshop_main, :main
def main
# If Call FFT Shop
if $game_temp.call_fftshopsystem
# Change to FFT Shop
$scene = FFT_ShopSystem::Scene_Shop.new
# Turn call FFT Shop off
$game_temp.call_fftshopsystem = false
# End Method
return
end
# Original Method
mac_fftshop_main
end
end
#==============================================================================
# ** FFT_ShopSystem
#==============================================================================
module FFT_ShopSystem
#==========================================================================
==
# ** Window_ShopCommand
#==========================================================================
==
class Window_ShopCommand < ::Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(180, ['Buy', 'Sell', 'Exit'])
# Reassign Window Parameters
self.x, self.y, self.opacity = 16, 336, 0
# Creates Background Graphic
@command_graphic = Sprite.new
@command_graphic.bitmap = RPG::Cache.picture('Shop Command')
@command_graphic.x = self.x + 1
@command_graphic.y = self.y + 7
@command_graphic.z = self.z - 1
@command_graphic.visible = true
@gold_graphic = Sprite.new
@gold_graphic.bitmap = RPG::Cache.picture('Gold Window')
@gold_graphic.x = self.x + 480
@gold_graphic.y = self.y + 104
@gold_graphic.z = self.z - 2
@gold_graphic.visible = true
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
@command_graphic.visible = self.visible
@gold_graphic.visible = self.visible
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
super
@command_graphic.dispose
@gold_graphic.dispose
end
end
#==========================================================================
==
# ** Window_ShopBuy
#==========================================================================
==
class Window_ShopBuy < ::Window_ShopBuy
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(shop_goods)
super(shop_goods)
# Reassign Window Parameters
self.x, self.y, self.width, self.height = 16, 20, 600, 228
self.opacity, self.visible, self.active = 0, false, false
# Creates Showback Graphic
@showback_graphic = Sprite.new
@showback_graphic.bitmap = RPG::Cache.picture('Shop Window')
@showback_graphic.x = self.x + 1
@showback_graphic.y = self.y + 1
@showback_graphic.z = self.z - 1
@showback_graphic.visible = self.visible
end
#--------------------------------------------------------------------------
# * Draw Item
#--------------------------------------------------------------------------
def draw_item(index)
# Gets item Number
item = @data[index]
# Gets Number Owned & Equipped
case item
when RPG::Item
number = $game_party.item_number(item.id)
equipped_number = 0
when RPG::Weapon
number = $game_party.weapon_number(item.id)
equipped_number = $game_party.equipped_weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
equipped_number = $game_party.equipped_armor_number(item.id)
end
# Adjust Color By Price
if item.price <= $game_party.gold and number < 99
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
# Clears Area
rect = Rect.new(0, index * 32, contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
# Draws Icon
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(4, index * 32 + 4, bitmap, Rect.new(0, 0, 24, 24),
opacity)
# Draws Item Name, Total, Equipped and Price
self.contents.draw_text(32, index * 32, 212, 32, item.name, 0)
self.contents.draw_text(374, index * 32, 88, 32,
(number + equipped_number).to_s, 2)
self.contents.draw_text(294, index * 32, 88, 32, equipped_number.to_s, 2)
self.contents.draw_text(464, index * 32, 88, 32, item.price.to_s, 2)
end
#--------------------------------------------------------------------------
# * Update
#--------------------------------------------------------------------------
def update
super
@showback_graphic.visible = self.visible
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
super
@showback_graphic.dispose
end
end
#==========================================================================
==
# ** Window_ShopSell
#==========================================================================
==
class Window_ShopSell < ::Window_ShopSell
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super
# Reassign Window Parameters
self.x, self.y, self.width, self.height = 16, 20, 600, 228
self.opacity, self.visible, self.active = 0, false, false
# Creates Showback Graphic
@showback_graphic = Sprite.new
@showback_graphic.bitmap = RPG::Cache.picture('Shop Window')
@showback_graphic.x = self.x + 1
@showback_graphic.y = self.y + 1
@showback_graphic.z = self.z - 1
@showback_graphic.visible = self.visible
# Adjust Column Max
@column_max = 1
end
#--------------------------------------------------------------------------
# * Draw Item
#--------------------------------------------------------------------------
def draw_item(index)
# Gets Item Data
item = @data[index]
# Gets Number & Equipped Number
case item
when RPG::Item
number = $game_party.item_number(item.id)
equipped_number = 0
when RPG::Weapon
number = $game_party.weapon_number(item.id)
equipped_number = $game_party.equipped_weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
equipped_number = $game_party.equipped_armor_number(item.id)
end
# Adjust Font Color By Price
if item.price > 0
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
# Clears Area
rect = Rect.new(0, index * 32, contents.width, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
# Draws Icon
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(4, index * 32 + 4, bitmap, Rect.new(0, 0, 24, 24),
opacity)
# Draws Item Name, Total Owned, Equipped and Price
self.contents.draw_text(32, index * 32, 212, 32, item.name, 0)
self.contents.draw_text(374, index * 32, 88, 32,
(number + equipped_number).to_s, 2)
self.contents.draw_text(294, index * 32, 88, 32, equipped_number.to_s, 2)
self.contents.draw_text(464, index * 32, 88, 32,
(item.price / 2).to_s, 2)
end
#--------------------------------------------------------------------------
# * Update
#--------------------------------------------------------------------------
def update
super
@showback_graphic.visible = self.visible
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
super
@showback_graphic.dispose
end
end
#==========================================================================
==
# ** Window_ShopNumber
#==========================================================================
==
class Window_ShopNumber < ::Window_ShopNumber
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super
# Reassign Window Parameters
self.x, self.y, self.width, self.height, self.opacity = 450, 242, 65, 64, 0
# Recreates Window Contents
@number_graphic = Sprite.new
@number_graphic.bitmap = RPG::Cache.picture('Shop Number')
@number_graphic.x = self.x + 3
@number_graphic.y = self.y + 14
@number_graphic.z = self.z - 1
@number_graphic.visible = false
self.contents = Bitmap.new(width - 32, height - 32)
self.visible, self.active = false, false
end
#--------------------------------------------------------------------------
# * Update
#--------------------------------------------------------------------------
def update
super
@number_graphic.visible = self.visible
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
super
@number_graphic.dispose
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = Color.new(0, 0, 0, 255)
self.contents.draw_text(0, 0, 25, 32, "?")
self.contents.draw_text(-25, 0, 56, 32, "#{@number}", 2)
self.cursor_rect.set(256, 0, 64, 32)
end
end
#==========================================================================
====
# ** FFT_ShopSystem
#==========================================================================
====
class Scene_Shop
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Memorize BGM & Play Shop Music
$game_temp.map_bgm = $game_system.playing_bgm
# Audio.bgm_play("Audio/BGM/31 - Mysterious Shop", 100, 100)
# Create Command Window
@command_window = Window_ShopCommand.new
# Create Spriteset
@spriteset = Spriteset_Map.new
# Create Gold Window
@gold_window = Window_Gold.new
@gold_window.opacity = 0
@gold_window.x = 650 - @gold_window.width - 16
@gold_window.y = 500 - @gold_window.height - 16
# Create Buy Window
@buy_window = FFT_ShopSystem::Window_ShopBuy.new($game_temp.shop_goods)
@buy_window.help_window = @help_window
# Create Sell Window
@sell_window = FFT_ShopSystem::Window_ShopSell.new
@sell_window.help_window = @help_window
# Create Number Window
@number_window = FFT_ShopSystem::Window_ShopNumber.new
# Transition run
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose Scene Objects
@spriteset.dispose
@command_window.dispose
@gold_window.dispose
@buy_window.dispose
@sell_window.dispose
@number_window.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@command_window.update
@gold_window.update
@buy_window.update
@sell_window.update
@number_window.update
# If command window is active: call update_command
if @command_window.active
update_command
return
# If buy window is active: call update_buy
elsif @buy_window.active
update_buy
return
# If sell window is active: call update_sell
elsif @sell_window.active
update_sell
return
# If quantity input window is active: call update_number
elsif @number_window.active
update_number
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (when command window is active)
#--------------------------------------------------------------------------
def update_command
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to map screen
$scene = Scene_Map.new
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Branch by command window cursor position
case @command_window.index
when 0 # buy
# Change windows to buy mode
@command_window.active = false
@buy_window.active = true
@buy_window.visible = true
@buy_window.refresh
when 1 # sell
# Change windows to sell mode
@command_window.active = false
@sell_window.active = true
@sell_window.visible = true
@sell_window.refresh
when 2 # quit
# Switch to map screen
$scene = Scene_Map.new
end
return
end
end
#--------------------------------------------------------------------------
# * Frame Update (when buy window is active)
#--------------------------------------------------------------------------
def update_buy
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Change windows to initial mode
@command_window.active = true
@buy_window.active = false
@buy_window.visible = false
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get item
@item = @buy_window.item
# If item is invalid, or price is higher than money possessed
if @item == nil or @item.price > $game_party.gold
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Get items in possession count
case @item
when RPG::Item
number = $game_party.item_number(@item.id)
when RPG::Weapon
number = $game_party.weapon_number(@item.id)
when RPG::Armor
number = $game_party.armor_number(@item.id)
end
# If 99 items are already in possession
if number == 99
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Calculate maximum amount possible to buy
max = @item.price == 0 ? 99 : $game_party.gold / @item.price
max = [max, 99 - number].min
# Turn Buy Window Off
@buy_window.active = false
# Change windows to quantity input mode
@number_window.set(@item, max, @item.price)
@number_window.active = true
@number_window.visible = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when sell window is active)
#--------------------------------------------------------------------------
def update_sell
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Change windows to initial mode
@command_window.active = true
@sell_window.active = false
@sell_window.visible = false
return
end
# If C button was pressed
if Input.trigger?(Input::C)
# Get item
@item = @sell_window.item
# If item is invalid, or item price is 0 (unable to sell)
if @item == nil or @item.price == 0
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Get items in possession count
case @item
when RPG::Item
number = $game_party.item_number(@item.id)
when RPG::Weapon
number = $game_party.weapon_number(@item.id)
when RPG::Armor
number = $game_party.armor_number(@item.id)
end
# Maximum quanitity to sell = number of items in possession
max = number
# Turn Sell Window Off
@sell_window.active = false
# Change windows to quantity input mode
@number_window.set(@item, max, @item.price / 2)
@number_window.active = true
@number_window.visible = true
end
end
#--------------------------------------------------------------------------
# * Frame Update (when quantity input window is active)
#--------------------------------------------------------------------------
def update_number
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Set quantity input window to inactive / invisible
case @command_window.index
when 0
@buy_window.active = true
@number_window.active = false
@number_window.visible = false
when 1
@sell_window.active = true
@number_window.active = false
@number_window.visible = false
return
end
end
# If C button was pressed
if Input.trigger?(Input::C)
# Play shop SE
$game_system.se_play($data_system.shop_se)
# Set quantity input window to inactive / invisible
@number_window.active = false
@number_window.visible = false
# Branch by command window cursor position
case @command_window.index
when 0 # buy
# Buy process
$game_party.lose_gold(@number_window.number * @item.price)
case @item
when RPG::Item
$game_party.gain_item(@item.id, @number_window.number)
when RPG::Weapon
$game_party.gain_weapon(@item.id, @number_window.number)
when RPG::Armor
$game_party.gain_armor(@item.id, @number_window.number)
end
# Refresh each window
@gold_window.refresh
@buy_window.refresh
# Change windows to buy mode
@buy_window.active = true
@buy_window.visible = true
when 1 # sell
# Sell process
$game_party.gain_gold(@number_window.number * (@item.price / 2))
case @item
when RPG::Item
$game_party.lose_item(@item.id, @number_window.number)
when RPG::Weapon
$game_party.lose_weapon(@item.id, @number_window.number)
when RPG::Armor
$game_party.lose_armor(@item.id, @number_window.number)
end
# Refresh each window
@gold_window.refresh
@sell_window.refresh
# Change windows to sell mode
@sell_window.active = true
@sell_window.visible = true
end
return
end
end
end
end
To call on it, call this script and then after it call on the shop as you usually would do.
Code:
$game_temp.call_fftshopsystem = true
Required Images
The system 'USES' required images that belong in your Graphics\Pictures folder. The original forum's post no longer having on file.
They need to be graphics named "Shop Number", "Gold Window", "Shop Command" and "Shop Window"
Authors Notes
Credits to Bluescope for helping me with a String Error
Credits to SephirothSpawn for helping me tidy the code up