赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 2 |
经验 | 0 |
最后登录 | 2023-12-31 |
在线时间 | 20 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 160
- 在线时间
- 20 小时
- 注册时间
- 2021-11-16
- 帖子
- 15
|
3楼
楼主 |
发表于 2023-12-27 18:39:58
|
只看该作者
- #打开脚本编辑器,将“物品制造1”“物品制造2”脚本插入到main上。
- #encoding:utf-8
- #==============================================================================
- # 本腳本來自www.66RPG.com,使用和轉載請保留此信息
- #==============================================================================
- #==============================================================================
- #使用说明:
- #每添加一个制造的类型,最上面的类别菜单就会多一项。
- #
- #添加类型的方法是运行:
- #$game_party.add_cook_type("合成","合成药品", true)
- #$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[i].enable(en)
- end
- #--------------------------------------------------------------------------
- # ● 更改序号为i的食谱的使用状态
- #--------------------------------------------------------------------------
- def set_cookbook(i, en)
- @cookbooks[i].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
复制代码 |
|