Project1

标题: 求高手修改一下这个合成脚本 [打印本页]

作者: shua1125    时间: 2010-12-7 04:35
标题: 求高手修改一下这个合成脚本
本帖最后由 shua1125 于 2010-12-20 12:30 编辑

(近期可能因为突发事件导致不能上网,如果此帖已解决或者过期而没及时处理,望版主能帮忙修正)


我想在这个脚本上添加个成功率,成功率显示在窗口中,成功率随着合成次数而提高(无论成功失败),不同的物品有不同的初始成功率(需要自己设定)。
此外,除了合成成功率,『如果想要一次性合成多个物品怎么办?例如合成木雕需要消耗木块,但是一个木块可以制作8个木雕』
『(不消耗物品的方法恕我眼瞎看漏了……)』
『一次合成多个物品的修改想法有两个:  第一种想法是在自定义合成公式时,新增一个定义(大概意思,不要细究),使该物品合成时增减量为N(窗口里不是从1开始而是从N开始,按上下时为N的倍数)而每次合成消耗物品还是正常倍数;  第二种想法是修改原有的定义,当所需物品数量M<0时,合成后增加其-M的数量,且不算做必须材料(也不在材料框内显示)。  感觉上还是第一种方法可能简单一些……』
个人不怎么会脚本(唯一“写”过的脚本只有3个词,还是借鉴后改来的……)
希望高手能帮忙予以解决。
先在此谢谢了!
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ 物品合成 - KGC_ComposeItem ◆ VX ◆
  3. #_/    ◇ Last update : 2008/01/25 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/                     可制作合成物品。
  6. #_/                    部分翻译:八云 紫
  7. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

  8. #==============================================================================
  9. # ★ 定做項目 - Customize ★
  10. #==============================================================================

  11. module KGC
  12. module ComposeItem
  13.   # ◆ 将合成画面调用的开关号码
  14.   #  把这个开关设定为 ON 的话,可代替通常的店铺并使用合成功能。
  15.   COMPOSE_CALL_SWITCH = 10

  16.   # ◆ 合成物素材设定,通常格式:
  17.   #  ≪费用,"物品类型:ID,个数",... ≫
  18.   #  【 费用 】合成物品所需的费用
  19.   #  【 物品种类 】合成素材的种类  (I..物品  W..武器  A..防具)
  20.   #  【  ID  】合成素材的ID (↑要与以上相对应)
  21.   #  【 个数 】合成物品所需素材的数目
  22.   #  "物品种类:ID,個数" 。多个的时候也可以这样设定。
  23.   #  可省略数目。写成 "物品类型:ID" 。如果没写的话,将用默认设定个数为1。
  24.   #  如果把个数设定为0的话,持有1个以上时也可以合成,但是合成成功的话,将
  25.   #不会扣除所设定的物品。
  26.   #  按一下设定的排列,添加的顺序与物品・武器・防具的ID相对应。
  27.   RECIPE_ITEM   = []  # 物品
  28.   RECIPE_WEAPON = []  # 武器
  29.   RECIPE_ARMOR  = []  # 防具
  30.   # 从这里开始,自定义合成公式(找不到好的词)。
  31.   #  <例如>
  32.   #  物品ID为8的合成公式
  33.   #  物品ID 2, 4, 7 各消耗1个,免费合成。
  34. #~   RECIPE_ITEM[8] = [0, "I:2", "I:4", "I:7"]
  35.   #  武器ID:16 的合成公式
  36.   #  武器ID:10 消耗1个、物品ID:16 消耗 2 个,合成费用800 G。
  37. #~   RECIPE_WEAPON[16] = [800, "W:10", "I:16,2"]
  38. #~   RECIPE_WEAPON[1] = [0,"I:1,2"]

  39.   # ◆ 合成指令名
  40.   #  可替代普通商店的购买指令。
  41.   #  ※ 想要修改指令名字的话,可在下面的[Vocab]后做修改。
  42.   VOCAB_COMPOSE_ITEM = "合成"
  43.   # ◆ 合成物品的信息转换按键
  44.   #  「所需材料 <=转换=> 角色能力值変化(为装备品时)」信息变换按键。
  45.   #  不使用的时候,请设定成 nil。
  46.   SWITCH_INFO_BUTTON = Input::X

  47.   # ◆ 必要设定
  48.   #  当合成的材料为较多数时,请设定成 true。(其实就是合成素材的行距与字的大小)
  49.   COMPACT_MATERIAL_LIST = true
  50.   # ◆ 不显示命令窗口。
  51.   #  这与XP是相似的。
  52.   HIDE_COMMAND_WINDOW   = true
  53.   # ◆ 不显示所持金钱数
  54.   HIDE_GOLD_WINDOW      = false
  55.   # ◆ 当合成费用是0时, 不显示费用。
  56.   HIDE_ZERO_COST        = true

  57.   # ◆ 不表示费用与素材不足的合成列表。
  58.   #  之前合成过的物品的显名表示。
  59.   HIDE_SHORTAGE_RECIPE     = false
  60.   # ◆ 没有合成的物品隐藏物品名字, true为隐藏。
  61.   MASK_UNKNOWN_RECIPE_NAME = true
  62.   # ◆ 没有合成过的物品在列表上的表示方法
  63.   #  以下设定隐藏名,当物品名字为多个时,按以下设定扩展名字。
  64.   UNKNOWN_NAME_MASK        = "?"
  65.   # ◆ 没有合成过的物品,隐藏帮助信息。
  66.   HIDE_UNKNOWN_RECIPE_HELP = true
  67.   # ◆ 没有合成过在物品在列表上的帮助 信息。
  68.   UNKNOWN_RECIPE_HELP      = "合成列表"
  69. end
  70. end

  71. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  72. $imported = {} if $imported == nil
  73. $imported["ComposeItem"] = true

  74. module KGC::ComposeItem
  75.   # 定义正则表达式
  76.   module Regexp
  77.     # 合成列表
  78.     RECIPE = /([IWA])[ ]*:[ ]*(\d+)([ ]*,[ ]*\d+)?/i
  79.   end
  80. end

  81. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  82. #==============================================================================
  83. # ■ Vocab
  84. #==============================================================================

  85. module Vocab
  86.   # 合成画面
  87.   ComposeItem = KGC::ComposeItem::VOCAB_COMPOSE_ITEM
  88. end

  89. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  90. #==============================================================================
  91. # ■ RPG::BaseItem
  92. #==============================================================================

  93. class RPG::BaseItem
  94.   #--------------------------------------------------------------------------
  95.   # ○ 变量
  96.   #--------------------------------------------------------------------------
  97.   @@__masked_name =
  98.     KGC::ComposeItem::UNKNOWN_NAME_MASK  # 隐藏名
  99.   @@__expand_masked_name = false         # 隐藏名的扩展表示

  100.   if @@__masked_name != nil
  101.     @@__expand_masked_name = (@@__masked_name.scan(/./).size == 1)
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ○ 物品合成费用
  105.   #--------------------------------------------------------------------------
  106.   def create_compose_item_cache
  107.     @__compose_cost = 0
  108.     @__compose_materials = []

  109.     # 合成列表取得
  110.     recipe = nil
  111.     case self
  112.     when RPG::Item    # 物品
  113.       recipe = KGC::ComposeItem::RECIPE_ITEM[self.id]
  114.     when RPG::Weapon  # 武器
  115.       recipe = KGC::ComposeItem::RECIPE_WEAPON[self.id]
  116.     when RPG::Armor   # 防具
  117.       recipe = KGC::ComposeItem::RECIPE_ARMOR[self.id]
  118.     end
  119.     return if recipe == nil
  120.     recipe = recipe.dup

  121.     @__compose_cost = recipe.shift
  122.     # 合成材料名单
  123.     recipe.each { |r|
  124.       if r =~ KGC::ComposeItem::Regexp::RECIPE
  125.         material = Game_ComposeMaterial.new
  126.         material.kind = $1.upcase                    # 取得材料的种类
  127.         material.id = $2.to_i                        # 取得材料的ID
  128.         if $3 != nil
  129.           material.number = [$3[/\d+/].to_i, 0].max  # 取得必要合成个数
  130.         end
  131.         @__compose_materials << material
  132.       end
  133.     }
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ○ 隐藏名
  137.   #--------------------------------------------------------------------------
  138.   def masked_name
  139.     if KGC::ComposeItem::MASK_UNKNOWN_RECIPE_NAME
  140.       if @@__expand_masked_name
  141.         # 隐藏名的扩展表示
  142.         return @@__masked_name * self.name.scan(/./).size
  143.       else
  144.         return @@__masked_name
  145.       end
  146.     else
  147.       return self.name
  148.     end
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ○ 合成费用
  152.   #--------------------------------------------------------------------------
  153.   def compose_cost
  154.     create_compose_item_cache if @__compose_cost == nil
  155.     return @__compose_cost
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ○ 合成用材料名单
  159.   #--------------------------------------------------------------------------
  160.   def compose_materials
  161.     create_compose_item_cache if @__compose_materials == nil
  162.     return @__compose_materials
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ○ 合成列表
  166.   #--------------------------------------------------------------------------
  167.   def is_compose?
  168.     return !compose_materials.empty?
  169.   end
  170. end

  171. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  172. #==============================================================================
  173. # ■ Game_Party
  174. #==============================================================================

  175. class Game_Party < Game_Unit
  176.   #--------------------------------------------------------------------------
  177.   # ○ 合成済みフラグをクリア
  178.   #--------------------------------------------------------------------------
  179.   def clear_composed_flag
  180.     @item_composed = {}
  181.     @weapon_composed = {}
  182.     @armor_composed = {}
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ○ アイテムの合成済みフラグを設定
  186.   #     item : アイテム
  187.   #     flag : true..合成済み  false..未合成
  188.   #--------------------------------------------------------------------------
  189.   def set_item_composed(item, flag = true)
  190.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外
  191.     return false unless item.is_compose?           # 合成アイテム以外

  192.     # 合成済みフラグを格納するハッシュを作成
  193.     clear_composed_flag if @item_composed == nil

  194.     # 合成済みフラグをセット
  195.     case item
  196.     when RPG::Item    # アイテム
  197.       @item_composed[item.id] = flag
  198.     when RPG::Weapon  # 武器
  199.       @weapon_composed[item.id] = flag
  200.     when RPG::Armor   # 防具
  201.       @armor_composed[item.id] = flag
  202.     end
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ○ アイテムの合成済み判定
  206.   #     item : アイテム
  207.   #--------------------------------------------------------------------------
  208.   def item_composed?(item)
  209.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外
  210.     return false unless item.is_compose?           # 合成アイテム以外

  211.     # 合成済みフラグを格納するハッシュを作成
  212.     clear_composed_flag if @item_composed == nil

  213.     # 合成済み判定
  214.     case item
  215.     when RPG::Item    # アイテム
  216.       return @item_composed[item.id]
  217.     when RPG::Weapon  # 武器
  218.       return @weapon_composed[item.id]
  219.     when RPG::Armor   # 防具
  220.       return @armor_composed[item.id]
  221.     end
  222.     return false
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ○ アイテムの合成可能判定
  226.   #     item : アイテム
  227.   #--------------------------------------------------------------------------
  228.   def item_can_compose?(item)
  229.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外は不可
  230.     return false unless item.is_compose?           # 合成アイテム以外は不可

  231.     return false if gold < item.compose_cost       # 資金不足なら不可

  232.     item.compose_materials.each { |material|
  233.       num = item_number(material.item)
  234.       # 素材不足なら不可
  235.       return false if num < material.number || num == 0
  236.     }
  237.     return true
  238.   end
  239.   #--------------------------------------------------------------------------
  240.   # ○ アイテムの合成可能数を取得
  241.   #     item : アイテム
  242.   #--------------------------------------------------------------------------
  243.   def number_of_composable(item)
  244.     return 0 unless item.is_a?(RPG::BaseItem)  # アイテム以外
  245.     return 0 unless item.is_compose?           # 合成アイテム以外

  246.     number = ($imported["LimitBreak"] ? item.number_limit : 99)
  247.     if item.compose_cost > 0
  248.       number = [number, gold / item.compose_cost].min
  249.     end
  250.     # 素材数判定
  251.     item.compose_materials.each { |material|
  252.       next if material.number == 0  # 必要数 0 は無視
  253.       n = item_number(material.item) / material.number
  254.       number = [number, n].min
  255.     }
  256.     return number
  257.   end
  258. end

  259. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  260. #==============================================================================
  261. # □ Game_ComposeMaterial
  262. #------------------------------------------------------------------------------
  263. #   合成素材の情報を格納するクラスです。
  264. #==============================================================================

  265. class Game_ComposeMaterial
  266.   #--------------------------------------------------------------------------
  267.   # ○ 公開インスタンス変数
  268.   #--------------------------------------------------------------------------
  269.   attr_accessor :kind                     # アイテムの種類 (/[IWA]/)
  270.   attr_accessor :id                       # アイテムの ID
  271.   attr_accessor :number                   # 必要数
  272.   #--------------------------------------------------------------------------
  273.   # ○ オブジェクト初期化
  274.   #--------------------------------------------------------------------------
  275.   def initialize
  276.     @kind = "I"
  277.     @id = 0
  278.     @number = 1
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ○ アイテム取得
  282.   #--------------------------------------------------------------------------
  283.   def item
  284.     case @kind
  285.     when "I"  # アイテム
  286.       return $data_items[@id]
  287.     when "W"  # 武器
  288.       return $data_weapons[@id]
  289.     when "A"  # 防具
  290.       return $data_armors[@id]
  291.     else
  292.       return nil
  293.     end
  294.   end
  295. end

  296. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  297. #==============================================================================
  298. # ■ Window_Base
  299. #==============================================================================

  300. class Window_Base < Window
  301.   #--------------------------------------------------------------------------
  302.   # ○ 合成アイテム名の描画
  303.   #     item    : アイテム (スキル、武器、防具でも可)
  304.   #     x       : 描画先 X 座標
  305.   #     y       : 描画先 Y 座標
  306.   #     enabled : 有効フラグ。false のとき半透明で描画
  307.   #--------------------------------------------------------------------------
  308.   def draw_compose_item_name(item, x, y, enabled = true)
  309.     return if item == nil

  310.     draw_icon(item.icon_index, x, y, enabled)
  311.     self.contents.font.color = normal_color
  312.     self.contents.font.color.alpha = enabled ? 255 : 128
  313.     self.contents.draw_text(x + 24, y, 172, WLH,
  314.       $game_party.item_composed?(item) ? item.name : item.masked_name)
  315.   end
  316. end
  317.   
  318. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  319. #==============================================================================
  320. # □ Window_ComposeNumber
  321. #------------------------------------------------------------------------------
  322. #   合成画面で、合成するアイテムの個数を入力するウィンドウです。
  323. #==============================================================================

  324. class Window_ComposeNumber < Window_ShopNumber
  325.   #--------------------------------------------------------------------------
  326.   # ● リフレッシュ
  327.   #--------------------------------------------------------------------------
  328.   def refresh
  329.     y = 96
  330.     self.contents.clear
  331.     draw_compose_item_name(@item, 0, y)
  332.     self.contents.font.color = normal_color
  333.     self.contents.draw_text(212, y, 20, WLH, "×")
  334.     self.contents.draw_text(248, y, 20, WLH, @number, 2)
  335.     self.cursor_rect.set(244, y, 28, WLH)
  336.     if !KGC::ComposeItem::HIDE_ZERO_COST || @price > 0
  337.       draw_currency_value(@price * @number, 4, y + WLH * 2, 264)
  338.     end
  339.   end
  340. end

  341. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  342. #==============================================================================
  343. # □ Window_ComposeItem
  344. #------------------------------------------------------------------------------
  345. #   合成画面で、合成できる商品の一覧を表示するウィンドウです。
  346. #==============================================================================

  347. class Window_ComposeItem < Window_ShopBuy
  348.   #--------------------------------------------------------------------------
  349.   # ● リフレッシュ
  350.   #--------------------------------------------------------------------------
  351.   def refresh
  352.     @data = []
  353.     for goods_item in @shop_goods
  354.       case goods_item[0]
  355.       when 0
  356.         item = $data_items[goods_item[1]]
  357.       when 1
  358.         item = $data_weapons[goods_item[1]]
  359.       when 2
  360.         item = $data_armors[goods_item[1]]
  361.       end
  362.       # 合成アイテムのみ追加
  363.       @data.push(item) if include?(item)
  364.     end
  365.     @item_max = @data.size
  366.     create_contents
  367.     for i in 0...@item_max
  368.       draw_item(i)
  369.     end
  370.   end
  371.   #--------------------------------------------------------------------------
  372.   # ○ アイテムをリストに含めるかどうか
  373.   #     item : アイテム
  374.   #--------------------------------------------------------------------------
  375.   def include?(item)
  376.     return false if item == nil                # アイテムが nil なら含めない
  377.     return false unless item.is_compose?       # 合成アイテムでなければ含めない
  378.     if KGC::ComposeItem::HIDE_SHORTAGE_RECIPE  # 費用・素材不足を隠す場合
  379.       if !$game_party.item_composed?(item) && !enable?(item)
  380.         return false  # 未合成かつ合成不可なら含めない
  381.       end
  382.     end

  383.     return true
  384.   end
  385.   #--------------------------------------------------------------------------
  386.   # ○ アイテムを許可状態で表示するかどうか
  387.   #     item : アイテム
  388.   #--------------------------------------------------------------------------
  389.   def enable?(item)
  390.     return $game_party.item_can_compose?(item)
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 項目の描画
  394.   #     index : 項目番号
  395.   #--------------------------------------------------------------------------
  396.   def draw_item(index)
  397.     item = @data[index]
  398.     number = $game_party.item_number(item)
  399.     limit = ($imported["LimitBreak"] ? item.number_limit : 99)
  400.     rect = item_rect(index)
  401.     self.contents.clear_rect(rect)
  402.     draw_compose_item_name(item, rect.x, rect.y, enable?(item))
  403.     # 費用を描画
  404.     if !KGC::ComposeItem::HIDE_ZERO_COST || item.compose_cost > 0
  405.       rect.width -= 4
  406.       self.contents.draw_text(rect, item.compose_cost, 2)
  407.     end
  408.   end

  409.   if KGC::ComposeItem::HIDE_UNKNOWN_RECIPE_HELP
  410.   #--------------------------------------------------------------------------
  411.   # ● ヘルプテキスト更新
  412.   #--------------------------------------------------------------------------
  413.   def update_help
  414.     item = (index >= 0 ? @data[index] : nil)
  415.     if item == nil || $game_party.item_composed?(item)
  416.       # アイテムが nil か、合成済みなら [Window_ShopBuy] に任せる
  417.       super
  418.     else
  419.       @help_window.set_text(KGC::ComposeItem::UNKNOWN_RECIPE_HELP)
  420.     end
  421.   end
  422.   end
  423. end

  424. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  425. #==============================================================================
  426. # □ Window_ComposeStatus
  427. #------------------------------------------------------------------------------
  428. #  合成画面で、素材の所持数や必要数を表示するウィンドウです。
  429. #==============================================================================

  430. class Window_ComposeStatus < Window_ShopStatus
  431.   #--------------------------------------------------------------------------
  432.   # ○ 表示モード
  433.   #--------------------------------------------------------------------------
  434.   MODE_MATERIAL = 0  # 素材リスト
  435.   MODE_STATUS   = 1  # パーティのステータス
  436.   #--------------------------------------------------------------------------
  437.   # ● オブジェクト初期化
  438.   #     x : ウィンドウの X 座標
  439.   #     y : ウィンドウの Y 座標
  440.   #--------------------------------------------------------------------------
  441.   def initialize(x, y)
  442.     @mode = MODE_MATERIAL
  443.     super(x, y)
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ○ モード変更
  447.   #--------------------------------------------------------------------------
  448.   def change_mode
  449.     case @mode
  450.     when MODE_MATERIAL
  451.       @mode = MODE_STATUS
  452.     when MODE_STATUS
  453.       @mode = MODE_MATERIAL
  454.     end
  455.     self.oy = 0
  456.     refresh
  457.   end
  458.   #--------------------------------------------------------------------------
  459.   # ● ウィンドウ内容の作成
  460.   #--------------------------------------------------------------------------
  461.   def create_contents
  462.     if @mode == MODE_STATUS
  463.       super
  464.       return
  465.     end

  466.     self.contents.dispose
  467.     ch = height - 32
  468.     if @item != nil
  469.       mag = (KGC::ComposeItem::COMPACT_MATERIAL_LIST ? 1 : 2)
  470.       ch = [ch, WLH * (mag + @item.compose_materials.size * mag)].max
  471.     end
  472.     self.contents = Bitmap.new(width - 32, ch)
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● リフレッシュ
  476.   #--------------------------------------------------------------------------
  477.   def refresh
  478.     create_contents
  479.     self.contents.font.size = Font.default_size
  480.     case @mode
  481.     when MODE_MATERIAL
  482.       draw_material_list
  483.     when MODE_STATUS
  484.       super
  485.     end
  486.   end
  487.   #--------------------------------------------------------------------------
  488.   # ○ 素材リストを描画
  489.   #--------------------------------------------------------------------------
  490.   def draw_material_list
  491.     return if @item == nil
  492.     number = $game_party.item_number(@item)
  493.     self.contents.font.color = system_color
  494.     self.contents.draw_text(4, 0, 200, WLH, Vocab:ossession)
  495.     self.contents.font.color = normal_color
  496.     self.contents.draw_text(4, 0, 200, WLH, number, 2)
  497.     self.contents.font.size = 16 if KGC::ComposeItem::COMPACT_MATERIAL_LIST
  498.     mag = (KGC::ComposeItem::COMPACT_MATERIAL_LIST ? 1 : 2)
  499.     @item.compose_materials.each_with_index { |material, i|
  500.       y = WLH * (mag + i * mag)
  501.       draw_material_info(0, y, material)
  502.     }
  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ○ 素材情報を描画
  506.   #--------------------------------------------------------------------------
  507.   def draw_material_info(x, y, material)
  508.     m_item = material.item
  509.     return if m_item == nil
  510.     number = $game_party.item_number(m_item)
  511.     enabled = (number > 0 && number >= material.number)
  512.     draw_item_name(m_item, x, y, enabled)
  513.     if KGC::ComposeItem::COMPACT_MATERIAL_LIST
  514.       m_number = (material.number == 0 ? "-" : sprintf("%d", material.number))
  515.       self.contents.draw_text(x, y, width - 32, WLH,
  516.         sprintf("%s/%d", m_number, number), 2)
  517.     else
  518.       m_number = (material.number == 0 ? "-" : sprintf("%2d", material.number))
  519.       self.contents.draw_text(x, y + WLH, width - 32, WLH,
  520.         sprintf("%2s/%2d", m_number, number), 2)
  521.     end
  522.   end
  523. end

  524. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  525. #==============================================================================
  526. # ■ Scene_Map
  527. #==============================================================================

  528. class Scene_Map < Scene_Base
  529.   #--------------------------------------------------------------------------
  530.   # ● ショップ画面への切り替え
  531.   #--------------------------------------------------------------------------
  532.   alias call_shop_KGC_ComposeItem call_shop
  533.   def call_shop
  534.     # 合成画面を呼び出した場合
  535.     if $game_switches[KGC::ComposeItem::COMPOSE_CALL_SWITCH]
  536.       # 合成画面に移行
  537.       $game_temp.next_scene = nil
  538.       $game_switches[KGC::ComposeItem::COMPOSE_CALL_SWITCH] = false
  539.       $scene = Scene_ComposeItem.new
  540.     else
  541.       call_shop_KGC_ComposeItem
  542.     end
  543.   end
  544. end

  545. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  546. #==============================================================================
  547. # □ Scene_ComposeItem
  548. #------------------------------------------------------------------------------
  549. #  合成画面の処理を行うクラスです。
  550. #==============================================================================

  551. class Scene_ComposeItem < Scene_Shop
  552.   #--------------------------------------------------------------------------
  553.   # ● 開始処理
  554.   #--------------------------------------------------------------------------
  555.   def start
  556.     super
  557.     # コマンドウィンドウ非表示
  558.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW
  559.       @command_window.visible = false
  560.       @gold_window.y = Graphics.height - @gold_window.height
  561.       @gold_window.z = @status_window.z + 100
  562.       @gold_window.visible = !KGC::ComposeItem::HIDE_GOLD_WINDOW

  563.       @dummy_window.y = @command_window.y
  564.       @dummy_window.height += @command_window.height
  565.     end

  566.     # [Scene_Shop] 再利用のため、合成リストに @buy_window を使用
  567.     @buy_window.dispose
  568.     @buy_window = Window_ComposeItem.new(0, @dummy_window.y)
  569.     @buy_window.height = @dummy_window.height
  570.     @buy_window.active = false
  571.     @buy_window.visible = false
  572.     @buy_window.help_window = @help_window

  573.     # その他のウィンドウを再構成
  574.     @number_window.dispose
  575.     @number_window = Window_ComposeNumber.new(0, @buy_window.y)
  576.     @number_window.height = @buy_window.height
  577.     @number_window.create_contents
  578.     @number_window.active = false
  579.     @number_window.visible = false

  580.     @status_window.dispose
  581.     @status_window = Window_ComposeStatus.new(@buy_window.width, @buy_window.y)
  582.     @status_window.height = @buy_window.height
  583.     @status_window.create_contents
  584.     @status_window.visible = false

  585.     # コマンドウィンドウ非表示の場合、合成ウィンドウに切り替え
  586.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW
  587.       @command_window.active = false
  588.       @dummy_window.visible = false
  589.       @buy_window.active = true
  590.       @buy_window.visible = true
  591.       @buy_window.update_help
  592.       @status_window.visible = true
  593.       @status_window.item = @buy_window.item
  594.     end
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   # ● コマンドウィンドウの作成
  598.   #--------------------------------------------------------------------------
  599.   def create_command_window
  600.     s1 = Vocab::ComposeItem
  601.     s2 = Vocab::ShopSell
  602.     s3 = Vocab::ShopCancel
  603.     @command_window = Window_Command.new(384, [s1, s2, s3], 3)
  604.     @command_window.y = 56
  605.     if $game_temp.shop_purchase_only
  606.       @command_window.draw_item(1, false)
  607.     end
  608.   end
  609.   #--------------------------------------------------------------------------
  610.   # ● フレーム更新
  611.   #--------------------------------------------------------------------------
  612.   def update
  613.     super
  614.     if KGC::ComposeItem::SWITCH_INFO_BUTTON != nil &&
  615.         Input.trigger?(KGC::ComposeItem::SWITCH_INFO_BUTTON)
  616.       Sound.play_cursor
  617.       @status_window.change_mode
  618.     end
  619.   end
  620.   #--------------------------------------------------------------------------
  621.   # ● 購入アイテム選択の更新
  622.   #--------------------------------------------------------------------------
  623.   def update_buy_selection
  624.     # コマンドウィンドウ非表示で B ボタンが押された場合
  625.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW && Input.trigger?(Input::B)
  626.       Sound.play_cancel
  627.       $scene = Scene_Map.new
  628.       return
  629.     end

  630.     @status_window.item = @buy_window.item
  631.     if Input.trigger?(Input::C)
  632.       @item = @buy_window.item
  633.       # アイテムが無効なら選択不可
  634.       if @item == nil
  635.         Sound.play_buzzer
  636.         return
  637.       end

  638.       # 合成不可能 or 限界数まで所持している場合は選択不可
  639.       number = $game_party.item_number(@item)
  640.       limit = ($imported["LimitBreak"] ? @item.number_limit : 99)
  641.       if !$game_party.item_can_compose?(@item) || number == limit
  642.         Sound.play_buzzer
  643.         return
  644.       end

  645.       # 個数入力に切り替え
  646.       Sound.play_decision
  647.       max = $game_party.number_of_composable(@item)
  648.       max = [max, limit - number].min
  649.       @buy_window.active = false
  650.       @buy_window.visible = false
  651.       @number_window.set(@item, max, @item.compose_cost)
  652.       @number_window.active = true
  653.       @number_window.visible = true
  654.       return
  655.     end

  656.     super
  657.   end
  658.   #--------------------------------------------------------------------------
  659.   # ● 個数入力の決定
  660.   #--------------------------------------------------------------------------
  661.   def decide_number_input
  662.     if @command_window.index != 0  # 「合成する」以外
  663.       super
  664.       return
  665.     end

  666.     Sound.play_shop
  667.     @number_window.active = false
  668.     @number_window.visible = false
  669.     # 合成処理
  670.     operation_compose
  671.     @gold_window.refresh
  672.     @buy_window.refresh
  673.     @status_window.refresh
  674.     @buy_window.active = true
  675.     @buy_window.visible = true
  676.   end
  677.   #--------------------------------------------------------------------------
  678.   # ○ 合成の処理
  679.   #--------------------------------------------------------------------------
  680.   def operation_compose
  681.     $game_party.lose_gold(@number_window.number * @item.compose_cost)
  682.     $game_party.gain_item(@item, @number_window.number)
  683.     # 素材を減らす
  684.     @item.compose_materials.each { |material|
  685.       $game_party.lose_item(material.item,
  686.         material.number * @number_window.number)
  687.     }
  688.     # 合成済みにする
  689.     $game_party.set_item_composed(@item)
  690.   end
  691. end

复制代码
(经过提示我花了N分钟来找用来框代码的按钮……  
为什么那个按钮旁边还有一个长得一样的……  
为什么按钮图标是“A” 让我误解成它是字体修改的按钮……
为什么鼠标移到上边不给提示只给了个省略号……
囧死我了……欲哭无泪……)

作者: fux2    时间: 2010-12-7 08:14
回复 shua1125 的帖子

乃没事找事么?打造脚本不用,非要把合成脚本改成打造脚本再用。
作者: shua1125    时间: 2010-12-7 17:45
本帖最后由 shua1125 于 2010-12-8 03:09 编辑

回复 fux2 的帖子

实际上想要改成发明工坊1的基本效果,如果按那个豪华打造系统的分类的话,例如拥有高温炉后可以利用铁块和E原料合成E型钢铁,不消耗高温炉;而用高温炉和铁块和E原料还可以合成超高压炉,需要消耗高温炉。像这样的就得单独分出一类,而且类别名称还不好定……
分类我准备在事件中设定。
目前问题就是【成功率随合成次数增长】、【一个材料可以合成多个物品】这两个……
这个脚本至少自己限定的东西比较多,感觉上还是修改这个脚本比较合适……
希望高手能帮帮忙……
作者: shua1125    时间: 2010-12-9 08:43
自顶一下……
作者: 脚本大神    时间: 2010-12-10 16:58
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ 物品合成 - KGC_ComposeItem ◆ VX ◆
  3. #_/    ◇ Last update : 2008/01/25 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/                     可制作合成物品。
  6. #_/                    部分翻译:八云 紫
  7. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

  8. #==============================================================================
  9. # ★ 定做項目 - Customize ★
  10. #==============================================================================

  11. module KGC
  12. module ComposeItem
  13.   # ◆ 将合成画面调用的开关号码
  14.   #  把这个开关设定为 ON 的话,可代替通常的店铺并使用合成功能。
  15.   COMPOSE_CALL_SWITCH = 10

  16.   # ◆ 合成物素材设定,通常格式:
  17.   #  ≪费用,"物品类型:ID,个数",... ≫
  18.   #  【 费用 】合成物品所需的费用
  19.   #  【 物品种类 】合成素材的种类  (I..物品  W..武器  A..防具)
  20.   #  【  ID  】合成素材的ID (↑要与以上相对应)
  21.   #  【 个数 】合成物品所需素材的数目
  22.   #  "物品种类:ID,個数" 。多个的时候也可以这样设定。
  23.   #  可省略数目。写成 "物品类型:ID" 。如果没写的话,将用默认设定个数为1。
  24.   #  如果把个数设定为0的话,持有1个以上时也可以合成,但是合成成功的话,将
  25.   #不会扣除所设定的物品。
  26.   #  按一下设定的排列,添加的顺序与物品・武器・防具的ID相对应。
  27.   RECIPE_ITEM   = []  # 物品
  28.   RECIPE_WEAPON = []  # 武器
  29.   RECIPE_ARMOR  = []  # 防具
  30.   # 从这里开始,自定义合成公式(找不到好的词)。
  31.   #  <例如>
  32.   #  物品ID为8的合成公式
  33.   #  物品ID 2, 4, 7 各消耗1个,免费合成。
  34. #~   RECIPE_ITEM[8] = [0, "I:2", "I:4", "I:7"]
  35.   #  武器ID:16 的合成公式
  36.   #  武器ID:10 消耗1个、物品ID:16 消耗 2 个,合成费用800 G。
  37. #~   RECIPE_WEAPON[16] = [800, "W:10", "I:16,2"]
  38. #~   RECIPE_WEAPON[1] = [0,"I:1,2"]

  39.   # ◆ 合成指令名
  40.   #  可替代普通商店的购买指令。
  41.   #  ※ 想要修改指令名字的话,可在下面的[Vocab]后做修改。
  42.   VOCAB_COMPOSE_ITEM = "合成"
  43.   # ◆ 合成物品的信息转换按键
  44.   #  「所需材料 <=转换=> 角色能力值変化(为装备品时)」信息变换按键。
  45.   #  不使用的时候,请设定成 nil。
  46.   SWITCH_INFO_BUTTON = Input::X

  47.   # ◆ 必要设定
  48.   #  当合成的材料为较多数时,请设定成 true。(其实就是合成素材的行距与字的大小)
  49.   COMPACT_MATERIAL_LIST = true
  50.   # ◆ 不显示命令窗口。
  51.   #  这与XP是相似的。
  52.   HIDE_COMMAND_WINDOW   = true
  53.   # ◆ 不显示所持金钱数
  54.   HIDE_GOLD_WINDOW      = false
  55.   # ◆ 当合成费用是0时, 不显示费用。
  56.   HIDE_ZERO_COST        = true

  57.   # ◆ 不表示费用与素材不足的合成列表。
  58.   #  之前合成过的物品的显名表示。
  59.   HIDE_SHORTAGE_RECIPE     = false
  60.   # ◆ 没有合成的物品隐藏物品名字, true为隐藏。
  61.   MASK_UNKNOWN_RECIPE_NAME = true
  62.   # ◆ 没有合成过的物品在列表上的表示方法
  63.   #  以下设定隐藏名,当物品名字为多个时,按以下设定扩展名字。
  64.   UNKNOWN_NAME_MASK        = "?"
  65.   # ◆ 没有合成过的物品,隐藏帮助信息。
  66.   HIDE_UNKNOWN_RECIPE_HELP = true
  67.   # ◆ 没有合成过在物品在列表上的帮助 信息。
  68.   UNKNOWN_RECIPE_HELP      = "合成列表"
  69. end
  70. end

  71. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  72. $imported = {} if $imported == nil
  73. $imported["ComposeItem"] = true

  74. module KGC::ComposeItem
  75.   # 定义正则表达式
  76.   module Regexp
  77.     # 合成列表
  78.     RECIPE = /([IWA])[ ]*:[ ]*(\d+)([ ]*,[ ]*\d+)?/i
  79.   end
  80. end

  81. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  82. #==============================================================================
  83. # ■ Vocab
  84. #==============================================================================

  85. module Vocab
  86.   # 合成画面
  87.   ComposeItem = KGC::ComposeItem::VOCAB_COMPOSE_ITEM
  88. end

  89. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  90. #==============================================================================
  91. # ■ RPG::BaseItem
  92. #==============================================================================

  93. class RPG::BaseItem
  94.   #--------------------------------------------------------------------------
  95.   # ○ 变量
  96.   #--------------------------------------------------------------------------
  97.   @@__masked_name =
  98.     KGC::ComposeItem::UNKNOWN_NAME_MASK  # 隐藏名
  99.   @@__expand_masked_name = false         # 隐藏名的扩展表示

  100.   if @@__masked_name != nil
  101.     @@__expand_masked_name = (@@__masked_name.scan(/./).size == 1)
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ○ 物品合成费用
  105.   #--------------------------------------------------------------------------
  106.   def create_compose_item_cache
  107.     @__compose_cost = 0
  108.     @__compose_materials = []

  109.     # 合成列表取得
  110.     recipe = nil
  111.     case self
  112.     when RPG::Item    # 物品
  113.       recipe = KGC::ComposeItem::RECIPE_ITEM[self.id]
  114.     when RPG::Weapon  # 武器
  115.       recipe = KGC::ComposeItem::RECIPE_WEAPON[self.id]
  116.     when RPG::Armor   # 防具
  117.       recipe = KGC::ComposeItem::RECIPE_ARMOR[self.id]
  118.     end
  119.     return if recipe == nil
  120.     recipe = recipe.dup

  121.     @__compose_cost = recipe.shift
  122.     # 合成材料名单
  123.     recipe.each { |r|
  124.       if r =~ KGC::ComposeItem::Regexp::RECIPE
  125.         material = Game_ComposeMaterial.new
  126.         material.kind = $1.upcase                    # 取得材料的种类
  127.         material.id = $2.to_i                        # 取得材料的ID
  128.         if $3 != nil
  129.           material.number = [$3[/\d+/].to_i, 0].max  # 取得必要合成个数
  130.         end
  131.         @__compose_materials << material
  132.       end
  133.     }
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ○ 隐藏名
  137.   #--------------------------------------------------------------------------
  138.   def masked_name
  139.     if KGC::ComposeItem::MASK_UNKNOWN_RECIPE_NAME
  140.       if @@__expand_masked_name
  141.         # 隐藏名的扩展表示
  142.         return @@__masked_name * self.name.scan(/./).size
  143.       else
  144.         return @@__masked_name
  145.       end
  146.     else
  147.       return self.name
  148.     end
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ○ 合成费用
  152.   #--------------------------------------------------------------------------
  153.   def compose_cost
  154.     create_compose_item_cache if @__compose_cost == nil
  155.     return @__compose_cost
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ○ 合成用材料名单
  159.   #--------------------------------------------------------------------------
  160.   def compose_materials
  161.     create_compose_item_cache if @__compose_materials == nil
  162.     return @__compose_materials
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ○ 合成列表
  166.   #--------------------------------------------------------------------------
  167.   def is_compose?
  168.     return !compose_materials.empty?
  169.   end
  170. end

  171. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  172. #==============================================================================
  173. # ■ Game_Party
  174. #==============================================================================

  175. class Game_Party < Game_Unit
  176.   #--------------------------------------------------------------------------
  177.   # ○ 合成済みフラグをクリア
  178.   #--------------------------------------------------------------------------
  179.   def clear_composed_flag
  180.     @item_composed = {}
  181.     @weapon_composed = {}
  182.     @armor_composed = {}
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ○ アイテムの合成済みフラグを設定
  186.   #     item : アイテム
  187.   #     flag : true..合成済み  false..未合成
  188.   #--------------------------------------------------------------------------
  189.   def set_item_composed(item, flag = true)
  190.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外
  191.     return false unless item.is_compose?           # 合成アイテム以外

  192.     # 合成済みフラグを格納するハッシュを作成
  193.     clear_composed_flag if @item_composed == nil

  194.     # 合成済みフラグをセット
  195.     case item
  196.     when RPG::Item    # アイテム
  197.       @item_composed[item.id] = flag
  198.     when RPG::Weapon  # 武器
  199.       @weapon_composed[item.id] = flag
  200.     when RPG::Armor   # 防具
  201.       @armor_composed[item.id] = flag
  202.     end
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ○ アイテムの合成済み判定
  206.   #     item : アイテム
  207.   #--------------------------------------------------------------------------
  208.   def item_composed?(item)
  209.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外
  210.     return false unless item.is_compose?           # 合成アイテム以外

  211.     # 合成済みフラグを格納するハッシュを作成
  212.     clear_composed_flag if @item_composed == nil

  213.     # 合成済み判定
  214.     case item
  215.     when RPG::Item    # アイテム
  216.       return @item_composed[item.id]
  217.     when RPG::Weapon  # 武器
  218.       return @weapon_composed[item.id]
  219.     when RPG::Armor   # 防具
  220.       return @armor_composed[item.id]
  221.     end
  222.     return false
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ○ アイテムの合成可能判定
  226.   #     item : アイテム
  227.   #--------------------------------------------------------------------------
  228.   def item_can_compose?(item)
  229.     return false unless item.is_a?(RPG::BaseItem)  # アイテム以外は不可
  230.     return false unless item.is_compose?           # 合成アイテム以外は不可

  231.     return false if gold < item.compose_cost       # 資金不足なら不可

  232.     item.compose_materials.each { |material|
  233.       num = item_number(material.item)
  234.       # 素材不足なら不可
  235.       return false if num < material.number || num == 0
  236.     }
  237.     return true
  238.   end
  239.   #--------------------------------------------------------------------------
  240.   # ○ アイテムの合成可能数を取得
  241.   #     item : アイテム
  242.   #--------------------------------------------------------------------------
  243.   def number_of_composable(item)
  244.     return 0 unless item.is_a?(RPG::BaseItem)  # アイテム以外
  245.     return 0 unless item.is_compose?           # 合成アイテム以外

  246.     number = ($imported["LimitBreak"] ? item.number_limit : 99)
  247.     if item.compose_cost > 0
  248.       number = [number, gold / item.compose_cost].min
  249.     end
  250.     # 素材数判定
  251.     item.compose_materials.each { |material|
  252.       next if material.number == 0  # 必要数 0 は無視
  253.       n = item_number(material.item) / material.number
  254.       number = [number, n].min
  255.     }
  256.     return number
  257.   end
  258. end

  259. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  260. #==============================================================================
  261. # □ Game_ComposeMaterial
  262. #------------------------------------------------------------------------------
  263. #   合成素材の情報を格納するクラスです。
  264. #==============================================================================

  265. class Game_ComposeMaterial
  266.   #--------------------------------------------------------------------------
  267.   # ○ 公開インスタンス変数
  268.   #--------------------------------------------------------------------------
  269.   attr_accessor :kind                     # アイテムの種類 (/[IWA]/)
  270.   attr_accessor :id                       # アイテムの ID
  271.   attr_accessor :number                   # 必要数
  272.   #--------------------------------------------------------------------------
  273.   # ○ オブジェクト初期化
  274.   #--------------------------------------------------------------------------
  275.   def initialize
  276.     @kind = "I"
  277.     @id = 0
  278.     @number = 1
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ○ アイテム取得
  282.   #--------------------------------------------------------------------------
  283.   def item
  284.     case @kind
  285.     when "I"  # アイテム
  286.       return $data_items[@id]
  287.     when "W"  # 武器
  288.       return $data_weapons[@id]
  289.     when "A"  # 防具
  290.       return $data_armors[@id]
  291.     else
  292.       return nil
  293.     end
  294.   end
  295. end

  296. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  297. #==============================================================================
  298. # ■ Window_Base
  299. #==============================================================================

  300. class Window_Base < Window
  301.   #--------------------------------------------------------------------------
  302.   # ○ 合成アイテム名の描画
  303.   #     item    : アイテム (スキル、武器、防具でも可)
  304.   #     x       : 描画先 X 座標
  305.   #     y       : 描画先 Y 座標
  306.   #     enabled : 有効フラグ。false のとき半透明で描画
  307.   #--------------------------------------------------------------------------
  308.   def draw_compose_item_name(item, x, y, enabled = true)
  309.     return if item == nil

  310.     draw_icon(item.icon_index, x, y, enabled)
  311.     self.contents.font.color = normal_color
  312.     self.contents.font.color.alpha = enabled ? 255 : 128
  313.     self.contents.draw_text(x + 24, y, 172, WLH,
  314.       $game_party.item_composed?(item) ? item.name : item.masked_name)
  315.   end
  316. end
  317.   
  318. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  319. #==============================================================================
  320. # □ Window_ComposeNumber
  321. #------------------------------------------------------------------------------
  322. #   合成画面で、合成するアイテムの個数を入力するウィンドウです。
  323. #==============================================================================

  324. class Window_ComposeNumber < Window_ShopNumber
  325.   #--------------------------------------------------------------------------
  326.   # ● リフレッシュ
  327.   #--------------------------------------------------------------------------
  328.   def refresh
  329.     y = 96
  330.     self.contents.clear
  331.     draw_compose_item_name(@item, 0, y)
  332.     self.contents.font.color = normal_color
  333.     self.contents.draw_text(212, y, 20, WLH, "×")
  334.     self.contents.draw_text(248, y, 20, WLH, @number, 2)
  335.     self.cursor_rect.set(244, y, 28, WLH)
  336.     if !KGC::ComposeItem::HIDE_ZERO_COST || @price > 0
  337.       draw_currency_value(@price * @number, 4, y + WLH * 2, 264)
  338.     end
  339.   end
  340. end

  341. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  342. #==============================================================================
  343. # □ Window_ComposeItem
  344. #------------------------------------------------------------------------------
  345. #   合成画面で、合成できる商品の一覧を表示するウィンドウです。
  346. #==============================================================================

  347. class Window_ComposeItem < Window_ShopBuy
  348.   #--------------------------------------------------------------------------
  349.   # ● リフレッシュ
  350.   #--------------------------------------------------------------------------
  351.   def refresh
  352.     @data = []
  353.     for goods_item in @shop_goods
  354.       case goods_item[0]
  355.       when 0
  356.         item = $data_items[goods_item[1]]
  357.       when 1
  358.         item = $data_weapons[goods_item[1]]
  359.       when 2
  360.         item = $data_armors[goods_item[1]]
  361.       end
  362.       # 合成アイテムのみ追加
  363.       @data.push(item) if include?(item)
  364.     end
  365.     @item_max = @data.size
  366.     create_contents
  367.     for i in 0...@item_max
  368.       draw_item(i)
  369.     end
  370.   end
  371.   #--------------------------------------------------------------------------
  372.   # ○ アイテムをリストに含めるかどうか
  373.   #     item : アイテム
  374.   #--------------------------------------------------------------------------
  375.   def include?(item)
  376.     return false if item == nil                # アイテムが nil なら含めない
  377.     return false unless item.is_compose?       # 合成アイテムでなければ含めない
  378.     if KGC::ComposeItem::HIDE_SHORTAGE_RECIPE  # 費用・素材不足を隠す場合
  379.       if !$game_party.item_composed?(item) && !enable?(item)
  380.         return false  # 未合成かつ合成不可なら含めない
  381.       end
  382.     end

  383.     return true
  384.   end
  385.   #--------------------------------------------------------------------------
  386.   # ○ アイテムを許可状態で表示するかどうか
  387.   #     item : アイテム
  388.   #--------------------------------------------------------------------------
  389.   def enable?(item)
  390.     return $game_party.item_can_compose?(item)
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 項目の描画
  394.   #     index : 項目番号
  395.   #--------------------------------------------------------------------------
  396.   def draw_item(index)
  397.     item = @data[index]
  398.     number = $game_party.item_number(item)
  399.     limit = ($imported["LimitBreak"] ? item.number_limit : 99)
  400.     rect = item_rect(index)
  401.     self.contents.clear_rect(rect)
  402.     draw_compose_item_name(item, rect.x, rect.y, enable?(item))
  403.     # 費用を描画
  404.     if !KGC::ComposeItem::HIDE_ZERO_COST || item.compose_cost > 0
  405.       rect.width -= 4
  406.       self.contents.draw_text(rect, item.compose_cost, 2)
  407.     end
  408.   end

  409.   if KGC::ComposeItem::HIDE_UNKNOWN_RECIPE_HELP
  410.   #--------------------------------------------------------------------------
  411.   # ● ヘルプテキスト更新
  412.   #--------------------------------------------------------------------------
  413.   def update_help
  414.     item = (index >= 0 ? @data[index] : nil)
  415.     if item == nil || $game_party.item_composed?(item)
  416.       # アイテムが nil か、合成済みなら [Window_ShopBuy] に任せる
  417.       super
  418.     else
  419.       @help_window.set_text(KGC::ComposeItem::UNKNOWN_RECIPE_HELP)
  420.     end
  421.   end
  422.   end
  423. end

  424. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  425. #==============================================================================
  426. # □ Window_ComposeStatus
  427. #------------------------------------------------------------------------------
  428. #  合成画面で、素材の所持数や必要数を表示するウィンドウです。
  429. #==============================================================================

  430. class Window_ComposeStatus < Window_ShopStatus
  431.   #--------------------------------------------------------------------------
  432.   # ○ 表示モード
  433.   #--------------------------------------------------------------------------
  434.   MODE_MATERIAL = 0  # 素材リスト
  435.   MODE_STATUS   = 1  # パーティのステータス
  436.   #--------------------------------------------------------------------------
  437.   # ● オブジェクト初期化
  438.   #     x : ウィンドウの X 座標
  439.   #     y : ウィンドウの Y 座標
  440.   #--------------------------------------------------------------------------
  441.   def initialize(x, y)
  442.     @mode = MODE_MATERIAL
  443.     super(x, y)
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ○ モード変更
  447.   #--------------------------------------------------------------------------
  448.   def change_mode
  449.     case @mode
  450.     when MODE_MATERIAL
  451.       @mode = MODE_STATUS
  452.     when MODE_STATUS
  453.       @mode = MODE_MATERIAL
  454.     end
  455.     self.oy = 0
  456.     refresh
  457.   end
  458.   #--------------------------------------------------------------------------
  459.   # ● ウィンドウ内容の作成
  460.   #--------------------------------------------------------------------------
  461.   def create_contents
  462.     if @mode == MODE_STATUS
  463.       super
  464.       return
  465.     end

  466.     self.contents.dispose
  467.     ch = height - 32
  468.     if @item != nil
  469.       mag = (KGC::ComposeItem::COMPACT_MATERIAL_LIST ? 1 : 2)
  470.       ch = [ch, WLH * (mag + @item.compose_materials.size * mag)].max
  471.     end
  472.     self.contents = Bitmap.new(width - 32, ch)
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● リフレッシュ
  476.   #--------------------------------------------------------------------------
  477.   def refresh
  478.     create_contents
  479.     self.contents.font.size = Font.default_size
  480.     case @mode
  481.     when MODE_MATERIAL
  482.       draw_material_list
  483.     when MODE_STATUS
  484.       super
  485.     end
  486.   end
  487.   #--------------------------------------------------------------------------
  488.   # ○ 素材リストを描画
  489.   #--------------------------------------------------------------------------
  490.   def draw_material_list
  491.     return if @item == nil
  492.     number = $game_party.item_number(@item)
  493.     self.contents.font.color = system_color
  494.     self.contents.draw_text(4, 0, 200, WLH, Vocabssession)
  495.     self.contents.font.color = normal_color
  496.     self.contents.draw_text(4, 0, 200, WLH, number, 2)
  497.     self.contents.font.size = 16 if KGC::ComposeItem::COMPACT_MATERIAL_LIST
  498.     mag = (KGC::ComposeItem::COMPACT_MATERIAL_LIST ? 1 : 2)
  499.     @item.compose_materials.each_with_index { |material, i|
  500.       y = WLH * (mag + i * mag)
  501.       draw_material_info(0, y, material)
  502.     }
  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ○ 素材情報を描画
  506.   #--------------------------------------------------------------------------
  507.   def draw_material_info(x, y, material)
  508.     m_item = material.item
  509.     return if m_item == nil
  510.     number = $game_party.item_number(m_item)
  511.     enabled = (number > 0 && number >= material.number)
  512.     draw_item_name(m_item, x, y, enabled)
  513.     if KGC::ComposeItem::COMPACT_MATERIAL_LIST
  514.       m_number = (material.number == 0 ? "-" : sprintf("%d", material.number))
  515.       self.contents.draw_text(x, y, width - 32, WLH,
  516.         sprintf("%s/%d", m_number, number), 2)
  517.     else
  518.       m_number = (material.number == 0 ? "-" : sprintf("%2d", material.number))
  519.       self.contents.draw_text(x, y + WLH, width - 32, WLH,
  520.         sprintf("%2s/%2d", m_number, number), 2)
  521.     end
  522.   end
  523. end

  524. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  525. #==============================================================================
  526. # ■ Scene_Map
  527. #==============================================================================

  528. class Scene_Map < Scene_Base
  529.   #--------------------------------------------------------------------------
  530.   # ● ショップ画面への切り替え
  531.   #--------------------------------------------------------------------------
  532.   alias call_shop_KGC_ComposeItem call_shop
  533.   def call_shop
  534.     # 合成画面を呼び出した場合
  535.     if $game_switches[KGC::ComposeItem::COMPOSE_CALL_SWITCH]
  536.       # 合成画面に移行
  537.       $game_temp.next_scene = nil
  538.       $game_switches[KGC::ComposeItem::COMPOSE_CALL_SWITCH] = false
  539.       $scene = Scene_ComposeItem.new
  540.     else
  541.       call_shop_KGC_ComposeItem
  542.     end
  543.   end
  544. end

  545. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  546. #==============================================================================
  547. # □ Scene_ComposeItem
  548. #------------------------------------------------------------------------------
  549. #  合成画面の処理を行うクラスです。
  550. #==============================================================================

  551. class Scene_ComposeItem < Scene_Shop
  552.   #--------------------------------------------------------------------------
  553.   # ● 開始処理
  554.   #--------------------------------------------------------------------------
  555.   def start
  556.     super
  557.     # コマンドウィンドウ非表示
  558.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW
  559.       @command_window.visible = false
  560.       @gold_window.y = Graphics.height - @gold_window.height
  561.       @gold_window.z = @status_window.z + 100
  562.       @gold_window.visible = !KGC::ComposeItem::HIDE_GOLD_WINDOW

  563.       @dummy_window.y = @command_window.y
  564.       @dummy_window.height += @command_window.height
  565.     end

  566.     # [Scene_Shop] 再利用のため、合成リストに @buy_window を使用
  567.     @buy_window.dispose
  568.     @buy_window = Window_ComposeItem.new(0, @dummy_window.y)
  569.     @buy_window.height = @dummy_window.height
  570.     @buy_window.active = false
  571.     @buy_window.visible = false
  572.     @buy_window.help_window = @help_window

  573.     # その他のウィンドウを再構成
  574.     @number_window.dispose
  575.     @number_window = Window_ComposeNumber.new(0, @buy_window.y)
  576.     @number_window.height = @buy_window.height
  577.     @number_window.create_contents
  578.     @number_window.active = false
  579.     @number_window.visible = false

  580.     @status_window.dispose
  581.     @status_window = Window_ComposeStatus.new(@buy_window.width, @buy_window.y)
  582.     @status_window.height = @buy_window.height
  583.     @status_window.create_contents
  584.     @status_window.visible = false

  585.     # コマンドウィンドウ非表示の場合、合成ウィンドウに切り替え
  586.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW
  587.       @command_window.active = false
  588.       @dummy_window.visible = false
  589.       @buy_window.active = true
  590.       @buy_window.visible = true
  591.       @buy_window.update_help
  592.       @status_window.visible = true
  593.       @status_window.item = @buy_window.item
  594.     end
  595.   end
  596.   #--------------------------------------------------------------------------
  597.   # ● コマンドウィンドウの作成
  598.   #--------------------------------------------------------------------------
  599.   def create_command_window
  600.     s1 = Vocab::ComposeItem
  601.     s2 = Vocab::ShopSell
  602.     s3 = Vocab::ShopCancel
  603.     @command_window = Window_Command.new(384, [s1, s2, s3], 3)
  604.     @command_window.y = 56
  605.     if $game_temp.shop_purchase_only
  606.       @command_window.draw_item(1, false)
  607.     end
  608.   end
  609.   #--------------------------------------------------------------------------
  610.   # ● フレーム更新
  611.   #--------------------------------------------------------------------------
  612.   def update
  613.     super
  614.     if KGC::ComposeItem::SWITCH_INFO_BUTTON != nil &&
  615.         Input.trigger?(KGC::ComposeItem::SWITCH_INFO_BUTTON)
  616.       Sound.play_cursor
  617.       @status_window.change_mode
  618.     end
  619.   end
  620.   #--------------------------------------------------------------------------
  621.   # ● 購入アイテム選択の更新
  622.   #--------------------------------------------------------------------------
  623.   def update_buy_selection
  624.     # コマンドウィンドウ非表示で B ボタンが押された場合
  625.     if KGC::ComposeItem::HIDE_COMMAND_WINDOW && Input.trigger?(Input::B)
  626.       Sound.play_cancel
  627.       $scene = Scene_Map.new
  628.       return
  629.     end

  630.     @status_window.item = @buy_window.item
  631.     if Input.trigger?(Input::C)
  632.       @item = @buy_window.item
  633.       # アイテムが無効なら選択不可
  634.       if @item == nil
  635.         Sound.play_buzzer
  636.         return
  637.       end

  638.       # 合成不可能 or 限界数まで所持している場合は選択不可
  639.       number = $game_party.item_number(@item)
  640.       limit = ($imported["LimitBreak"] ? @item.number_limit : 99)
  641.       if !$game_party.item_can_compose?(@item) || number == limit
  642.         Sound.play_buzzer
  643.         return
  644.       end

  645.       # 個数入力に切り替え
  646.       Sound.play_decision
  647.       max = $game_party.number_of_composable(@item)
  648.       max = [max, limit - number].min
  649.       @buy_window.active = false
  650.       @buy_window.visible = false
  651.       @number_window.set(@item, max, @item.compose_cost)
  652.       @number_window.active = true
  653.       @number_window.visible = true
  654.       return
  655.     end

  656.     super
  657.   end
  658.   #--------------------------------------------------------------------------
  659.   # ● 個数入力の決定
  660.   #--------------------------------------------------------------------------
  661.   def decide_number_input
  662.     if @command_window.index != 0  # 「合成する」以外
  663.       super
  664.       return
  665.     end

  666.     Sound.play_shop
  667.     @number_window.active = false
  668.     @number_window.visible = false
  669.     # 合成処理
  670.     operation_compose
  671.     @gold_window.refresh
  672.     @buy_window.refresh
  673.     @status_window.refresh
  674.     @buy_window.active = true
  675.     @buy_window.visible = true
  676.   end
  677.   #--------------------------------------------------------------------------
  678.   # ○ 合成の処理
  679.   #--------------------------------------------------------------------------
  680.   def operation_compose
  681.     $game_party.lose_gold(@number_window.number * @item.compose_cost)
  682.     $game_party.gain_item(@item, @number_window.number)
  683.     # 素材を減らす
  684.     @item.compose_materials.each { |material|
  685.       $game_party.lose_item(material.item,
  686.         material.number * @number_window.number)
  687.     }
  688.     # 合成済みにする
  689.     $game_party.set_item_composed(@item)
  690.   end
  691. end

复制代码
请使用代码,shua1225先生………………,我不会做脚本但是我会使用代码 ==

作者: shua1125    时间: 2010-12-12 03:15
再自顶一下……
作者: cinapoem    时间: 2010-12-14 21:16
=_= 你就不能用事件實現麼..
用變數來做成功率,就像30以上是成功,30以下是失敗.這樣就可以按照你喜歡的不同物品不同成功率了,再者,在條件中的成功和失敗都寫上變數+X.這樣就可以了...
-  -麻煩是麻煩了點..不過少點腳本少點沖突阿...我這種不會寫腳本的菜鳥只能這麼想`.
作者: shua1125    时间: 2010-12-15 05:45
回复 cinapoem 的帖子

其实我确实想用纯事件做一个合成系统了……
但是你可以看一下我的这个贴:
http://rpg.blue/thread-163045-1-1.html
纯事件也会出bug啊……
毕竟想要弄得华丽一些,只用事件还是感觉略为简陋……
但是如果用事件做,我想这个用到的变量开关就太多了……
毕竟我构想的框架比较大,要节约变量和开关……
话说我那个咖啡机系统就已经够简单了,还用了十多个变量和开关,合成系统那么多东西,我变量或者开关是不是得弄一大堆?
目前计划是先用纯事件做,等到脚本学会了,视情况改用脚本……
作者: cinapoem    时间: 2010-12-15 10:41
其實在遊戲運行起來..
是腳本多比較卡,還是事件多比較卡?
我還沒做過大型的遊戲.不清楚...




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