设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2734|回复: 9
打印 上一主题 下一主题

[RMXP发布] 不公开配方的合成系统二度加强版本

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

跳转到指定楼层
1
发表于 2013-6-10 08:33:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 feizhaodan 于 2013-6-13 09:58 编辑
首先感谢@精灵使者 的帮助···解决了一个伪BUG,接着给图(其实界面没改和原版图看不出差别),主要说下更新吧,仿照一些网游增加了合成失败或者成功时带来的额外产物,而且现在可以通过合成控制变量与开关(合成成功才行)
  1. =begin
  2. ==============================================================================
  3. ★ Item_Transmute
  4. ------------------------------------------------------------------------------
  5.   配方不公开的物品合成(加强版)
  6.   原作者 Summoner
  7.   By Chd114
  8. ------------------------------------------------------------------------------
  9.   注:该脚本具有至高权威性,可以覆盖任何此脚本的前身脚本!
  10.   注:此脚本无视魔法免疫!
  11.   注:使用此脚本时,处于无敌状态!
  12. ==============================================================================
  13. 本脚本以知识共享署名-非商业性使用 3.0 Unported 许可协议进行许可。
  14. 详见 http://creativecommons.org/licenses/by-nc/3.0/
  15. ==============================================================================
  16. 原作者的话:  
  17. 这是一个配方不公开的物品合成,也就是说什么材料可以合成什么物品玩家在
  18. 游戏中的合成界面是不能直接看到的。由于物品的合成配方不是公开的,所以
  19. 玩家需要通过自己探索或从NPC处得到合成配方(当然看攻略也是一种可能)
  20. 例如M&M中的配药水,Diablo II的盒子,NWV中的铁匠铺、Wizard Lab……
  21. 可扩展性:可以加强、扩展的东西应该很多。
  22. 例如:合成需要花费GP、SP甚至XP,合成需要特定器具,合成失败受到伤害,
  23. 某些物品的几率合成、物品图鉴等等。
  24. 有的东西已经注释清楚了,搞懂原理的话,根据自己需要改起来也不会很麻烦。
  25. 个人一下子没时间实现这些,欢迎大家多多修改分享。

  26. Chd114的话(2013年6月9日 11:45:40):
  27. 其实这个脚本的改进思路早在去年此脚本出来之前就有想法了···只不过那个
  28. 时候本人的技术还差了一点所以就没有盲目去弄今天(2013年6月9日 9:33:40)
  29. 花了2小时左右的时间鼓捣了下最后把大部分东西都弄好了

  30. Chd114的话(2013年6月10日 7:59:49):
  31. 吃饭前来了新的灵感,于是就在吃完饭后鼓捣了下下···现在一个配方里的每一种成
  32. 功额外产物和失败额外产物都可以设定独立的出现概率了,而且还加了新功能,
  33. 可以控制开关与变量!(2013年6月10日 8:28:03)

  34. 此脚本冲突可能性:与装备耐久度、随即装备属性之类会导致装备具有独立性的
  35. 脚本功能冲突,其他脚本基本上不冲突

  36. 使用方法:在事件中使用脚本$scene = Scene_Compose.new,然后等待2帧
  37. ==============================================================================
  38. 若合成失败(无匹配的配方、因合成概率低而失败)物品是否失去
  39. =end
  40. $Ingredient_Lost_When_Fail = true#false
  41. # 合成成功/失败SE  
  42. # 若不使用SE请设置为“""”(不含外引号)
  43. $SE_Compose_Successful = ""  
  44. $SE_Compose_Failed = ""
  45.   
  46. #=============================================================================
  47. # ■ 配方及补充的定义
  48. #-----------------------------------------------------------------------------
  49. # Game_System
  50. #=============================================================================
  51. class Game_System
  52.   attr_accessor :formulas
  53.   attr_accessor :products
  54.   attr_accessor :sproducts
  55.   attr_accessor :fproducts
  56.   attr_accessor :other
  57.   attr_accessor :probability
  58.   alias formulas_initialize initialize  
  59.   def initialize  
  60.     formulas_initialize
  61.     @formulas = []  
  62.     @products = []
  63.     @sproducts = []
  64.     @fproducts = []
  65.     @other = []
  66.     @probability = []
  67. =begin
  68. ===========================配方表===========================================   

  69.   配方格式
  70.   @formulas[i] = [[材料种类,材料编号,数量],[材料种类,材料编号,数量]……]                  
  71.   @products[i] = [[成品种类,成品编号,数量],[成品种类,成品编号,数量]……]
  72.   @sproducts[i] = [[成功额外产物种类,编号,数量,出现概率],[成功额外产物种类,编号,数量,出现概率]]
  73.   @fproducts[i] = [[失败额外产物种类,编号,数量,出现概率],[失败额外产物种类,编号,数量,出现概率]]
  74.   @other[i] = [[开关/变量,开关/变量编号,控制系数],[开关/变量,开关/变量编号,控制系数]]
  75.   @probability[i] = 合成成功率
  76.   种类:物品 0 武器 1 防具 2
  77.   1.如果有两个配方材料相同,理论上会按编号较小的处理
  78.   2.配方材料的顺序与合成是无关的(当然如果你想改成有关肯定也不会太麻烦)
  79.   3.允许某个材料拆成多件成品(可能就不叫物品合成,应该叫物品分解了)
  80.   4.产物数量神马的理论上你可以无限写,只要你不怕麻烦加手抽筋。
  81.   5.暂时不支持多步合并为一步的合成  
  82.     例如 A + B = C,C + D = E,如果不存在A + B + D = E的配方
  83.     A + B + D无法合成 E
  84.   6.暂时不支持将配方逆向使用(本功能会尝试完善)
  85.     例如 A + B = C,C = A + B,如果不存在C = A + B的配方
  86.     C无法拆解成A + B
  87.   7.暂时不支持花费金钱的合成与配方学习(本功能会尝试完善)
  88.     例如A + B = C,作者设定成合成此配方的成品需要花费5000金币之类的
  89.   8.成功额外产物出现的概率与失败额外产物出现的概率会导致所有成功额外
  90.   产物或所有失败额外产物同时出现,比如失败额外产物有大药膏和艾西非远
  91.   古祭祀,则在合成失败后若出现失败的额外产物时同时出现大药膏和艾西非
  92.   远古祭祀。
  93.   9.成功额外产物和失败额外产物的设定和配方材料、配方成品设定格式是一致的。
  94.   10.@other[i]里面控制开关与变量,当[开关/变量,开关/变量编号,控制系数]
  95.   里面的[开关/变量]为0时是改变开关,改变开关的时候若控制系数为0则是关闭,
  96.   1就是打开,当[开关/变量]为1时是改变变量,这个时候控制系数可以添任意正负
  97.   整数。
  98.   11.当你要改变开关状态时控制系数只能是1或0
  99.   12.不需要的功能全部数字写0即可
  100.   13.只有合成/拆分成功时才能改变开关与变量
  101.   14.已经打开的开关依然可以用合成/拆分操作重复打开

  102. =end
  103.     #初始化模板
  104.     @formulas[0] = []
  105.     @products[0] = []
  106.     @sproducts[0] = []
  107.     @fproducts[0] = []
  108.     @other[0] = []
  109.     @probability[0] = []
  110.     #这个才是样例!!!
  111.     @formulas[1] = [[1,1,1]]         
  112.     @products[1] = [[2,29,1]]
  113.     @sproducts[1] = [[1,2,1,50],[1,3,1,100]]
  114.     @fproducts[1] = [[0,2,1,50],[0,3,3,100]]
  115.     @other[1] = [[0,10,1],[1,20,2]]#10号开关打开,20号变量+2
  116.     @probability[1] = 100
  117.   end  
  118. end
  119.   
  120. class Game_Temp  
  121.   attr_accessor :forge
  122.   alias forge_item_initialize initialize  
  123.   def initialize  
  124.     forge_item_initialize
  125.     # 定义合成窗口中的物品储存区
  126.     [url=home.php?mod=space&uid=14254]@Forge[/url] = []  
  127.   end  
  128. end
  129.   
  130. #==============================================================================
  131. # ■ Window_ForgeCommand
  132. #------------------------------------------------------------------------------
  133. #  合成画面、选择要做的事的窗口
  134. #==============================================================================
  135.   
  136. class Window_ComposeCommand < Window_Selectable
  137.   #--------------------------------------------------------------------------
  138.   # ● 初始化对像
  139.   #--------------------------------------------------------------------------
  140.   def initialize
  141.     super(0, 64, 640, 64)
  142.     self.contents = Bitmap.new(width - 32, height - 32)
  143.     @item_max = 4
  144.     @column_max = 4
  145.     @commands = ["更改材料", "合成", "放弃合成", "离开"]
  146.     refresh
  147.     self.index = 0
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 刷新
  151.   #--------------------------------------------------------------------------
  152.   def refresh
  153.     self.contents.clear
  154.     for i in 0...@item_max
  155.       draw_item(i)
  156.     end
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 描绘项目
  160.   #     index : 项目编号
  161.   #--------------------------------------------------------------------------
  162.   def draw_item(index)
  163.     x = 4 + index * 160
  164.     self.contents.draw_text(x, 0, 128, 32, @commands[index])
  165.   end
  166. end
  167.   
  168. #==============================================================================
  169. # ■ Window_ForgeLeft
  170. #------------------------------------------------------------------------------
  171. #  合成画面中显示拥有的物品的窗口
  172. #==============================================================================
  173.   
  174. class Window_ComposeLeft < Window_Selectable
  175.   #--------------------------------------------------------------------------
  176.   # ● 初始化对像
  177.   #--------------------------------------------------------------------------
  178.   def initialize
  179.     super(0, 128, 320, 352)
  180.     @column_max = 1
  181.     refresh
  182.     self.index = 0
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 获取物品
  186.   #--------------------------------------------------------------------------
  187.   def item
  188.     return @data[self.index]
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 刷新
  192.   #--------------------------------------------------------------------------
  193.   def refresh
  194.     if self.contents != nil
  195.       self.contents.dispose
  196.       self.contents = nil
  197.     end
  198.     self.update_cursor_rect
  199.     @data = []
  200.     for i in 1...$data_items.size
  201.       if $game_party.item_number(i) > 0
  202.         @data.push($data_items[i])
  203.       end
  204.     end
  205.     for i in 1...$data_weapons.size
  206.       if $game_party.weapon_number(i) > 0
  207.         @data.push($data_weapons[i])
  208.       end
  209.     end
  210.     for i in 1...$data_armors.size
  211.       if $game_party.armor_number(i) > 0
  212.         @data.push($data_armors[i])
  213.       end
  214.     end
  215.     # 如果项目数不是 0 就生成位图、描绘全部项目
  216.     @item_max = @data.size
  217.     if @item_max > 0
  218.       self.contents = Bitmap.new(width - 32, row_max * 32)
  219.       for i in 0...@item_max
  220.         draw_item(i)
  221.       end
  222.     end
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 描绘项目
  226.   #     index : 项目标号
  227.   #--------------------------------------------------------------------------
  228.   def draw_item(index)
  229.     item = @data[index]
  230.     case item
  231.     when RPG::Item
  232.       number = $game_party.item_number(item.id)
  233.     when RPG::Weapon
  234.       number = $game_party.weapon_number(item.id)
  235.     when RPG::Armor
  236.       number = $game_party.armor_number(item.id)
  237.     end
  238.     self.contents.font.color = text_color(item.name_color_66RPG)
  239.     x = 4
  240.     y = index * 32
  241.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  242.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  243.     bitmap = RPG::Cache.icon(item.icon_name)
  244.     opacity = self.contents.font.color == text_color(item.name_color_66RPG) ? 255 : 128
  245.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 32, 32), opacity)
  246.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  247.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  248.     self.contents.draw_text(x + 256, y, 32, 32, number.to_s, 2)
  249.   end
  250.   #--------------------------------------------------------------------------
  251.   # ● 刷新帮助文本
  252.   #--------------------------------------------------------------------------
  253.   def update_help
  254.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  255.   end
  256. end
  257.   
  258. #==============================================================================
  259. # ■ Window_ForgeRight
  260. #------------------------------------------------------------------------------
  261. #  合成画面中的合成区窗口
  262. #==============================================================================
  263.   
  264. class Window_ComposeRight < Window_Selectable
  265.   attr_accessor :forge_item
  266.   #--------------------------------------------------------------------------
  267.   # ● 初始化对像
  268.   #--------------------------------------------------------------------------
  269.   def initialize(forge_item)
  270.     super(320, 128, 320, 352)
  271.     @column_max = 1
  272.     @forge_item = []
  273.     refresh
  274.     self.index = 0
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 获取物品
  278.   #--------------------------------------------------------------------------
  279.   def item
  280.     return @data[self.index]
  281.   end
  282.   #--------------------------------------------------------------------------  
  283.   # ● 获取物品  
  284.   #--------------------------------------------------------------------------  
  285.   def item_number  
  286.     return @data_number[self.index]  
  287.   end  
  288.   #--------------------------------------------------------------------------
  289.   # ● 刷新
  290.   #--------------------------------------------------------------------------
  291.   def refresh
  292.     if self.contents != nil
  293.       self.contents.dispose
  294.       self.contents = nil
  295.     end
  296.     @data = []
  297.     @data_number = []  
  298.     @forge_item = $game_temp.forge
  299.     for item_forge in @forge_item
  300.       case item_forge[0]
  301.       when 0
  302.         item = $data_items[item_forge[1]]
  303.       when 1
  304.         item = $data_weapons[item_forge[1]]
  305.       when 2
  306.         item = $data_armors[item_forge[1]]
  307.       end
  308.       if (item != nil) and (item_forge[2] != 0)  
  309.         @data.push(item)  
  310.         @data_number.push(item_forge[2])  
  311.       else  
  312.         @data.delete(item)  
  313.       end  
  314.     end
  315.     # 如果项目数不是 0 就生成位图、描绘全部项目
  316.     @item_max = @data.size
  317.     if @item_max > 0
  318.       self.contents = Bitmap.new(width - 32, row_max * 32)
  319.       for i in 0...@item_max
  320.         draw_item(i)
  321.       end
  322.     end
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 描绘项目
  326.   #     index : 项目标号
  327.   #--------------------------------------------------------------------------
  328.   def draw_item(index)
  329.     item = @data[index]
  330.     case item
  331.     when RPG::Item
  332.       number = $game_temp.forge[index][2]
  333.     when RPG::Weapon
  334.       number = $game_temp.forge[index][2]
  335.     when RPG::Armor
  336.       number = $game_temp.forge[index][2]
  337.     end
  338.     self.contents.font.color = text_color(item.name_color_66RPG)
  339.     x = 4
  340.     y = index * 32
  341.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  342.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  343.     bitmap = RPG::Cache.icon(item.icon_name)
  344.     opacity = self.contents.font.color == text_color(item.name_color_66RPG) ? 255 : 128
  345.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 32, 32), opacity)
  346.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  347.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  348.     self.contents.draw_text(x + 256, y, 32, 32, number.to_s, 2)
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # ● 刷新帮助文本
  352.   #--------------------------------------------------------------------------
  353.   def update_help
  354.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  355.   end
  356. end
  357.   
  358. #==============================================================================
  359. # ■ Scene_Compose
  360. #------------------------------------------------------------------------------
  361. #  处理物品合成画面的类
  362. #==============================================================================
  363.   
  364. class Scene_Compose
  365. #--------------------------------------------------------------------------
  366. # ● 初始化
  367. #--------------------------------------------------------------------------
  368. def initialize
  369.    # 生成帮助窗口
  370.    @help_window = Window_Help.new
  371.    # 生成命令窗口
  372.    @command_window = Window_ComposeCommand.new
  373.    @command_window.active = false
  374.    # 生成左方窗口
  375.    @item_window = Window_ComposeLeft.new
  376.    @item_window.active = true
  377.    @item_window.help_window = @help_window
  378.    # 生成右方窗口
  379.    @forge_window = Window_ComposeRight.new([])
  380.    @forge_window.active = false
  381.    @forge_window.help_window = @help_window
  382.    # 初始化配方与合成区
  383.    @formulas = $game_system.formulas
  384.    @products = $game_system.products
  385.    @sproducts = $game_system.sproducts
  386.    @fproducts = $game_system.fproducts
  387.    @other = $game_system.other
  388.    @probability = $game_system.probability
  389.    [url=home.php?mod=space&uid=14254]@Forge[/url] = []
  390.    @products_temp = []  
  391.    @sproducts_temp = []
  392.    @fproducts_temp = []
  393.    @other_temp = []
  394.    @probability_temp = []
  395. end
  396.   #--------------------------------------------------------------------------
  397.   # ● 主处理
  398.   #--------------------------------------------------------------------------
  399. def main
  400.    # 执行过渡
  401.    Graphics.transition
  402.    # 主循环
  403.    loop do
  404.      # 刷新游戏画面
  405.      Graphics.update
  406.      # 刷新输入情报
  407.      Input.update
  408.      # 刷新画面
  409.      update
  410.      # 如果画面被切换的话就中断循环
  411.      if $scene != self
  412.        break
  413.      end
  414.    end
  415.    # 准备过渡
  416.    Graphics.freeze
  417.    # 释放窗口
  418.    @help_window.dispose
  419.    @command_window.dispose
  420.    @item_window.dispose
  421.    @forge_window.dispose
  422. end
  423.   #--------------------------------------------------------------------------
  424.   # ● 刷新画面
  425.   #--------------------------------------------------------------------------  
  426. def update
  427.    @help_window.update
  428.    @command_window.update
  429.    @item_window.update
  430.    @forge_window.update
  431.    if @command_window.active
  432.      update_command
  433.      return
  434.    end
  435.    if @item_window.active
  436.      update_item
  437.      return
  438.    end
  439.    if @forge_window.active
  440.      update_forge
  441.      return
  442.    end
  443.     return
  444. end
  445.   #--------------------------------------------------------------------------
  446.   # ● 刷新画面(指令窗口激活的情况下)
  447.   #--------------------------------------------------------------------------
  448.   def update_command
  449.     # 按下 B 键的情况下
  450.     if Input.trigger?(Input::B)
  451.       # 演奏取消 SE
  452.       $game_system.se_play($data_system.cancel_se)
  453.       abort
  454.       # 切换到地图画面
  455.       $scene = Scene_Map.new
  456.       return
  457.     end
  458.      # 按下 C 键的情况下
  459.     if Input.trigger?(Input::C)
  460.       # 命令窗口光标位置分支
  461.       case @command_window.index
  462.       when 0  # 更改材料
  463.         # 演奏确定 SE
  464.         $game_system.se_play($data_system.decision_se)
  465.         # 窗口状态转向物品窗口
  466.         @command_window.active = false
  467.         @item_window.active = true
  468.         @forge_window.active = false
  469.       when 1  # 合成
  470.         # 演奏确定 SE
  471.         $game_system.se_play($data_system.decision_se)
  472.         # 执行合成命令
  473.         if $game_temp.forge != []
  474.           compose
  475.         end
  476.       when 2  # 放弃合成
  477.         # 演奏确定 SE
  478.         $game_system.se_play($data_system.decision_se)
  479.         # 放弃合成
  480.         abort
  481.       when 3  # 离开
  482.         # 演奏确定 SE
  483.         $game_system.se_play($data_system.decision_se)
  484.         # 放弃合成
  485.         abort
  486.         # 切换到地图画面
  487.         $scene = Scene_Map.new
  488.       end
  489.       return
  490.     end
  491.   end
  492.   #--------------------------------------------------------------------------
  493.   # ● 刷新画面(物品窗口激活的情况下)
  494.   #--------------------------------------------------------------------------
  495.   def update_item
  496.      # 按下 B 键的情况下
  497.     if Input.trigger?(Input::B)
  498.       # 演奏取消 SE
  499.       $game_system.se_play($data_system.cancel_se)
  500.       # 切换到指令窗口
  501.       @item_window.active = false
  502.       @command_window.active = true
  503.       @help_window.set_text("")
  504.       return
  505.     end
  506.      # 按下 C 键的情况
  507.     if Input.trigger?(Input::C)
  508.       # 演奏确定 SE
  509.       $game_system.se_play($data_system.decision_se)
  510.       # 获取物品
  511.       @item = @item_window.item
  512.       # 获取物品的所持数
  513.       case @item
  514.       when RPG::Item
  515.         number = $game_party.item_number(@item.id)
  516.         typetemp = 0
  517.       when RPG::Weapon
  518.         number = $game_party.weapon_number(@item.id)
  519.         typetemp = 1
  520.       when RPG::Armor
  521.         number = $game_party.armor_number(@item.id)
  522.         typetemp = 2
  523.       end
  524.       if number != nil
  525.         # 更改合成窗口的物品
  526.         case @item
  527.         when RPG::Item
  528.           $game_party.lose_item(@item.id, 1)
  529.         when RPG::Weapon
  530.           $game_party.lose_weapon(@item.id, 1)
  531.         when RPG::Armor
  532.           $game_party.lose_armor(@item.id, 1)
  533.         end
  534.         forge_change(typetemp, @item.id, 1)
  535.         # 刷新各窗口
  536.         @item_window.update
  537.         @help_window.update
  538.         @forge_window.update
  539.         @item_window.refresh
  540.         @forge_window.refresh
  541.       end
  542.     end
  543.      # 按下 右方向键 的情况
  544.     if Input.trigger?(Input::RIGHT)
  545.       # 切换到合成窗口
  546.       @item_window.active = false
  547.       @forge_window.active = true
  548.     end
  549.   end
  550.   #--------------------------------------------------------------------------
  551.   # ● 刷新画面(合成窗口激活的情况下)
  552.   #--------------------------------------------------------------------------
  553.   def update_forge
  554.      # 按下 B 键的情况下
  555.     if Input.trigger?(Input::B)
  556.       # 演奏取消 SE
  557.       $game_system.se_play($data_system.cancel_se)
  558.       # 切换到指令窗口
  559.       @forge_window.active = false
  560.       @command_window.active = true
  561.       @help_window.set_text("")
  562.       return
  563.     end
  564.      # 按下 C 键的情况
  565.     if Input.trigger?(Input::C)
  566.      # 演奏确定 SE
  567.      $game_system.se_play($data_system.decision_se)
  568.      # 获取物品
  569.       @item = @forge_window.item
  570.       # 获取物品的所持数
  571.       case @item
  572.       when RPG::Item
  573.         number = @forge_window.item_number
  574.         typetemp = 0
  575.       when RPG::Weapon
  576.         number = @forge_window.item_number
  577.         typetemp = 1
  578.       when RPG::Armor
  579.         number = @forge_window.item_number
  580.         typetemp = 2
  581.       end
  582.      if number != nil
  583.        # 更改合成窗口的物品
  584.        case @item
  585.        when RPG::Item
  586.          $game_party.gain_item(@item.id, 1)
  587.        when RPG::Weapon
  588.          $game_party.gain_weapon(@item.id, 1)
  589.        when RPG::Armor
  590.          $game_party.gain_armor(@item.id, 1)
  591.        end
  592.        #p number
  593.        forge_change(typetemp, @item.id, -1)
  594.        # 刷新各窗口
  595.        @item_window.refresh
  596.        @forge_window.refresh
  597.        @help_window.update
  598.        @item_window.update
  599.        @forge_window.update
  600.       end
  601.     end
  602.        # 按下 左方向键 的情况下
  603.     if Input.trigger?(Input::LEFT)
  604.       # 切换到合成窗口
  605.       @forge_window.active = false
  606.       @item_window.active = true
  607.     end
  608.   end
  609.   #--------------------------------------------------------------------------
  610.   # ● 更改合成窗口物品
  611.   #--------------------------------------------------------------------------
  612.   def forge_change(type,id,number)  
  613.      quantity = number  
  614.      for item in $game_temp.forge
  615.        if (item[0]==type) and (item[1]==id)  
  616.          item[2] = [item[2] += quantity,99].min  
  617.          if item[2] == 0  
  618.            $game_temp.forge.delete(item)  
  619.          end
  620.          return  
  621.        end  
  622.      end  
  623.      $game_temp.forge.push([type,id,number])  
  624.   end  
  625.   #--------------------------------------------------------------------------
  626.   # ● 放弃合成
  627.   #--------------------------------------------------------------------------  
  628.   def abort
  629.     # 将合成窗口中的物品转移至物品窗口中
  630.     for item in $game_temp.forge
  631.       # 判断物品类型并归还
  632.       case item[0]
  633.       when 0
  634.         $game_party.gain_item(item[1], item[2])
  635.       when 1
  636.         $game_party.gain_weapon(item[1], item[2])
  637.       when 2
  638.         $game_party.gain_armor(item[1], item[2])
  639.       end
  640.     end
  641.     $game_temp.forge = []
  642.     # 刷新各窗口
  643.     @item_window.refresh
  644.     @forge_window.refresh
  645.   end
  646.   #--------------------------------------------------------------------------
  647.   # ● 检测是否有符合的配方
  648.   #--------------------------------------------------------------------------
  649. def match
  650.    match_one = false
  651.    match_this = false
  652.     # 检测每一个配方
  653.    for i in [email protected]
  654.      # 将合成窗口中的物品复制到合成缓存区
  655.      # 注意: 直接使用"="将传引用 导致检测配方是否匹配时合成窗口中物品被删除
  656.      [url=home.php?mod=space&uid=14254]@Forge[/url] = $game_temp.forge.dup
  657.      # 检测这个配方中每一项材料
  658.      for ingredient in @formulas[i]
  659.        match_this = true
  660.        # 合成区中没有此项材料的情况
  661.        unless @forge.include?(ingredient)
  662.          match_this = false
  663.          break
  664.        end
  665.        # 从合成区中暂时删除这项材料
  666.        @forge.delete(ingredient)
  667.      end
  668.      if match_this == false
  669.        next
  670.      end
  671.      # 检测合成区中是否还有配方外的材料剩余
  672.      unless [url=home.php?mod=space&uid=14254]@Forge[/url] == []
  673.        match_this = false
  674.      end
  675.      # 满足这一个配方的情况
  676.      if match_this == true
  677.        match_one = true
  678.        # 获取配方的成品、成功额外产物、失败额外产物、合成各种概率
  679.        @products_temp = @products[i]
  680.        @sproducts_temp = @sproducts[i]
  681.        @fproducts_temp = @fproducts[i]
  682.        @other_temp = @other[i]
  683.        @probability_temp = @probability[i]
  684.        $g=i
  685.        break
  686.      end
  687.    end
  688.    return match_one
  689. end
  690.   #--------------------------------------------------------------------------
  691.   # ● 合成
  692.   #--------------------------------------------------------------------------
  693. def compose
  694.    # 如果有符合的配方
  695.    if match
  696.      # 将合成窗口中的材料改变为成品
  697.      $game_temp.forge = []
  698.      if @probability_temp==100
  699.        @pro1=0#当成功率为100%时随机概率是0
  700.      else
  701.        @pro1=rand(99)#当成功率不为100%时随即概率为0-99
  702.      end
  703.      if @pro1<@probability_temp
  704.        for i in 0...@other_temp.size
  705.          if @other_temp[i][1]!=0
  706.            if @other_temp[i][0]==0
  707.              $game_switches[@other_temp[i][1]]=@other_temp[i][2]#控制开关
  708.            else
  709.              $game_variables[@other_temp[i][1]]+=@other_temp[i][2]#控制变量
  710.            end
  711.          end
  712.          $game_map.need_refresh = true#强制刷新地图
  713.        end
  714.        for i in 0...@products_temp.size
  715.          forge_change(@products_temp[i][0], @products_temp[i][1], @products_temp[i][2])
  716.        end
  717.        for i in 0...@sproducts_temp.size
  718.          if @sproducts_temp[i][3]==100
  719.            @pro2=0#成功额外产率为100%时随即概率为0
  720.          elsif @sproducts_temp[i][3]<100
  721.            @pro2=rand(99)#成功额外产率为0-99%时随即概率为0-99%
  722.          else
  723.            @pro2=0#成功额外产率为0%时没有成功额外产物
  724.          end
  725.          if @pro2<@sproducts_temp[i][3]
  726.            forge_change(@sproducts_temp[i][0], @sproducts_temp[i][1], @sproducts_temp[i][2])
  727.          end
  728.        end  
  729.      else
  730.        for i in 0...@fproducts_temp.size
  731.          if @fproducts_temp[i][3]==100
  732.            @pro3=0#成功额外产率为100%时随即概率为0
  733.          elsif @fproducts_temp[i][3]<100
  734.            @pro3=rand(99)#成功额外产率为0-99%时随即概率为0-99%
  735.          else
  736.            @pro3=0#成功额外产率为0%时没有成功额外产物
  737.          end
  738.          if @pro3<@fproducts_temp[i][3]
  739.            forge_change(@fproducts_temp[i][0], @fproducts_temp[i][1], @fproducts_temp[i][2])
  740.          end
  741.        end
  742.      end
  743.      if $SE_Compose_Successful != ""
  744.        Audio.se_play($SE_Compose_Successful)
  745.      end
  746.    # 合成失败的情况
  747.    else  
  748.      if $SE_Compose_Failed != ""
  749.        Audio.se_play($SE_Compose_Failed)
  750.      end
  751.      if $Ingredient_Lost_When_Fail
  752.        $game_temp.forge = []
  753.      end
  754.    end
  755.     # 刷新各窗口
  756.    @item_window.refresh
  757.    @forge_window.refresh
  758. end
  759. end
复制代码

评分

参与人数 1星屑 +80 收起 理由
feizhaodan + 80 奖赏条例-滥用分类惩罚

查看全部评分

[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

2
 楼主| 发表于 2013-6-10 08:37:09 | 只看该作者
如果你的配方不需要控制开关和变量只需要把写开关和变量编号的那个数写成0就行,比如
  1. @other[1] = [[0,10,1],[1,20,2]]#10号开关打开,20号变量+2
复制代码
改成
  1. @other[1] = [[0,0,1],[1,0,2]]
复制代码
即可,额外产物不需要只需要把出现概率写0即可
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
84 小时
注册时间
2013-4-19
帖子
35
3
发表于 2013-6-10 20:25:51 | 只看该作者
{:2_287:}用了你的第一版,请问可不可以弄个分支,比如放入三个回复剂可以合成一个大回复剂。如果放入六个回复剂却不能直接合成两个大回复剂,对于要大量合成的东西来说,一次次添加似乎有点麻烦。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

4
 楼主| 发表于 2013-6-10 21:11:41 | 只看该作者
jinae 发表于 2013-6-10 20:25
用了你的第一版,请问可不可以弄个分支,比如放入三个回复剂可以合成一个大回复剂。如果放入六个 ...

的确,其实你说的批量合成跟这个脚本无法把多步合成弄成一步是一样的道理···关键在于持有的那个配方的一组材料要超过然后才能设定批量神马的···还有就是循环的问题
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
84 小时
注册时间
2013-4-19
帖子
35
5
发表于 2013-6-10 23:48:33 | 只看该作者
chd114 发表于 2013-6-10 21:11
的确,其实你说的批量合成跟这个脚本无法把多步合成弄成一步是一样的道理···关键在于持有的那个配方的 ...

似乎是挺麻烦的,有点小遗憾。个人蛮喜欢这个功能的。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

6
 楼主| 发表于 2013-6-11 06:36:43 | 只看该作者
jinae 发表于 2013-6-10 23:48
似乎是挺麻烦的,有点小遗憾。个人蛮喜欢这个功能的。

还有一个麻烦的地方是有时候你设定配方如果有回复药剂*3=大药膏、回复药剂*6=魔瓶的话做批量很可能会导致系统崩溃,因为判断不了成品
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
84 小时
注册时间
2013-4-19
帖子
35
7
发表于 2013-6-11 23:23:50 | 只看该作者
chd114 发表于 2013-6-11 06:36
还有一个麻烦的地方是有时候你设定配方如果有回复药剂*3=大药膏、回复药剂*6=魔瓶的话做批量很可能会导致 ...

不管怎样,都要对做出脚本奉献给大家使用的好人表示敬意。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

8
 楼主| 发表于 2013-6-12 12:28:29 | 只看该作者
jinae 发表于 2013-6-11 23:23
不管怎样,都要对做出脚本奉献给大家使用的好人表示敬意。

这个合成系统最大的两个缺陷就是不能把多步合成变成一个、不能批量合成,就这样···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
帖子
3039

贵宾

9
发表于 2013-6-14 17:16:47 | 只看该作者
在这里明说一下,修改他人的脚本需要原作者的同意才可以在新帖内发布,并且不要每次更新都发新帖。
在这里警告一次,若再次发现就不会手软了。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

10
 楼主| 发表于 2013-6-15 11:29:06 | 只看该作者
feizhaodan 发表于 2013-6-14 17:16
在这里明说一下,修改他人的脚本需要原作者的同意才可以在新帖内发布,并且不要每次更新都发新帖。
在这里 ...

原作者发布时就是同意的···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-6 10:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表