Project1

标题: 请帮忙改改这个物品合成脚本 [打印本页]

作者: 惊鸿一梦    时间: 2015-9-1 17:40
标题: 请帮忙改改这个物品合成脚本
就是这个脚本在合成东西的时候一次只能合成一个,但本人不是很懂脚本。希望各位会的大神们能帮帮忙把它改成一次可以合成多个物品的脚本。(就是在合成前问你合成数量的那种)


以下是脚本
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================  

# Sample master list for crafting script
# written by Deke
#============================================================================================
# 简介:
# 这是一个很不错的合成物品系统,可以通过游戏的过程,不断学习可以合成的
# 物品方法。
#
# 使用方法:
# 1、召唤界面:使用脚本$scene = Scene_Craft.new
#
# 2、学习合成:$game_party.learn_recipe(合成项目)
#
# 3、合成定义:
# 这个合成脚本可以定义两种合成物品。一种是预先定义好了的,就像下面这样,
# 直接写在这里就可以,另一种是在学习之前现场定义。
#
# 4、举例
#  4.1、学会recipe_list[1]定义的合成:$game_party.learn_recipe($game_temp.recipe_list[1])
#       注意,一行如果输入不下,在(的后面或[的后面按回车换行,否则可能出错
#
#  4.2、在游戏中临时定义一种合成,让玩家学会。使用事件中的脚本如下,   
#  脚本:
#    材料 = [$game_variables[1],$game_variables[2]]  #——材料编号是变量1、2的编号
#    材料种类 = [0,0]                                #——材料是物品
#    材料数量 = [$game_variables[3],$game_variables[4]]  #——需要材料数量是变量3、4的编号
#    成品 = $game_variables[5]                       #——获得结果编号是5
#    成品种类 = 1                                    #——成品是防具类
#    $game_party.learn_recipe(Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类))
#===========================================================================================
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   
##########################################################################
    # 1 号合成物品设定
    ##########################################################################
    材料 = [265, 272, 293]             # 需要材料的数据库编号
    材料种类 = [0, 0]         # 需要材料的种类,0是普通物品,1是防具,2是武器
    材料数量 = [2, 1, 2]         # 需要材料的数量
    成品 = 180                  # 获得物品编号
    成品种类 = 0              # 获得物品种类,0是普通物品,1是防具,2是武器
    合成成功率 = 95           #合成成功率,百分比。
    @recipe_list[1] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类,合成成功率)
   
    ##########################################################################
  ##########################################################################
    # 2 号合成物品设定
    ##########################################################################
    材料 = [293, 298]          # 需要材料的数据库编号
    材料种类 = [0, 0]      # 需要材料的种类,0是普通物品,1是防具,2是武器
    材料数量 = [3, 3]      # 需要材料的数量
    成品 = 181                  # 获得物品编号
    成品种类 = 0              # 获得物品种类,0是普通物品,1是防具,2是武器
    合成成功率 = 90           #合成成功率,百分比。
    @recipe_list[2] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类,合成成功率)
   
    ##########################################################################
    # 3 号合成物品设定
    ##########################################################################
    材料 = [272, 287, 294, 295, 296]            # 需要材料的数据库编号
    材料种类 = [0, 0, 0, 0, 0]         # 需要材料的种类,0是普通物品,1是防具,2是武器
    材料数量 = [1, 1, 1, 1, 1]         # 需要材料的数量
    成品 = 182                  # 获得物品编号
    成品种类 = 0              # 获得物品种类,0是普通物品,1是防具,2是武器
    合成成功率 = 85           #合成成功率,百分比。
    @recipe_list[3] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类,合成成功率)
   
    # 4 号合成物品设定
    ##########################################################################
    材料 = [272, 287, 294, 295, 296]            # 需要材料的数据库编号
    材料种类 = [0, 0, 0, 0,0]         # 需要材料的种类,0是普通物品,1是防具,2是武器
    材料数量 = [1, 1, 1, 1, 1]         # 需要材料的数量
    成品 = 183                  # 获得物品编号
    成品种类 = 0              # 获得物品种类,0是普通物品,1是防具,2是武器
    合成成功率 = 80           #合成成功率,百分比。
    @recipe_list[4] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类,合成成功率)
   
  end # of get_recipe_list method
end # of updates to Game_Temp Class

#================================
# 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 [email protected]
        if recipe == @recipes
          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.result and item[1] ==$game_temp.recipe_list.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
  attr_reader :success_rate
#----------------------------------------------------------------------
  def initialize( ingredients, ingredient_types, quantities, result, result_type,success_rate)
    @ingredients = ingredients
    @ingredient_types = ingredient_types
    @quantities = quantities
    @result = result
    @result_type = result_type
    @success_rate = success_rate
  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 [email protected]
      case @ingredient_types
        when 0
          if $game_party.item_number(@ingredients) < @quantities
            have_all=false
          end
        when 1
          if $game_party.armor_number(@ingredients) < @quantities
            have_all=false
          end
        when 2
          if $game_party.weapon_number(@ingredients) < @quantities
            have_all=false
          end
      end
    end
    return have_all
  end

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

#----------------------------------------------------------------------
  def make
    if have
      @fortune = rand(100)       #☆新增脚本☆
      if @fortune <= @success_rate then     #☆新增脚本☆
        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
      else                       #☆新增脚本☆
        p "合成失败"             #☆新增脚本☆
      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)
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      self.contents.font.name = "黑体" # = "黑体"
      self.contents.font.size = 18 # = 18
      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 = 18 # = 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回复率:"
          hp_stat = item.recover_hp_rate
        else
          hp_string = "HP回复量:"
          hp_stat = item.recover_hp
        end
        if item.recover_sp_rate > item.recover_sp
          sp_string = "SP回复率:"
          sp_stat = item.recover_sp_rate
        else
          sp_string = "SP回复量:"
          sp_stat = item.recover_sp
        end
        @strings = [hp_string, sp_string, "物理防御:" , "魔法防御:", "命中率:", "分散度:"]
        @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 = ["物理防御:", "魔法防御:", "回避修正:", "力量增加:", "灵巧增加:",
                       "速度增加:", "魔力增加:"]
        @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 =["攻击力:", "物理防御:", "魔法防御:", "力量增加:", "灵巧增加:",
                    "速度增加:", "魔力增加:"]
        @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 [email protected]
      x = i%2 * 184
      y = i /2 *28 +32
      self.contents.font.color = normal_color
      self.contents.draw_text(x,y,100, 28,@strings)
      self.contents.font.color = system_color
      self.contents.draw_text(x + 110, y, 45, 28, @stats.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, "待合成物品的现有数量:")
    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 = 18 # = 20
    @ingredients = []
    @types = []
    @quantities = []
    @item = nil
    @count = 0
  end

  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in [email protected]
      case @types
      when 0
        @item = $data_items[@ingredients]
        @count = $game_party.item_number(@ingredients)
      when 1
        @item = $data_armors[@ingredients]
        @count = $game_party.armor_number(@ingredients)
      when 2
        @item = $data_weapons[@ingredients]
        @count = $game_party.weapon_number(@ingredients)
      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 ? normal_color : disabled_color
      self.contents.draw_text(30, y, 280, 28, @item.name)
      self.contents.draw_text(300, y, 45, 28, @quantities.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)
    @craft_index=craft_index
  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 = "黑体"
    @confirm_window.contents.font.size = 20
    @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, ["确定", "放弃"])
    @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 = "黑体"
    @label_window.contents.draw_text(0, 0, @label_window.contents.width, 20, "  现有   需要")
    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)
      $scene = Scene_Menu.new
      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 = "合成 " + @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)
      p "NOPE"
      $game_system.se_play($data_system.cancel_se)
      $scene=Scene_Craft.new(@craft_index)
    end
  end
end
# of Scene_Craft

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

作者: 惊鸿一梦    时间: 2015-9-2 19:30
诚心求助啊,真的没人会吗?
作者: 亡灵史莱姆    时间: 2015-9-3 13:09
  1. #=============================================================================
  2. # 物品合成简易优化版 Ver 1.0
  3. #-----------------------------------------------------------------------------
  4. # By : RyanBern
  5. #-----------------------------------------------------------------------------
  6. # 功能介绍:
  7. #     这是一个简单的物品合成系统,和论坛上原有的有所不同。在这个系统里面你可以
  8. #     通过学习配方来获取某种道具的合成方法,也可以直接合成。有关数据存储我已经
  9. #     改成了外部文件的形式,下面就说明一下如何使用。
  10. #-----------------------------------------------------------------------------
  11. # 使用方法:
  12. #     1.有关数据编辑,在游戏根目录里面建立一个名为 Recipes.txt 的记事本,然后
  13. #       再里面写下所有配方的内容,下面是一个例子表明如何书写一组完整的数据。
  14. #       <recipe=1>
  15. #         <product>kind=0,id=3</product>
  16. #         <ingredients>
  17. #           kind=0,id=1,number=2
  18. #           kind=0,id=2,number=2
  19. #         </ingredients>
  20. #       </recipe>
  21. #       其中,第一行recipe=1表示这是ID为1的配方的数据,这里ID是从1开始的。
  22. #       第二行是表示最终合成的物品,kind表示分类,道具为0,武器为1,防具为2;id
  23. #       就是对应的ID
  24. #       第三行是原料的设定,所有的材料都必须在<ingredients></ingredients>之间
  25. #       每一行代表一种原料的分类,id,和数量,注意不要写重复了。
  26. #       如果想再增加一条配方,则令起一行开一个<recipe>结点即可。
  27. #     2.有关学习配方:
  28. #       $game_party.recipe_learn?(配方ID) 用于判断是否习得某一配方
  29. #       $game_party.learn_recipe(配方ID) 学习该ID的配方
  30. #       $game_party.forget_recipe(配方ID) 失去该ID的配方
  31. #     3.有关场景调用:
  32. #       $scene = Scene_Craft.new 直接打开合成场景,配方为主角已有的配方
  33. #       $scene = Scene_Craft.new(0/1/2) 打开合成场景,配方为产品分类为i的配方(无论主角是否习得)
  34. #       $scene = Scene_Craft.new(3) 打开合成场景,配方为所有的配方
  35. #-----------------------------------------------------------------------------
  36. # 注意事项:
  37. #     1.Recipes.txt里面的缩进不是必须的。
  38. #     2.游戏发布时,可以删去Recipes.txt,不过建议在你的制作工程中保留一个副本
  39. #       以便日后做出更改。
  40. #-----------------------------------------------------------------------------
  41. # 更新记录:
  42. #=============================================================================
  43. module RB
  44.   Regex_Recipe = /<recipe\s*=\s*(\d+)>(.*?)<\/recipe>/m
  45.   Regex_Product = /<product>\s*kind\s*=\s*(\d)\s*,\s*id\s*=\s*(\d+)\s*<\/product>/m
  46.   Regex_Ingredient = /<ingredients>(.*?)<\/ingredients>/m
  47.   Regex_Ingredient_Info = /kind\s*=\s*(\d)\s*,\s*id\s*=\s*(\d+)\s*,\s*number\s*=\s*(\d+)/
  48. end
  49. module RPG
  50.   class Recipe
  51.     attr_accessor :id
  52.     attr_accessor :product
  53.     attr_accessor :ingredients
  54.     def initialize
  55.       @id = 0
  56.       @product = Ingredient.new
  57.       @ingredients = []
  58.     end
  59.     class Ingredient
  60.       attr_accessor :kind
  61.       attr_accessor :id
  62.       attr_accessor :number
  63.       def initialize(kind = 0, id = 0, number = 0)
  64.         @kind = kind
  65.         @id = id
  66.         @number = number
  67.       end
  68.     end
  69.   end
  70.   def self.extract_recipe
  71.     filename = "Recipes.txt"
  72.     outfile_name = "Data/Recipes.rxdata"
  73.     data = []
  74.     begin
  75.       file = File.open(filename, "r")
  76.       str = file.read
  77.       file.close
  78.       while str.slice!(RB::Regex_Recipe)
  79.         id = $1.to_i
  80.         contents = $2
  81.         recipe = Recipe.new
  82.         recipe.id = id
  83.         if RB::Regex_Product =~ contents
  84.           recipe.product.kind = $1.to_i
  85.           recipe.product.id = $2.to_i
  86.         end
  87.         if RB::Regex_Ingredient =~ contents
  88.           ingredient_contents = $1
  89.           ingredient_contents.scan(RB::Regex_Ingredient_Info) do |a|
  90.             recipe.ingredients << Recipe::Ingredient.new(a[0].to_i, a[1].to_i, a[2].to_i)
  91.           end
  92.         end
  93.         data[id] = recipe
  94.       end
  95.       outfile = File.open(outfile_name, "wb")
  96.       Marshal.dump(data, outfile)
  97.       outfile.close
  98.     rescue
  99.       p 1
  100.     end
  101.   end
  102. end

  103. class Game_Party
  104.   alias rb_initialize_20141226 initialize
  105.   def initialize
  106.     rb_initialize_20141226
  107.     @recipes = {}
  108.   end
  109.   def recipe_learn?(recipe_id)
  110.     @recipes ||= {}
  111.     return @recipes[recipe_id]
  112.   end
  113.   def learn_recipe(recipe_id)
  114.     @recipes ||= {}
  115.     @recipes[recipe_id] = true
  116.   end
  117.   def forget_recipe(recipe_id)
  118.     @recipes ||= {}
  119.     @recipes[recipe_id] = nil
  120.   end
  121.   def product_max_num(recipe_id)
  122.     max = -1
  123.     recipe = $data_recipes[recipe_id]
  124.     return 0 if recipe.nil?
  125.     recipe.ingredients.each do |ingredient|
  126.       num_need = ingredient.number
  127.       case ingredient.kind
  128.       when 0
  129.         num_current = item_number(ingredient.id)
  130.       when 1
  131.         num_current = weapon_number(ingredient.id)
  132.       when 2
  133.         num_current = armor_number(ingredient.id)
  134.       else
  135.         num_current = 0
  136.       end
  137.       max = num_current / num_need if max == -1 || num_current / num_need < max
  138.     end
  139.     return max == -1 ? 0 : max
  140.   end
  141. end

  142. class Window_Product < Window_Selectable
  143.   def initialize(mode = -1)
  144.     super(0, 64, 240, 480 - 64)
  145.     self.index = 0
  146.     @mode = mode
  147.     refresh
  148.   end
  149.   def recipe
  150.     return @data[self.index]
  151.   end
  152.   def item
  153.     recipe = self.recipe
  154.     return nil if recipe.nil?
  155.     product = recipe.product
  156.     case product.kind
  157.     when 0
  158.       item = $data_items[product.id]
  159.     when 1
  160.       item = $data_weapons[product.id]
  161.     when 2
  162.       item = $data_armors[product.id]
  163.     else
  164.       item = nil
  165.     end
  166.     return item
  167.   end
  168.   def refresh
  169.     if self.contents != nil
  170.       self.contents.dispose
  171.       self.contents = nil
  172.     end
  173.     @data = []
  174.     (1...$data_recipes.size).each do |i|
  175.       if @mode == -1 && $game_party.recipe_learn?(i) || $data_recipes[i].product.kind == @mode || @mode == 3
  176.         @data << $data_recipes[i] if $data_recipes[i] != nil
  177.       end
  178.     end
  179.     @item_max = @data.size
  180.     if @item_max > 0
  181.       self.contents = Bitmap.new(width - 32, @item_max * 32)
  182.       @data.each_index{|i| draw_item(i)}
  183.     else
  184.       self.contents = Bitmap.new(width - 32, 32)
  185.       self.contents.draw_text(4, 0, 192, 32, "没有可用配方")
  186.     end
  187.   end
  188.   def draw_item(index)
  189.     x = 4
  190.     y = 32 * index
  191.     product = @data[index].product
  192.     case product.kind
  193.     when 0
  194.       item = $data_items[product.id]
  195.     when 1
  196.       item = $data_weapons[product.id]
  197.     when 2
  198.       item = $data_armors[product.id]
  199.     else
  200.       item = nil
  201.     end
  202.     if item == nil
  203.       return
  204.     end
  205.     disabled = $game_party.product_max_num(@data[index].id) == 0
  206.     bitmap = RPG::Cache.icon(item.icon_name)
  207.     opacity = disabled ? 128 : 255
  208.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  209.     self.contents.font.color = disabled ? disabled_color : normal_color
  210.     self.contents.draw_text(x + 28, y, 176, 32, item.name)
  211.   end
  212.   def update_help
  213.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  214.   end
  215. end

  216. class Window_Ingredients < Window_Base
  217.   def initialize
  218.     super(240, 288, 400, 192)
  219.     @waiting = 0
  220.     @dy = 1
  221.     [url=home.php?mod=space&uid=2564094]@recipe[/url] = nil
  222.     refresh
  223.   end
  224.   def recipe=(recipe)
  225.     if @recipe != recipe
  226.       @recipe = recipe
  227.       @waiting = 40
  228.       @dy = 1
  229.       self.oy = 0
  230.       refresh
  231.     end
  232.   end
  233.   def refresh
  234.     if self.contents != nil
  235.       self.contents.dispose
  236.       self.contents = nil
  237.     end
  238.     if @recipe == nil
  239.       return
  240.     end
  241.     h = 32 * @recipe.ingredients.size
  242.     if h > 0
  243.       self.contents = Bitmap.new(width - 32, h)
  244.       @recipe.ingredients.each_with_index do |ingredient, index|
  245.         draw_item(ingredient, index)
  246.       end
  247.     end
  248.   end
  249.   def draw_item(ingredient, index)
  250.     x = 4
  251.     y = index * 32
  252.     case ingredient.kind
  253.     when 0
  254.       item = $data_items[ingredient.id]
  255.       num = $game_party.item_number(ingredient.id)
  256.     when 1
  257.       item = $data_weapons[ingredient.id]
  258.       num = $game_party.weapon_number(ingredient.id)
  259.     when 2
  260.       item = $data_armors[ingredient.id]
  261.       num = $game_party.armor_number(ingredient.id)
  262.     else
  263.       item = nil
  264.     end
  265.     if item == nil
  266.       return
  267.     end
  268.     bitmap = RPG::Cache.icon(item.icon_name)
  269.     disabled = num < ingredient.number
  270.     opacity = disabled ? 128 : 255
  271.     self.contents.blt(x, y+4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  272.     self.contents.font.color = disabled ? disabled_color : normal_color
  273.     self.contents.draw_text(x + 28, y, 192, 32, item.name)
  274.     self.contents.draw_text(x + 220, y, 64, 32, num.to_s, 2)
  275.     self.contents.font.color = normal_color
  276.     self.contents.draw_text(x + 264, y, 64, 32, ingredient.number.to_s, 2)
  277.   end
  278.   def update
  279.     super
  280.     if self.contents != nil && self.contents.height > self.height - 32
  281.       if @waiting > 0
  282.         @waiting -= 1
  283.         return
  284.       end
  285.       self.oy += @dy
  286.       if self.oy + self.height - 32 >= self.contents.height
  287.         @dy = -1
  288.         @waiting = 60
  289.       end
  290.       if self.oy <= 0
  291.         @dy = 1
  292.         @waiting = 60
  293.       end
  294.     end
  295.   end
  296. end

  297. class Window_Craft_Number < Window_Base
  298.   def initialize
  299.     super(240, 64, 400, 160)
  300.     self.contents = Bitmap.new(width - 32, height - 32)
  301.     @recipe = nil
  302.     [url=home.php?mod=space&uid=25307]@Max[/url] = 1
  303.     @number = 1
  304.     @number_current = 0
  305.   end
  306.   def recipe=(recipe)
  307.     if @recipe != recipe
  308.       @recipe = recipe
  309.       reset
  310.       refresh
  311.     end
  312.   end
  313.   def reset
  314.     if @recipe == nil
  315.       @number = 0
  316.       @number_current = 0
  317.       return
  318.     end
  319.     product = @recipe.product
  320.     case product.kind
  321.     when 0
  322.       @number_current = $game_party.item_number(product.id)
  323.     when 1
  324.       @number_current = $game_party.weapon_number(product.id)
  325.     when 2
  326.       @number_current = $game_party.armor_number(product.id)
  327.     else
  328.       @number_current = 0
  329.     end
  330.     @max = $game_party.product_max_num(@recipe.id)
  331.     @max = [@max, 99 - @number_current].min
  332.     @number = @max == 0 ? 0 : 1
  333.   end
  334.   def number
  335.     return @number
  336.   end
  337.   #--------------------------------------------------------------------------
  338.   # ● 刷新
  339.   #--------------------------------------------------------------------------
  340.   def refresh
  341.     self.contents.clear
  342.     self.contents.font.color = system_color
  343.     self.contents.draw_text(4, 0, 364, 32, "所持数")
  344.     self.contents.draw_text(4, 32, 364, 32, "最大可合成数")
  345.     self.contents.draw_text(4, 64, 364, 32, "当前合成数量")
  346.     self.contents.font.color = normal_color
  347.     self.contents.draw_text(4, 0, 364, 32, @number_current.to_s, 2)
  348.     self.contents.draw_text(4, 32, 364, 32, @max.to_s, 2)
  349.     self.contents.draw_text(252, 96, 32, 32, "×")
  350.     self.contents.draw_text(308, 96, 24, 32, @number.to_s, 2)
  351.   end
  352.   def update
  353.     super
  354.     if self.active
  355.       # 光标右 (+1)
  356.       if Input.repeat?(Input::RIGHT) and @number < @max
  357.         $game_system.se_play($data_system.cursor_se)
  358.         @number += 1
  359.         refresh
  360.       end
  361.       # 光标左 (-1)
  362.       if Input.repeat?(Input::LEFT) and @number > 1
  363.         $game_system.se_play($data_system.cursor_se)
  364.         @number -= 1
  365.         refresh
  366.       end
  367.       # 光标上 (+10)
  368.       if Input.repeat?(Input::UP) and @number < @max
  369.         $game_system.se_play($data_system.cursor_se)
  370.         @number = [@number + 10, @max].min
  371.         refresh
  372.       end
  373.       # 光标下 (-10)
  374.       if Input.repeat?(Input::DOWN) and @number > 1
  375.         $game_system.se_play($data_system.cursor_se)
  376.         @number = [@number - 10, 1].max
  377.         refresh
  378.       end
  379.     end
  380.   end
  381. end
  382. class Window_Craft_Label < Window_Base
  383.   def initialize
  384.     super(240, 224, 400, 64)
  385.     self.contents = Bitmap.new(width - 32, height - 32)
  386.     refresh
  387.   end
  388.   def refresh
  389.     self.contents.clear
  390.     self.contents.font.color = system_color
  391.     self.contents.draw_text(0, 0, width - 32, 32, "材料名称               现有  需要")
  392.   end
  393. end

  394. class Scene_Title
  395.   alias rb_main_20141226 main
  396.   def main
  397.     if $DEBUG
  398.       RPG.extract_recipe
  399.     end
  400.     $data_recipes = load_data("Data/Recipes.rxdata")
  401.     rb_main_20141226
  402.   end
  403. end

  404. class Scene_Craft
  405.   def initialize(mode = -1)
  406.     @mode = mode
  407.   end
  408.   def main
  409.     @product_window = Window_Product.new(@mode)
  410.     @help_window = Window_Help.new
  411.     @product_window.help_window = @help_window
  412.     @ingredient_window = Window_Ingredients.new
  413.     @number_window = Window_Craft_Number.new
  414.     @label_window = Window_Craft_Label.new
  415.     Graphics.transition
  416.     loop do
  417.       Graphics.update
  418.       Input.update
  419.       update
  420.       if $scene != self
  421.         break
  422.       end
  423.     end
  424.     Graphics.freeze
  425.     @product_window.dispose
  426.     @help_window.dispose
  427.     @ingredient_window.dispose
  428.     @number_window.dispose
  429.     @label_window.dispose
  430.   end
  431.   def update
  432.     @product_window.update
  433.     @ingredient_window.update
  434.     @ingredient_window.recipe = @product_window.recipe
  435.     @number_window.recipe = @product_window.recipe
  436.     if @product_window.active
  437.       update_product
  438.       return
  439.     end
  440.     if @number_window.active
  441.       update_number
  442.     end
  443.   end
  444.   def update_product
  445.     if Input.trigger?(Input::B)
  446.       $game_system.se_play($data_system.cancel_se)
  447.       $scene = Scene_Map.new
  448.       return
  449.     end
  450.     if Input.trigger?(Input::C)
  451.       recipe = @product_window.recipe
  452.       if recipe == nil || $game_party.product_max_num(recipe.id) == 0
  453.         $game_system.se_play($data_system.buzzer_se)
  454.         return
  455.       end
  456.       $game_system.se_play($data_system.decision_se)
  457.       @number_window.cursor_rect.set(304, 96, 32, 32)
  458.       @product_window.active = false
  459.       @number_window.active = true
  460.       return
  461.     end
  462.   end
  463.   def update_number
  464.     @number_window.update
  465.     if Input.trigger?(Input::B)
  466.       $game_system.se_play($data_system.cancel_se)
  467.       @number_window.active = false
  468.       @product_window.active = true
  469.       @number_window.cursor_rect.empty
  470.       return
  471.     end
  472.     if Input.trigger?(Input::C)
  473.       $game_system.se_play($data_system.shop_se)
  474.       recipe = @product_window.recipe
  475.       case recipe.product.kind
  476.       when 0
  477.         $game_party.gain_item(recipe.product.id, @number_window.number)
  478.       when 1
  479.         $game_party.gain_weapon(recipe.product.id, @number_window.number)
  480.       when 2
  481.         $game_party.gain_armor(recipe.product.id, @number_window.number)
  482.       end
  483.       recipe.ingredients.each do |ingredient|
  484.         case ingredient.kind
  485.         when 0
  486.           $game_party.lose_item(ingredient.id, ingredient.number * @number_window.number)
  487.         when 1
  488.           $game_party.lose_weapon(ingredient.id, ingredient.number * @number_window.number)
  489.         when 2
  490.           $game_party.lose_armor(ingredient.id, ingredient.number * @number_window.number)
  491.         end
  492.       end
  493.       @product_window.refresh
  494.       @ingredient_window.refresh
  495.       @number_window.reset
  496.       @number_window.refresh
  497.       @product_window.active = true
  498.       @number_window.active = false
  499.       @number_window.cursor_rect.empty
  500.       return
  501.     end
  502.   end
  503. end
复制代码
要善用搜索功能……
以及代码功能

作者: 金芒芒    时间: 2015-9-4 14:35
本帖最后由 金芒芒 于 2015-9-6 10:46 编辑

##########################################################################
    # 1 (改1-99)号合成物品设定     可以无限复制1-9999
    ##########################################################################
    材料 = [265, 272, 293]             # 需要材料的数据库编号    ###### 这里是物品在数据库添加
    材料种类 = [0, 0]         # 需要材料的种类,0是普通物品,1是防具,2是武器   ######这里是合成的种类0 代表物品
    材料数量 = [2, 1, 2]         # 需要材料的数量
    成品 = 180                  # 获得物品编号
    成品种类 = 0              # 获得物品种类,0是普通物品,1是防具,2是武器
    合成成功率 = 95           #合成成功率,百分比。
    @recipe_list[1] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类,合成成功率)

无限复制  更改[] 里的条件就可以了
   

不要太死板     

QQ截图20150906104438.png (67.42 KB, 下载次数: 14)

QQ截图20150906104438.png

作者: 金芒芒    时间: 2015-9-6 10:47
本帖最后由 金芒芒 于 2015-9-6 10:58 编辑
金芒芒 发表于 2015-9-4 14:35
##########################################################################
    # 1 (改1-99)号合成 ...


会写脚本的高才生太死板,不会以此类推,### ==注释   其实原作者写脚本就是=N的,




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1