Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Help with Deke's Crafting/Recipe script

I'm looking for the original thread for Deke's Crafting/Recipe Script. I've searched all over the site and either it isn't here or I am missing it. If you could give me a direct link, that would be good.


I do have a version I got from Artbane/the guys from MOTW, unfortunately there really aren't any comments explaining how to use the script and, though I used examples from them, I'm having trouble.

Here's the scripts:

Code:
#================================
# CRAFTING PROGRAM
#----------------------------------------------------------------
#-written by Deke
#-yes_no window code created by Phsylomortis
#----------------------------------------------------------------
#================================

#updates to Game_Party class

class Game_Party
 
 attr_accessor       :recipes
 
 alias crafting_party_initialize initialize
 
 def initialize
   crafting_party_initialize
   @recipes=[]
 end
 
 #----------------------------------------------------------------------
 def know?(recipe, version = 1)
   unless recipe.is_a?(Game_Recipe)
     recipe = get_recipe_from_master_list(recipe, version)
   end
   return $game_party.recipes.include?(recipe)
 end
 
#----------------------------------------------------------------------
 def learn_recipe(recipe , version = 1)
   unless recipe.is_a?(Game_Recipe)
     recipe = get_recipe_from_master_list(recipe, version)
   end
   if recipe.is_a?(Game_Recipe)
     unless know?(recipe)
       @recipes.push(recipe)
     end
   end
 end
 
#----------------------------------------------------------------------
 def forget_recipe(recipe , version = 1)
   if !recipe.is_a?(Game_Recipe)
     recipe = get_recipe_from_master_list(recipe, version)
   end
   if recipe.is_a?(Game_Recipe)
     for i in 0...@recipes.size
       if recipe == @recipes[i]
         index = i
         break
       end
     end
     if index != nil
       @recipes.delete(@recipes[index])
     end
   end
 end
 
#----------------------------------------------------------------------
 def get_recipe_from_master_list(item, version)
   index = nil
   for i in 0...$game_temp.recipe_list.size
     if item[0] == $game_temp.recipe_list[i].result and item[1] ==$game_temp.recipe_list[i].result_type
       version -= 1
       if version == 0
         index = i
         break
       end
     end
   end
   if index.is_a?(Integer)
     return ($game_temp.recipe_list[index])
   else
     return false
   end
 end
 
end # of Game_Party updates

#================================
class Game_Recipe

 attr_reader :ingredients
 attr_reader :quantities
 attr_reader :result
 attr_reader :result_type
 attr_reader :ingredient_types
 
#----------------------------------------------------------------------
 def initialize( ingredients, ingredient_types, quantities, result, result_type)
   @ingredients = ingredients
   @ingredient_types = ingredient_types
   @quantities = quantities
   @result = result
   @result_type = result_type
 end
 
#----------------------------------------------------------------------
 def name
   case @result_type
     when 0
       name = $data_items[@result].name
     when 1
       name = $data_armors[@result].name
     when 2
       name = $data_weapons[@result].name
   end
   return name
 end

#----------------------------------------------------------------------
 def have
   have_all = true
   for i in 0...@ingredients.size
     case @ingredient_types[i]
       when 0
         if $game_party.item_number(@ingredients[i]) < @quantities[i]
           have_all=false
         end
       when 1
         if $game_party.armor_number(@ingredients[i]) < @quantities[i]
           have_all=false
         end
       when 2
         if $game_party.weapon_number(@ingredients[i]) < @quantities[i]
           have_all=false
         end
     end
   end
   return have_all
 end

#----------------------------------------------------------------------
 def decrement
   for i in 0...@ingredients.size
     case @ingredient_types[i]
     when 0
       $game_party.lose_item(@ingredients[i], @quantities[i])
     when 1
       $game_party.lose_armor(@ingredients[i], @quantities[i])
     when 2
       $game_party.lose_weapon(@ingredients[i], @quantities[i])
     end
   end
 end

#----------------------------------------------------------------------
 def make
   if have
     case @result_type
     when 0
       $game_party.gain_item(@result, 1)
     when 1
       $game_party.gain_armor(@result, 1)
     when 2
       $game_party.gain_weapon(@result, 1)
     end
     decrement
   end
 end
 
#----------------------------------------------------------------------
 def == (recipe)
   if recipe.is_a?(Game_Recipe)
     equal = true
     if recipe.ingredients != self.ingredients
       equal = false
     end
     if recipe.ingredient_types != self.ingredient_types
       equal = false
     end
     if recipe.quantities != self.quantities
       equal = false
     end
     if recipe.result != self.result
       equal=false
     end
     if recipe.result_type != self.result_type
       equal = false
     end
   else
     equal = false
   end
   return equal
 end
 
end # of Game_Recipe class

#===================================

class Window_Craft < Window_Selectable

 #--------------------------------------------------------------------------
 def initialize
   super(0, 64, 240, 416)
   @column_max = 1
   refresh
   self.index = 0
 end

 #--------------------------------------------------------------------------
 def recipe
   return @data[self.index]
 end

 #--------------------------------------------------------------------------
 def refresh
   if self.contents != nil
     self.contents.dispose
     self.contents = nil
   end
   @data = []
   for i in 0...$game_party.recipes.size
       @data.push($game_party.recipes[i])
   end
   @item_max = @data.size
   if @item_max > 0
     self.contents = Bitmap.new(width - 32, row_max * 32)
     self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
     self.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize
     for i in 0...@item_max
       draw_item(i)
     end
   end
 end

 #--------------------------------------------------------------------------
 def draw_item(index)
   recipe = @data[index]
   self.contents.font.color = recipe.have ? normal_color : disabled_color
   x = 16
   y = index * 32
   self.contents.draw_text(x , y, self.width-32, 32, recipe.name, 0)
 end

 #--------------------------------------------------------------------------
 def update_help
   current_recipe = recipe
   if current_recipe.is_a?(Game_Recipe)
   case current_recipe.result_type
     when 0
       description = $data_items[current_recipe.result].description
     when 1
       description = $data_armors[current_recipe.result].description
     when 2
       description = $data_weapons[current_recipe.result].description
     end
   else
     description = ""
   end
   @help_window.set_text(description)
   @help_window.update
 end
 
end # of Window_Craft

#=======================================
class Window_CraftResult < Window_Base

 #--------------------------------------------------------------------------
 def initialize
   super(240, 64, 400, 184)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
   self.contents.font.size = 15
   @result = nil
   @type = nil
 end

 #--------------------------------------------------------------------------
 def refresh
   self.contents.clear
   case @type
     when 0
       item = $data_items[@result]
       if item.recover_hp_rate > item.recover_hp
         hp_string = "HP Recovery% :"
         hp_stat = item.recover_hp_rate
       else
         hp_string = "HP Recovery Points:"
         hp_stat = item.recover_hp
       end
       if item.recover_sp_rate > item.recover_sp
         sp_string = "SP Recovery% :"
         sp_stat = item.recover_sp_rate
       else
         sp_string = "SP Recovery Points:"
         sp_stat = item.recover_sp
       end
       @strings = [hp_string, sp_string, "Phy. Def:" , "Mag Def:", "Accuracy:", "Variance:"]
       @stats = [hp_stat, sp_stat, item. pdef_f, item.mdef_f, item.hit, item.variance,
                      $game_party.item_number(@result)]
       @bitmap = RPG::Cache.icon(item.icon_name)
     when 1
       item = $data_armors[@result]
       @strings = ["Phy. Def:", "Mag. Def:", "Evasion plus:", "Strength plus:", "Dex. plus:",
                      "Agility plus:", "Int. plus:"]
       @stats = [item.pdef, item.mdef, item.eva, item.str_plus, item.dex_plus,
                   item.agi_plus, item.int_plus, $game_party.armor_number(@result) ]
       @bitmap = RPG::Cache.icon(item.icon_name)
     when 2
       item = $data_weapons[@result]
       @strings =["Attack Power:", "Phy. Def:", "Mag. Def:", "Strength plus:", "Dex. plus:",
                   "Agility plus:", "Int. plus:"]
       @stats = [item.atk, item.pdef, item.mdef, item.str_plus, item.dex_plus,
                   item.agi_plus, item.int_plus, $game_party.weapon_number(@result) ]
       @bitmap = RPG::Cache.icon(item.icon_name)
   end
   for i in 0...@strings.size
     x = i%2 * 184
     y = i /2 *28 +32
     self.contents.font.color = normal_color
     self.contents.draw_text(x,y,100, 28,@strings[i])
     self.contents.font.color = system_color
     self.contents.draw_text(x + 110, y, 45, 28, @stats[i].to_s)
   end
   self.contents.blt(0, 0, @bitmap, Rect.new(0, 0, 24, 24), 255)
   self.contents.font.color= normal_color
   self.contents.draw_text(40, 0, 300, 28, "Quantity curentley owned:")
   self.contents.font.color = system_color
   count = @stats[@stats.size - 1].to_s
   self.contents.draw_text(294, 0, 45, 28, count )
 end
   
#----------------------------------------------------------------------
 def set_result(result , type)
   @result = result
   @type = type
   refresh
 end

end #of Window_CraftResult

#=======================================
class Window_CraftIngredients < Window_Base

 #--------------------------------------------------------------------------
 def initialize
   super(240, 248, 400, 232)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
   self.contents.font.size = 15
   @ingredients = []
   @types = []
   @quantities = []
   @item = nil
   @count = 0
 end

 #--------------------------------------------------------------------------
 def refresh
   self.contents.clear
   for i in 0...@ingredients.size
     case @types[i]
     when 0
       @item = $data_items[@ingredients[i]]
       @count = $game_party.item_number(@ingredients[i])
     when 1
       @item = $data_armors[@ingredients[i]]
       @count = $game_party.armor_number(@ingredients[i])
     when 2
       @item = $data_weapons[@ingredients[i]]
       @count = $game_party.weapon_number(@ingredients[i])
     end
     y = i *26
     self.contents.blt(0, y, RPG::Cache.icon(@item.icon_name), Rect.new(0, 0, 24, 24), 255)
     self.contents.font.color = @count >= @quantities[i] ? normal_color : disabled_color
     self.contents.draw_text(30, y, 280, 28, @item.name)
     self.contents.draw_text(300, y, 45, 28, @quantities[i].to_s)
     self.contents.font.color = system_color
     self.contents.draw_text(245, y, 45, 28, @count.to_s )    
   end
 end
     
 #--------------------------------------------------------------------------
 def set_ingredients(ingredients , types, quantities)
   @ingredients = ingredients
   @types = types
   @quantities = quantities
   refresh
 end

end # of Window_CraftIngredients

#======================================
class Scene_Craft

 #--------------------------------------------------------------------------
 def initialize(craft_index=0, return_scene = "menu")
   @craft_index=craft_index
   @return_scene = return_scene
 end
 
 #--------------------------------------------------------------------------
 def main
   @craft_window = Window_Craft.new
   @craft_window.index=@craft_index
   @confirm_window = Window_Base.new(120, 188, 400, 64)
   @confirm_window.contents = Bitmap.new(368, 32)
   @confirm_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
   @confirm_window.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize
   @help_window = Window_Help.new
   @craft_window.help_window = @help_window
   @result_window=Window_CraftResult.new
   @ingredients_window=Window_CraftIngredients.new
   @yes_no_window = Window_Command.new(100, ["Yes", "No"])
   @confirm_window.visible = false
   @confirm_window.z = 1500
   @yes_no_window.visible = false
   @yes_no_window.active = false
   @yes_no_window.index = 1
   @yes_no_window.x = 270
   @yes_no_window.y = 252
   @yes_no_window.z = 1500
   @label_window = Window_Base.new(450,200,190,52)
   @label_window.contents=Bitmap.new(@label_window.width - 32,@label_window.height - 32)
   @label_window.contents.font.size=15
   @label_window.contents.font.color = @label_window.normal_color
   @label_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
   @label_window.contents.draw_text(0, 0, @label_window.contents.width, 20, "   Have    Need")
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     if $scene != self
       break
     end
   end
   Graphics.freeze
   @help_window.dispose
   @craft_window.dispose
   @result_window.dispose
   @ingredients_window.dispose
   @confirm_window.dispose
   @yes_no_window.dispose
   @label_window.dispose
 end

 #--------------------------------------------------------------------------
 def update
   @craft_window.update
   @ingredients_window.update
   if $game_party.recipes.size > 0
     @result_window.set_result(@craft_window.recipe.result, @craft_window.recipe.result_type)
     @ingredients_window.set_ingredients(@craft_window.recipe.ingredients,
                                                          @craft_window.recipe.ingredient_types,
                                                          @craft_window.recipe.quantities)
   end
   if @craft_window.active
     update_craft
     return
   end
   if @yes_no_window.active
     confirm_update
     return
   end
 end

 #--------------------------------------------------------------------------
 def update_craft
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     if @return_scene == "menu"
       $scene = Scene_Menu.new(0)
     else
       $scene = Scene_Map.new
     end
     return
   end
   if Input.trigger?(Input::C) and $game_party.recipes.size != 0
     @recipe = @craft_window.recipe
     if @recipe.have
       @yes_no_window.active = true
       @craft_window.active = false
     else
       $game_system.se_play($data_system.buzzer_se)
       return
     end
   end
 end

 #--------------------------------------------------------------------------
 def confirm_update
   @craft_index = @craft_window.index
   @confirm_window.visible = true
   @confirm_window.z = 1500
   @yes_no_window.visible = true
   @yes_no_window.active = true
   @yes_no_window.z = 1500
   @yes_no_window.update
   string = "Create " + @recipe.name + "?"
   cw = @confirm_window.contents.text_size(string).width
   center = @confirm_window.contents.width/2 - cw /2
   unless @drawn
     @confirm_window.contents.draw_text(center, 0, cw, 30, string)
     @drawn = true
   end
   if Input.trigger?(Input::C)
     if @yes_no_window.index == 0
       $game_system.se_play($data_system.decision_se)
       @recipe.make
       $game_system.se_play($data_system.save_se)
       $scene=Scene_Craft.new(@craft_index)
     else
       $game_system.se_play($data_system.cancel_se)
       $scene=Scene_Craft.new(@craft_index)
     end
   end
   if Input.trigger?(Input::B)
     $game_system.se_play($data_system.cancel_se)
     $scene=Scene_Craft.new(@craft_index)
   end
 end

end # of Scene_Craft

Code:
#================================
# Sample master list for crafting script
#----------------------------------------------------------------
#-written by Deke
#----------------------------------------------------------------
#================================


#result type: 0=item, 1=armor, 2=weapon

class Game_Temp
  attr_reader :recipe_list
 
  alias crafting_temp_initialize initialize

  def initialize
    crafting_temp_initialize
    @recipe_list=[]
    get_recipe_list
  end
 
  def get_recipe_list
    
    
    #Molotov Cocktail
    ingredients = [204,211]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 218  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Dynamite
    ingredients = [201,202]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 219  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Mega Bomb
    ingredients = [201,203,204,202]
    ingredient_types = [0,0,0,0] 
    quantities = [1,1,1,1]
    result = 220  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Firestorm
    ingredients = [203,204,211]
    ingredient_types = [0,0,0] 
    quantities = [1,1,1]
    result = 221  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Snow Flurry
    ingredients = [205,206]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 222  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Greased Lightning
    ingredients = [208,207,211]
    ingredient_types = [0,0,0] 
    quantities = [1,1,1]
    result = 223  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Poison Vial
    ingredients = [209,211]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 224  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Tetra Ball
    ingredients = [320, 321, 322, 202]
    ingredient_types = [0,0,0,0] 
    quantities = [1,1,1,1]
    result = 217  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Energy Drink 
    ingredients = [76,211]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 78  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Bolt Ball
    ingredients = [208,202]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 215  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Fire Ball
    ingredients = [204,202]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 214  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Ice Ball
    ingredients = [205,202]
    ingredient_types = [0,0] 
    quantities = [1,1]
    result = 216  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    #Hero Drink
    ingredients = [76,71,72,74,73,75,211]
    ingredient_types = [0,0,0,0,0,0,0] 
    quantities = [1,1,1,1,1,1,1]
    result = 77  #Final Objects ID
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
    
    
  end # of get_recipe_list method
end # of updates to Game_Temp Class


Basically from what I saw I should put:

$game_party.learn_recipe([219,1])

where 219=the item to be created's ID number (in this case, Dynamite), and 1.. I'm assuming is the quantity, not sure about that one.

I do that script, then call this script to access the mixing menu:

$scene=Scene_Craft.new

and when I go into the menu it's just all blank, no recipe learned whatsoever...
 
i dunno why but this does not display anything, it's a blank page and it says done with errors. Is there anyway you can cut and paste any instructions on that site, cause I can't see it.

EDIT: Actually it started to load finally, took a few actual minutes to begin loading.. very weird. Anyway, I figured out what I was doing wrong and it's working well now, except now when I go over a certain item in the Crafting Menu, the item is 'Tetra Ball', it gives this error:

Script 'Crafting' line 367: NoMethodError occurred.
undefined method 'icon_name' for nil:NilClass

This is the line of the error, 367:

self.contents.blt(0, y, RPG::Cache.icon(@item.icon_name), Rect.new(0, 0, 24, 24), 255)

All the other's seem to work fine except for that one. What does it mean?
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top