Project1

标题: 菜鸟版绿色装备耐久系统 [打印本页]

作者: 灯笼菜刀王    时间: 2018-4-5 02:52
标题: 菜鸟版绿色装备耐久系统
本帖最后由 灯笼菜刀王 于 2018-4-7 16:30 编辑

之所以叫"绿色"是因为我没用到热门地盘description... 这年头XP数据库地皮紧张, 能不用它就不用了XD

支持 持有复数同类型装备,支持装备丢包裹也能保存耐久,支持每个人的装备都独立耐久

设置:价格的前两位是 耐久度, 价格的后4位是价格 千万数着来别设置错,   你说这样装备贬值了?  为了不通货膨胀, 市面流通的货币还是能少则少吧

耐久设置为99 就是无限耐久

然后做N件同名字的装备,N为允许所持同类型装备的数量, 注意所持有是包括全员装备上的也算

超过的话,再次获得会直接消失 ,商店超过数量就不让你买了

冲突 ,不太清楚 应该或许可能也许说不定大概maybe 可以和那些用到description的一起用{:4_86:}



  不好意思,之前的有BUG, 粗心造成的, 已经更新脚本和范例(2018,4,6), 经几次测试确认没问题了......

RUBY 代码复制
  1. # 菜鸟版耐久度系统  by 灯笼菜刀酱
  2. #
  3. # 设置:价格的前两位是 耐久度, 价格的后4位是价格 千万数着来别设置错 =v= ....
  4. #  耐久设置为99 就是无限耐久
  5. #
  6. # 然后做N件同名字的装备,N为允许所持同类型装备的数量,超过的话,再次获得会
  7. # 直接消失@_@,商店超过数量就不让你买了
  8. #
  9. # 获取武器的方法: $game_party.入手("铁剑") 记得双引号别丢
  10. # 获取防具的方法: $game_party.入手("帽子",1)
  11. # 丢弃武器的方法: $game_party.丢弃("铁剑")
  12. # 丢弃防具的方法: $game_party.丢弃("帽子",1)
  13. # 持有XX武器数量: $game_party.持有("铁剑")
  14. # 持有XX防具数量: $game_party.持有("帽子",1)
  15. # 全身修理: $game_party.actors[队伍位数].全修
  16. #============================================
  17. module XOXO
  18.   WEAPON_MAX = 10 #允许同类型武器所持最大数(根据你做的武器数量设置,用于商店可买的上限)
  19.   ARMOR_MAX = 10 #允许同类型装备所持最大数(根据你做的防具数量设置,用于商店可买的上限)
  20.   NORMAL_ATTACK = 1 #普通攻击消耗武器耐久
  21.   SKILL_ATTACK = 2 #技能攻击消耗武器耐久
  22.   NORMAL_DAMAGE = 1 #普通挨打消耗防具耐久
  23.   SKILL_DAMAGE = 1  #技能挨打消耗防具耐久
  24. end
  25. #============================================
  26. module RPG
  27. class Weapon
  28.   def durable
  29.    return @price % 100
  30.   end
  31.   def price
  32.    return @price / 100
  33.   end
  34. end
  35. class Armor
  36.   def durable
  37.    return @price % 100
  38.   end
  39.   def price
  40.    return @price / 100
  41.   end
  42. end
  43. end
  44. class Game_Actor < Game_Battler
  45.   attr_accessor :durable
  46.   alias xoxo_setup setup
  47.   def setup(actor_id)
  48.     xoxo_setup(actor_id)
  49.     actor = $data_actors[actor_id]
  50.     @durable = []
  51.     a = actor.weapon_id == 0 ? 0 : $data_weapons[actor.weapon_id].durable
  52.     @durable.push(a)
  53.     a = actor.armor1_id == 0 ? 0 : $data_armors[actor.armor1_id].durable
  54.     @durable.push(a)
  55.     a = actor.armor2_id == 0 ? 0 : $data_armors[actor.armor2_id].durable
  56.     @durable.push(a)
  57.     a = actor.armor3_id == 0 ? 0 : $data_armors[actor.armor3_id].durable
  58.     @durable.push(a)
  59.     a = actor.armor4_id == 0 ? 0 : $data_armors[actor.armor4_id].durable
  60.     @durable.push(a)
  61.   end
  62.   def armorid
  63.     a = []
  64.     a.push(@armor1_id)
  65.     a.push(@armor2_id)
  66.     a.push(@armor3_id)
  67.     a.push(@armor4_id)
  68.     return a
  69.   end
  70.   def equip(t, id)
  71.     case t
  72.     when 0  
  73.       if id == 0 or $game_party.weapon_number(id) > 0
  74.        $game_party.gain_weapon(@weapon_id,@durable[0])
  75.        @weapon_id = id
  76.        @durable[0] = $game_party.weapon_number(id)
  77.        $game_party.lose_weapon(id,@durable[0])
  78.       end
  79.     else
  80.       f = self.armorid
  81.       if id == 0 or $game_party.armor_number(id) > 0
  82.         update_auto_state($data_armors[f[t-1]], $data_armors[id])
  83.         $game_party.gain_armor(f[t-1], @durable[t])
  84.         f[t-1] = id
  85.         @durable[t] = $game_party.armor_number(id)
  86.         $game_party.lose_armor(id, @durable[t])
  87.       end
  88.       @armor1_id = f[0]
  89.       @armor2_id = f[1]
  90.       @armor3_id = f[2]
  91.       @armor4_id = f[3]
  92.     end
  93.   end
  94.   def 损坏
  95.     f = self.armorid
  96.     if @durable[0] <= 0
  97.      @weapon_id = 0
  98.      @durable[0] = 0
  99.     end
  100.     for i in 1..4
  101.       if @durable[i] <= 0
  102.         f[i-1] = 0
  103.         @durable[i] = 0
  104.       end
  105.     end
  106.     @armor1_id = f[0]
  107.     @armor2_id = f[1]
  108.     @armor3_id = f[2]
  109.     @armor4_id = f[3]
  110.   end
  111.   def 全修
  112.     @durable[0] = $data_weapons[@weapon_id].durable if @weapon_id != 0
  113.     for i in 1..4
  114.       @durable[i] = $data_weapons[self.armorid[i-1]].durable if self.armorid[i-1] != 0
  115.     end
  116.   end
  117. end
  118.  
  119. class Game_Party
  120.   def 入手(name,t=0)
  121.     f = []
  122.     q = []
  123.     case t
  124.     when 1  
  125.       for j in 1...$data_actors.size
  126.         for k in 0..3
  127.          q.push($game_actors[j].armorid[k])
  128.         end
  129.       end
  130.       for i in 1...$data_armors.size
  131.       if $data_armors[i].name == name
  132.         if $game_party.armor_number(i) > 0
  133.           next
  134.         elsif q.include?(i)
  135.           next
  136.         else
  137.           f.push(i)
  138.         end
  139.       end
  140.       end
  141.       a = f[rand(f.size - 1)]
  142.       if a != nil and a != 0
  143.        $game_party.gain_armor(a,$data_armors[a].durable)
  144.       else
  145.        $game_system.se_play($data_system.buzzer_se)
  146.       end
  147.     else
  148.       for j in 1...$data_actors.size
  149.         q.push($game_actors[j].weapon_id)
  150.       end
  151.       for i in 1...$data_weapons.size
  152.       if $data_weapons[i].name == name
  153.         if $game_party.weapon_number(i) > 0
  154.           next
  155.         elsif q.include?(i)
  156.           next
  157.         else
  158.           f.push(i)
  159.         end
  160.       end
  161.       end
  162.       a = f[rand(f.size - 1)]
  163.       if a != nil and a != 0
  164.       $game_party.gain_weapon(a,$data_weapons[a].durable)
  165.       else
  166.       $game_system.se_play($data_system.buzzer_se)
  167.       end
  168.     end
  169.   end
  170.   def 丢弃(name,t=0)
  171.     case t
  172.     when 0
  173.       for i in @weapons.keys
  174.         if $data_weapons[i].name == name
  175.           $game_party.lose_weapon(i, $game_party.weapon_number(i))
  176.           break
  177.         end
  178.       end
  179.     else
  180.       for i in @armors.keys
  181.         if $data_armors[i].name == name
  182.           $game_party.lose_armor(i, $game_party.armor_number(i))
  183.           break
  184.         end
  185.       end
  186.     end
  187.   end
  188.   def 持有(name,t=0)
  189.     a = 0
  190.     case t
  191.     when 0
  192.     for i in @weapons.keys
  193.       if $game_party.weapon_number(i) > 0 and $data_weapons[i].name == name
  194.        a += 1
  195.       end
  196.     end
  197.     for j in 1...$data_actors.size
  198.      if $game_actors[j].weapon_id !=0 and $data_weapons[$game_actors[j].weapon_id] != 0
  199.        a += 1 if $data_weapons[$game_actors[j].weapon_id].name == name
  200.      end
  201.     end
  202.    else
  203.     for i in @armors.keys
  204.       if $game_party.armor_number(i)>0 and $data_armors[i].name == name
  205.         a += 1
  206.       end
  207.     end
  208.     for j in 1...$data_actors.size
  209.       for k in 0..3
  210.         if $game_actors[j].armorid[k] != 0 and $data_armors[$game_actors[j].armorid[k]] != 0
  211.          a += 1 if $data_armors[$game_actors[j].armorid[k]].name == name
  212.         end
  213.       end
  214.     end
  215.    end
  216.    return a
  217. end
  218. end
  219.  
  220. class Window_EquipRight < Window_Selectable
  221.   def refresh
  222.     self.contents.clear
  223.     @data = []
  224.     @data.push($data_weapons[@actor.weapon_id])
  225.     @data.push($data_armors[@actor.armor1_id])
  226.     @data.push($data_armors[@actor.armor2_id])
  227.     @data.push($data_armors[@actor.armor3_id])
  228.     @data.push($data_armors[@actor.armor4_id])
  229.     @item_max = @data.size
  230.     self.contents.font.color = system_color
  231.     self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon)
  232.     self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.armor1)
  233.     self.contents.draw_text(4, 32 * 2, 92, 32, $data_system.words.armor2)
  234.     self.contents.draw_text(4, 32 * 3, 92, 32, $data_system.words.armor3)
  235.     self.contents.draw_text(5, 32 * 4, 92, 32, $data_system.words.armor4)
  236.     draw_item_name(@data[0], 92, 32 * 0)
  237.     draw_item_name(@data[1], 92, 32 * 1)
  238.     draw_item_name(@data[2], 92, 32 * 2)
  239.     draw_item_name(@data[3], 92, 32 * 3)
  240.     draw_item_name(@data[4], 92, 32 * 4)
  241.     for i in 0..3
  242.       if @actor.armorid[i] != 0
  243.         number = @actor.durable[i+1]
  244.         self.contents.draw_text(230,32 + 32*i, 48, 32,"耐久")
  245.         if $data_armors[@actor.armorid[i]].durable == 99
  246.           self.contents.draw_text(240,32 + 32*i,96,32,"--/--",2)
  247.         else
  248.          self.contents.draw_text(240,32 + 32*i, 96, 32,number.to_s + "/" + $data_armors[@actor.armorid[i]].durable.to_s, 2)
  249.         end
  250.       end
  251.     end
  252.    if @actor.weapon_id != 0
  253.     number = @actor.durable[0]
  254.     self.contents.draw_text(230,0, 48, 32,"耐久")
  255.     if $data_weapons[@actor.weapon_id].durable == 99
  256.      self.contents.draw_text(240,0,96,32,"--/--",2)
  257.     else
  258.      self.contents.draw_text(240, 0, 96, 32,number.to_s + "/" + $data_weapons[@actor.weapon_id].durable.to_s, 2)
  259.     end
  260.    end
  261.   end
  262. end
  263. class Window_EquipItem < Window_Selectable
  264.   def draw_item(index)
  265.     item = @data[index]
  266.     x = 4 + index % 2 * (288 + 32)
  267.     y = index / 2 * 32
  268.     case item
  269.     when RPG::Weapon
  270.       number = $game_party.weapon_number(item.id)
  271.       a = $data_weapons[item.id].durable
  272.     when RPG::Armor
  273.       number = $game_party.armor_number(item.id)
  274.       a = $data_armors[item.id].durable
  275.     end
  276.     bitmap = RPG::Cache.icon(item.icon_name)
  277.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
  278.     self.contents.font.color = normal_color
  279.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  280.     self.contents.draw_text(x + 146, y, 48, 32, "耐久", 2)
  281.     if a == 99
  282.       self.contents.draw_text(x + 160, y, 96, 32, "--/--", 2)
  283.     else
  284.       self.contents.draw_text(x + 160, y, 96, 32, number.to_s + "/" + a.to_s, 2)
  285.     end
  286.   end
  287. end
  288. class Game_Battler
  289.   alias xoxo_attack_effect attack_effect
  290.   def attack_effect(attacker)
  291.     xoxo_attack_effect(attacker)
  292.     if attacker.is_a?(Game_Actor)
  293.       if self.damage != "MISS"
  294.          attacker.durable[0] -= XOXO::NORMAL_ATTACK if attacker.durable[0] != 99
  295.          attacker.损坏
  296.       end
  297.     end
  298.     if self.is_a?(Game_Actor)
  299.       if self.damage != "MISS"
  300.         for i in 1..4
  301.          self.durable[i] -= XOXO::NORMAL_DAMAGE if self.durable[i] != 99
  302.         end
  303.         self.损坏
  304.       end
  305.     end
  306.   end
  307.   alias xoxo_skill_effect skill_effect
  308.   def skill_effect(user, skill)
  309.     xoxo_skill_effect(user, skill)
  310.     if user.is_a?(Game_Actor)
  311.       if self.damage != "MISS"
  312.          user.durable[0] -= XOXO::SKILL_ATTACK if user.durable[0] != 99
  313.          user.损坏
  314.       end
  315.     end
  316.     if self.is_a?(Game_Actor)
  317.       if self.damage != "MISS"
  318.         for i in 1..4
  319.          self.durable[i] -= XOXO::SKILL_DAMAGE if self.durable[i] != 99
  320.         end
  321.         self.损坏
  322.       end
  323.     end
  324.   end
  325. end  
  326. class Window_ShopNumber < Window_Base
  327.   def set(item, max, price)
  328.     if item.is_a?(RPG::Item)
  329.     @no = true
  330.     else
  331.     @no = false
  332.     end
  333.     @item = item
  334.     @max = max
  335.     @price = price
  336.     @number = 1
  337.     refresh
  338.   end
  339.   def update
  340.     super
  341.     if self.active
  342.       if @no
  343.        if Input.repeat?(Input::RIGHT) and @number < @max
  344.         $game_system.se_play($data_system.cursor_se)
  345.         @number += 1
  346.         refresh
  347.        end
  348.        if Input.repeat?(Input::LEFT) and @number > 1
  349.         $game_system.se_play($data_system.cursor_se)
  350.         @number -= 1
  351.         refresh
  352.        end
  353.        if Input.repeat?(Input::UP) and @number < @max
  354.         $game_system.se_play($data_system.cursor_se)
  355.         @number = [@number + 10, @max].min
  356.         refresh
  357.        end
  358.        if Input.repeat?(Input::DOWN) and @number > 1
  359.         $game_system.se_play($data_system.cursor_se)
  360.         @number = [@number - 10, 1].max
  361.         refresh
  362.        end
  363.       else
  364.         if Input.dir4 != 0
  365.         $game_system.se_play($data_system.decision_se)
  366.         end
  367.       end
  368.     end
  369.   end
  370. end
  371. class Scene_Shop
  372.   def update_number
  373.     # 按下 B 键的情况下
  374.     if Input.trigger?(Input::B)
  375.       # 演奏取消 SE
  376.       $game_system.se_play($data_system.cancel_se)
  377.       # 设置个数输入窗口为不活动·非可视状态
  378.       @number_window.active = false
  379.       @number_window.visible = false
  380.       # 命令窗口光标位置分支
  381.       case @command_window.index
  382.       when 0  # 购买
  383.         # 窗口状态转向购买模式
  384.         @buy_window.active = true
  385.         @buy_window.visible = true
  386.       when 1  # 卖出
  387.         # 窗口状态转向卖出模式
  388.         @sell_window.active = true
  389.         @sell_window.visible = true
  390.         @status_window.visible = false
  391.       end
  392.       return
  393.     end
  394.     # 按下 C 键的情况下
  395.     if Input.trigger?(Input::C)
  396.       # 演奏商店 SE
  397.       $game_system.se_play($data_system.shop_se)
  398.       # 设置个数输入窗口为不活动·非可视状态
  399.       @number_window.active = false
  400.       @number_window.visible = false
  401.       # 命令窗口光标位置分支
  402.       case @command_window.index
  403.       when 0  # 购买
  404.         # 购买处理
  405.         $game_party.lose_gold(@number_window.number * @item.price)
  406.         case @item
  407.         when RPG::Item
  408.           $game_party.gain_item(@item.id, @number_window.number)
  409.         when RPG::Weapon
  410.           $game_party.入手(@item.name)
  411.         when RPG::Armor
  412.           $game_party.入手(@item.name,1)
  413.         end
  414.         # 刷新各窗口
  415.         @gold_window.refresh
  416.         @buy_window.refresh
  417.         @status_window.refresh
  418.         # 窗口状态转向购买模式
  419.         @buy_window.active = true
  420.         @buy_window.visible = true
  421.       when 1  # 卖出
  422.         # 卖出处理
  423.         $game_party.gain_gold(@number_window.number * (@item.price / 2))
  424.         case @item
  425.         when RPG::Item
  426.           $game_party.lose_item(@item.id, @number_window.number)
  427.         when RPG::Weapon
  428.           $game_party.lose_weapon(@item.id, $game_party.weapon_number(@item.id))
  429.         when RPG::Armor
  430.           $game_party.lose_armor(@item.id, $game_party.armor_number(@item.id))
  431.         end
  432.         # 刷新各窗口
  433.         @gold_window.refresh
  434.         @sell_window.refresh
  435.         @status_window.refresh
  436.         # 窗口状态转向卖出模式
  437.         @sell_window.active = true
  438.         @sell_window.visible = true
  439.         @status_window.visible = false
  440.       end
  441.       return
  442.     end
  443.   end
  444. end
  445. class Window_ShopBuy < Window_Selectable
  446.   def draw_item(index)
  447.     item = @data[index]
  448.     # 获取物品所持数
  449.     case item
  450.     when RPG::Item
  451.       number = $game_party.item_number(item.id)
  452.       max = 99
  453.     when RPG::Weapon
  454.       number = $game_party.持有(item.name)
  455.       max = XOXO::WEAPON_MAX
  456.     when RPG::Armor
  457.       number = $game_party.持有(item.name,1)
  458.       max = XOXO::ARMOR_MAX
  459.     end
  460.     # 价格在所持金以下、并且所持数不是 99 的情况下为普通文字颜色
  461.     # 除此之外的情况设置为无效文字色
  462.     if item.price <= $game_party.gold and number < max
  463.       self.contents.font.color = normal_color
  464.     else
  465.       self.contents.font.color = disabled_color
  466.     end
  467.     x = 4
  468.     y = index * 32
  469.     rect = Rect.new(x, y, self.width - 32, 32)
  470.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  471.     bitmap = RPG::Cache.icon(item.icon_name)
  472.     opacity = self.contents.font.color == normal_color ? 255 : 128
  473.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  474.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  475.     self.contents.draw_text(x + 240, y, 88, 32, item.price.to_s, 2)
  476.   end
  477. end


范例一只
Project2.rar (383.03 KB, 下载次数: 146)

作者: 零教授    时间: 2018-4-5 03:52
我用XP写的MC(其实是泰拉瑞亚)里,为了避免同种装备不能叠加,还是用哈希key-id;val-耐久的,然后耐久为0后对应id装备数-1,value恢复设定值;
虽然分离处理是很好但是如果是单个装备没有稀有度和其他属性的一般游戏(其实MC也有覆膜啦)这样不能叠加就很碍眼,当然也不是不能叠加,新建个列表再把同种装备的不同对象存起来然后在道具栏里多加一个窗口类就行了,也好看点。

只不过我现在做的有耐久的都没那么多花样所以还是老实用着val为0数量-1再reset好了
作者: 1696993583    时间: 2018-4-5 07:38
脚本真的太好了!谢谢lz
作者: 1696993583    时间: 2018-4-5 09:05
...
语法错误什么鬼?

作者: 灯笼菜刀王    时间: 2018-4-5 10:04
其实这种系统还是根据自己的游戏内容定制比较不会出错且方便.....

所以还是建议无法驾驭脚本的新手慎用此类容易冲突的脚本....
作者: chd114    时间: 2018-4-5 12:45
这个耐久显示的地方还真是骚气···
我自己是选择脚本里加一个module单独定义···因为能撞module定义的我觉得这个概率撞了的人可以直接两个人结婚吧···
用name和description就怕还有其他的也用,然后肯定有一个到两个是要出bug的···
作者: xp兔子徒弟    时间: 2018-4-5 12:55
超过的话,再次获得会直接消失
用暴力的方法解决了根本问题
思路挺好的,赞(dao)一(qie)下
作者: 真·可乐    时间: 2018-4-5 13:49
前几天还看到有人在讨论装备耐久怎么写来着
作者: 1696993583    时间: 2018-4-6 15:56
打开范例包直接显示: 脚本 '菜鸟版绿色装备系统' 的第 472 行发生了 SyntaxErroe .
作者: 1696993583    时间: 2018-4-6 17:58
  你把铜剑和铁剑的价格都设置为 100010 就会发生很神奇的一幕...
  另外就是耐久无法设置为个位数...设置了 05 后耐久直接归0 并且继续用下去还可以变为负数直到把装备脱下来才消失.

wt1.PNG (16.07 KB, 下载次数: 11)

wt1.PNG

作者: 灯笼菜刀王    时间: 2018-4-6 20:55
本帖最后由 灯笼菜刀王 于 2018-4-6 20:58 编辑
1696993583 发表于 2018-4-6 17:58
你把铜剑和铁剑的价格都设置为 100010 就会发生很神奇的一幕...
  另外就是耐久无法设置为个位数...设置 ...


  负数情况是我没考虑到 耐久一次扣太多会超过0.....   

在def 损坏   那里 把武器和防具的   == 0  换成   <= 0 就OK啦

不会换就复制

def 损坏 整段换成  下面的就OK了

RUBY 代码复制
  1. def 损坏
  2.     f = self.armorid
  3.     if @durable[0] <= 0
  4.      @weapon_id = 0
  5.      @durable[0] = 0
  6.     end
  7.     for i in 1..4
  8.       if @durable[i] <= 0
  9.         f[i-0] = 0
  10.         @durable[i] = 0
  11.       end
  12.     end
  13.     @armor1_id = f[0]
  14.     @armor2_id = f[1]
  15.     @armor3_id = f[2]
  16.     @armor4_id = f[3]
  17.   end


果然这玩意一个没考虑到就会出问题, 就像我说的自作孽,  无法驾驭脚本还是别玩这种了.......


至于其他的, 个位数, 价格设置一样什么的, 都不存在问题,我这里实验是都OK, 其实, 装备只是用名字判断而已, 其他的可以随便你设置, 只要名字相同, 内容完全不一样也可以, 也就是说这个也可以做成"随机品质", "破烂中随机出极品" 这类的装备=3=...


作者: 1696993583    时间: 2018-4-6 21:32
不过... 你到底有没有修改一下价格再测试脚本啊!反正目前BUG好多啊!基本上砍一刀就出BUG.

wt4.PNG (15.31 KB, 下载次数: 9)

简直了

简直了

作者: 灯笼菜刀王    时间: 2018-4-6 22:22
本帖最后由 灯笼菜刀王 于 2018-4-6 22:23 编辑
1696993583 发表于 2018-4-6 21:32
不过... 你到底有没有修改一下价格再测试脚本啊!反正目前BUG好多啊!基本上砍一刀就出BUG.  ...


这些就是我之前说的"无数 里麻烦 " , 这个是写脚本的时候没考虑周全出现的

原因是:敌人没有定义durable的属性,  解决方法 : 所有涉及到battler的地方都用一个
if battler.is_a?(Game_Actor)  圈起来; 或者给敌人也加个durable属性

因为改动这种涉及的范围不少, 所以还是能自己驾驭脚本在来用吧.

这个脚本原理非常简单, 能用好它的人都可以自己写出来,

虽然原理简单,但是要插件化却花了我相当多的时间, 极不划算, 不再进行售后服务了, 要用的话自己学会处理这些小问题把

奥义: 不负责任遁
作者: 夜狠简单    时间: 2018-4-6 22:32
灯笼菜刀王 发表于 2018-4-6 22:22
这些就是我之前说的"无数 里麻烦 " , 这个是写脚本的时候没考虑周全出现的

原因是:敌人没有定 ...

既然已知异常,怎么不试试用rescue修饰符解决掉了。半残品多可惜
作者: 灯笼菜刀王    时间: 2018-4-6 22:36
夜狠简单 发表于 2018-4-6 22:32
既然已知异常,怎么不试试用rescue修饰符解决掉了。半残品多可惜

你可以看看我的脚本, 我可是有好好区分Game_Battler最后的伤害结算的=3=

他估计是有用什么战斗脚本, self.damage部分被多次引用造成的吧.
作者: 灯笼菜刀王    时间: 2018-4-6 22:49
1696993583 发表于 2018-4-6 21:32
不过... 你到底有没有修改一下价格再测试脚本啊!反正目前BUG好多啊!基本上砍一刀就出BUG.  ...


汗, 原本以为是脚本冲突,  原来是我复制后忘记改词造成的  class Game_Battler 类整个替换就行  原因是 后面想添加无限耐久的时候,复制过来的 attacker没改成self....

RUBY 代码复制
  1. class Game_Battler
  2.   alias xoxo_attack_effect attack_effect
  3.   def attack_effect(attacker)
  4.     xoxo_attack_effect(attacker)
  5.     if attacker.is_a?(Game_Actor)
  6.       if self.damage != "MISS"
  7.          attacker.durable[0] -= XOXO::NORMAL_ATTACK if attacker.durable[0] != 99
  8.          attacker.损坏
  9.       end
  10.     end
  11.     if self.is_a?(Game_Actor)
  12.       if self.damage != "MISS"
  13.         for i in 1..4
  14.          self.durable[i] -= XOXO::NORMAL_DAMAGE if self.durable[i] != 99
  15.         end
  16.         self.损坏
  17.       end
  18.     end
  19.   end
  20.   alias xoxo_skill_effect skill_effect
  21.   def skill_effect(user, skill)
  22.     xoxo_skill_effect(user, skill)
  23.     if user.is_a?(Game_Actor)
  24.       if self.damage != "MISS"
  25.          user.durable[0] -= XOXO::SKILL_ATTACK if user.durable[0] != 99
  26.          user.损坏
  27.       end
  28.     end
  29.     if self.is_a?(Game_Actor)
  30.       if self.damage != "MISS"
  31.         for i in 1..4
  32.          self.durable[i] -= XOXO::SKILL_DAMAGE if self.durable[i] != 99
  33.         end
  34.         self.损坏
  35.       end
  36.     end
  37.   end
  38. end



作者: y967    时间: 2018-4-7 11:58
不错,只是有两个问题,1,价格不能超过9999了?2,商店买的时候只能一个一个买了...
作者: 灯笼菜刀王    时间: 2018-4-7 12:13
本帖最后由 灯笼菜刀王 于 2018-4-7 12:16 编辑
y967 发表于 2018-4-7 11:58
不错,只是有两个问题,1,价格不能超过9999了?2,商店买的时候只能一个一个买了... ...


1, 要涨价很容易呗, 标价随便乘上个系数就好了, 比如 价格X耐久

因为价格只是商店用, 所以没有啥大问题,设定上就可以解决.

2, 武器防具你一下买几麻袋想干嘛? 当饭吃? 正常人通常只买一件吧

药品是可以99瓶一起买的
作者: 1696993583    时间: 2018-4-7 14:15
我就不想说什么了...问题都在这里面.

问题啊.rar

192.32 KB, 下载次数: 50


作者: 灯笼菜刀王    时间: 2018-4-7 14:33
本帖最后由 灯笼菜刀王 于 2018-4-7 14:49 编辑
1696993583 发表于 2018-4-7 14:15
我就不想说什么了...问题都在这里面.


那是当然的,你不按我设置的来

# 获取武器的方法: $game_party.入手("铁剑") 记得双引号别丢
# 获取防具的方法: $game_party.入手("帽子",1)
# 丢弃武器的方法: $game_party.丢弃("铁剑")
# 丢弃防具的方法: $game_party.丢弃("帽子",1)
# 持有XX武器数量: $game_party.持有("铁剑")
# 持有XX防具数量: $game_party.持有("帽子",1)
# 全身修理: $game_party.actors[队伍位数].全修

要得到武器, 就要用事件脚本这样写 :  $game_party.入手("铁剑")

要得到两把铁剑,要这样写   $game_party.入手("铁剑")
                                          $game_party.入手("铁剑")

要三把, 就这样写  $game_party.入手("铁剑")
                            $game_party.入手("铁剑")
                            $game_party.入手("铁剑")

要十把, 你的格子就写不下了  ,当然,  懂脚本的会这样写   

i = 0
while i < 10
$game_party.入手("铁剑")
i += 1
end

-----------------------------------------------

默认的事件按钮只能用来获取道具, 否则就是耐久1, 而且你获得两把就会变耐久2

同样的, 敌人的掉落也不能是装备(要装备就用战斗结束后公共事件获得, 或者自己改战利品获得脚本)

其次,你没按我说的, 设置10个同样名字的装备, 这样做的目的就是我在你帖子里说的"让装备不出现同样ID", 借此形成"伪独立"状态, 上面用事件脚本获得的同样名字的装备,其实在数据库里是不一样的, 我通过脚本控制让它在达到上限之前不会出现同样的ID装备.

这东西不懂原理的话就是会问题一大堆, 所以斑竹不是说了, 不要使用超过自己等级所能接受的系统.

最后,舰R是 战舰少女R, 我在玩的一款舰娘卡片收集类手游, 由于脑洞突开, 让我决定把它改造成 火焰之纹章式SRPG. 目前还在进度中,只完成了战斗系统框架. 耐久系统也是我在制作过程中思考过的实现方法,虽然我采用的不是这个脚本的方法而是在你帖子里说的"第二种方法"(这个就是和你说的"第一种方法")

由于是同人圈作品,所以我没在这里发 帖子在贴吧
https://tieba.baidu.com/p/5632722323?pn=1
作者: 夜狠简单    时间: 2018-4-7 15:07
灯笼菜刀王 发表于 2018-4-7 14:33
那是当然的,你不按我设置的来

# 获取武器的方法: $game_party.入手("铁剑") 记得双引号别丢


应该是你没有排除玩家没有装备武器或者防具时,调用$data_weapons[$game_actors[j].weapon_id]时,
$game_actors[j].weapon_id值为0,导致上面获取的值为nil的错误.
作者: 夜狠简单    时间: 2018-4-7 15:15
本帖最后由 夜狠简单 于 2018-4-7 15:19 编辑
灯笼菜刀王 发表于 2018-4-7 14:33
那是当然的,你不按我设置的来

# 获取武器的方法: $game_party.入手("铁剑") 记得双引号别丢


额,不能点评,我想说的是你排除的是$data_weapons[$game_actors[j].weapon_id] != 0的情况
但是没有考虑到排除
$game_actors[j].weapon_id = 0时
$data_weapons[$game_actors[j].weapon_id] = nil 的情况

改完大大再更新主楼,一个实用脚本的脚本就产生了.
像我这样的,

IDE启动,10行代码15个BUG.
学习编写脚本放弃
作者: 1696993583    时间: 2018-4-7 15:31
我的天呐... 到底是我的游戏有问题还是你的脚本有问题啊?

商店界面弹出.PNG (63.8 KB, 下载次数: 18)

商店界面弹出.PNG

是我的游戏有问题吗.PNG (13 KB, 下载次数: 15)

是我的游戏有问题吗.PNG

数据没错吧.PNG (98.04 KB, 下载次数: 13)

数据没错吧.PNG

作者: 1696993583    时间: 2018-4-7 15:50
无语了.

到底是哪里出问题了啊!.PNG (39.51 KB, 下载次数: 16)

到底是哪里出问题了啊!.PNG

是我的游戏有问题吗.PNG (13 KB, 下载次数: 14)

是我的游戏有问题吗.PNG

作者: 1696993583    时间: 2018-4-7 15:52
1696993583 发表于 2018-4-7 15:31
我的天呐... 到底是我的游戏有问题还是你的脚本有问题啊?

哦{:4_112:
作者: 1696993583    时间: 2018-4-7 16:02
比如说我们有32种武器还有32钟装备.每一种最大上限10个.就要打32x10+32x10=640个勾
然后有12个职业.还要再打12x640=....咳咳

....PNG (20.37 KB, 下载次数: 10)

....PNG

作者: 灯笼菜刀王    时间: 2018-4-7 16:11
本帖最后由 灯笼菜刀王 于 2018-4-7 16:16 编辑
1696993583 发表于 2018-4-7 16:02
比如说我们有32种武器还有32钟装备.每一种最大上限10个.就要打32x10+32x10=640个勾
然后有12个职业.还要再 ...


数量是随你设置的, 只要你能保证游戏里不会出现相同的装备, 1件一个也是可以的(如果设置1个,获得第二个就会直接:"嘟---"的一声,然后蒸发=3=)

主要是放商店里的货, 要注意上限要一致, 比如商店要卖  铁剑,铜剑, 铁盾,帽子, 那这些就要做一样的数量出来

然后改下这里

WEAPON_MAX = 10 #允许同类型武器所持最大数(根据你做的武器数量设置, 用于商店可买的上限)
  ARMOR_MAX = 10 #允许同类型装备所持最大数(根据你做的防具数量设置, 用于商店可买的上限)
  NORMAL_ATTACK = 1 #普通攻击消耗武器耐久
  SKILL_ATTACK = 2 #技能攻击消耗武器耐久
  NORMAL_DAMAGE = 1 #普通挨打消耗防具耐久
  SKILL_DAMAGE = 1  #技能挨打消耗防具耐久

脚本最上面的这里就是让你方便的设置数据的.


至于嫌勾起来麻烦, 看得懂脚本的话是有偷懒的做法, 看不懂就老老实实的勾吧.

我的舰R 20个职业 350个角色外加改1呢XD
作者: 1696993583    时间: 2018-4-7 16:37
灯笼菜刀王 发表于 2018-4-7 16:11
数量是随你设置的, 只要你能保证游戏里不会出现相同的装备, 1件一个也是可以的(如果设置1个,获得第二个就 ...

所以偷懒的办法到底是什么啊!
作者: 1696993583    时间: 2018-4-7 17:58
所以具体是修改哪些地方啊...我不敢乱改




















另外请有着踔绝之能的您告诉我哪里修改最大持钱数 最大物品持有数(超过数量直接消失) 以及'最大物品种类(包含已经装备的防具武器 超过这个种类的物品直接小时)持有数啊?

捕获.PNG (71.5 KB, 下载次数: 12)

捕获.PNG

作者: 灯笼菜刀王    时间: 2018-4-7 18:13
本帖最后由 灯笼菜刀王 于 2018-4-7 18:52 编辑
1696993583 发表于 2018-4-7 17:58
所以具体是修改哪些地方啊...我不敢乱改


钱的上限 ,找到game party这类, 可以看到获取金钱, 改变那一堆9就可以了

道具的持有数量也一样,但是总数可就不是一行改动就OK的事,

而且,改变默认脚本的后果就是会有无数意想不到的东西出现, 如果你没能力解决它们,那就别乱改动.

最好的栗子你已经看到过了, 我写的脚本, 原理很简单, "把装备的持有数量变成耐久度" 就这13个汉字, 出了多少麻烦,你应该能感受得到吧

要限制原本可以无限容纳的背包就不是个简单的事, 牵涉到的不会比改个装备耐久显示少

所以我才说, 仓库系统最主要的功能,不是怎么存东西,而应该是限制你怎么带东西才对.

至于我贴的那张背包图, 那只是把所持道具放到一个数组里而已, 我是用原本的道具栏当做仓库,然后背包就用这个数组,

能这样做,因为我这个游戏不重视道具用途, 战斗期间无法使用道具, 敌人也不会掉落道具, 而且背包里不会放装备(连装炮,舰载机你怎么塞包里?=3=), 道具基本只是战斗节点之间补给用而已, 所以只要具备,存储,取出功能就OK(也就是大部分仓库系统的功能, 然而我是相反操作XD)




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