设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1580|回复: 1
打印 上一主题 下一主题

[已经过期] 可以兼容下面脚本的横版战斗

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
144 小时
注册时间
2011-11-26
帖子
161
跳转到指定楼层
1
发表于 2012-8-26 21:17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人对脚本是(你懂得)。。


我要的是九个人战斗
那位大湿可以帮我


module LimBattlePlug


# 队伍最大人数

MaxPartySize = 9


# 出战人数

MaxBattlerSize = 1


# 换人语句

WordChangeBattler = "换人"


# 换人时播放的动画

AnimationChangeBattler = 26


end


class Game_BattleAction

  attr_accessor :change_to_battler

  # 初始化

  alias lbp_initialize initialize

  def initialize

    lbp_initialize

    @change_to_battler = 0

  end

  # 欲更换角色编号

  def set_change_battler

    @kind = 3

  end

  # 判断行动是否为更换角色

  def is_change_battler?

    return (@kind == 3)

  end

end


class Game_Party

  include LimBattlePlug

  attr_reader :actors2

  alias lpb_initialize initialize

  def initialize

    lpb_initialize

    @actors2 = []

  end

  # 角色加入

  def add_actor(actor_id)

    actor = $game_actors[actor_id]

    if @actors.size < MaxPartySize and not @actors.include?(actor)

      @actors.push(actor)

      $game_player.refresh

    end

  end

  # 设置战斗的角色

  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

    end

  end

  # 还原战斗的角色

  def set_actor_to_normal

    @actors = []

    @actors2.each do |actor|

      @actors.push(actor)

    end

  end

  # 获取角色id数组

  def get_actors_id

    id = []

    @actors.each{|actor|id.push(actor.id)}

    return id

  end

  # 获取角色id数组

  def get_actors2_id

    id = []

    @actors2.each{|actor|id.push(actor.id)}

    return id

  end

  # 兑换角色

  def change_actor(index,id)

    @actors[index] = $game_actors[id]

  end

  # 全灭判定

  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 true

  end

  # 其他角色

  def other_actors

    actors = []

    @actors2.each{|actor|actors.push(actor) if [email protected]?(actor)}

    return actors

  end

  # 角色位置互换

  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[i] == id1

        id1_index = i

      elsif actor_id[i] == id2

        id2_index = i

      end

    end

    temp_actor = @actors[id1_index]

    @actors[id1_index] = @actors[id2_index]

    @actors[id2_index] = temp_actor

  end

end


class Window_Actor < Window_Selectable

  # 初始化

  def initialize

    super(0,64,640,256)

    self.back_opacity = 160

    refresh

    self.index = -1

    self.active = false

  end

  # 刷新

  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 [email protected]?(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

    end

  end

  # 获取当前角色编号

  def actor_id

    return @data[self.index].id

  end

  # 刷新帮助

  def update_help

    @help_window.set_text(@data[self.index] == nil ?\

                          "" : @data[self.index].name)

  end

end


class Scene_Battle

  include LimBattlePlug

  # 初始化

  def initialize

    $game_party.set_actor_to_battle

  end

  # 主处理

  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, [s1, s2, s3, s4,s5])

    @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

    end

  end

  # 战斗结束

  alias lpb_battle_end battle_end

  def battle_end(n)

    lpb_battle_end(n)

    $game_party.set_actor_to_normal

  end

  # 开始回合3

  alias lbp_start_phase3 start_phase3

  def start_phase3

    @changed_battler_id = []

    lbp_start_phase3

  end

  # 刷新角色命令回合画面

  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

    end

  end

  # 角色基本命令

  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

    end

  end

  # 开始角色选择

  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 = false

  end

  # 结束角色选择

  def end_battler_select

    @actor_window.dispose

    @actor_window = nil

    @help_window.visible = false

    @actor_command_window.active = true

    @actor_command_window.visible = true

  end

  # 刷新角色选择

  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[actor_id].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

    end

  end

  # 行动方动画

  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 = 4

  end

  # 对象方动画

  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[i].id == actor2_id

          $game_party.change_actor(i,actor1_id)

          @active_battler = $game_actors[actor1_id]

          @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 = 5

  end

  # 公共事件

  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[i].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 = 1

  end

end


class Window_MenuStatus

  def 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[i]

      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)

    end

  end

  def update_cursor_rect

    super

  end

end

评分

参与人数 1星屑 +200 收起 理由
hcm + 200 补回

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
117 小时
注册时间
2012-4-24
帖子
110
2
发表于 2012-8-27 18:36:59 | 只看该作者
问:为什么要横版呢。要45度的不好吗?
回复

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-10-1 01:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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