扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 103|回复: 0

[转载发布] 装备随机属性值如何设置合成物品也随机?

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-3-29 03:52
  • 签到天数: 127 天

    连续签到: 11 天

    [LV.7]常住居民III

    2349

    主题

    420

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    11309
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    14106

    灌水之王

    发表于 2025-2-14 23:48:25 | 显示全部楼层 |阅读模式
    [pre lang="ruby" file="装备随机代码"]#encoding:utf-8
    #==============================================================================
    # ■ 随机属性装备 By wyongcan
    #==============================================================================
    #==============================================================================
    #==============================================================================
    #~    0 => "最大HP",
    #~                 1 => "最大MP",
    #~                 2 => "物理攻击",
    #~                 3 => "物理防御",
    #~                 4 => "魔法攻击",
    #~                 5 => "魔法防御",
    #~                 6 => "敏 捷 值",
    module Equipplus
      @maxparamplus = 1 #最大前缀数
      @moneyrate = 10 #物品价格计算公式为:原价格 + 前缀权重 * @moneyrate
      @transpose = [*1..100].reverse #用于把1变成100,100变成1
      @paramsplus = [
        [80,"普通",[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0]]], #+0%
        [10,"精良",[[0,0.1],[1,0.1],[2,0.1],[3,0.1],[4,0.1],[5,0.1],[6,0.1]]], #+10%
        [5,"稀有",[[0,0.2],[1,0.2],[2,0.2],[3,0.2],[4,0.2],[5,0.2],[6,0.2]]], #+20%
        [3,"史诗",[[0,0.5],[1,0.5],[2,0.5],[3,0.5],[4,0.5],[5,0.5],[6,0.5]]], #+50%
        [2,"神器",[[0,1],[1,1],[2,1],[3,1],[4,1],[5,1],[6,1]]] #+100%
      ]
      @paramsplus = @paramsplus.sort_by { |param| -param[0] }#大到小

      $商店随机 = true #商店买装备时出随机属性
      $战斗随机 = true #战斗后获得随机属性装备
    #~   $合成随机 = true
      def self.getname(paramsplus)
        name = ""
        paramsplus.is_a?(Array) ? paramsplus.each{|a| @temp = []; a[1].scan(/^[\u4e00-\u9fa5|\w]*|,[\u4e00-\u9fa5|\w]*/){|b| @temp.push b.gsub(","){}}; name += @temp[rand(@temp.size)]} : paramsplus[1].scan(/^[\u4e00-\u9fa5|\w]*|,[\u4e00-\u9fa5|\w]*/){|b| @temp = [] if @temp == nil ;@temp.push b.gsub(","){}}
        name += @temp[rand(@temp.size)] if paramsplus.is_a?(Array) != true
        name = "【#{name}】"  
      end
      def self.getluck #获得极品出现率
        luck = 0
        $game_party.all_members.each{|a| a.weapons.each{|a| luck += a.params[8] if a.params.size == 9};a.armors.each{|a| luck += a.params[8] if a.params.size == 9}}
        luck
      end
      
      def self.getnewequip(xequip,params = 1) #提供两个参数  装备(RPG::EquipItem类下的)和附加前缀数,不填则为随机
        return unless xequip.is_a?(RPG::EquipItem)
       
        #xparamplus为前缀数
        xequip.paramsplus = [] if xequip.paramsplus == nil
        return if xequip.paramsplus.size >= @maxparamplus
       
        params != nil ? xparamplus = params :  xparamplus = rand(@maxparamplus * 110) / 100
        xparamplus = xparamplus.to_int
        return xequip if xparamplus == 0
       
        equip = xequip.dup
        paramsplus = equip.paramsplus.dup  #无奈的方法,不这样改一个装备所有同父装备的装备都会变
        newparams = equip.params.dup
        newfeatures = equip.features.dup
        aparamsplus = @paramsplus.collect{|a| [a[0] = @transpose[a[0]-1],a[1],a[2]]}.sort_by{|a| a[0]}
       
        while paramsplus.size < xparamplus
          temp = rand(aparamsplus[-1][0])
          temp = [temp - getluck,0].max
          x = []
          
          for i in aparamsplus
            x.push i if i[0] >= temp && paramsplus.include?(i) != true
          end
          
          if x != []
            a = [(x.size-1)*100 - getluck,0].max
            a = (rand(a)/100).to_int
            paramsplus.push x[a]
          end
        end
       
        equip.name = getname(paramsplus) + equip.name #更新名称
        paramsplus.each{|a| equip.price += @transpose[a[0] - 1] * @moneyrate} #更新价格
       
        paramsplus.select{|a| a[2].select{|a| a.size == 2}.each{|a| newparams[a[0]] += newparams[a[0]] * a[1]}} #更新属性
       
        #以下为更新特性
        features = []
        paramsplus.each{|a| a[2].each{|a| features.push a if a.size == 3}}
        while features.size > 0
          i = features.pop
          newfeatures.select{|a| a.code == i[0] && a.data_id == i[1]}.size == 0 ? newfeatures.push(RPG::BaseItem::Feature.new(i[0],i[1],i[2])) : newfeatures.each_with_index{|a,b| newfeatures.value += i[2] if a.code == i[0] && a.data_id == i[1]}
        end
       
        if equip.is_a?(RPG::Weapon)
          equip.id = $data_weapons.size
          $data_weapons.insert $data_weapons.size,equip
          $data_weapons[equip.id].paramsplus = paramsplus
          $data_weapons[equip.id].params = newparams
          $data_weapons[equip.id].features = newfeatures
        else
          equip.id = $data_armors.size
          $data_armors.insert $data_armors.size,equip
          $data_armors[equip.id].paramsplus = paramsplus
          $data_armors[equip.id].params = newparams
          $data_armors[equip.id].features = newfeatures
        end
       
        equip
      end
      
      def self.gainequip(id,params = nil)
        $game_party.gain_item(Equipplus.getnewequip($data_weapons[id],params),1,true)
      end
      end
    if $商店随机 == true
      class Scene_Shop < Scene_MenuBase
        def do_buy(number)
          $game_party.lose_gold(number * buying_price)
          if @item.is_a?(RPG::EquipItem)
            x = number
            loop do
              break if x  0
              max_buf = $game_party.item_number(item)/num
            else
              max_buf = 999
            end
            max = [max, max_buf].min
          end
          
        buying_price == 0 ? max : [max, money / buying_price].min

      end
      #--------------------------------------------------------------------------
      # ● 所持金の取得
      #--------------------------------------------------------------------------
      def money
        @gold_window.value
      end
      #--------------------------------------------------------------------------
      # ● 通貨単位の取得
      #--------------------------------------------------------------------------
      def currency_unit
        @gold_window.currency_unit
      end
      #--------------------------------------------------------------------------
      # ● 合成費用の取得
      #--------------------------------------------------------------------------
      def buying_price
        @list_window.price(@item)
      end
    end


    #==============================================================================
    # ■ Window_ItemSynthesisList
    #------------------------------------------------------------------------------
    #  合成画面で、合成可能なアイテムの一覧を表示するウィンドウです。
    #==============================================================================

    class Window_ItemSynthesisList < Window_Selectable
      include WD_itemsynthesis
      #--------------------------------------------------------------------------
      # ● 公開インスタンス変数
      #--------------------------------------------------------------------------
      attr_reader   :status_window            # ステータスウィンドウ
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      def initialize(x, y, height)
        super(x, y, window_width, height)
       
        @shop_goods = []
        @shop_recipes = []
       
        for i in 1..WD_itemsynthesis_ini::I_recipe.size
          recipe = WD_itemsynthesis_ini::I_recipe
          if recipe
            good = [0, i, recipe[0]]
            if i_recipe_switch_on?(i)
              @shop_goods.push(good)
              @shop_recipes.push(recipe)
            end
          end
        end
        for i in 1..WD_itemsynthesis_ini::W_recipe.size
          recipe = WD_itemsynthesis_ini::W_recipe
          if recipe
            good = [1, i, recipe[0]]
            if w_recipe_switch_on?(i)
              @shop_goods.push(good)
              @shop_recipes.push(recipe)
            end
          end
        end
        for i in 1..WD_itemsynthesis_ini::A_recipe.size
          recipe = WD_itemsynthesis_ini::A_recipe
          if recipe
            good = [2, i, recipe[0]]
            if a_recipe_switch_on?(i)
              @shop_goods.push(good)
              @shop_recipes.push(recipe)
            end
          end
        end
       
        @money = 0
        refresh
        select(0)
      end
      #--------------------------------------------------------------------------
      # ● ウィンドウ幅の取得
      #--------------------------------------------------------------------------
      def window_width
        return 304
      end
      #--------------------------------------------------------------------------
      # ● 項目数の取得
      #--------------------------------------------------------------------------
      def item_max
        @data ? @data.size : 1
      end
      #--------------------------------------------------------------------------
      # ● アイテムの取得
      #--------------------------------------------------------------------------
      def item
        @data[index]
      end
      #--------------------------------------------------------------------------
      # ● 所持金の設定
      #--------------------------------------------------------------------------
      def money=(money)
        @money = money
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 選択項目の有効状態を取得
      #--------------------------------------------------------------------------
      def current_item_enabled?
        enable?(@data[index])
      end
      #--------------------------------------------------------------------------
      # ● 合成費用を取得
      #--------------------------------------------------------------------------
      def price(item)
        @price[item]
      end
      #--------------------------------------------------------------------------
      # ● 合成可否を取得
      #--------------------------------------------------------------------------
      def enable?(item)
        @makable[item]
      end
      #--------------------------------------------------------------------------
      # ● レシピを取得
      #--------------------------------------------------------------------------
      def recipe(item)
        @recipe[item]
      end
      #--------------------------------------------------------------------------
      # ● アイテムを許可状態で表示するかどうか
      #--------------------------------------------------------------------------
      def have_mat?(recipe)
        flag = true
        if @money >= recipe[0]
          for i in 1...recipe.size
            kind = recipe[0]
            id   = recipe[1]
            num  = recipe[2]
            if kind == "I"
              item = $data_items[id]
            elsif kind == "W"
              item = $data_weapons[id]
            elsif kind == "A"
              item = $data_armors[id]
            end
            if $game_party.item_number(item) < [num, 1].max
              flag = false
            end
          end
        else
          flag = false
        end
        return flag
      end
      #--------------------------------------------------------------------------
      # ● カテゴリの設定
      #--------------------------------------------------------------------------
      def category=(category)
        return if @category == category
        @category = category
        refresh
      end
      #--------------------------------------------------------------------------
      # ● リフレッシュ
      #--------------------------------------------------------------------------
      def refresh
        make_item_list
        create_contents
        draw_all_items
      end
      #--------------------------------------------------------------------------
      # ● アイテムをリストに含めるかどうか
      #--------------------------------------------------------------------------
      def include?(item)
        case @category
        when :item
          item.is_a?(RPG::Item) && !item.key_item?
        when :weapon
          item.is_a?(RPG::Weapon)
        when :armor
          item.is_a?(RPG::Armor)
        when :key_item
          item.is_a?(RPG::Item) && item.key_item?
        else
          false
        end
      end
      #--------------------------------------------------------------------------
      # ● アイテムリストの作成
      #--------------------------------------------------------------------------
      def make_item_list
        @data = []
        @price = {}
        @makable = {}
        @recipe = {}
        for i in 0...@shop_goods.size
          goods = @shop_goods
          recipe = @shop_recipes
          case goods[0]
          when 0;  item = $data_items[goods[1]]
          when 1;  item = $data_weapons[goods[1]]
          when 2;  item = $data_armors[goods[1]]
          end
          if item
            if include?(item)
              @data.push(item)
              @price[item] = goods[2]
              @makable[item] = have_mat?(recipe) && $game_party.item_number(item) < $game_party.max_item_number(item)
              @recipe[item] = recipe
            end
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● 項目の描画
      #--------------------------------------------------------------------------
      def draw_item(index)
        item = @data[index]
        rect = item_rect(index)
        draw_item_name(item, rect.x, rect.y, enable?(item))
        rect.width -= 4
        draw_text(rect, price(item), 2)  if WD_itemsynthesis_ini::Cost_view
      end
      #--------------------------------------------------------------------------
      # ● ステータスウィンドウの設定
      #--------------------------------------------------------------------------
      def status_window=(status_window)
        @status_window = status_window
        call_update_help
      end
      #--------------------------------------------------------------------------
      # ● 素材ウィンドウの設定
      #--------------------------------------------------------------------------
      def material_window=(material_window)
        @material_window = material_window
        call_update_help
      end
      #--------------------------------------------------------------------------
      # ● ヘルプテキスト更新
      #--------------------------------------------------------------------------
      def update_help
        @help_window.set_item(item) if @help_window
        @status_window.item = item if @status_window
        @material_window.set(item, recipe(item)) if @material_window
      end
      #--------------------------------------------------------------------------
      # ● Z ボタン(表示切替)が押されたときの処理
      #--------------------------------------------------------------------------
      def process_change_window
        Sound.play_cursor
        Input.update
        call_handler(:change_window)
      end
      #--------------------------------------------------------------------------
      # ● 決定やキャンセルなどのハンドリング処理
      #--------------------------------------------------------------------------
      def process_handling
        super
        if active
          return process_change_window if handle?(:change_window) && Input.trigger?(:Z)
    #      return process_change_window if handle?(:change_window) && Input.trigger?(:Z)
        end
      end
    end


    #==============================================================================
    # ■ Window_ItemSynthesisMaterial
    #------------------------------------------------------------------------------
    #  合成画面で、合成に必要な素材を表示するウィンドウです。
    #==============================================================================

    class Window_ItemSynthesisMaterial < Window_Base
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      def initialize(x, y, width, height)
        super(x, y, width, height)
        @item = nil
        refresh
      end
      #--------------------------------------------------------------------------
      # ● リフレッシュ
      #--------------------------------------------------------------------------
      def refresh
        contents.clear
        draw_possession(4, 0)
        draw_material_info(0, line_height * 2)
      end
      #--------------------------------------------------------------------------
      # ● アイテムの設定
      #--------------------------------------------------------------------------
      def set(item, recipe)
        @item = item
        @recipe = recipe
        @make_number = 1
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 作成個数の設定
      #--------------------------------------------------------------------------
      def set_num(make_number)
        @make_number = make_number
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 所持数の描画
      #--------------------------------------------------------------------------
      def draw_possession(x, y)
        rect = Rect.new(x, y, contents.width - 4 - x, line_height)
        change_color(system_color)
        draw_text(rect, Vocab::Possession)
        change_color(normal_color)
        draw_text(rect, $game_party.item_number(@item), 2)
      end
      #--------------------------------------------------------------------------
      # ● 素材情報の描画
      #--------------------------------------------------------------------------
      def draw_material_info(x, y)
        rect = Rect.new(x, y, contents.width, line_height)
        change_color(system_color)
        contents.font.size = 18
        draw_text(rect, "需要原料", 0)
        if @recipe
          for i in [email protected]
            kind = @recipe[0]
            id   = @recipe[1]
            num  = @recipe[2]
            if kind == "I"
              item = $data_items[id]
            elsif kind == "W"
              item = $data_weapons[id]
            elsif kind == "A"
              item = $data_armors[id]
            end
            rect = Rect.new(x, y + line_height*i, contents.width, line_height)
            enabled = true
            enabled = false if [num*@make_number, 1].max  > $game_party.item_number(item)
            draw_item_name(item, rect.x, rect.y, enabled)
            change_color(normal_color, enabled)
            if num > 0
              draw_text(rect, "#{num*@make_number}/#{$game_party.item_number(item)}", 2)
            end
          end
        end
        change_color(normal_color)
        contents.font.size = 24
      end
    end


    #==============================================================================
    # ■ Window_ItemSynthesisNumber
    #------------------------------------------------------------------------------
    #  合成画面で、合成するアイテムの個数を入力するウィンドウです。
    #==============================================================================

    class Window_ItemSynthesisNumber < Window_ShopNumber
      #--------------------------------------------------------------------------
      # ● リフレッシュ
      #--------------------------------------------------------------------------
      def refresh
        contents.clear
        draw_item_name(@item, 0, item_y)
        draw_number
        draw_total_price if WD_itemsynthesis_ini::Cost_view
      end
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      def material_window=(material_window)
        @material_window = material_window
        call_update_help
      end
      #--------------------------------------------------------------------------
      # ● 作成個数の変更
      #--------------------------------------------------------------------------
      def change_number(amount)
        @number = [[@number + amount, @max].min, 1].max
        call_update_help #追加
      end
      #--------------------------------------------------------------------------
      # ● ヘルプテキスト更新
      #--------------------------------------------------------------------------
      def call_update_help
        @material_window.set_num(@number) if @material_window
      end
      #--------------------------------------------------------------------------
      # ● Z ボタン(表示切替)が押されたときの処理
      #--------------------------------------------------------------------------
      def process_change_window
        Sound.play_cursor
        Input.update
        call_handler(:change_window)
      end
      #--------------------------------------------------------------------------
      # ● 決定やキャンセルなどのハンドリング処理
      #--------------------------------------------------------------------------
      def process_handling
        super
        if active
          return process_change_window if handle?(:change_window) && Input.trigger?(:Z)
    #      return process_change_window if handle?(:change_window) && Input.trigger?(:Z)
        end
      end
    end


    #==============================================================================
    # ■ Window_ItemSynthesisCategory
    #------------------------------------------------------------------------------
    #  合成画面で、通常アイテムや装備品の分類を選択するウィンドウです。
    #==============================================================================

    class Window_ItemSynthesisCategory < Window_ItemCategory
      #--------------------------------------------------------------------------
      # ● 桁数の取得
      #--------------------------------------------------------------------------
      def col_max
        i = 0
        i += 1 if WD_itemsynthesis_ini::Category_i
        i += 1 if WD_itemsynthesis_ini::Category_w
        i += 1 if WD_itemsynthesis_ini::Category_a
        i += 1 if WD_itemsynthesis_ini::Category_k
        return i
      end
      #--------------------------------------------------------------------------
      # ● コマンドリストの作成
      #--------------------------------------------------------------------------
      def make_command_list
        add_command("普通物品",     :item)     if WD_itemsynthesis_ini::Category_i
        add_command("人类装备",   :weapon)   if WD_itemsynthesis_ini::Category_w
        add_command("战车装备",    :armor)    if WD_itemsynthesis_ini::Category_a
        add_command("特殊物品", :key_item) if WD_itemsynthesis_ini::Category_k
      end
    end


    #==============================================================================
    # ■ Window_ItemSynthesisNumber
    #------------------------------------------------------------------------------
    #  合成画面で、切替を表示するウィンドウです。
    #==============================================================================

    class Window_ItemSynthesisChange < Window_Base
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      def initialize(x, y, width, height)
        super(x, y, width, height)
        refresh
      end
      #--------------------------------------------------------------------------
      # ● リフレッシュ
      #--------------------------------------------------------------------------
      def refresh
        contents.clear
        text = "制作信息"
        draw_text(0, 0, contents_width, line_height, text, 1)
      end
    end[/pre]
    求教怎样才可以让合成的装备也是随机化的?
                本帖来自P1论坛作者霉素存档秀,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=494272  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-4-20 11:21 , Processed in 0.141736 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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