查看: 2416|回复: 4

[已经过期] 物品制造的问题

[复制链接]
梦石
0
星屑
50
在线时间
28 小时
注册时间
2015-1-30
回帖
28
发表于 2015-2-10 14:40:05 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
请问如果我想设个NPC用来合成物品要怎么做啊
需要物品合成的脚本吗   

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-2-10 14:46:43 | 显示全部楼层

点评

这个网址的是事件  发表于 2015-2-14 23:52
事件  发表于 2015-2-14 23:51
要怎么做啊???  发表于 2015-2-10 16:37
直接使用合成系统的脚本···  发表于 2015-2-10 16:34
如果我想用图书馆物品制造的脚本 把他放在一个NPC上 就像商店处理一样要怎么做呢 应该要写脚本吧 怎么写呢???  发表于 2015-2-10 16:20
回复

使用道具 举报

梦石
0
星屑
70
在线时间
1083 小时
注册时间
2013-3-29
回帖
2158
发表于 2015-2-14 22:33:55 | 显示全部楼层
物品制造系统脚本:
  1. #encoding:utf-8
  2. #==============================================================================
  3. #BY:asd11000
  4. #每添加一个制造的类型,最上面的类别菜单就会多一项。
  5. #
  6. #添加类型的方法是:
  7. #$game_party.add_cook_type(类别名称,类别介绍, 类别状态-默认false)
  8. #
  9. #举例:
  10. #$game_party.add_cook_type("制药","调配药品", true)
  11. #
  12. #添加配方的方法:
  13. #$game_party.add_cookbook(配方名称, 配方介绍, 配方类别名称,材料的二维数组,产出物的二维数组,配方状态默认为true)
  14. #
  15. #举例:
  16. #$game_party.add_cookbook("初级补血药水", "制作初级补血药水", "制药",[[18,2],[3,4],[2,5]],[[1,1],[44,5]],true)
  17. #
  18. #调用窗口的方法:SceneManager.call(Scene_Cook)
  19. #==============================================================================

  20. #==============================================================================
  21. # ■ Cookbook_Type
  22. #------------------------------------------------------------------------------
  23. #  食谱类型类。
  24. #==============================================================================

  25. class Cookbook_Type
  26.   attr_reader :index
  27.   attr_reader :name
  28.   attr_reader :description
  29.   attr_reader :enabled
  30.   #--------------------------------------------------------------------------
  31.   # ● 初始化对象
  32.   #--------------------------------------------------------------------------
  33.   def initialize(index, name, description, enabled = false)
  34.     @Index = index
  35.     @name = name
  36.     @description = description
  37.     @enabled = enabled
  38.   end

  39.   def enable(en)
  40.     @enabled = en
  41.   end
  42. end

  43. #==============================================================================
  44. # ■ Cookbook
  45. #------------------------------------------------------------------------------
  46. #  食谱类。本类在 Game_Task 类的内部使用。
  47. #   食谱属性:食谱序号,食谱名称,食谱类型,食谱介绍,原料,成品
  48. #==============================================================================

  49. class Cookbook
  50.   attr_reader :index
  51.   attr_reader :name
  52.   attr_reader :description
  53.   attr_reader :type
  54.   attr_reader :input
  55.   attr_reader :output
  56.   attr_reader :enabled
  57.   #--------------------------------------------------------------------------
  58.   # ● 初始化对象
  59.   #--------------------------------------------------------------------------
  60.   def initialize(index, name, description, type, input, output, enabled = true)
  61.     @Index = index
  62.     @name = name
  63.     @description = description
  64.     @type = type
  65.     @input = input
  66.     @output = output
  67.     @enabled = enabled
  68.   end

  69.   def enable(en)
  70.     @enabled = en
  71.   end

  72.   #--------------------------------------------------------------------------
  73.   # ● 查询列表中的物品
  74.   #--------------------------------------------------------------------------
  75.   def in_list?(item, list)
  76.     list.each do |arr|
  77.       return true if arr[0] == item.id
  78.     end
  79.     return false
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ● 查询是否是材料列表中的物品
  83.   #--------------------------------------------------------------------------
  84.   def resource?(item)
  85.     in_list?(item, @input)
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ● 查询是否是产出列表中的物品
  89.   #--------------------------------------------------------------------------
  90.   def output?(item)
  91.     in_list?(item, @output)
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   # ● 查询材料需求量
  95.   #--------------------------------------------------------------------------
  96.   def amount(item, i)
  97.     if i == 0
  98.       @input.each do |arr|
  99.         return arr[1] if arr[0] == item.id
  100.       end
  101.     else
  102.       @output.each do |arr|
  103.         return arr[1] if arr[0] == item.id
  104.       end
  105.     end
  106.     return 0
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 查询材料是否足够
  110.   #--------------------------------------------------------------------------
  111.   def enough?
  112.     input.each do |arr|
  113.       return false if $data_items[arr[0]] && arr[1] > $game_party.item_number($data_items[arr[0]])
  114.     end
  115.     return true
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 查询某件材料是否足够
  119.   #--------------------------------------------------------------------------
  120.   def item_enough?(item)
  121.     input.each do |arr|
  122.       return false if arr[0] == item.id && arr[1] > $game_party.item_number(item)
  123.     end
  124.     return true
  125.   end
  126. end

  127. #==============================================================================
  128. # ■ Game_Party
  129. #==============================================================================

  130. class Game_Party < Game_Unit
  131.   #--------------------------------------------------------------------------
  132.   # ● 初始化对象
  133.   #--------------------------------------------------------------------------
  134.   alias old_old_init initialize
  135.   def initialize
  136.     old_old_init
  137.     @cook_types = []
  138.     @cookbooks = []
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 添加新的食谱类型
  142.   #--------------------------------------------------------------------------
  143.   def add_cook_type(n, d, en)
  144.     @cook_types.push(Cookbook_Type.new(@cook_types.size, n, d, en)) if !have_cook_type?(n)
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 添加新的食谱
  148.   #--------------------------------------------------------------------------
  149.   def add_cookbook(n, d, type, input, output, en)
  150.     if !have_cookbook?(n) && have_cook_type?(type)
  151.       @cookbooks.push(Cookbook.new(@cookbooks.size, n, d, type, input, output, en))
  152.     end
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 判断名称为n的食谱类型是否存在
  156.   #--------------------------------------------------------------------------
  157.   def have_cook_type?(n)
  158.     @cook_types.each do |x|
  159.       return true if x.name == n
  160.     end
  161.     return false
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● 判断名称为n的食谱是否存在
  165.   #--------------------------------------------------------------------------
  166.   def have_cookbook?(n)
  167.     @cookbooks.each do |x|
  168.       return true if x.name == n
  169.     end
  170.     return false
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ● 返回食谱类型列表
  174.   #--------------------------------------------------------------------------
  175.   def cook_types
  176.     return @cook_types
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 返回食谱列表
  180.   #--------------------------------------------------------------------------
  181.   def cookbooks(type = nil)
  182.     return @cookbooks if type == nil
  183.     arr = []
  184.     @cookbooks.each do |x|
  185.       arr.push(x) if x.type == type
  186.     end
  187.     return arr
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ● 更改序号为i的食谱类型的使用状态
  191.   #--------------------------------------------------------------------------
  192.   def set_cook_type(i, en)
  193.     @cook_types[i].enable(en)
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # ● 更改序号为i的食谱的使用状态
  197.   #--------------------------------------------------------------------------
  198.   def set_cookbook(i, en)
  199.     @cookbooks[i].enable(en)
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 返回食谱类型数目
  203.   #--------------------------------------------------------------------------
  204.   def cook_types_size
  205.     return @cook_types.size
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 查询名称为n的食谱类型的描述
  209.   #--------------------------------------------------------------------------
  210.   def cook_type_description(n)
  211.     @cook_types.each do |x|
  212.       return x.description if x.name == n
  213.     end
  214.     return ""
  215.   end
  216. end

  217. #==============================================================================
  218. # ■ Scene_Cook
  219. #------------------------------------------------------------------------------
  220. #  烹饪画面
  221. #==============================================================================

  222. class Scene_Cook < Scene_ItemBase
  223.   #--------------------------------------------------------------------------
  224.   # ● 开始处理
  225.   #--------------------------------------------------------------------------
  226.   def start
  227.     super
  228.     create_category_window
  229.     create_cookbook_window
  230.     create_description_window
  231.     create_needs_window
  232.   end
  233.   #--------------------------------------------------------------------------
  234.   # ● 生成分类窗口
  235.   #--------------------------------------------------------------------------
  236.   def create_category_window
  237.     @category_window = Window_CookCategory.new
  238.     @category_window.viewport = @viewport
  239.     @category_window.y = 0
  240.     @category_window.set_handler(:ok,     method(:on_category_ok))
  241.     @category_window.set_handler(:cancel, method(:return_scene))
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● 生成食谱窗口
  245.   #--------------------------------------------------------------------------
  246.   def create_cookbook_window
  247.     wy = @category_window.height
  248.     wh = Graphics.height - wy
  249.     @item_window = Window_CookList.new(0, wy, Graphics.width*0.5 , wh)
  250.     @item_window.viewport = @viewport
  251.     @item_window.set_handler(:ok,     method(:on_item_ok))
  252.     @item_window.set_handler(:cancel, method(:on_item_cancel))
  253.     @category_window.item_window = @item_window
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 生成描述窗口
  257.   #--------------------------------------------------------------------------
  258.   def create_description_window
  259.     wy = @category_window.height
  260.     @help_window = Window_Description.new(Graphics.width*0.5, wy)
  261.     @help_window.viewport = @viewport
  262.     @item_window.help_window = @help_window
  263.     @category_window.help_window = @help_window
  264.   end
  265.     #--------------------------------------------------------------------------
  266.   # ● 生成材料窗口
  267.   #--------------------------------------------------------------------------
  268.   def create_needs_window
  269.     wy = @category_window.height + @help_window.height
  270.     wh = Graphics.height - wy
  271.     @needs_window = Window_NeedsList.new(Graphics.width*0.5, wy, Graphics.width*0.5 , wh)
  272.     #@item_window.viewport = @viewport
  273.     @item_window.needs_window = @needs_window

  274.   end
  275.   #--------------------------------------------------------------------------
  276.   # ● 分类“确定”
  277.   #--------------------------------------------------------------------------
  278.   def on_category_ok
  279.     @item_window.activate
  280.     @item_window.select_last
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 食谱“确定”
  284.   #--------------------------------------------------------------------------
  285.   def on_item_ok
  286.     #$game_party.last_item.object = item
  287.     cook
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ● 食谱“取消”
  291.   #--------------------------------------------------------------------------
  292.   def on_item_cancel
  293.     @item_window.unselect
  294.     @category_window.activate
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 烹饪
  298.   #--------------------------------------------------------------------------
  299.   def cook
  300.     if item.enough?
  301.       play_se_for_item
  302.       use_item
  303.       @needs_window.refresh
  304.       @item_window.refresh
  305.       activate_item_window
  306.     end
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● 播放制作声效
  310.   #--------------------------------------------------------------------------
  311.   def play_se_for_item
  312.     Sound.play_recovery
  313.   end
  314.   #--------------------------------------------------------------------------
  315.   # ● 使用食谱
  316.   #--------------------------------------------------------------------------
  317.   def use_item
  318.     #super
  319.     #@item_window.redraw_current_item
  320.     $data_items.each do |it|
  321.       if it && !it.name.empty?
  322.         $game_party.gain_item(it,-item.amount(it,0)) if item.resource?(it)
  323.         $game_party.gain_item(it,item.amount(it,1)) if item.output?(it)
  324.       end
  325.     end
  326.   end
  327. end


  328. #==============================================================================
  329. # ■ Window_CookCategory
  330. #------------------------------------------------------------------------------
  331. #  烹饪画面中,显示食谱类型的窗口。
  332. #==============================================================================

  333. class Window_CookCategory < Window_HorzCommand
  334.   #--------------------------------------------------------------------------
  335.   # ● 定义实例变量
  336.   #--------------------------------------------------------------------------
  337.   attr_reader   :item_window
  338.   #--------------------------------------------------------------------------
  339.   # ● 初始化对象
  340.   #--------------------------------------------------------------------------
  341.   def initialize
  342.     super(0, 0)
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 获取窗口的宽度
  346.   #--------------------------------------------------------------------------
  347.   def window_width
  348.     Graphics.width
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # ● 获取列数
  352.   #--------------------------------------------------------------------------
  353.   def col_max
  354.     return $game_party.cook_types_size
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● 更新画面
  358.   #--------------------------------------------------------------------------
  359.   def update
  360.     super
  361.     #@item_window.category = current_symbol if @item_window
  362.     @item_window.category = current_data[:name] if @item_window
  363.   end
  364.   #--------------------------------------------------------------------------
  365.   # ● 生成食谱类型列表
  366.   #--------------------------------------------------------------------------
  367.   def make_command_list
  368.     $game_party.cook_types.each do |t|
  369.       add_command(t.name, t.index, t.enabled)
  370.     end
  371.   end
  372.   #--------------------------------------------------------------------------
  373.   # ● 设置食谱列表窗口
  374.   #--------------------------------------------------------------------------
  375.   def item_window=(item_window)
  376.     @item_window = item_window
  377.     update
  378.   end
  379.   #--------------------------------------------------------------------------
  380.   # ● 更新帮助内容
  381.   #--------------------------------------------------------------------------
  382.   def update_help
  383.     @help_window.set_text($game_party.cook_type_description(current_data[:name]))
  384.   end
  385. end

  386. #==============================================================================
  387. # ■ Window_CookList
  388. #------------------------------------------------------------------------------
  389. #  任务画面中,显示已获得任务的窗口。
  390. #==============================================================================

  391. class Window_CookList < Window_Selectable
  392.   #--------------------------------------------------------------------------
  393.   # ● 定义实例变量
  394.   #--------------------------------------------------------------------------
  395.   attr_reader   :needs_window
  396.   #--------------------------------------------------------------------------
  397.   # ● 初始化对象
  398.   #--------------------------------------------------------------------------
  399.   def initialize(x, y, width, height)
  400.     super
  401.     @data = []
  402.     @category = $game_party.cook_types_size > 0 ? $game_party.cook_types[0].name : nil
  403.     refresh
  404.   end
  405.   #--------------------------------------------------------------------------
  406.   # ● 设置分类
  407.   #--------------------------------------------------------------------------
  408.   def category=(category)
  409.     return if @category == category
  410.     @category = category
  411.     refresh
  412.     self.oy = 0
  413.   end
  414.   #--------------------------------------------------------------------------
  415.   # ● 设置材料窗口
  416.   #--------------------------------------------------------------------------
  417.   def needs_window=(needs_window)
  418.     @needs_window = needs_window
  419.     update
  420.   end
  421.   #--------------------------------------------------------------------------
  422.   # ● 获取列数
  423.   #--------------------------------------------------------------------------
  424.   def col_max
  425.     return 1
  426.   end
  427.   #--------------------------------------------------------------------------
  428.   # ● 获取项目数
  429.   #--------------------------------------------------------------------------
  430.   def item_max
  431.     @data ? @data.size : 1
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ● 获取食谱
  435.   #--------------------------------------------------------------------------
  436.   def item
  437.     @data && index >= 0 ? @data[index] : nil
  438.   end
  439.   #--------------------------------------------------------------------------
  440.   # ● 获取选择食谱的有效状态
  441.   #--------------------------------------------------------------------------
  442.   def current_item_enabled?
  443.     enable?(@data[index])
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # ● 查询此食谱是否可用
  447.   #--------------------------------------------------------------------------
  448.   def enable?(item)
  449.     item.enabled && item.enough?
  450.   end
  451.   #--------------------------------------------------------------------------
  452.   # ● 生成食谱列表
  453.   #--------------------------------------------------------------------------
  454.   def make_item_list
  455.     @data = $game_party.cookbooks(@category)
  456.   end
  457.   #--------------------------------------------------------------------------
  458.   # ● 返回上一个选择的位置
  459.   #--------------------------------------------------------------------------
  460.   def select_last
  461.     select(0)
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 绘制项目
  465.   #--------------------------------------------------------------------------
  466.   def draw_item(index)
  467.     item = @data[index]
  468.     if item
  469.       rect = item_rect(index)
  470.       rect.width -= 4
  471.       draw_item_name(item, rect.x, rect.y, enable?(item))
  472.     end
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● 绘制名称
  476.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  477.   #--------------------------------------------------------------------------
  478.   def draw_item_name(item, x, y, enabled = true, width = 300)
  479.     return unless item
  480.     text = item.name
  481.     text += "[材料不足]" if !item.enough?
  482.     change_color(normal_color, enabled)
  483.     draw_text(x, y, width, line_height, text)
  484.   end
  485.   #--------------------------------------------------------------------------
  486.   # ● 更新帮助内容
  487.   #--------------------------------------------------------------------------
  488.   def update_help
  489.     @help_window.set_item(item)
  490.   end
  491.    #--------------------------------------------------------------------------
  492.   # ● 更新食谱清单
  493.   #--------------------------------------------------------------------------
  494.   def update_needslist
  495.     @needs_window.set_item(item)
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 调用帮助窗口的更新方法
  499.   #--------------------------------------------------------------------------
  500.   def call_update_help
  501.     update_help if @help_window
  502.     update_needslist if @needs_window
  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ● 刷新
  506.   #--------------------------------------------------------------------------
  507.   def refresh
  508.     make_item_list
  509.     create_contents
  510.     draw_all_items
  511.   end
  512. end
  513. #==============================================================================
  514. # ■ Window_Description
  515. #------------------------------------------------------------------------------
  516. #  显示食谱的说明的窗口
  517. #==============================================================================

  518. class Window_Description < Window_Base
  519.   #--------------------------------------------------------------------------
  520.   # ● 初始化对象
  521.   #--------------------------------------------------------------------------
  522.   def initialize(x, y)
  523.     super(x, y, Graphics.width*0.5, fitting_height(4))
  524.   end
  525.   #--------------------------------------------------------------------------
  526.   # ● 设置内容
  527.   #--------------------------------------------------------------------------
  528.   def set_text(text)
  529.     if text != @text
  530.       @text = text
  531.       refresh
  532.     end
  533.   end
  534.   #--------------------------------------------------------------------------
  535.   # ● 清除
  536.   #--------------------------------------------------------------------------
  537.   def clear
  538.     set_text("")
  539.   end
  540.   #--------------------------------------------------------------------------
  541.   # ● 设置食谱的介绍
  542.   #--------------------------------------------------------------------------
  543.   def set_item(item)
  544.     set_text(item ? item.description : "")
  545.   end
  546.   #--------------------------------------------------------------------------
  547.   # ● 刷新
  548.   #--------------------------------------------------------------------------
  549.   def refresh
  550.     contents.clear
  551.     draw_text_ex(4, 0, @text)
  552.   end
  553. end

  554. #==============================================================================
  555. # ■ Window_NeedsList
  556. #------------------------------------------------------------------------------
  557. #  烹饪画面中,显示食谱所需材料的窗口。
  558. #==============================================================================

  559. class Window_NeedsList < Window_Selectable
  560.   #--------------------------------------------------------------------------
  561.   # ● 初始化对象
  562.   #--------------------------------------------------------------------------
  563.   def initialize(x, y, width, height)
  564.     super
  565.     @category = :item
  566.     @cookbook = nil
  567.     @data = []
  568.     refresh
  569.   end
  570.   #--------------------------------------------------------------------------
  571.   # ● 获取列数
  572.   #--------------------------------------------------------------------------
  573.   def col_max
  574.     return 1
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ● 获取项目数
  578.   #--------------------------------------------------------------------------
  579.   def item_max
  580.     @data ? @data.size : 1
  581.   end
  582.   #--------------------------------------------------------------------------
  583.   # ● 获取物品
  584.   #--------------------------------------------------------------------------
  585.   def item
  586.     @data && index >= 0 ? @data[index] : nil
  587.   end
  588.   #--------------------------------------------------------------------------
  589.   # ● 查询列表中是否含有此物品
  590.   #--------------------------------------------------------------------------
  591.   def include?(item)
  592.     item.is_a?(RPG::Item) && !item.key_item?
  593.   end
  594.   #--------------------------------------------------------------------------
  595.   # ● 获取选择食谱的有效状态
  596.   #--------------------------------------------------------------------------
  597.   def current_item_enabled?
  598.     enable?(@data[index])
  599.   end
  600.   #--------------------------------------------------------------------------
  601.   # ● 查询此食谱是否可用
  602.   #--------------------------------------------------------------------------
  603.   def enable?(item)
  604.     $game_party.usable?(item) && @cookbook.item_enough?(item)
  605.   end
  606.   #--------------------------------------------------------------------------
  607.   # ● 生成物品列表
  608.   #--------------------------------------------------------------------------
  609.   def make_item_list
  610.     @data = []
  611.     return if @cookbook== nil
  612.     tmp1 = []
  613.     tmp2 = []
  614.     $data_items.each do |item|
  615.       tmp1.push([item, 0]) if item && !item.name.empty? && @cookbook.resource?(item)
  616.       tmp2.push([item, 1]) if item && !item.name.empty? && @cookbook.output?(item)
  617.     end
  618.     if tmp1.size > 0 && tmp2.size > 0
  619.       @data.push(["需要材料:",0])
  620.       @data += tmp1
  621.       @data.push(["可以获得:",1])
  622.       @data += tmp2
  623.     end
  624.   end
  625.   #--------------------------------------------------------------------------
  626.   # ● 返回上一个选择的位置
  627.   #--------------------------------------------------------------------------
  628.   def select_last
  629.     select(0)
  630.   end
  631.   #--------------------------------------------------------------------------
  632.   # ● 绘制项目
  633.   #--------------------------------------------------------------------------
  634.   def draw_item(index)
  635.     item = @data[index]
  636.     if item
  637.       rect = item_rect(index)
  638.       rect.width -= 4
  639.       if item[0].is_a?(RPG::Item)
  640.         draw_item_name(item, rect.x, rect.y, enable?(item[0]))
  641.         draw_item_number(rect, item[0])
  642.       else
  643.         draw_input_output(item, rect.x, rect.y)
  644.       end
  645.     end
  646.   end
  647.   #--------------------------------------------------------------------------
  648.   # ● 绘制物品名称
  649.   #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  650.   #--------------------------------------------------------------------------
  651.   def draw_item_name(item, x, y, enabled = true, width = 172)
  652.     return unless item
  653.     text = item[0].name + "*" + String(@cookbook.amount(item[0], item[1]))
  654.     draw_icon(item[0].icon_index, x, y, enabled)
  655.     change_color(normal_color, enable?(item[0]))
  656.     draw_text(x + 24, y, width, line_height, text)
  657.   end
  658.   #--------------------------------------------------------------------------
  659.   # ● 绘制输入和产出
  660.   #--------------------------------------------------------------------------
  661.   def draw_input_output(item, x, y, enabled = false, width = 172)
  662.     return unless item
  663.     if item[1] == 0
  664.       text = "[需要]"
  665.     else
  666.       text = "[可以获得]"
  667.     end
  668.     change_color(normal_color, @cookbook.enough?)
  669.     draw_text(x , y, width, line_height, text)
  670.   end
  671.   #--------------------------------------------------------------------------
  672.   # ● 绘制物品个数
  673.   #--------------------------------------------------------------------------
  674.   def draw_item_number(rect, item)
  675.     draw_text(rect, sprintf("现有%2d", $game_party.item_number(item)), 2)
  676.   end
  677.   #--------------------------------------------------------------------------
  678.   # ● 刷新
  679.   #--------------------------------------------------------------------------
  680.   def refresh
  681.     make_item_list
  682.     create_contents
  683.     draw_all_items
  684.   end
  685.   #--------------------------------------------------------------------------
  686.   # ● 设置食谱的材料
  687.   #--------------------------------------------------------------------------
  688.   def set_item(item)
  689.     @cookbook = item
  690.     refresh
  691.   end
  692. end
复制代码
稍微摸索一下前面的注释应该很容易就会了
在你的那个npc事件里调用这个窗口
还有不会回复

坑的进度如上                                                                                                        点击↑
回复

使用道具 举报

梦石
0
星屑
50
在线时间
17 小时
注册时间
2015-2-7
回帖
19
发表于 2015-2-15 15:04:23 | 显示全部楼层
做一个事件就好了。
回复

使用道具 举报

梦石
0
星屑
604
在线时间
333 小时
注册时间
2011-11-19
回帖
166
发表于 2015-2-15 15:52:21 | 显示全部楼层
本帖最后由 q854240045 于 2015-2-15 15:54 编辑

[pre lang="ruby"]#==============================================================================
# 本腳本來自www.66RPG.com,使用和轉載請保留此信息
#==============================================================================
#==============================================================================
#
#每添加一个制造的类型,最上面的类别菜单就会多一项。
#
#添加类型的方法是:
#$game_party.add_cook_type(类别名称,类别介绍, 类别状态-默认false)
#
#举例:
#$game_party.add_cook_type("制药","调配药品", true)
#
#添加配方的方法:
#$game_party.add_cookbook(配方名称, 配方介绍, 配方类别名称,材料的二维数组,产出物的二维数组,配方状态)
#
#举例:
#$game_party.add_cookbook("初级补血药水", "制作初级补血药水", "制药",[[18,2]],[[1,1]],true)
#
#调用窗口的方法:SceneManager.call(Scene_Cook)
#
#
#==============================================================================

#==============================================================================
# ■ Cookbook_Type
#------------------------------------------------------------------------------
#  食谱类型类。
#==============================================================================

class Cookbook_Type
  attr_reader :index
  attr_reader :name
  attr_reader :description
  attr_reader :enabled
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(index, name, description, enabled = false)
    @index = index
    @name = name
    @description = description
    @enabled = enabled
  end
  
  def enable(en)
    @enabled = en
  end
end

#==============================================================================
# ■ Cookbook
#------------------------------------------------------------------------------
#  食谱类。本类在 Game_Task 类的内部使用。
#   食谱属性:食谱序号,食谱名称,食谱类型,食谱介绍,原料,成品
#==============================================================================

class Cookbook
  attr_reader :index
  attr_reader :name
  attr_reader :description
  attr_reader :type
  attr_reader :input
  attr_reader :output
  attr_reader :enabled
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(index, name, description, type, input, output, enabled = true)
    @index = index
    @name = name
    @description = description
    @type = type
    @input = input
    @output = output
    @enabled = enabled
  end
  
  def enable(en)
    @enabled = en
  end
  
  #--------------------------------------------------------------------------
  # ● 查询列表中的物品
  #--------------------------------------------------------------------------
  def in_list?(item, list)
    list.each do |arr|
      return true if arr[0] == item.id
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 查询是否是材料列表中的物品
  #--------------------------------------------------------------------------
  def resource?(item)
    in_list?(item, @input)
  end
  #--------------------------------------------------------------------------
  # ● 查询是否是产出列表中的物品
  #--------------------------------------------------------------------------
  def output?(item)
    in_list?(item, @output)
  end
  #--------------------------------------------------------------------------
  # ● 查询材料需求量
  #--------------------------------------------------------------------------
  def amount(item, i)
    if i == 0
      @input.each do |arr|
        return arr[1] if arr[0] == item.id
      end
    else
      @output.each do |arr|
        return arr[1] if arr[0] == item.id
      end
    end
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 查询材料是否足够
  #--------------------------------------------------------------------------
  def enough?
    input.each do |arr|
      return false if $data_items[arr[0]] && arr[1] > $game_party.item_number($data_items[arr[0]])
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 查询某件材料是否足够
  #--------------------------------------------------------------------------
  def item_enough?(item)
    input.each do |arr|
      return false if arr[0] == item.id && arr[1] > $game_party.item_number(item)
    end
    return true
  end
end

#==============================================================================
# ■ Game_Party
#==============================================================================

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias old_init initialize
  def initialize
    old_init
    @cook_types = []
    @cookbooks = []
  end
  #--------------------------------------------------------------------------
  # ● 添加新的制造类型
  #--------------------------------------------------------------------------
  def add_cook_type(n, d, en)
    @cook_types.push(Cookbook_Type.new(@cook_types.size, n, d, en)) if !have_cook_type?(n)
  end
  #--------------------------------------------------------------------------
  # ● 添加新的食谱
  #--------------------------------------------------------------------------
  def add_cookbook(n, d, type, input, output, en)
    if !have_cookbook?(n) && have_cook_type?(type)
      @cookbooks.push(Cookbook.new(@cookbooks.size, n, d, type, input, output, en))
    end
  end
  #--------------------------------------------------------------------------
  # ● 判断名称为n的制造类型是否存在
  #--------------------------------------------------------------------------
  def have_cook_type?(n)
    @cook_types.each do |x|
      return true if x.name == n
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 判断名称为n的食谱是否存在
  #--------------------------------------------------------------------------
  def have_cookbook?(n)
    @cookbooks.each do |x|
      return true if x.name == n
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 返回制造类型列表
  #--------------------------------------------------------------------------
  def cook_types
    return @cook_types
  end
  #--------------------------------------------------------------------------
  # ● 返回食谱列表
  #--------------------------------------------------------------------------
  def cookbooks(type = nil)
    return @cookbooks if type == nil
    arr = []
    @cookbooks.each do |x|
      arr.push(x) if x.type == type
    end
    return arr
  end
  #--------------------------------------------------------------------------
  # ● 更改序号为i的制造类型的使用状态
  #--------------------------------------------------------------------------
  def set_cook_type(i, en)
    @cook_types.enable(en)
  end
  #--------------------------------------------------------------------------
  # ● 更改序号为i的食谱的使用状态
  #--------------------------------------------------------------------------
  def set_cookbook(i, en)
    @cookbooks.enable(en)
  end
  #--------------------------------------------------------------------------
  # ● 返回制造类型数目
  #--------------------------------------------------------------------------
  def cook_types_size
    return @cook_types.size
  end
  #--------------------------------------------------------------------------
  # ● 查询名称为n的制造类型的描述
  #--------------------------------------------------------------------------
  def cook_type_description(n)
    @cook_types.each do |x|
      return x.description if x.name == n
    end
    return ""
  end
end

#==============================================================================
# ■ Scene_Cook
#------------------------------------------------------------------------------
#  制造画面
#==============================================================================

class Scene_Cook < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    create_category_window
    create_cookbook_window
    create_description_window
    create_needs_window
  end
  #--------------------------------------------------------------------------
  # ● 生成分类窗口
  #--------------------------------------------------------------------------
  def create_category_window
    @category_window = Window_CookCategory.new
    @category_window.viewport = @viewport
    @category_window.y = 0
    @category_window.set_handler(:ok,     method(:on_category_ok))
    @category_window.set_handler(:cancel, method(:return_scene))
  end
  #--------------------------------------------------------------------------
  # ● 生成食谱窗口
  #--------------------------------------------------------------------------
  def create_cookbook_window
    wy = @category_window.height
    wh = Graphics.height - wy
    @item_window = Window_CookList.new(0, wy, Graphics.width*0.5 , wh)
    @item_window.viewport = @viewport
    @item_window.set_handler(:ok,     method(:on_item_ok))
    @item_window.set_handler(:cancel, method(:on_item_cancel))
    @category_window.item_window = @item_window
  end
  #--------------------------------------------------------------------------
  # ● 生成描述窗口
  #--------------------------------------------------------------------------
  def create_description_window
    wy = @category_window.height
    @help_window = Window_Description.new(Graphics.width*0.5, wy)
    @help_window.viewport = @viewport
    @item_window.help_window = @help_window
    @category_window.help_window = @help_window
  end
    #--------------------------------------------------------------------------
  # ● 生成材料窗口
  #--------------------------------------------------------------------------
  def create_needs_window
    wy = @category_window.height + @help_window.height
    wh = Graphics.height - wy
    @needs_window = Window_NeedsList.new(Graphics.width*0.5, wy, Graphics.width*0.5 , wh)
    #@item_window.viewport = @viewport
    @item_window.needs_window = @needs_window
   
  end
  #--------------------------------------------------------------------------
  # ● 分类“确定”
  #--------------------------------------------------------------------------
  def on_category_ok
    @item_window.activate
    @item_window.select_last
  end
  #--------------------------------------------------------------------------
  # ● 食谱“确定”
  #--------------------------------------------------------------------------
  def on_item_ok
    #$game_party.last_item.object = item
    cook
  end
  #--------------------------------------------------------------------------
  # ● 食谱“取消”
  #--------------------------------------------------------------------------
  def on_item_cancel
    @item_window.unselect
    @category_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 制造
  #--------------------------------------------------------------------------
  def cook
    if item.enough?
      play_se_for_item
      use_item
      @needs_window.refresh
      @item_window.refresh
      activate_item_window
    end
  end
  #--------------------------------------------------------------------------
  # ● 播放制作声效
  #--------------------------------------------------------------------------
  def play_se_for_item
    Sound.play_recovery
  end
  #--------------------------------------------------------------------------
  # ● 使用食谱
  #--------------------------------------------------------------------------
  def use_item
    #super
    #@item_window.redraw_current_item
    $data_items.each do |it|
      if it && !it.name.empty?
        $game_party.gain_item(it,-item.amount(it,0)) if item.resource?(it)
        $game_party.gain_item(it,item.amount(it,1)) if item.output?(it)
      end
    end
  end
end


#==============================================================================
# ■ Window_CookCategory
#------------------------------------------------------------------------------
#  制造画面中,显示制造类型的窗口。
#==============================================================================

class Window_CookCategory < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :item_window
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● 获取列数
  #--------------------------------------------------------------------------
  def col_max
    return $game_party.cook_types_size
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    #@item_window.category = current_symbol if @item_window
    @item_window.category = current_data[:name] if @item_window
  end
  #--------------------------------------------------------------------------
  # ● 生成制造列表
  #--------------------------------------------------------------------------
  def make_command_list
    $game_party.cook_types.each do |t|
      add_command(t.name, t.index, t.enabled)
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置制造列表窗口
  #--------------------------------------------------------------------------
  def item_window=(item_window)
    @item_window = item_window
    update
  end
  #--------------------------------------------------------------------------
  # ● 更新帮助内容
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text($game_party.cook_type_description(current_data[:name]))
  end
end

#==============================================================================
# ■ Window_CookList
#------------------------------------------------------------------------------
#  任务画面中,显示已获得任务的窗口。
#==============================================================================

class Window_CookList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :needs_window
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super
    @data = []
    @category = $game_party.cook_types_size > 0 ? $game_party.cook_types[0].name : nil
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 设置分类
  #--------------------------------------------------------------------------
  def category=(category)
    return if @category == category
    @category = category
    refresh
    self.oy = 0
  end
  #--------------------------------------------------------------------------
  # ● 设置材料窗口
  #--------------------------------------------------------------------------
  def needs_window=(needs_window)
    @needs_window = needs_window
    update
  end
  #--------------------------------------------------------------------------
  # ● 获取列数
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 获取项目数
  #--------------------------------------------------------------------------
  def item_max
    @data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # ● 获取食谱
  #--------------------------------------------------------------------------
  def item
    @data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # ● 获取选择食谱的有效状态
  #--------------------------------------------------------------------------
  def current_item_enabled?
    enable?(@data[index])
  end
  #--------------------------------------------------------------------------
  # ● 查询此食谱是否可用
  #--------------------------------------------------------------------------
  def enable?(item)
    item.enabled && item.enough?
  end
  #--------------------------------------------------------------------------
  # ● 生成食谱列表
  #--------------------------------------------------------------------------
  def make_item_list
    @data = $game_party.cookbooks(@category)
  end
  #--------------------------------------------------------------------------
  # ● 返回上一个选择的位置
  #--------------------------------------------------------------------------
  def select_last
    select(0)
  end
  #--------------------------------------------------------------------------
  # ● 绘制项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, enable?(item))
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制名称
  #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true, width = 300)
    return unless item
    text = item.name
    text += "[材料不足]" if !item.enough?
    change_color(normal_color, enabled)
    draw_text(x, y, width, line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 更新帮助内容
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_item(item)
  end
   #--------------------------------------------------------------------------
  # ● 更新食谱清单
  #--------------------------------------------------------------------------
  def update_needslist
    @needs_window.set_item(item)
  end
  #--------------------------------------------------------------------------
  # ● 调用帮助窗口的更新方法
  #--------------------------------------------------------------------------
  def call_update_help
    update_help if @help_window
    update_needslist if @needs_window
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    make_item_list
    create_contents
    draw_all_items
  end
end
#==============================================================================
# ■ Window_Description
#------------------------------------------------------------------------------
#  显示食谱的说明的窗口
#==============================================================================

class Window_Description < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, Graphics.width*0.5, fitting_height(4))
  end
  #--------------------------------------------------------------------------
  # ● 设置内容
  #--------------------------------------------------------------------------
  def set_text(text)
    if text != @text
      @text = text
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● 清除
  #--------------------------------------------------------------------------
  def clear
    set_text("")
  end
  #--------------------------------------------------------------------------
  # ● 设置食谱的介绍
  #--------------------------------------------------------------------------
  def set_item(item)
    set_text(item ? item.description : "")
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    draw_text_ex(4, 0, @text)
  end
end

#==============================================================================
# ■ Window_NeedsList
#------------------------------------------------------------------------------
#  制造画面中,显示食谱所需材料的窗口。
#==============================================================================

class Window_NeedsList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super
    @category = :item
    @cookbook = nil
    @data = []
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 获取列数
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 获取项目数
  #--------------------------------------------------------------------------
  def item_max
    @data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # ● 获取物品
  #--------------------------------------------------------------------------
  def item
    @data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # ● 查询列表中是否含有此物品
  #--------------------------------------------------------------------------
  def include?(item)
    item.is_a?(RPG::Item) && !item.key_item?
  end
  #--------------------------------------------------------------------------
  # ● 获取选择食谱的有效状态
  #--------------------------------------------------------------------------
  def current_item_enabled?
    enable?(@data[index])
  end
  #--------------------------------------------------------------------------
  # ● 查询此食谱是否可用
  #--------------------------------------------------------------------------
  def enable?(item)
    $game_party.usable?(item) && @cookbook.item_enough?(item)
  end
  #--------------------------------------------------------------------------
  # ● 生成物品列表
  #--------------------------------------------------------------------------
  def make_item_list
    @data = []
    return if @cookbook== nil
    tmp1 = []
    tmp2 = []
    $data_items.each do |item|
      tmp1.push([item, 0]) if item && !item.name.empty? && @cookbook.resource?(item)
      tmp2.push([item, 1]) if item && !item.name.empty? && @cookbook.output?(item)
    end
    if tmp1.size > 0 && tmp2.size > 0
      @data.push(["需要材料:",0])
      @data += tmp1
      @data.push(["可以获得:",1])
      @data += tmp2
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回上一个选择的位置
  #--------------------------------------------------------------------------
  def select_last
    select(0)
  end
  #--------------------------------------------------------------------------
  # ● 绘制项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      if item[0].is_a?(RPG::Item)
        draw_item_name(item, rect.x, rect.y, enable?(item[0]))
        draw_item_number(rect, item[0])
      else
        draw_input_output(item, rect.x, rect.y)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制物品名称
  #     enabled : 有效的标志。false 的时候使用半透明效果绘制
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true, width = 172)
    return unless item
    text = item[0].name + "*" + String(@cookbook.amount(item[0], item[1]))
    draw_icon(item[0].icon_index, x, y, enabled)
    change_color(normal_color, enable?(item[0]))
    draw_text(x + 24, y, width, line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 绘制输入和产出
  #--------------------------------------------------------------------------
  def draw_input_output(item, x, y, enabled = false, width = 172)
    return unless item
    if item[1] == 0
      text = "[需要]"
    else
      text = "[可以获得]"
    end
    change_color(normal_color, @cookbook.enough?)
    draw_text(x , y, width, line_height, text)
  end
  #--------------------------------------------------------------------------
  # ● 绘制物品个数
  #--------------------------------------------------------------------------
  def draw_item_number(rect, item)
    draw_text(rect, sprintf("现有%2d", $game_party.item_number(item)), 2)
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    make_item_list
    create_contents
    draw_all_items
  end
  #--------------------------------------------------------------------------
  # ● 设置食谱的材料
  #--------------------------------------------------------------------------
  def set_item(item)
    @cookbook = item
    refresh
  end
end

#==============================================================================
# 本腳本來自www.66RPG.com,使用和轉載請保留此信息
#==============================================================================


# add by Sion 2013.12.17
# 作者修改了原范例的菜单,但是在原系统脚本里改的。
# 整理出来写在这里, 不需要改菜单的同学把这些删掉就可以。
class Scene_Menu
  def command_cook
    SceneManager.call(Scene_Cook)
  end
  alias_method :s20131217_create_command_window, :create_command_window
  def create_command_window
    s20131217_create_command_window
    @command_window.set_handler(:cook, method(:command_cook))
  end
end
class Window_MenuCommand
  alias_method :s20131217_add_main_commands, :add_main_commands
  def add_main_commands
    s20131217_add_main_commands
    add_command("方技",   :cook,   main_commands_enabled)
  end
end[/pre]






方法:插入脚本后自己弄个数据库,按照游戏进程和脚本说明的方法添加制作方案。
最后新建NPC事件,编辑事件时翻到第三页最后,点击脚本,然后填入
[pre lang="ruby"]SceneManager.call(Scene_Cook)[/pre]
这样一个制造物品的NPC就完成了,如果不需要菜单有选项直接进入的话就删除原本脚本之中的
[pre lang="ruby"]class Window_MenuCommand
  alias_method :s20131217_add_main_commands, :add_main_commands
  def add_main_commands
    s20131217_add_main_commands
    add_command("方技",   :cook,   main_commands_enabled)
  end
end[/pre]
这样菜单就应该不会显示了

如果说是使用某物品制作的话,那么就是新建一个物品
仅菜单使用不消耗(除非作者您需要,改成消耗)无适用范围
效果是直接在右边公式下方的空栏处双击执行公共事件
公共事件里也就是一个脚本
[pre lang="ruby"]SceneManager.call(Scene_Cook)[/pre]
就可以了

当然,如果NPC有几个又嫌麻烦的话,直接每个NPC执行上面那个公共事件就可以了
另外:添加方案什么的都是脚本,事件里面执行脚本


脚本很好用,用着用着就熟悉了
祝制作过程愉快!

支持《彼岸之光》系列!加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部