Save-Point
Blacksmith Script Edit - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Games Development (https://www.save-point.org/forum-4.html)
+--- Forum: Code Support (https://www.save-point.org/forum-20.html)
+--- Thread: Blacksmith Script Edit (/thread-131.html)



Blacksmith Script Edit - Ace - 06-18-2010

Hi^^
I found a Blacksmith Script by ForeverZer0.
It takes items to forge new weapons or armor.
You can also extract weapons and get a few items.

I want it to work a little bit different:
Instead of forging with items it should forge new weapons with old ones (like Final Fantasy 9) and new armor with old armor and accessoires.

Here is the script
http://forum.chaos-project.com/index.php/topic,6171.0.html

Could someone help me? I think it should not take too much to edit, but I'm not sure Confused


Blacksmith Script Edit - mageone - 06-18-2010

hi Zarox

try this, maybe you like it :


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 = 20
   @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 = ["PDF:", "MDF:", "EVA:", "FOR:", "DEX :", "VIT :", "ESP :"]
       @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 =["ATK :", "PDF:", "MDF:", "FOR :", "DEX :",
                   "VIT :", "ESP :"]

       @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, "Stats :")
   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 = 20
   @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, ["Oui", "Non"])
   @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=20
   @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, "   En possession    Nécéssaire")
   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)
     @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 = "Craft Weapon  " + @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

ingredients = [30,31,32]
types = [0,0,0]
quantities = [1,1,1]
sword=Game_Recipe.new(ingredients, types, quantities,4,2)

end # of Scene_Craft

This script allows weapons creation by crafting system.

Events : this is working via script call.Edit the script and call the recipies.

How it works :

Make a new scrip above main and call it Crafting System or no matter what.

1.INGREDIENTS
A :
Item to be used to make the desired item.
This is just corresponding to the index of items in the data base.
For example, the Item with ID no. 30 is the Lithograph, ID of Card and Fruit are 31 and 32
If we want to make a recipe using those 3 items to make one, this is gona be written like that :
[30,31,32]

B :
When you want the recipes to not be made only with items but with armors or weapons too,
Specify the type of item with a number :

-Items = 0
-Armors = 1
-Weapons = 2

In this case the items recepe will be written like that [0,0,0]

C :
When you know the ID and type of items required, then let’s specify the required quantity of each item.
If we want an item of same type, then the spelling is like that : [1,1,1]

2. THE RESULT
A:
As for ingredients you have to specify the type of the item that will be created, and its ID.
For example, if you wana make a Mithril Sword, its ID will be 4 in the Data Base.

B:
Like before with ingredients, specify the item type (0 for items,
1 for armors and 2 for weapons)

So, if you need 1 Lithograph + 1 Card + 1 Fruit to make a Mithril Sword, use this code :

ingredients = [30,31,32]
types = [0,0,0]
quantities = [1,1,1]
sword=Game_Recipe.new(ingredients, types, quantities,4,2)


Now that your new recipie has been created, the party has to learn it, so use this code :

$game_party.learn_recipe(sword)



Finally to launch the Blacksmith screen use this code :

$scene=Scene_Craft.new



2.RECIPIES
When you want your party to learn other recipies you’ve created use this kind of codes :

Code:

$game_party.learn_recipe([4,2])
$game_party.learn_recipe([8,1])
$game_party.learn_recipe([4,0])


The first one will make your party learn the receipie to create a Mithril Sword (4 is the ID of the Mithril Sword and 2 means Weapon)
The second one is for the 8th armor
The third one will be for the 4th item.


Blacksmith Script Edit - Ace - 06-18-2010

Hi,
ty for your reply but when I paste the code in and call the recipe and after that the blacksmith, there is an error:
Script Scene Craft line 63: Nomethod error occured
undefinded method recipe list for #<game_temp:0x937f888>

also I don't understand how to set up different ingredients^^


Blacksmith Script Edit - mageone - 06-18-2010

Zarox look at this demo i ve made for you

http://rapidshare.com/files/400406498/Crafting.rar.html


as you can see, i edit the recipies via script call.

i ve found out about your bug. you need to add font and size info in the script Main (as it s done in the demo Mian script).
i hope you like it :)


======================================================
EDIT
======================================================

btw, i ve forgot to say :

i ve put a switch condition in the blacksmith so that the scene craft will be launched only if a recipi is known.
this is because if you open crafting window while the party hasn't learnt any recipi, the game will crash


Blacksmith Script Edit - Ace - 06-18-2010

ah now it works, ty. And also ty for the demo, now I get it^^
I like the other script more because you can make weapons cost gold. Also I like the layout (you see which char can equip the weapon and which stat raises) and the extract feature very much. So ty you so much, it's a cool script but a modified version of the one I postet would be better. if no one can edit the script I will take this one^^

EDIT: Ok I decided to take this script. Maybe someone could add some prices for weapons and armors, then it would be awesome^^