itachi-hime
Member
Code:
#===============================================================================
# Module Craft by Prexus
# - Version 2.0 (12.31.06)
#-------------------------------------------------------------------------------
# This is the primary module of the PrexCraft script. Be sure to read the
# instructions to learn how to create new recipes. Do not change any of the
# constants in the DO NOT TOUCH section.
#===============================================================================
module Craft
#=============================================================================
# CONSTANTS :: DO NOT TOUCH
#=============================================================================
ITEM = 0; ARMOR = 1; WEAPON = 2
NOT_CONSUMED = false; CONSUMED = true;
#=============================================================================
# CONSTANTS :: PLEASE TOUCH THESE.. BABY!
#=============================================================================
USE_LEVELS = true # Use Levels for skills.
SHOW_COLORS = true # Use colorcoding (only for Levels)
SHOW_LEVELS = true # Show recipe level display
SHOW_LEVEL_UP = true # Show level up window
SHOW_LIST_ICONS = true # Show icons in recipe list
SHOW_RESULT_ICON = true # Show icons in result window
SHOW_COMPONENT_ICONS = true # Show icons in component window
#=============================================================================
# TRADE :: OFFSET LEVEL RANGE (edit with caution) (For use with levels only)
#=============================================================================
TRADE_LEVEL_OFFSET = 10
#=============================================================================
# COLORS :: EDIT WITH CAUTION (For use with Levels only)
#=============================================================================
TRIVIAL = Color.new( 64, 64, 64, 255)
LOW = Color.new( 0, 255, 0, 255)
MID = Color.new(255, 255, 0, 255)
HIGH = Color.new(255, 128, 0, 255)
IMPOSSIBLE = Color.new(255, 0, 0, 255)
#=============================================================================
# RECIPES :: Follow Instructions
#-----------------------------------------------------------------------------
# FORMAT :
# {'NAME' => 'RECIPE NAME AS STRING',
# 'TYPE' => 'RECIPE TYPE AS STRING',
# 'LEVEL' => LEVEL_AS_INTEGER, << Not Necessary with USE_LEVELS set to False
# 'RESULT' => [TYPE, ID, VALUE],
# 'COMPONENTS' => [
# [TYPE, ID, VALUE, CONSUMED?],
# [TYPE, ID, VALUE, CONSUMED?],
# ...
# ]
# }
#-----------------------------------------------------------------------------
# To setup a recipe, follow the example below:
#-----------------------------------------------------------------------------
# {'NAME' => 'Cold Iron Sword',
# 'TYPE' => 'Blacksmith',
# 'LEVEL' => 10,
# 'RESULT' => [WEAPON, 1, 1],
# 'COMPONENTS' => [
# [ITEM, 1, 1, CONSUMED],
# [ITEM, 2, 1, CONSUMED],
# [WEAPON, 3, 1, NOT_CONSUMED]
# ]
# } # End Recipe [WEAPON, 1, 1]
#=============================================================================
RECIPES = [
{'NAME' => 'Cold Sword',
'TYPE' => 'Blacksmith',
'LEVEL' => 1,
'RESULT' => [WEAPON, 33, 1],
'COMPONENTS' => [
[ITEM, 33, 1, CONSUMED],
[WEAPON, 1, 1, CONSUMED]
]
},
{'NAME' => 'Tempered Sword',
'TYPE' => 'Blacksmith',
'LEVEL' => 20,
'RESULT' => [WEAPON, 34, 1],
'COMPONENTS' => [
[ITEM, 38, 1, NOT_CONSUMED],
[WEAPON, 1, 1, CONSUMED]
]
},
{'NAME' => 'Apple Pie',
'TYPE' => 'Cook',
'LEVEL' => 1,
'RESULT' => [ITEM, 36, 1],
'COMPONENTS' => [
[ITEM, 34, 1, NOT_CONSUMED],
[ITEM, 35, 3, CONSUMED]
]
}
]
#=============================================================================
# Craft Methods
#-----------------------------------------------------------------------------
# valid_recipe? : name
# Checks if the recipe name given exists in the recipe data store.
#=============================================================================
def self.valid_recipe?(name)
for recipe in RECIPES
return true if name == recipe['NAME']
end
return false
end
#=============================================================================
# Craft Methods
#-----------------------------------------------------------------------------
# can_make? : name
# Checks if the recipe is possible to make. First finds if the recipe given is
# valid, then checks if there are enough components in your inventory.
#=============================================================================
def self.can_make?(name)
return false unless self.valid_recipe?(name)
for r in RECIPES
next unless name == r['NAME']
recipe = r
end
return false unless recipe
for component in recipe['COMPONENTS']
case component[0]
when 0 # ITEM
return false unless $game_party.item_number(component[1]) >= component[2]
when 1 # ARMOR
return false unless $game_party.armor_number(component[1]) >= component[2]
when 2 # WEAPON
return false unless $game_party.weapon_number(component[1]) >= component[2]
end
end
return true
end
#=============================================================================
# Craft Methods
#-----------------------------------------------------------------------------
# get_recipe : name
# Returns the hash object containing the data information for the recipe if
# the recipe is valid. Else returns nil.
#=============================================================================
def self.get_recipe(name)
return nil unless self.valid_recipe?(name)
for recipe in RECIPES
return recipe if recipe['NAME'] == name
end
return nil
end
#=============================================================================
# Craft Methods for LEVELS
#-----------------------------------------------------------------------------
# color_chart : diff
# Returns the color suited for the recipe based on the difference between the
# recipe level and your party's skill level
#=============================================================================
def self.color_chart(diff)
if diff < 0
return IMPOSSIBLE
elsif (0...TRADE_LEVEL_OFFSET).to_a.include?(diff)
return HIGH
elsif (TRADE_LEVEL_OFFSET...TRADE_LEVEL_OFFSET * 2).to_a.include?(diff)
return MID
elsif (TRADE_LEVEL_OFFSET * 2...TRADE_LEVEL_OFFSET * 3).to_a.include?(diff)
return LOW
else
return TRIVIAL
end
end
#=============================================================================
# Craft Methods for LEVELS
#-----------------------------------------------------------------------------
# level_skill : skill, diff
# Raises the level of the skill based on the difference between the recipe
# level and the party's skill level.
#=============================================================================
def self.level_skill(skill, diff)
if (0...TRADE_LEVEL_OFFSET).to_a.include?(diff)
if rand(10) >= 1
$game_party.trade_level_up(skill, 1)
return true
else
return false
end
elsif (TRADE_LEVEL_OFFSET...TRADE_LEVEL_OFFSET * 2).to_a.include?(diff)
if rand(10) >= 3
$game_party.trade_level_up(skill, 1)
return true
else
return false
end
elsif (TRADE_LEVEL_OFFSET * 2...TRADE_LEVEL_OFFSET * 3).to_a.include?(diff)
if rand(10) >= 6
$game_party.trade_level_up(skill, 1)
return true
else
return false
end
else
return false
end
end
end
#===============================================================================
# Scene Craft
#-------------------------------------------------------------------------------
# This is the main interface for the crafting system. You can run it by using
# the callscript command '$scene = Scene_Craft.new' or by adding it to your own
# code in the same manner.
#===============================================================================
class Scene_Craft
def initialize(type = nil)
@type = type
end
def main
@recipe_list = Window_RecipeList.new(@type)
@result_info = Window_ResultInfo.new(@recipe_list.data)
@result_comp = Window_ResultComponents.new(@recipe_list.data)
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
@recipe_list.dispose
@result_info.dispose
@result_comp.dispose
@level_window.dispose if @level_window
end
#-----------------------------------------------------------------------------
def update
@recipe_list.update
@result_info.update(@recipe_list.data)
@result_comp.update(@recipe_list.data)
if @level_window
@level_window.update
@level_window.opacity -= 2
@level_window.contents_opacity -= 2
if @level_window.opacity == 0
@level_window.dispose
@level_window = nil
end
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
end
if Input.trigger?(Input::C)
if craft(@recipe_list.data)
$game_system.se_play($data_system.decision_se)
else
$game_system.se_play($data_system.buzzer_se)
end
@recipe_list.refresh
@result_info.refresh
@result_comp.refresh
return
end
end
#-----------------------------------------------------------------------------
def craft(recipe)
return false unless Craft.can_make?(recipe)
recipe = Craft.get_recipe(@recipe_list.data)
if Craft::USE_LEVELS
skill = (recipe['TYPE'] ? recipe['TYPE'] : nil)
level = (recipe['LEVEL'] ? recipe['LEVEL'] : 1)
if skill
return unless $game_party.trade_check?(skill, level)
diff = ($game_party.trade_skills[skill] - level).abs
old_level = $game_party.trade_skills[skill]
if Craft.level_skill(skill, diff)
if Craft::SHOW_LEVEL_UP
if @level_window
@level_window.dispose
@level_window = nil
end
@level_window = Window_Base.new(0, 0, 256, 64)
@level_window.contents = Bitmap.new(224, 32)
@level_window.x = 320 - @level_window.width / 2
@level_window.y = 240 - @level_window.height / 2
@level_window.z = 9998
@level_window.contents.draw_text(4, 0, 224, 32,
"#{skill} +#{($game_party.trade_skills[skill] - old_level).abs}", 1)
end
end
end
end
for component in recipe['COMPONENTS']
case component[0]
when 0 # Item
$game_party.lose_item(component[1], component[2]) if component[3]
when 1 # Armor
$game_party.lose_armor(component[1], component[2]) if component[3]
when 2 # Weapon
$game_party.lose_weapon(component[1], component[2]) if component[3]
end
end
case recipe['RESULT'][0]
when 0 # Item
$game_party.gain_item(recipe['RESULT'][1], recipe['RESULT'][2])
when 1 # Armor
$game_party.gain_armor(recipe['RESULT'][1], recipe['RESULT'][2])
when 2 # Weapon
$game_party.gain_weapon(recipe['RESULT'][1], recipe['RESULT'][2])
end
return true
end
end
#===============================================================================
# Window RecipeList
#-------------------------------------------------------------------------------
# This is a standard command window which shows all the recipes known by the
# party. They will appear in White if you have the proper reagents to combine
# or grey otherwise.
#===============================================================================
class Window_RecipeList < Window_Selectable
def initialize(type)
super(0, 0, 224, 480)
self.contents = Bitmap.new(width - 32, height - 32)
@data = []
@type = type
refresh
end
#-----------------------------------------------------------------------------
def data
return @data[self.index]
end
#-----------------------------------------------------------------------------
def refresh
self.contents.clear
@data = []
for recipe in $game_party.recipes
if @type
next unless Craft.get_recipe(recipe)['TYPE'] == @type
end
@data.push(recipe) if Craft.valid_recipe?(recipe)
end
@item_max = @data.size
self.index = [[self.index, 0].max, @item_max].min
for i in 0..@data.size
data = @data[i]
next unless data
x = (Craft::SHOW_LIST_ICONS ? 32 : 4)
recipe = Craft.get_recipe(data)
if Craft::SHOW_LIST_ICONS
case recipe['RESULT'][0]
when 0 # ITEM
bitmap = RPG::Cache.icon($data_items[recipe['RESULT'][1]].icon_name)
self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))
when 1 # ARMOR
bitmap = RPG::Cache.icon($data_armors[recipe['RESULT'][1]].icon_name)
self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))
when 2 # WEAPON
bitmap = RPG::Cache.icon($data_weapons[recipe['RESULT'][1]].icon_name)
self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))
end
end
if Craft::USE_LEVELS
level = (recipe['LEVEL'] ? recipe['LEVEL'] : 1)
diff = $game_party.trade_skills[recipe['TYPE']] - level
if Craft::SHOW_COLORS
self.contents.font.color = Craft.color_chart(diff)
else
self.contents.font.color = (Craft.can_make?(data) ? normal_color : disabled_color)
end
if Craft::SHOW_LEVELS
self.contents.draw_text(x, i * 32, self.contents.width - x, 32,
"(#{recipe['LEVEL']}) #{data}")
else
self.contents.draw_text(x, i * 32, self.contents.width - x, 32, data.to_s)
end
else
self.contents.font.color = (Craft.can_make?(data) ? normal_color : disabled_color)
self.contents.draw_text(x, i * 32, self.contents.width - x, 32, data.to_s)
end
end
end
end
#===============================================================================
# Window ResultInfo
#-------------------------------------------------------------------------------
# This window displays all the information regarding the resulting item.
#===============================================================================
class Window_ResultInfo < Window_Base
def initialize(recipe)
super(224, 0, 640-224, 272)
self.contents = Bitmap.new(width - 32, height - 32)
@recipe = recipe
refresh
end
#-----------------------------------------------------------------------------
def refresh
self.contents.clear
recipe = Craft.get_recipe(@recipe)
return unless recipe
case recipe['RESULT'][0]
when 0 # ITEM
item = $data_items[recipe['RESULT'][1]]
return unless item
if Craft::SHOW_RESULT_ICON
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.draw_text(32, 0, self.contents.width - 36, 32, item.name.to_s)
else
self.contents.draw_text(4, 0, self.contents.width - 8, 32, item.name.to_s)
end
self.contents.draw_text(4, 0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)
if item.recover_hp_rate != 0
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "HP: #{item.recover_hp_rate}%")
elsif item.recover_hp != 0
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "HP: #{item.recover_hp}")
end
if item.recover_sp_rate != 0
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "SP: #{item.recover_sp_rate}%", 1)
elsif item.recover_sp != 0
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "SP: #{item.recover_sp}", 1)
end
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "Hit%: #{item.hit}")
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "Variance: #{item.variance}", 2)
case item.parameter_type
when 1
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "Max HP: +#{item.parameter_points}", 2)
when 2
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "Max SP: +#{item.parameter_points}", 2)
when 3
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "STR: +#{item.parameter_points}", 2)
when 4
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "DEX: +#{item.parameter_points}", 2)
when 5
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "AGI: +#{item.parameter_points}", 2)
when 6
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "INT: +#{item.parameter_points}", 2)
end
state_text = 'State + '
for state in item.plus_state_set
state_text += ', ' unless state == item.plus_state_set.first
state_text += $data_states[state].name
end
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "#{state_text}")
state_text = 'State - '
for state in item.minus_state_set
state_text += ', ' unless state == item.minus_state_set.first
state_text += $data_states[state].name
end
self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")
when 1 # ARMOR
item = $data_armors[recipe['RESULT'][1]]
return unless item
if Craft::SHOW_RESULT_ICON
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.draw_text(32, 0, self.contents.width - 36, 32, item.name.to_s)
else
self.contents.draw_text(4, 0, self.contents.width - 8, 32, item.name.to_s)
end
self.contents.draw_text(4, 0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)
case item.kind
when 0 # Shield
self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Shield')
when 1 # Helmet
self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Helmet')
when 2 # Body Armor
self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Body Armor')
when 3 # Accessory
self.contents.draw_text(4, 48, self.contents.width - 8, 32, 'Accessory')
end
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "EVA: #{item.eva}", 2)
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "PDEF: #{item.pdef}")
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "STR: #{item.str_plus}", 1)
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "DEX: #{item.dex_plus}", 2)
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "MDEF: #{item.mdef}")
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "AGI: #{item.agi_plus}", 1)
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "INT: #{item.int_plus}", 2)
state_text = 'State Guard: '
for state in item.guard_state_set
state_text += ', ' unless state == item.guard_state_set.first
state_text += $data_states[state].name
end
self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")
state_text = 'Element Guard: '
for state in item.guard_element_set
state_text += ', ' unless state == item.guard_element_set.first
state_text += $data_system.elements[state]
end
self.contents.draw_text(4, 176, self.contents.width - 8, 32, "#{state_text}")
if item.auto_state_id != 0
self.contents.draw_text(4, 208, self.contents.width - 8, 32, "Auto State: #{$data_states[item.auto_state_id].name}")
end
when 2 # WEAPON
item = $data_weapons[recipe['RESULT'][1]]
return unless item
if Craft::SHOW_RESULT_ICON
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(4, 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.draw_text(32, 0, self.contents.width - 36, 32, item.name.to_s)
else
self.contents.draw_text(4, 0, self.contents.width - 8, 32, item.name.to_s)
end
self.contents.draw_text(4, 0, self.contents.width - 8, 32, "#{item.price} #{$data_system.words.gold}", 2)
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "ATK: #{item.atk}")
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "PDEF: #{item.pdef}", 1)
self.contents.draw_text(4, 48, self.contents.width - 8, 32, "MDEF: #{item.mdef}", 2)
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "STR: #{item.str_plus}")
self.contents.draw_text(4, 80, self.contents.width - 8, 32, "DEX: #{item.dex_plus}", 2)
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "AGI: #{item.agi_plus}")
self.contents.draw_text(4, 112, self.contents.width - 8, 32, "INT: #{item.int_plus}", 2)
state_text = 'State + '
for state in item.plus_state_set
state_text += ', ' unless state == item.plus_state_set.first
state_text += $data_states[state].name
end
self.contents.draw_text(4, 144, self.contents.width - 8, 32, "#{state_text}")
state_text = 'State - '
for state in item.minus_state_set
state_text += ', ' unless state == item.minus_state_set.first
state_text += $data_states[state].name
end
self.contents.draw_text(4, 176, self.contents.width - 8, 32, "#{state_text}")
state_text = 'Element: '
for state in item.element_set
state_text += ', ' unless state == item.element_set.first
state_text += $data_system.elements[state]
end
self.contents.draw_text(4, 208, self.contents.width - 8, 32, "#{state_text}")
end
end
#-----------------------------------------------------------------------------
def update(recipe)
super()
return unless recipe != @recipe
@recipe = recipe
refresh
end
end
#===============================================================================
# Window ResultComponents
#-------------------------------------------------------------------------------
# This window displays all the components required for the combination, as well
# as the amount you have and the amount required of each. If an item has a *
# after the name, it will not be consumed in the combination.
#===============================================================================
class Window_ResultComponents < Window_Base
def initialize(recipe)
super(224, 272, 640-224, 208)
self.contents = Bitmap.new(width - 32, height - 32)
@recipe = recipe
refresh
end
#-----------------------------------------------------------------------------
def refresh
self.contents.clear
recipe = Craft.get_recipe(@recipe)
return unless recipe
i = 0
for component in recipe['COMPONENTS']
case component[0]
when 0 # ITEM
item = $data_items[component[1]]
number = $game_party.item_number(component[1])
when 1 # ARMOR
item = $data_armors[component[1]]
number = $game_party.armor_number(component[1])
when 2 # WEAPON
item = $data_weapons[component[1]]
number = $game_party.weapon_number(component[1])
end
next unless item
text = "#{item.name}"
text += ' (*)' unless component[3]
x = (Craft::SHOW_COMPONENT_ICONS ? 32 : 4)
if Craft::SHOW_COMPONENT_ICONS
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(4, i * 32 + 4, bitmap, Rect.new(0, 0, 24, 24))
end
self.contents.draw_text(x, i * 32, self.contents.width - x - 4, 32, "#{text}")
self.contents.draw_text(x, i * 32, self.contents.width - x - 4, 32, "#{number}/#{component[2]}", 2)
i += 1
end
end
#-----------------------------------------------------------------------------
def update(recipe)
super()
return unless recipe != @recipe
@recipe = recipe
refresh
end
end
#===============================================================================
# Game_Party
#-------------------------------------------------------------------------------
# This is a small edit of the original Game_Party class to add recognition for
# recipes. It also adds the methods below:
# add_recipe() : name
# - this will teach the party the recipe, if it's valid. name is the name
# of the recipe.
# remove_recipe() : name
# - this will force the party to forget the recipe, if it's known. name is
# the name of the recipe.
# have_recipe() : name
# - this will return true or false, depending on if the party knows the
# recipe. Primary used in the can_make? method of the Craft module.
# -- FOR LEVELS --
# learn_trade() : name
# - this will set the level of the 'trade skill' to 1, enabling it for use
# with recipes.
# forget_trade() : name
# - this will reset the level of the 'trade skill' to 0.
# trade_check() : name, level
# - this will return true or false, depending on if the arguement 'level' is
# less than or equal to the 'trade skill'.
# trade_level_up() : name, value = 1
# - this will add the value to the existing trade level. Used primary by
# the Craft module.
#===============================================================================
class Game_Party
attr_reader :recipes
attr_reader :trade_skills
#-----------------------------------------------------------------------------
alias prexcraft_g_party_initialize initialize
#-----------------------------------------------------------------------------
def initialize
prexcraft_g_party_initialize
@recipes = []
@trade_skills = Hash.new(0)
end
#-----------------------------------------------------------------------------
def add_recipe(name)
@recipes.push(name) if Craft.valid_recipe?(name) and !have_recipe(name)
end
#-----------------------------------------------------------------------------
def remove_recipe(name)
@recipes.delete(name)
end
#-----------------------------------------------------------------------------
def have_recipe(name)
return @recipes.include?(name)
end
#-----------------------------------------------------------------------------
def learn_trade(name)
@trade_skills[name] = 1
end
#-----------------------------------------------------------------------------
def forget_trade(name)
@trade_skills[name] = 0
end
#-----------------------------------------------------------------------------
def trade_check?(name, level)
return (@trade_skills[name] >= level)
end
#-----------------------------------------------------------------------------
def trade_level_up(name, value = 1)
@trade_skills[name] += value
end
end
http://www.rmxp.org/forums/index.php?topic=11261.0
The script only shows 14 recipes in the window. Any way to fix this? It's probably easy but I don't know anything about scripting.
Prexus won't answer my PM's and no one on the thread will either.
Thanks so much for your time! Your help is GREATLY appreciated and will be credited!
~Itachi