じ☆ve冰风 发表于 2024-4-19 21:04:06

战斗中换人,口袋口袋依旧是口袋

以前曾经写了一个,貌似那个贴已经失踪到不懂哪里去了,所以今天重写了一个。而且之前写那个还可以玩围攻,这个是模仿口袋的战斗换人,功能就是那样,没得介绍,插入脚本后即可用。

脚本已经更新,请使用以下脚本,范例的脚本已经旧了。

范例:
module LimBattlePlug# 队伍最大人数MaxPartySize = 8# 出战人数MaxBattlerSize = 1# 换人语句WordChangeBattler = "换人"# 换人时播放的动画AnimationChangeBattler = 26endclass Game_BattleActionattr_accessor :change_to_battler# 初始化alias lbp_initialize initializedef initialize    lbp_initialize    @change_to_battler = 0end# 欲更换角色编号def set_change_battler    @kind = 3end# 判断行动是否为更换角色def is_change_battler?    return (@kind == 3)endendclass Game_Partyinclude LimBattlePlugattr_reader :actors2alias lpb_initialize initializedef initialize    lpb_initialize    @actors2 = []end# 角色加入def add_actor(actor_id)    actor = $game_actors    if @actors.size < MaxPartySize and not @actors.include?(actor)      @actors.push(actor)      $game_player.refresh    endend# 设置战斗的角色def set_actor_to_battle    @actors2 = []    @actors.each do |actor|      @actors2.push(actor)    end    @actors = []    dead_actor = []    @actors2.each do |actor|      if !actor.dead?      @actors.push(actor)      else      dead_actor.push(actor)      end      break if @actors.size == MaxBattlerSize    end    if @actors.size < MaxBattlerSize      for actor in dead_actor      @actors.push(actor)      break if @actors.size == MaxBattlerSize      end    endend# 还原战斗的角色def set_actor_to_normal    @actors = []    @actors2.each do |actor|      @actors.push(actor)    endend# 获取角色id数组def get_actors_id    id = []    @actors.each{|actor|id.push(actor.id)}    return idend# 获取角色id数组def get_actors2_id    id = []    @actors2.each{|actor|id.push(actor.id)}    return idend# 兑换角色def change_actor(index,id)    @actors = $game_actorsend# 全灭判定def all_dead?    # 同伴人数为 0 的情况下    if $game_party.actors.size == 0      return false    end    # 同伴中无人 HP 在 0 以上    for actor in @actors2      if actor.hp > 0      return false      end    end    for actor in @actors      if actor.hp > 0      return false      end    end    # 全灭    return trueend# 其他角色def other_actors    actors = []    @actors2.each{|actor|actors.push(actor) if ?(actor)}    return actorsend# 角色位置互换def change_actor_pos(id1,id2)    actor_id = []    @actors.each do |actor|      actor_id.push(actor.id)    end    return if !actor_id.include?(id1) and !actor_id.include?(id2)    id1_index = id2_index = -1    (0...actor_id.size).each do |i|      if actor_id == id1      id1_index = i      elsif actor_id == id2      id2_index = i      end    end    temp_actor = @actors    @actors = @actors    @actors = temp_actorendendclass Window_Actor < Window_Selectable# 初始化def initialize    super(0,64,640,256)    self.back_opacity = 160    refresh    self.index = -1    self.active = falseend# 刷新def refresh    @item_max = $game_party.actors2.size    @data = []    $game_party.actors.each do |actor|      @data.push(actor)    end    $game_party.actors2.each do |actor|      @data.push(actor) if ?(actor)    end    if self.contents != nil      self.contents.clear      self.contents = nil    end    self.contents = Bitmap.new(608,@data.size*32)    x = 4    y = 0    @data.each do |actor|      bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)      rect = Rect.new(0,0,bitmap.width/4,31)      self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)      draw_actor_name(actor,x+36,y)      draw_actor_state(actor,156,y)      draw_actor_hp(actor,x+256,y,96)      draw_actor_sp(actor,x+376,y,96)      if $game_party.actors.include?(actor)      self.contents.font.color = text_color(6)      cword = "出战"      else      self.contents.font.color = text_color(0)      cword = "待战"      end      self.contents.draw_text(x+496,y,60,32,cword)      y += 32    endend# 获取当前角色编号def actor_id    return @data.idend# 刷新帮助def update_help    @help_window.set_text(@data == nil ?\                        "" : @data.name)endendclass Scene_Battleinclude LimBattlePlug# 初始化def initialize    $game_party.set_actor_to_battleend# 主处理def main    # 初始化战斗用的各种暂时数据    $game_temp.in_battle = true    $game_temp.battle_turn = 0    $game_temp.battle_event_flags.clear    $game_temp.battle_abort = false    $game_temp.battle_main_phase = false    $game_temp.battleback_name = $game_map.battleback_name    $game_temp.forcing_battler = nil    # 初始化战斗用事件解释器    $game_system.battle_interpreter.setup(nil, 0)    # 准备队伍    @troop_id = $game_temp.battle_troop_id    $game_troop.setup(@troop_id)    # 生成角色命令窗口    s1 = $data_system.words.attack    s2 = $data_system.words.skill    s3 = $data_system.words.guard    s4 = $data_system.words.item    s5 = WordChangeBattler    @actor_command_window = Window_Command.new(160, )    @actor_command_window.y = 128    @actor_command_window.back_opacity = 160    @actor_command_window.active = false    @actor_command_window.visible = false    # 生成其它窗口    @party_command_window = Window_PartyCommand.new    @help_window = Window_Help.new    @help_window.back_opacity = 160    @help_window.visible = false    @status_window = Window_BattleStatus.new    @message_window = Window_Message.new    # 生成活动块    @spriteset = Spriteset_Battle.new    # 初始化等待计数    @wait_count = 0    # 执行过渡    if $data_system.battle_transition == ""      Graphics.transition(20)    else      Graphics.transition(40, "Graphics/Transitions/" +      $data_system.battle_transition)    end    # 开始自由战斗回合    start_phase1    # 主循环    loop do      # 刷新游戏画面      Graphics.update      # 刷新输入信息      Input.update      # 刷新画面      update      # 如果画面切换的话就中断循环      if $scene != self      break      end    end    # 刷新地图    $game_map.refresh    # 准备过渡    Graphics.freeze    # 释放窗口    @actor_command_window.dispose    @party_command_window.dispose    @help_window.dispose    @status_window.dispose    @message_window.dispose    if @skill_window != nil      @skill_window.dispose    end    if @item_window != nil      @item_window.dispose    end    if @actor_window != nil      @actor_window.dispose    end    if @result_window != nil      @result_window.dispose    end    # 释放活动块    @spriteset.dispose    # 标题画面切换中的情况    if $scene.is_a?(Scene_Title)      # 淡入淡出画面      Graphics.transition      Graphics.freeze    end    # 战斗测试或者游戏结束以外的画面切换中的情况    if $BTEST and not $scene.is_a?(Scene_Gameover)      $scene = nil    endend# 战斗结束alias lpb_battle_end battle_enddef battle_end(n)    lpb_battle_end(n)    $game_party.set_actor_to_normalend# 开始回合3alias lbp_start_phase3 start_phase3def start_phase3    @changed_battler_id = []    lbp_start_phase3end# 刷新角色命令回合画面def update_phase3    # 敌人光标有效的情况下    if @enemy_arrow != nil      update_phase3_enemy_select    # 角色光标有效的情况下    elsif @actor_arrow != nil      update_phase3_actor_select    # 特技窗口有效的情况下    elsif @skill_window != nil      update_phase3_skill_select    # 物品窗口有效的情况下    elsif @item_window != nil      update_phase3_item_select    elsif @actor_window != nil      update_phase3_battler_select    # 角色指令窗口有效的情况下    elsif @actor_command_window.active      update_phase3_basic_command    endend# 角色基本命令def update_phase3_basic_command    # 按下 B 键的情况下    if Input.trigger?(Input::B)      # 演奏取消 SE      $game_system.se_play($data_system.cancel_se)      # 转向前一个角色的指令输入      phase3_prior_actor      return    end    # 按下 C 键的情况下    if Input.trigger?(Input::C)      # 角色指令窗口光标位置分之      case @actor_command_window.index      when 0# 攻击      # 演奏确定 SE      $game_system.se_play($data_system.decision_se)      # 设置行动      @active_battler.current_action.kind = 0      @active_battler.current_action.basic = 0      # 开始选择敌人      start_enemy_select      when 1# 特技      # 演奏确定 SE      $game_system.se_play($data_system.decision_se)      # 设置行动      @active_battler.current_action.kind = 1      # 开始选择特技      start_skill_select      when 2# 防御      # 演奏确定 SE      $game_system.se_play($data_system.decision_se)      # 设置行动      @active_battler.current_action.kind = 0      @active_battler.current_action.basic = 1      # 转向下一位角色的指令输入      phase3_next_actor      when 3# 物品      # 演奏确定 SE      $game_system.se_play($data_system.decision_se)      # 设置行动      @active_battler.current_action.kind = 2      # 开始选择物品      start_item_select      when 4 # 换人      $game_system.se_play($data_system.decision_se)      @active_battler.current_action.set_change_battler      start_battler_select      end      return    endend# 开始角色选择def start_battler_select    @actor_window = Window_Actor.new    @actor_window.active = true    @actor_window.index = 0    @actor_window.help_window = @help_window    @actor_command_window.active = false    @actor_command_window.visible = falseend# 结束角色选择def end_battler_select    @actor_window.dispose    @actor_window = nil    @help_window.visible = false    @actor_command_window.active = true    @actor_command_window.visible = trueend# 刷新角色选择def update_phase3_battler_select    @actor_window.visible = true    @actor_window.update    if Input.trigger?(Input::B)      $game_system.se_play($data_system.cancel_se)      end_battler_select      return    end    if Input.trigger?(Input::C)      actor_id = @actor_window.actor_id      if $game_party.get_actors_id.include?(actor_id) or         $game_actors.dead? or          @changed_battler_id.include?(actor_id)      $game_system.se_play($data_system.buzzer_se)      return      end      $game_system.se_play($data_system.decision_se)      @active_battler.current_action.change_to_battler = actor_id      @changed_battler_id.push(actor_id)      end_battler_select      phase3_next_actor      return    endend# 行动方动画def update_phase4_step3    if @active_battler.current_action.is_change_battler?      @animation1_id = AnimationChangeBattler      @target_battlers = []    end    # 行动方动画 (ID 为 0 的情况下是白色闪烁)    if @animation1_id == 0      @active_battler.white_flash = true    else      @active_battler.animation_id = @animation1_id      @active_battler.animation_hit = true    end    # 移至步骤 4    @phase4_step = 4end# 对象方动画def update_phase4_step4    if @active_battler.current_action.is_change_battler?      actor1_id = @active_battler.current_action.change_to_battler      actor2_id = @active_battler.id      (0...$game_party.actors.size).each do |i|      if $game_party.actors.id == actor2_id          $game_party.change_actor(i,actor1_id)          @active_battler = $game_actors          @status_window.refresh      end      end    end    # 对像方动画    for target in @target_battlers      target.animation_id = @animation2_id      target.animation_hit = (target.damage != "Miss")    end    # 限制动画长度、最低 8 帧    @wait_count = 8    # 移至步骤 5    @phase4_step = 5end# 公共事件def update_phase4_step6    @target_battlers.each do |target|      if target.is_a?(Game_Actor) and target.dead? and         !$game_party.other_actors.all?{|actor|actor.dead?}      @actor_window = Window_Actor.new      @actor_window.index = 0      @actor_window.active = true      @actor_window.help_window = @help_window      actor_id = -1      loop do          Graphics.update          Input.update          @actor_window.update          if Input.trigger?(Input::C)            actor = $game_actors[@actor_window.actor_id]            if actor.dead? or               (@changed_battler_id.include?(actor.id) and               target.current_action.change_to_battler != actor.id) or               $game_party.actors.include?(actor)            $game_system.se_play($data_system.buzzer_se)            else            actor_id = actor.id            end          end          break if actor_id >= 0      end      @actor_window.visible = false      @actor_window.dispose      @actor_window = nil      @help_window.visible = false      (0...$game_party.actors.size).each do |i|          if $game_party.actors.id == target.id            $game_party.change_actor(i,actor_id)            @status_window.refresh          end      end      end    end    # 清除强制行动对像的战斗者    $game_temp.forcing_battler = nil    # 公共事件 ID 有效的情况下    if @common_event_id > 0      # 设置事件      common_event = $data_common_events[@common_event_id]      $game_system.battle_interpreter.setup(common_event.list, 0)    end    # 移至步骤 1    @phase4_step = 1endendclass Window_MenuStatusdef refresh    self.contents.clear    @item_max = $game_party.actors.size    for i in 0...$game_party.actors.size      x = 4      y = i * 32      actor = $game_party.actors      bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)      rect = Rect.new(0,0,bitmap.width/4,31)      self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)      draw_actor_name(actor, x+36, y)      draw_actor_state(actor, x + 136,y)      draw_actor_hp(actor, x + 236, y,96)      draw_actor_sp(actor, x + 336, y,96)    endenddef update_cursor_rect    superendend复制代码
            本帖来自P1论坛作者enghao_lim,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=163143若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 战斗中换人,口袋口袋依旧是口袋