RMXP脚本解析(二十五):Game_Party

目录

Game_Party类代码解析

角色的位置与轮流概率


Game_Party类代码解析

#==============================================================================

# ■ Game_Party

#------------------------------------------------------------------------------

#  处理同伴的类。包含金钱以及物品的信息。本类的实例

# 请参考 $game_party。

#==============================================================================

class Game_Party

    #--------------------------------------------------------------------------

    # ● 定义实例变量

    #--------------------------------------------------------------------------

    attr_reader   :actors                   # 角色

    attr_reader   :gold                     # 金钱

    attr_reader   :steps                    # 步数

    #--------------------------------------------------------------------------

    # ● 初始化对像

    #--------------------------------------------------------------------------

    def initialize

      # 建立角色序列

      @actors = []

      # 初始化金钱与步数

      @gold = 0

      @steps = 0

      # 生成物品、武器、防具的所持数 hash

      @items = {} ##并不是哈希表,不如说它的下标与RPG::Item.id对应

      @weapons = {}

      @armors = {}

    end

    #--------------------------------------------------------------------------

    # ● 设置初期同伴

    #--------------------------------------------------------------------------

    def setup_starting_members

      @actors = []

      for i in $data_system.party_members ##根据文件里存储的初期同伴设置

        @actors.push($game_actors[i]) ##Game_Actors类的实例,[]是个方法哦(也就是运算符重载)

      end

    end

    #--------------------------------------------------------------------------

    # ● 设置战斗测试用同伴

    #--------------------------------------------------------------------------

    def setup_battle_test_members

      @actors = []

      for battler in $data_system.test_battlers ##遍历所有测试角色

        actor = $game_actors[battler.actor_id] ##生成角色 

        actor.level = battler.level

        gain_weapon(battler.weapon_id, 1)

        gain_armor(battler.armor1_id, 1)

        gain_armor(battler.armor2_id, 1)

        gain_armor(battler.armor3_id, 1)

        gain_armor(battler.armor4_id, 1)

        actor.equip(0, battler.weapon_id)

        actor.equip(1, battler.armor1_id)

        actor.equip(2, battler.armor2_id)

        actor.equip(3, battler.armor3_id)

        actor.equip(4, battler.armor4_id)

        actor.recover_all

        @actors.push(actor) ##将生成的角色加入队列

      end

      @items = {} ##所有物品的所持数

      for i in 1...$data_items.size 

        if $data_items[i].name != "" ##如果这个物品的名字不为空(存在)

          occasion = $data_items[i].occasion ##场合 

          if occasion == 0 or occasion == 1 ##战斗中可以使用的所有场合

            @items[i] = 99 ##赋值99,因为是战斗测试

          end

        end

      end

    end

    #--------------------------------------------------------------------------

    # ● 同伴成员的还原

    #--------------------------------------------------------------------------

    def refresh ##这个函数刷新角色数组

      # 游戏数据载入后角色对像直接从 $game_actors

      # 分离。

      # 回避由于载入造成的角色再设置的问题。

      new_actors = []

      for i in 0...@actors.size

        if $data_actors[@actors[i].id] != nil

          new_actors.push($game_actors[@actors[i].id])

        end

      end

      @actors = new_actors

    end

    #--------------------------------------------------------------------------

    # ● 获取最大等级

    #--------------------------------------------------------------------------

    def max_level

      # 同伴人数为 0 的情况下

      if @actors.size == 0

        return 0

      end

      # 初始化本地变量 level

      level = 0

      # 求得同伴的最大等级

      for actor in @actors

        if level < actor.level

          level = actor.level

        end

      end

      return level

    end

    #--------------------------------------------------------------------------

    # ● 加入同伴

    #     actor_id : 角色 ID

    #--------------------------------------------------------------------------

    def add_actor(actor_id)

      # 获取角色

      actor = $game_actors[actor_id]

      # 同伴人数未满 4 人、本角色不在队伍中的情况下

      if @actors.size < 4 and not @actors.include?(actor) ##主角的队伍最多有四个人

        # 添加角色

        @actors.push(actor)

        # 还原主角

        $game_player.refresh ##重新排序

      end

    end

    #--------------------------------------------------------------------------

    # ● 角色离开

    #     actor_id : 角色 ID

    #--------------------------------------------------------------------------

    def remove_actor(actor_id)

      # 删除角色

      @actors.delete($game_actors[actor_id])

      # 还原主角

      $game_player.refresh

    end

    #--------------------------------------------------------------------------

    # ● 增加金钱 (减少)

    #     n : 金额

    #--------------------------------------------------------------------------

    def gain_gold(n)

      @gold = [[@gold + n, 0].max, 9999999].min

    end

    #--------------------------------------------------------------------------

    # ● 减少金钱

    #     n : 金额

    #--------------------------------------------------------------------------

    def lose_gold(n)

      # 调用数值逆转 gain_gold 

      gain_gold(-n) ##虽然但是,有点多此一举吧

    end

    #--------------------------------------------------------------------------

    # ● 增加步数

    #--------------------------------------------------------------------------

    def increase_steps

      @steps = [@steps + 1, 9999999].min ##步数最大值为9999999

    end

    #--------------------------------------------------------------------------

    # ● 获取物品的所持数

    #     item_id : 物品 ID

    #--------------------------------------------------------------------------

    def item_number(item_id)

      # 如果 hash 个数数值不存在就返回 0

      return @items.include?(item_id) ? @items[item_id] : 0 

    end

    #--------------------------------------------------------------------------

    # ● 获取武器所持数

    #     weapon_id : 武器 ID

    #--------------------------------------------------------------------------

    def weapon_number(weapon_id)

      # 如果 hash 个数数值不存在就返回 0

      return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0

    end

    #--------------------------------------------------------------------------

    # ● 获取防具所持数

    #     armor_id : 防具 ID

    #--------------------------------------------------------------------------

    def armor_number(armor_id)

      # 如果 hash 个数数值不存在就返回 0

      return @armors.include?(armor_id) ? @armors[armor_id] : 0

    end

    #--------------------------------------------------------------------------

    # ● 增加物品 (减少)

    #     item_id : 物品 ID

    #     n       : 个数

    #--------------------------------------------------------------------------

    def gain_item(item_id, n)

      # 更新 hash 的个数数据

      if item_id > 0

        @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min

      end

    end

    #--------------------------------------------------------------------------

    # ● 增加武器 (减少)

    #     weapon_id : 武器 ID

    #     n         : 个数

    #--------------------------------------------------------------------------

    def gain_weapon(weapon_id, n)

      # 更新 hash 的个数数据

      if weapon_id > 0

        @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min

      end

    end

    #--------------------------------------------------------------------------

    # ● 增加防具 (减少)

    #     armor_id : 防具 ID

    #     n        : 个数

    #--------------------------------------------------------------------------

    def gain_armor(armor_id, n)

      # 更新 hash 的个数数据

      if armor_id > 0

        @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min

      end

    end

    #--------------------------------------------------------------------------

    # ● 减少物品

    #     item_id : 物品 ID

    #     n       : 个数

    #--------------------------------------------------------------------------

    def lose_item(item_id, n)

      # 调用 gain_item 的数值逆转

      gain_item(item_id, -n)

    end

    #--------------------------------------------------------------------------

    # ● 减少武器

    #     weapon_id : 武器 ID

    #     n         : 个数

    #--------------------------------------------------------------------------

    def lose_weapon(weapon_id, n)

      # 调用 gain_weapon 的数值逆转

      gain_weapon(weapon_id, -n)

    end

    #--------------------------------------------------------------------------

    # ● 减少防具

    #     armor_id : 防具 ID

    #     n        : 个数

    #--------------------------------------------------------------------------

    def lose_armor(armor_id, n)

      # 调用 gain_armor 的数值逆转

      gain_armor(armor_id, -n)

    end

    #--------------------------------------------------------------------------

    # ● 判断物品可以使用

    #     item_id : 物品 ID

    #--------------------------------------------------------------------------

    def item_can_use?(item_id)

      # 物品个数为 0 的情况

      if item_number(item_id) == 0

        # 不能使用

        return false

      end

      # 获取可以使用的时候

      occasion = $data_items[item_id].occasion

      # 战斗的情况

      if $game_temp.in_battle

        # 可以使用时为 0 (平时) 或者是 1 (战斗时) 可以使用

        return (occasion == 0 or occasion == 1)

      end

      # 可以使用时为 0 (平时) 或者是 2 (菜单时) 可以使用

      return (occasion == 0 or occasion == 2)

    end

    #--------------------------------------------------------------------------

    # ● 清除全体的行动

    #--------------------------------------------------------------------------

    def clear_actions

      # 清除全体同伴的行为

      for actor in @actors

        actor.current_action.clear

      end

    end

    #--------------------------------------------------------------------------

    # ● 可以输入命令的判定

    #--------------------------------------------------------------------------

    def inputable?

      # 如果一可以输入命令就返回 true

      for actor in @actors

        if actor.inputable?

          return true

        end

      end

      return false

    end

    #--------------------------------------------------------------------------

    # ● 全灭判定

    #--------------------------------------------------------------------------

    def all_dead?

      # 同伴人数为 0 的情况下

      if $game_party.actors.size == 0

        return false

      end

      # 同伴中无人 HP 在 0 以上

      for actor in @actors

        if actor.hp > 0

          return false

        end

      end

      # 全灭

      return true

    end

    #--------------------------------------------------------------------------

    # ● 检查连续伤害 (地图用)

    #--------------------------------------------------------------------------

    def check_map_slip_damage

      for actor in @actors 

        if actor.hp > 0 and actor.slip_damage?

          actor.hp -= [actor.maxhp / 100, 1].max ##地图中的连续伤害缩减为1/100(战斗中为1/10)

          if actor.hp == 0 

            $game_system.se_play($data_system.actor_collapse_se)

          end

          $game_screen.start_flash(Color.new(255,0,0,128), 4) ##屏闪 Game_Screen.start_flash(Color,time) 时间的单位为帧

          $game_temp.gameover = $game_party.all_dead? ##如果全部死亡就游戏结束

        end

      end

    end

    #--------------------------------------------------------------------------

    # ● 对像角色的随机确定

    #     hp0 : 限制为 HP 0 的角色

    #--------------------------------------------------------------------------

    def random_target_actor(hp0 = false)

      # 初始化轮流

      roulette = []

      # 循环

      for actor in @actors

        # 符合条件的场合

        if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)

          # 获取角色职业的位置 [位置]

          position = $data_classes[actor.class_id].position ##也就是说,角色的位置越前,轮到他的可能性越高

          # 前卫的话 n = 4、中卫的话 n = 3、后卫的话 n = 2

          n = 4 - position

          # 添加角色的轮流 n 回

          n.times do

            roulette.push(actor)

          end

        end

      end

      # 轮流大小为 0 的情况

      if roulette.size == 0

        return nil

      end

      # 转轮盘赌,决定角色

      return roulette[rand(roulette.size)]

    end

    #--------------------------------------------------------------------------

    # ● 对像角色的随机确定 (HP 0)

    #--------------------------------------------------------------------------

    def random_target_actor_hp0

      return random_target_actor(true)

    end

    #--------------------------------------------------------------------------

    # ● 对像角色的顺序确定

    #     actor_index : 角色索引

    #--------------------------------------------------------------------------

    def smooth_target_actor(actor_index)

      # 取得对像

      actor = @actors[actor_index]

      # 对像存在的情况下

      if actor != nil and actor.exist?

        return actor

      end

      # 循环

      for actor in @actors

        # 对像存在的情况下

        if actor.exist?

          return actor

        end

      end

    end

  end

角色的位置与轮流概率

我们知道游戏中主角的职业里有一个关于位置的属性(前卫中卫后卫),它们存储在RPG::Class.position中,当:

  • -为前卫,position=0
  • -为中卫,position=1
  • -为后卫,position=2

在战斗中,随机选择主角队伍的目标时,执行以下过程:

  • 1.读取每个符合条件的角色
  • 2.对每个角色,其轮流中回合数为4-position
  • 3.将这个角色的回合数压入轮流,然后随机决定一个回合的角色为目标(也就是说,其position值越高,被选为目标的概率越低)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01·容错脚本 BY 轮回者 本脚本基于星大叔的容错脚本第2版,建立两个txt文件(log_bitmap.txt log_audio.txt),对系统缺失的文件进行补救,也就是缺失文件照样可以玩游戏。 02·角色加入提示(开关2) 角色加入、离开提示。 03·分开距离自动跟随(开关4) 传说中的“开火车”。 04·加强窗口(选项动态加强)作者:carol3 05·读书读报系统(开关50) by 柳柳 参考注释打开开关,则进入读书系统,系统会连续不停地读取“显示文章”的内容显示在一个窗口中,直到碰到其他事件。 06·天气系统 by ScriptKitty and Mr.DJ 共包含16个天气,(具体看脚本的长篇说明)。 07·按键加速 08·光标循环移动 菜单可以循环选择 09·升级加点系统 本脚本不会取代默认的升级,但可以用这个功能手动追加点数。 如果你想纯粹使用手动加点(而升级不提升能力),只要把数据库中角色升级能力,1-99级全部等于一个相同数值就行了(具体看脚本的长篇说明)。 10·升级提示 (开关5) By 叶子 原作者:桜雅 在土 11·防卡机 作者:“用我的视野范围去限制刷新的事件,因此一个有300多个事件的大地图仍然可以运行在40的帧速率。这可能不是最后一个版本,我还在考虑更多的方法减少事件的拖慢” 12·半透明菜单 13·截图 14·按键调用 By: Cybersa 15·文字投影效果 16·全屏幕(API) 17·游戏版权(游戏开始时显示LOGO) 18·杀敌随机金钱 by.我要食叉包 19·商店显示 优化了商店 20·价格变动 翻译:柳柳 21·菜单显示血条 22·物品分类 可以自定义设置物品分类,利用物品描述,每个描述后面添加@物品分类即可。 23·任务和菜单 by 柳柳 24·完美输入法(具体看脚本的长篇说明) 25·显示敌人生命百分比 作者:carol3_柳柳 26·显示地图名 by 桜雅 在土 27·截图存取档(具体看脚本的长篇说明) 28·真实商店(具体看脚本的长篇说明) 29·即时消息脚本(仿网游,甚者可以外接成为聊天框) 30·贵重物品特殊颜色 31·等级突破 32·显示每个事件的名字 作者:柳柳 加强:叶子 33·事件的储存读取进度 34·偷盗系统 By 绿发的Eclair 35·完整鼠标系统 By whbm 36·繁体字 (把简体字转换为繁体字?) 37·直接用地图做战斗背景 脚本作者:bluefool 38·显示ARPG by 刻宮 39·fuki v6 (具体看脚本的长篇说明) 40·得失提示 作者:KKME,联系QQ:6690474 41·套装系统 By 凌冰 42·价格变动 by 和希成纳 、桜雅在土 43·坐标显示 44·四方向寻路 By whbm 45·防卡机2 (应该是放挂机才对) 46·小地图 by ピニョン clum-sea 游戏中,按下shift键可以开关地图, 47·更新加密游戏(暂时用不着)(具体看脚本的长篇说明) 48·银行系统(开关12)(具体看脚本的长篇说明) 49·魔物图鉴(具体看脚本的长篇说明) 50·自动更新(暂无效)BY 亿万星辰(具体看脚本的长篇说明) ---2.01测试---- 1.RM计算机by 七夕小雨 2.解决RM的10s 3.打造 4.鼠标脚本控制窗口滚动 5.光标位置记录 6.移动的公告 by bbaugle 7.特技升级 by Claimh 8.彩虹神剑 by 柳柳 修改 by 叶子 9.远景自动移动 by ぷのくー 10.全键盘检测 11.多重状态 by Claimh 12.技能连击追加 by Claimh 13.显示敌人列表 Scene_Battle 14.回合表示 15.转到输入下一个角色的命令 16.魔法商店 17.视角跟随NPC 18.颜色随血量变化 19.组合键连续特技系统 By 绿发的Eclair 20.游戏版权LOGO(结束游戏时)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值