查看: 2075|回复: 6

[已经解决] 关于经验获取的问题

[复制链接]
梦石
0
星屑
4476
在线时间
419 小时
注册时间
2016-5-11
回帖
127
发表于 2016-12-22 21:07:42 | 显示全部楼层 |阅读模式

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

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

×
XP的默认经验获得脚本,经验获得好像是整个队伍一起获得的,我想做一个可以佩戴增加经验的装备或者状态,但是我试了好多回怎么都是整体获得的。
梦石
0
星屑
2457
在线时间
912 小时
注册时间
2014-10-14
回帖
1155

开拓者

发表于 2016-12-23 00:54:28 | 显示全部楼层
[pre lang="ruby"]#==============================================================================
# ■ Scene_Battle (分割定义 2)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 开始自由战斗回合
  #--------------------------------------------------------------------------
  def start_phase1
    # 转移到回合 1
    @phase = 1
    # 清除全体同伴的行动
    $game_party.clear_actions
    # 设置战斗事件
    setup_battle_event
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (自由战斗回合)
  #--------------------------------------------------------------------------
  def update_phase1
    # 胜败判定
    if judge
      # 胜利或者失败的情况下 : 过程结束
      return
    end
    # 开始同伴命令回合
    start_phase2
  end
  #--------------------------------------------------------------------------
  # ● 开始同伴命令回合
  #--------------------------------------------------------------------------
  def start_phase2
    # 转移到回合 2
    @phase = 2
    # 设置角色为非选择状态
    @actor_index = -1
    @active_battler = nil
    # 有效化同伴指令窗口
    @party_command_window.active = true
    @party_command_window.visible = true
    # 无效化角色指令窗口
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # 清除主回合标志
    $game_temp.battle_main_phase = false
    # 清除全体同伴的行动
    $game_party.clear_actions
    # 不能输入命令的情况下
    unless $game_party.inputable?
      
      # 开始主回合
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (同伴命令回合)
  #--------------------------------------------------------------------------
  def update_phase2
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴指令窗口光标位置分支
      case @party_command_window.index
      when 0  # 战斗
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 开始角色的命令回合
        start_phase3
      when 1  # 逃跑
        # 不能逃跑的情况下
        if $game_temp.battle_can_escape == false
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 逃走处理
        update_phase2_escape
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面更新 (同伴指令回合 : 逃跑)
  #--------------------------------------------------------------------------
  def update_phase2_escape
    # 计算敌人速度的平均值
    enemies_agi = 0
    enemies_number = 0
    for enemy in $game_troop.enemies
      if enemy.exist?
        enemies_agi += enemy.agi
        enemies_number += 1
      end
    end
    if enemies_number > 0
      enemies_agi /= enemies_number
    end
    # 计算角色速度的平均值
    actors_agi = 0
    actors_number = 0
    for actor in $game_party.actors
      if actor.exist?
        actors_agi += actor.agi
        actors_number += 1
      end
    end
    if actors_number > 0
      actors_agi /= actors_number
    end
    # 逃跑成功判定
    success = rand(100) < 50 * actors_agi / enemies_agi
    # 成功逃跑的情况下
    if success
      # 演奏逃跑 SE
      $game_system.se_play($data_system.escape_se)
      # 还原为战斗开始前的 BGM
      $game_system.bgm_play($game_temp.map_bgm)
      # 战斗结束
      battle_end(1)
    # 逃跑失败的情况下
    else
      # 清除全体同伴的行动
      $game_party.clear_actions
      #逃跑效果音
Audio.se_play("Audio/SE/013-Move01",100,150)
#显示 逃跑失败字样
@help_window.set_text("逃跑失败你完了!",1)
@wait_count= 20      
      # 开始主回合
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ● 开始结束战斗回合
  #--------------------------------------------------------------------------
  def start_phase5
    # 转移到回合 5
    @phase = 5
    # 演奏战斗结束 ME
    $game_system.me_play($game_system.battle_end_me)
    # 还原为战斗开始前的 BGM
    $game_system.bgm_play($game_temp.map_bgm)
    # 初始化 EXP、金钱、宝物
    exp = 0
    gold = 0
    treasures = []
    # 循环
    for enemy in $game_troop.enemies
      # 敌人不是隐藏状态的情况下
      unless enemy.hidden
        # 获得 EXP、增加金钱
        exp += enemy.exp
        gold += enemy.gold
  ###########################################################################
        #将会掉多种宝物的敌人的编号写在@MIDE里面。
        @MIDE = [1, 2, 3]
        for i in 0..@MIDE.size
          #当前敌人会掉多种宝物
          if enemy.id == @MIDE
            lol = true
          end
        end
        if lol == true
          case enemy.id
          when 1 # 敌人编号为1
            # 出现宝物判定,机率请自定义,如果是100%出现的宝物可以省略这行。
            if rand(100) < 50 # 50%掉宝率
              treasures.push($data_items[1]) # 回复剂
            end
            if rand(100) < 20 # 20%掉宝率
              treasures.push($data_weapons[2]) # 铁剑
            end
            if rand(100) < 80 # 80%掉宝率
              treasures.push($data_armors[1]) # 铜盾
            end
          when 2 # 敌人编号为2
            if rand(100) < 50 # 50%掉宝率
              treasures.push($data_items[1]) # 回复剂
            end
            if rand(100) < 50 # 50%掉宝率
              treasures.push($data_items[4]) # 香水
            end
          when 3 # 敌人编号为3
            # 100%掉宝率
            treasures.push($data_items[4]) # 香水
            if rand(100) < 50 # 50%掉宝率
              treasures.push($data_items[7]) # 圣灵药
            end
          end
        else
          # 出现宝物判定
          if rand(100) < enemy.treasure_prob
            if enemy.item_id > 0
              treasures.push($data_items[enemy.item_id])
            end
            if enemy.weapon_id > 0
              treasures.push($data_weapons[enemy.weapon_id])
            end
            if enemy.armor_id > 0
              treasures.push($data_armors[enemy.armor_id])
            end
          end
        end
  ###########################################################################
      end
    end
    # 限制宝物数为 6 个
    treasures = treasures[0..5]
    # 获得 EXP
    for i in 0...$game_party.actors.size
  ###########################################################################
      if actor.cant_get_exp? == false
        last_level = actor.level
        if $game_switches[120] == true#一号开关打开时
          nexp = exp * 2
          actor.exp += nexp
        else
          nexp = exp
          actor.exp += nexp
        end
  ###########################################################################
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
    end
    # 获得金钱
    $game_party.gain_gold(gold)
    # 获得宝物
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    # 生成战斗结果窗口
  ###########################################################################
    @result_window = Window_BattleResult.new(nexp, gold, treasures)
  ###########################################################################
    # 设置等待计数
    @phase5_wait_count = 100
  end
  #--------------------------------------------------------------------------
  # ● 画面更新 (结束战斗回合)
  #--------------------------------------------------------------------------
  def update_phase5
    # 等待计数大于 0 的情况下
    if @phase5_wait_count > 0
      # 减少等待计数
      @phase5_wait_count -= 1
      # 等待计数为 0 的情况下
      if @phase5_wait_count == 0
        # 显示结果窗口
        @result_window.visible = true
        # 清除主回合标志
        $game_temp.battle_main_phase = false
        # 刷新状态窗口
        @status_window.refresh
      end
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 战斗结束
      battle_end(0)
    end
  end
end
[/pre]

点评

黏贴复制 120开关打开 双倍经验  发表于 2016-12-23 00:55
------落尽红樱君不见,轻绘梨花泪沾衣。~~~
回复

使用道具 举报

梦石
0
星屑
2457
在线时间
912 小时
注册时间
2014-10-14
回帖
1155

开拓者

发表于 2016-12-23 01:01:17 | 显示全部楼层
第二种  
还有更加简单 的多倍经验

https://rpg.blue/forum.php?mod=v ... d=396847&extra=  
360截图20161223010623290.jpg

点评

谢谢,已经解决了。  发表于 2016-12-23 22:27

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

------落尽红樱君不见,轻绘梨花泪沾衣。~~~
回复

使用道具 举报

梦石
0
星屑
606
在线时间
797 小时
注册时间
2014-7-1
回帖
501

开拓者

发表于 2016-12-23 16:14:50 | 显示全部楼层
我做过这个想法  我的做法就是给角色定义一个属性,然后在战斗中获得经验的时候加上这个属性
不知道这样是否是你想要的
[pre lang="ruby"]
class Game_Actor < Game_Battler
  attr_accessor :mexp  
  alias mohuaiyuan20161223_setup setup
  def setup(actor_id)
    mohuaiyuan20161223_setup(actor_id)
    @mexp_z = 0
  end
  def mexp # 经验提升
    @mexp_z = [[@mexp_z, 0].max,99999999].min
    n = @mexp_z
   #当角色装备1号防具的时候 经验增益1000点!
    if self.armor1_id ==1
     n+=1000
    end
    return [[n, 0].max,99999999].min
end
  def mexp=(mexp)
    @mexp_z += mexp - self.mexp
    @mexp_z = [[@mexp_z, 0].max,99999999].min
  end  
end
[/pre]
然后找到  Scene_Battle 2 获得 EXP那一行
把下面改一改
[pre lang="ruby"]   
for i in 0...$game_party.actors.size
      actor = $game_party.actors
      if actor.cant_get_exp? == false
        last_level = actor.level
        ##########################
        actor.exp += exp+actor.mexp
        ##########################
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
[/pre]

点评

谢谢,已经解决了  发表于 2016-12-23 22:27

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

学习使我疲劳,打工使我疲惫,恋爱使我伤身,吸烟伤我肺腑,饮酒损我形象,旅游使我破费,月底不见铜板,只有在论坛里面看看各种大佬才能使我进去
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部