제가 FF시리즈와 같은 전투방식인 리얼타임 엑티브 배틀 스크립트를 구했는데요.... 자꾸 오류가 나내요...
class Scene_Battle
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_reader :status_window # 스테이터스 윈도우
attr_reader :spriteset # 배틀 스프라이트
attr_reader :scroll_time # 스크린 이동 기본 시간
attr_reader :zoom_rate # 적 버틀러 기본 위치
attr_reader :drive # 카메라 구동
attr_accessor :force # 액션 강제도
attr_accessor :camera # 현재의 카메라 소지자
#--------------------------------------------------------------------------
# ● ATB기초 셋업
#--------------------------------------------------------------------------
def atb_setup
# ATB초기화
# speed : 배틀 스피드 결정. 값이 작을 정도 빠른
# @active : 액티브도 설정
# 3 : 항상 액티브 상태
# 2 : 스킬·아이템 선택중만 액티브 게이지가 멈추는
# 1 : 2상태에 가세해 타겟 선택시도 웨이트가 걸리는
# 0 : 1상태에 가세해 커멘드 입력시에도 웨이트가 걸리는
# @action : 타인이 행동중에 자신도 행동을 일으키는 것을 허락할까
# 3 : 자신이 행동 불능이 아닌 한 한정해 허락하는
# 2 : 자신이 데미지를 받지 않은 한 허락하는
# 1 : 2상태에 가세해 타겟이 행동하고 있지 않는 한 허락하는
# 0 : 행동을 허락하지 않는다. 차례로 행동 끝마칠 때까지 기다리는
# @anime_wait : true으로 하면(자) 배틀 애니메이션·데미지 표시중은 웨이트가 걸리는
# @damage_wait : 데미지 표시 대기 시간(단위는 프레임)
# @after_wait : 아군·적 전멸시 , 다음의 처리로 옮길 때까지의 대기 시간
# [a, b] a 은 아군 전멸시 ,b 는 적 전멸시(단위는 프레임)
# @enemy_speed : 적의 사고 속도. 1(이)라면 즉시 행동.
# 1프레임마다 ,1/@enemy_speed의 확률로 행동을 일으키는
# @force : 강제 액션으로 스킬 사용시의 강제 상태
# 2:스킬은 모두 영창 하지 않고 , 반드시 즉시 실행
# 1:단독 스킬은 영창 해 , 제휴 스킬만 즉시 실행
# 0:전 스킬 영창을 실시할 뿐(만큼)
# ($scene.force = x 과 하는 것으로써 , 통상 이벤트의 스크립트로부터 변경 가능)
# @drive : 카메라 구동ON/OFF. true그리고 구동ON,false그리고 구동OFF
# @scroll_time : 스크린 이동에 필요로 하는 기본 시간
# @zoom_rate = [i, j] : 에너미의 줌율
# i 이 화면 최상부에 배치했을 때의 확대율
# j 이 화면 최하부에 배치했을 때의 확대율
# 1 배로 하고 싶을 때도 ,1.0 라고 반드시 소수로 설정하는 것
speed = 150
@active = 1
@action = 2
@anime_wait = false
@damage_wait = 10
@after_wait = [80, 0]
@enemy_speed = 40
@force = 2
@drive = true
@scroll_time = 15
@zoom_rate = [0.2, 1.0]
@help_time = 40
@escape == false
@camera = nil
@max = 0
@turn_cnt = 0
@help_wait = 0
@action_battlers = []
@synthe = []
@spell_p = {}
@spell_e = {}
@command_a = false
@command = []
@party = false
for battler in $game_party.actors + $game_troop.enemies
spell_reset(battler)
battler.at = battler.agi * rand(speed / 2)
battler.damage_pop = {}
battler.damage = {}
battler.damage_sp = {}
battler.critical = {}
battler.recover_hp = {}
battler.recover_sp = {}
battler.state_p = {}
battler.state_m = {}
battler.animation = []
if battler.is_a?(Game_Actor)
@max += battler.agi
end
end
@max *= speed
@max /= $game_party.actors.size
for battler in $game_party.actors + $game_troop.enemies
battler.atp = 100 * battler.at / @max
end
end
#--------------------------------------------------------------------------
# ● AT게이지Max시SE
#--------------------------------------------------------------------------
def fullat_se
Audio.se_play("Audio/SE/033-switch02", 80, 100)
end
#--------------------------------------------------------------------------
# ● 레벨업SE
#--------------------------------------------------------------------------
def levelup_se
Audio.se_play("Audio/SE/056-Right02", 80, 100)
end
#--------------------------------------------------------------------------
# ● 스킬 습득SE
#--------------------------------------------------------------------------
def skill_se
Audio.se_play("Audio/SE/056-Right02", 80, 150)
end
end
class Window_Base < Window
#--------------------------------------------------------------------------
# ● ATG 의 묘화
# actor : 엑터
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# width : 묘화처의 폭
#--------------------------------------------------------------------------
def draw_actor_atg(actor, x, y, width = 144)
if @at_gauge == nil
# plus_x:X좌표의 위치 보정 rate_x:X좌표의 위치 보정(%) plus_y:Y좌표의 위치 보정
# plus_width:폭의 보정 rate_width:폭의 보정(%) height:세로폭
# align1:묘화 타입1 0:왼쪽 막혀라 1:centering 2:right justify
# align2:묘화 타입2 0:카미츠메째 1:centering 2:하막혀라
# align3:게이지 타입 0:왼쪽 막혀라 1:right justify
@plus_x = 0
@rate_x = 0
@plus_y = 16
@plus_width = 0
@rate_width = 100
@width = @plus_width + width * @rate_width / 100
@height = 16
@align1 = 0
@align2 = 1
@align3 = 0
# 그라데이션 설정 grade1:하늘 게이지 grade2:열매 게이지
# (0:옆에 그라데이션 1:세로에 그라데이션 2:비스듬하게 그라데이션)
grade1 = 1
grade2 = 0
# 색 설정. color1:최외측선 ,color2:중범위
# color3:공범위 다크 칼라 ,color4:공범위 라이트 칼라
color1 = Color.new(0, 0, 0)
color2 = Color.new(255, 255, 192)
color3 = Color.new(0, 0, 0, 192)
color4 = Color.new(0, 0, 64, 192)
# 게이지의 색 설정
# 통상시의 색 설정
color5 = Color.new(0, 64, 80)
color6 = Color.new(0, 128, 160)
# 게이지가MAX의 때의 색 설정
color7 = Color.new(80, 0, 0)
color8 = Color.new(240, 0, 0)
# 제휴 스킬 사용시의 색 설정
color9 = Color.new(80, 64, 32)
color10 = Color.new(240, 192, 96)
# 스킬 영창시의 색 설정
color11 = Color.new(80, 0, 64)
color12 = Color.new(240, 0, 192)
# 게이지의 묘화
gauge_rect_at(@width, @height, @align3, color1, color2,
color3, color4, color5, color6, color7, color8,
color9, color10, color11, color12, grade1, grade2)
end
# 변수at에 묘화 하는 게이지의 폭을 대입
if actor.rtp == 0
at = (width + @plus_width) * actor.atp * @rate_width / 10000
else
at = (width + @plus_width) * actor.rt * @rate_width / actor.rtp / 100
end
if at > width
at = width
end
# 게이지의 좌힐·중앙 짓고 등 의 보정
case @align1
when 1
x += (@rect_width - width) / 2
when 2
x += @rect_width - width
end
case @align2
when 1
y -= @height / 2
when 2
y -= @height
end
self.contents.blt(x + @plus_x + width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(0, 0, @width, @height))
if @align3 == 0
rect_x = 0
else
x += @width - at - 1
rect_x = @width - at - 1
end
# 게이지의 색 설정
if at == width
# MAX시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 2, at, @height))
else
if actor.rtp == 0
# 통상시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height, at, @height))
else
if actor.spell == true
# 제휴 스킬 사용시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 3, at, @height))
else
# 스킬 영창시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 4, at, @height))
end
end
end
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 1)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
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
# 배틀 이벤트용 interpreter를 초기화
$game_system.battle_interpreter.setup(nil, 0)
# 무리를 준비
@troop_id = $game_temp.battle_troop_id
$game_troop.setup(@troop_id)
atb_setup
# 엑터 커멘드 윈도우를 작성
s1 = $data_system.words.attack
s2 = $data_system.words.skill
s3 = $data_system.words.guard
s4 = $data_system.words.item
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
@actor_command_window.y = 160
@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 @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
#--------------------------------------------------------------------------
# ● 승패 판정
#--------------------------------------------------------------------------
def judge
# 전멸 판정이 진 , 또는 파티 인원수가 0 사람의 경우
if $game_party.all_dead? or $game_party.actors.size == 0
# 패배 가능의 경우
if $game_temp.battle_can_lose
# 배틀 개시전의 것 BGM 에 되돌리는
$game_system.bgm_play($game_temp.map_bgm)
# 배틀 종료
battle_end(2)
# true 를 돌려주는
return true
end
# 게임 오버 플래그를 세트
$game_temp.gameover = true
# true 를 돌려주는
return true
end
# 에너미가 1 몸에서도 존재하면 false 을 돌려주는
for enemy in $game_troop.enemies
if enemy.exist?
return false
end
end
# 애프터 배틀 국면 개시 (승리)
start_phase5
# true 를 돌려주는
return true
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 배틀 이벤트 실행중의 경우
if $game_system.battle_interpreter.running?
if @command.size > 0
@command_a = false
@command = []
command_delete
end
@status_window.at_refresh
# interpreter를 갱신
$game_system.battle_interpreter.update
# 액션을 강제당하고 있는 버틀러가 존재하지 않는 경우
if $game_temp.forcing_battler == nil
# 배틀 이벤트의 실행이 끝났을 경우
unless $game_system.battle_interpreter.running?
# 배틀 이벤트의 셋업을 재실행
@status_window.refresh
setup_battle_event
end
end
end
# 시스템 (타이머), 화면을 갱신
$game_system.update
$game_screen.update
# 타이머가 0 가 되었을 경우
if $game_system.timer_working and $game_system.timer == 0
# 배틀 중단
$game_temp.battle_abort = true
end
# 윈도우를 갱신
@help_window.update
@party_command_window.update
@actor_command_window.update
@status_window.update
@message_window.update
# 스프라이트 세트를 갱신
@spriteset.update
# 트란지션 처리중의 경우
if $game_temp.transition_processing
# 트란지션 처리중 플래그를 클리어
$game_temp.transition_processing = false
# 트란지션 실행
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# 메세지 윈도우 표시중의 경우
if $game_temp.message_window_showing
return
end
# 게임 오버의 경우
if $game_temp.gameover
# 게임 오버 화면으로 전환하고
$scene = Scene_Gameover.new
return
end
# 타이틀 화면에 되돌리는 경우
if $game_temp.to_title
# 타이틀 화면으로 전환하고
$scene = Scene_Title.new
return
end
# 배틀 중단의 경우
if $game_temp.battle_abort
# 배틀 개시전의 것 BGM 에 되돌리는
$game_system.bgm_play($game_temp.map_bgm)
# 배틀 종료
battle_end(1)
return
end
# 헬프 윈도우 표시중의 경우
if @help_wait > 0
@help_wait -= 1
if @help_wait == 0
# 헬프 윈도우를 숨기는
@help_window.visible = false
end
end
# 국면에 의해 분기
case @phase
when 0 # AT게이지 갱신 국면
if anime_wait_return
update_phase0
end
when 1 # 프레바트르페즈
update_phase1
return
when 2 # 파티 커멘드 국면
update_phase2
return
when 5 # 애프터 배틀 국면
update_phase5
return
end
if $scene != self
return
end
if @phase == 0
if @command.size != 0 # 엑터 커멘드 국면
if @command_a == false
start_phase3
end
update_phase3
end
# 웨이트중의 경우
if @wait_count > 0
# 웨이트 카운트를 줄이는
@wait_count -= 1
return
end
update_phase4
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 2)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
#--------------------------------------------------------------------------
# ● 프레임 갱신 (AT게이지 갱신 국면)
#--------------------------------------------------------------------------
def update_phase0
if $game_temp.battle_turn == 0
$game_temp.battle_turn = 1
end
# B 버튼이 밀렸을 경우
if @command_a == false and @party == false
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
@party = true
end
end
if @party == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
(@action_battlers.empty? or @action_battlers[0].phase == 1)))
# 파티 커멘드 국면에
start_phase2
return
end
# AT게이지 증가 처리
cnt = 0
for battler in $game_party.actors + $game_troop.enemies
active?(battler)
if battler.rtp == 0
if battler.at >= @max
if battler.is_a?(Game_Actor)
if battler.inputable?
unless @action_battlers.include?(battler) or
@command.include?(battler) or @escape == true
if battler.current_action.forcing
fullat_se
force_action(battler)
action_start(battler)
else
fullat_se
@command.push(battler)
end
end
else
unless @action_battlers.include?(battler) or
battler == @command[0]
battler.current_action.clear
if @command.include?(battler)
@command.delete(battler)
else
if battler.movable?
fullat_se
end
end
action_start(battler)
end
end
else
unless @action_battlers.include?(battler)
if battler.current_action.forcing
force_action(battler)
action_start(battler)
else
if @enemy_speed != 0
if rand(@enemy_speed) == 0
number = cnt - $game_party.actors.size
enemy_action(number)
end
else
number = cnt - $game_party.actors.size
enemy_action(number)
end
end
end
end
else
battler.at += battler.agi
if battler.guarding?
battler.at += battler.agi
end
if battler.movable?
battler.atp = 100 * battler.at / @max
end
end
else
if battler.rt >= battler.rtp
speller = synthe?(battler)
if speller != nil
battler = speller[0]
end
unless @action_battlers.include?(battler)
if battler.is_a?(Game_Actor)
fullat_se
end
battler.rt = battler.rtp
action_start(battler)
end
else
battler.rt += battler.agi
speller = synthe?(battler)
if speller != nil
for spell in speller
if spell != battler
spell.rt += battler.agi
end
end
end
end
end
cnt += 1
end
# AT게이지를 리프레쉬
@status_window.at_refresh
# 도주 처리
if @escape == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
(@action_battlers.empty? or @action_battlers[0].phase == 1)))
temp = false
for battler in $game_party.actors
if battler.inputable?
temp = true
end
end
if temp == true
for battler in $game_party.actors
if battler.at < @max and battler.inputable?
temp = false
break
end
end
if temp == true
@escape = false
for battler in $game_party.actors
battler.at %= @max
end
$game_temp.battle_main_phase = false
update_phase2_escape
end
end
end
end
#--------------------------------------------------------------------------
# ● 파티 커멘드 국면 개시
#--------------------------------------------------------------------------
def start_phase2
# 국면 2 에 이행
@phase = 2
@party = false
# 파티 커멘드 윈도우를 유효화
@party_command_window.active = true
@party_command_window.visible = true
# 엑터를 비선택 상태로 설정
@actor_index = -1
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
if @command.size != 0
# 엑터의 명 멸망 효과 OFF
if @active_actor != nil
@active_actor.blink = false
end
end
# 카메라 세트
@camera == "party"
@spriteset.screen_target(0, 0, 1)
# 메인 국면 플래그를 클리어
$game_temp.battle_main_phase = false
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (파티 커멘드 국면)
#--------------------------------------------------------------------------
def update_phase2
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 파티 커멘드 윈도우의 커서 위치에서 분기
case @party_command_window.index
when 0 # 싸우는
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
@escape = false
@phase = 0
if $game_temp.battle_turn == 0
$game_temp.battle_turn = 1
end
if @command_a == true
# 엑터 커멘드 국면 개시
start_phase3
else
$game_temp.battle_main_phase = true
end
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)
@phase = 0
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
$game_temp.battle_main_phase = true
if $game_temp.battle_turn == 0
update_phase2_escape
$game_temp.battle_turn = 1
for battler in $game_party.actors
battler.at -= @max / 2
end
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
@escape = true
for battler in $game_party.actors
@command_a = false
@command.delete(battler)
@action_battlers.delete(battler)
skill_reset(battler)
end
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
@help_window.set_text("도주 실패", 1)
@help_wait = @help_time
# 파티 전원의 액션을 클리어
$game_party.clear_actions
# 메인 국면 개시
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 = []
if @active_actor != nil
@active_actor.blink = false
end
# 메인 국면 플래그를 세트
$game_temp.battle_main_phase = true
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
if @skill_window != nil
# 스킬 윈도우를 해방
@skill_window.dispose
@skill_window = nil
end
if @item_window != nil
# 아이템 윈도우를 해방
@item_window.dispose
@item_window = nil
end
# 헬프 윈도우를 숨기는
@help_window.visible = false
# 루프
for enemy in $game_troop.enemies
# 에너미가 숨고 상태가 아닌 경우
unless enemy.hidden
# 획득 EXP, 골드를 추가
exp += enemy.exp
gold += enemy.gold
# 트레이닝 전기밥통 출현 판정
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
# 트레이닝 전기밥통의 수를 6 개까지 한정
treasures = treasures[0..5]
# EXP 획득
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor.cant_get_exp? == false
last_level = actor.level
actor.exp += exp
if actor.level > last_level
@status_window.level_up(i)
actor.damage[[actor, -1]] = "Level up!"
actor.up_level = actor.level - last_level
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(exp, 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
for actor in $game_party.actors
if actor.damage.include?([actor, 0])
@phase5_wait_count = 20
actor.damage_pop[[actor, 0]] = true
end
if actor.damage.include?([actor, -1])
@phase5_wait_count = 20
actor.damage_pop[[actor, -1]] = true
for level in actor.level - actor.up_level + 1..actor.level
for skill in $data_classes[actor.class_id].learnings
if level == skill.level and not actor.skill_learn?(skill.id)
actor.damage[[actor, 0]] = "New Skill!"
break
end
end
end
end
end
end
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 배틀 종료
battle_end(0)
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 3)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
#--------------------------------------------------------------------------
# ● 엑터 커멘드 국면 개시
#--------------------------------------------------------------------------
def start_phase3
if victory?
return
end
# 메인 국면 플래그를 클리어
$game_temp.battle_main_phase = false
@command_a = true
@active_actor = @command[0]
cnt = 0
for actor in $game_party.actors
if actor == @active_actor
@actor_index = cnt
end
cnt += 1
end
@active_actor.blink = true
unless @active_actor.inputable?
@active_actor.current_action.clear
phase3_next_actor
return
end
phase3_setup_command_window
# 카메라의 설정
@camera = "command"
plus = ($game_party.actors.size - 1) / 2.0 - @actor_index
y = [(plus.abs - 1.5) * 10 , 0].min
@spriteset.screen_target(plus * 50, y, 1.0 + y * 0.002)
end
#--------------------------------------------------------------------------
# ● 엑터의 커멘드 입력 종료
#--------------------------------------------------------------------------
def phase3_next_actor
@command.shift
@command_a = false
# 메인 국면 플래그를 세트
$game_temp.battle_main_phase = true
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
# 엑터의 명 멸망 효과 OFF
if @active_actor != nil
@active_actor.blink = false
end
action_start(@active_actor)
# 카메라를 바탕으로 되돌리는
if @camera == "command"
@spriteset.screen_target(0, 0, 1)
end
return
end
#--------------------------------------------------------------------------
# ● 엑터 커멘드 윈도우의 셋업
#--------------------------------------------------------------------------
def phase3_setup_command_window
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 엑터 커멘드 윈도우를 유효화
@actor_command_window.active = true
@actor_command_window.visible = true
# 엑터 커멘드 윈도우의 위치를 설정
@actor_command_window.x = @actor_index * 160 +
(4 - $game_party.actors.size) * 80
# 인덱스를 0 로 설정
@actor_command_window.index = 0
end
#--------------------------------------------------------------------------
# ● 에너미 액션 작성
#--------------------------------------------------------------------------
def enemy_action(number)
enemy = $game_troop.enemies[number]
unless enemy.current_action.forcing
enemy.make_action
end
action_start(enemy)
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (엑터 커멘드 국면)
#--------------------------------------------------------------------------
def update_phase3
if victory? and @command_a
command_delete
@command.push(@active_actor)
return
end
# 에네미아로가 유효의 경우
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_command_window.active
update_phase3_basic_command
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (엑터 커멘드 국면 : 기본 커멘드)
#--------------------------------------------------------------------------
def update_phase3_basic_command
unless @active_actor.inputable?
@active_actor.current_action.clear
phase3_next_actor
return
end
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B) and @party == false
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
@party = true
end
if @party == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
&n
class Scene_Battle
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_reader :status_window # 스테이터스 윈도우
attr_reader :spriteset # 배틀 스프라이트
attr_reader :scroll_time # 스크린 이동 기본 시간
attr_reader :zoom_rate # 적 버틀러 기본 위치
attr_reader :drive # 카메라 구동
attr_accessor :force # 액션 강제도
attr_accessor :camera # 현재의 카메라 소지자
#--------------------------------------------------------------------------
# ● ATB기초 셋업
#--------------------------------------------------------------------------
def atb_setup
# ATB초기화
# speed : 배틀 스피드 결정. 값이 작을 정도 빠른
# @active : 액티브도 설정
# 3 : 항상 액티브 상태
# 2 : 스킬·아이템 선택중만 액티브 게이지가 멈추는
# 1 : 2상태에 가세해 타겟 선택시도 웨이트가 걸리는
# 0 : 1상태에 가세해 커멘드 입력시에도 웨이트가 걸리는
# @action : 타인이 행동중에 자신도 행동을 일으키는 것을 허락할까
# 3 : 자신이 행동 불능이 아닌 한 한정해 허락하는
# 2 : 자신이 데미지를 받지 않은 한 허락하는
# 1 : 2상태에 가세해 타겟이 행동하고 있지 않는 한 허락하는
# 0 : 행동을 허락하지 않는다. 차례로 행동 끝마칠 때까지 기다리는
# @anime_wait : true으로 하면(자) 배틀 애니메이션·데미지 표시중은 웨이트가 걸리는
# @damage_wait : 데미지 표시 대기 시간(단위는 프레임)
# @after_wait : 아군·적 전멸시 , 다음의 처리로 옮길 때까지의 대기 시간
# [a, b] a 은 아군 전멸시 ,b 는 적 전멸시(단위는 프레임)
# @enemy_speed : 적의 사고 속도. 1(이)라면 즉시 행동.
# 1프레임마다 ,1/@enemy_speed의 확률로 행동을 일으키는
# @force : 강제 액션으로 스킬 사용시의 강제 상태
# 2:스킬은 모두 영창 하지 않고 , 반드시 즉시 실행
# 1:단독 스킬은 영창 해 , 제휴 스킬만 즉시 실행
# 0:전 스킬 영창을 실시할 뿐(만큼)
# ($scene.force = x 과 하는 것으로써 , 통상 이벤트의 스크립트로부터 변경 가능)
# @drive : 카메라 구동ON/OFF. true그리고 구동ON,false그리고 구동OFF
# @scroll_time : 스크린 이동에 필요로 하는 기본 시간
# @zoom_rate = [i, j] : 에너미의 줌율
# i 이 화면 최상부에 배치했을 때의 확대율
# j 이 화면 최하부에 배치했을 때의 확대율
# 1 배로 하고 싶을 때도 ,1.0 라고 반드시 소수로 설정하는 것
speed = 150
@active = 1
@action = 2
@anime_wait = false
@damage_wait = 10
@after_wait = [80, 0]
@enemy_speed = 40
@force = 2
@drive = true
@scroll_time = 15
@zoom_rate = [0.2, 1.0]
@help_time = 40
@escape == false
@camera = nil
@max = 0
@turn_cnt = 0
@help_wait = 0
@action_battlers = []
@synthe = []
@spell_p = {}
@spell_e = {}
@command_a = false
@command = []
@party = false
for battler in $game_party.actors + $game_troop.enemies
spell_reset(battler)
battler.at = battler.agi * rand(speed / 2)
battler.damage_pop = {}
battler.damage = {}
battler.damage_sp = {}
battler.critical = {}
battler.recover_hp = {}
battler.recover_sp = {}
battler.state_p = {}
battler.state_m = {}
battler.animation = []
if battler.is_a?(Game_Actor)
@max += battler.agi
end
end
@max *= speed
@max /= $game_party.actors.size
for battler in $game_party.actors + $game_troop.enemies
battler.atp = 100 * battler.at / @max
end
end
#--------------------------------------------------------------------------
# ● AT게이지Max시SE
#--------------------------------------------------------------------------
def fullat_se
Audio.se_play("Audio/SE/033-switch02", 80, 100)
end
#--------------------------------------------------------------------------
# ● 레벨업SE
#--------------------------------------------------------------------------
def levelup_se
Audio.se_play("Audio/SE/056-Right02", 80, 100)
end
#--------------------------------------------------------------------------
# ● 스킬 습득SE
#--------------------------------------------------------------------------
def skill_se
Audio.se_play("Audio/SE/056-Right02", 80, 150)
end
end
class Window_Base < Window
#--------------------------------------------------------------------------
# ● ATG 의 묘화
# actor : 엑터
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# width : 묘화처의 폭
#--------------------------------------------------------------------------
def draw_actor_atg(actor, x, y, width = 144)
if @at_gauge == nil
# plus_x:X좌표의 위치 보정 rate_x:X좌표의 위치 보정(%) plus_y:Y좌표의 위치 보정
# plus_width:폭의 보정 rate_width:폭의 보정(%) height:세로폭
# align1:묘화 타입1 0:왼쪽 막혀라 1:centering 2:right justify
# align2:묘화 타입2 0:카미츠메째 1:centering 2:하막혀라
# align3:게이지 타입 0:왼쪽 막혀라 1:right justify
@plus_x = 0
@rate_x = 0
@plus_y = 16
@plus_width = 0
@rate_width = 100
@width = @plus_width + width * @rate_width / 100
@height = 16
@align1 = 0
@align2 = 1
@align3 = 0
# 그라데이션 설정 grade1:하늘 게이지 grade2:열매 게이지
# (0:옆에 그라데이션 1:세로에 그라데이션 2:비스듬하게 그라데이션)
grade1 = 1
grade2 = 0
# 색 설정. color1:최외측선 ,color2:중범위
# color3:공범위 다크 칼라 ,color4:공범위 라이트 칼라
color1 = Color.new(0, 0, 0)
color2 = Color.new(255, 255, 192)
color3 = Color.new(0, 0, 0, 192)
color4 = Color.new(0, 0, 64, 192)
# 게이지의 색 설정
# 통상시의 색 설정
color5 = Color.new(0, 64, 80)
color6 = Color.new(0, 128, 160)
# 게이지가MAX의 때의 색 설정
color7 = Color.new(80, 0, 0)
color8 = Color.new(240, 0, 0)
# 제휴 스킬 사용시의 색 설정
color9 = Color.new(80, 64, 32)
color10 = Color.new(240, 192, 96)
# 스킬 영창시의 색 설정
color11 = Color.new(80, 0, 64)
color12 = Color.new(240, 0, 192)
# 게이지의 묘화
gauge_rect_at(@width, @height, @align3, color1, color2,
color3, color4, color5, color6, color7, color8,
color9, color10, color11, color12, grade1, grade2)
end
# 변수at에 묘화 하는 게이지의 폭을 대입
if actor.rtp == 0
at = (width + @plus_width) * actor.atp * @rate_width / 10000
else
at = (width + @plus_width) * actor.rt * @rate_width / actor.rtp / 100
end
if at > width
at = width
end
# 게이지의 좌힐·중앙 짓고 등 의 보정
case @align1
when 1
x += (@rect_width - width) / 2
when 2
x += @rect_width - width
end
case @align2
when 1
y -= @height / 2
when 2
y -= @height
end
self.contents.blt(x + @plus_x + width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(0, 0, @width, @height))
if @align3 == 0
rect_x = 0
else
x += @width - at - 1
rect_x = @width - at - 1
end
# 게이지의 색 설정
if at == width
# MAX시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 2, at, @height))
else
if actor.rtp == 0
# 통상시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height, at, @height))
else
if actor.spell == true
# 제휴 스킬 사용시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 3, at, @height))
else
# 스킬 영창시의 게이지 묘화
self.contents.blt(x + @plus_x + @width * @rate_x / 100, y + @plus_y,
@at_gauge, Rect.new(rect_x, @height * 4, at, @height))
end
end
end
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 1)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
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
# 배틀 이벤트용 interpreter를 초기화
$game_system.battle_interpreter.setup(nil, 0)
# 무리를 준비
@troop_id = $game_temp.battle_troop_id
$game_troop.setup(@troop_id)
atb_setup
# 엑터 커멘드 윈도우를 작성
s1 = $data_system.words.attack
s2 = $data_system.words.skill
s3 = $data_system.words.guard
s4 = $data_system.words.item
@actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
@actor_command_window.y = 160
@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 @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
#--------------------------------------------------------------------------
# ● 승패 판정
#--------------------------------------------------------------------------
def judge
# 전멸 판정이 진 , 또는 파티 인원수가 0 사람의 경우
if $game_party.all_dead? or $game_party.actors.size == 0
# 패배 가능의 경우
if $game_temp.battle_can_lose
# 배틀 개시전의 것 BGM 에 되돌리는
$game_system.bgm_play($game_temp.map_bgm)
# 배틀 종료
battle_end(2)
# true 를 돌려주는
return true
end
# 게임 오버 플래그를 세트
$game_temp.gameover = true
# true 를 돌려주는
return true
end
# 에너미가 1 몸에서도 존재하면 false 을 돌려주는
for enemy in $game_troop.enemies
if enemy.exist?
return false
end
end
# 애프터 배틀 국면 개시 (승리)
start_phase5
# true 를 돌려주는
return true
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 배틀 이벤트 실행중의 경우
if $game_system.battle_interpreter.running?
if @command.size > 0
@command_a = false
@command = []
command_delete
end
@status_window.at_refresh
# interpreter를 갱신
$game_system.battle_interpreter.update
# 액션을 강제당하고 있는 버틀러가 존재하지 않는 경우
if $game_temp.forcing_battler == nil
# 배틀 이벤트의 실행이 끝났을 경우
unless $game_system.battle_interpreter.running?
# 배틀 이벤트의 셋업을 재실행
@status_window.refresh
setup_battle_event
end
end
end
# 시스템 (타이머), 화면을 갱신
$game_system.update
$game_screen.update
# 타이머가 0 가 되었을 경우
if $game_system.timer_working and $game_system.timer == 0
# 배틀 중단
$game_temp.battle_abort = true
end
# 윈도우를 갱신
@help_window.update
@party_command_window.update
@actor_command_window.update
@status_window.update
@message_window.update
# 스프라이트 세트를 갱신
@spriteset.update
# 트란지션 처리중의 경우
if $game_temp.transition_processing
# 트란지션 처리중 플래그를 클리어
$game_temp.transition_processing = false
# 트란지션 실행
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# 메세지 윈도우 표시중의 경우
if $game_temp.message_window_showing
return
end
# 게임 오버의 경우
if $game_temp.gameover
# 게임 오버 화면으로 전환하고
$scene = Scene_Gameover.new
return
end
# 타이틀 화면에 되돌리는 경우
if $game_temp.to_title
# 타이틀 화면으로 전환하고
$scene = Scene_Title.new
return
end
# 배틀 중단의 경우
if $game_temp.battle_abort
# 배틀 개시전의 것 BGM 에 되돌리는
$game_system.bgm_play($game_temp.map_bgm)
# 배틀 종료
battle_end(1)
return
end
# 헬프 윈도우 표시중의 경우
if @help_wait > 0
@help_wait -= 1
if @help_wait == 0
# 헬프 윈도우를 숨기는
@help_window.visible = false
end
end
# 국면에 의해 분기
case @phase
when 0 # AT게이지 갱신 국면
if anime_wait_return
update_phase0
end
when 1 # 프레바트르페즈
update_phase1
return
when 2 # 파티 커멘드 국면
update_phase2
return
when 5 # 애프터 배틀 국면
update_phase5
return
end
if $scene != self
return
end
if @phase == 0
if @command.size != 0 # 엑터 커멘드 국면
if @command_a == false
start_phase3
end
update_phase3
end
# 웨이트중의 경우
if @wait_count > 0
# 웨이트 카운트를 줄이는
@wait_count -= 1
return
end
update_phase4
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 2)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
#--------------------------------------------------------------------------
# ● 프레임 갱신 (AT게이지 갱신 국면)
#--------------------------------------------------------------------------
def update_phase0
if $game_temp.battle_turn == 0
$game_temp.battle_turn = 1
end
# B 버튼이 밀렸을 경우
if @command_a == false and @party == false
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
@party = true
end
end
if @party == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
(@action_battlers.empty? or @action_battlers[0].phase == 1)))
# 파티 커멘드 국면에
start_phase2
return
end
# AT게이지 증가 처리
cnt = 0
for battler in $game_party.actors + $game_troop.enemies
active?(battler)
if battler.rtp == 0
if battler.at >= @max
if battler.is_a?(Game_Actor)
if battler.inputable?
unless @action_battlers.include?(battler) or
@command.include?(battler) or @escape == true
if battler.current_action.forcing
fullat_se
force_action(battler)
action_start(battler)
else
fullat_se
@command.push(battler)
end
end
else
unless @action_battlers.include?(battler) or
battler == @command[0]
battler.current_action.clear
if @command.include?(battler)
@command.delete(battler)
else
if battler.movable?
fullat_se
end
end
action_start(battler)
end
end
else
unless @action_battlers.include?(battler)
if battler.current_action.forcing
force_action(battler)
action_start(battler)
else
if @enemy_speed != 0
if rand(@enemy_speed) == 0
number = cnt - $game_party.actors.size
enemy_action(number)
end
else
number = cnt - $game_party.actors.size
enemy_action(number)
end
end
end
end
else
battler.at += battler.agi
if battler.guarding?
battler.at += battler.agi
end
if battler.movable?
battler.atp = 100 * battler.at / @max
end
end
else
if battler.rt >= battler.rtp
speller = synthe?(battler)
if speller != nil
battler = speller[0]
end
unless @action_battlers.include?(battler)
if battler.is_a?(Game_Actor)
fullat_se
end
battler.rt = battler.rtp
action_start(battler)
end
else
battler.rt += battler.agi
speller = synthe?(battler)
if speller != nil
for spell in speller
if spell != battler
spell.rt += battler.agi
end
end
end
end
end
cnt += 1
end
# AT게이지를 리프레쉬
@status_window.at_refresh
# 도주 처리
if @escape == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
(@action_battlers.empty? or @action_battlers[0].phase == 1)))
temp = false
for battler in $game_party.actors
if battler.inputable?
temp = true
end
end
if temp == true
for battler in $game_party.actors
if battler.at < @max and battler.inputable?
temp = false
break
end
end
if temp == true
@escape = false
for battler in $game_party.actors
battler.at %= @max
end
$game_temp.battle_main_phase = false
update_phase2_escape
end
end
end
end
#--------------------------------------------------------------------------
# ● 파티 커멘드 국면 개시
#--------------------------------------------------------------------------
def start_phase2
# 국면 2 에 이행
@phase = 2
@party = false
# 파티 커멘드 윈도우를 유효화
@party_command_window.active = true
@party_command_window.visible = true
# 엑터를 비선택 상태로 설정
@actor_index = -1
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
if @command.size != 0
# 엑터의 명 멸망 효과 OFF
if @active_actor != nil
@active_actor.blink = false
end
end
# 카메라 세트
@camera == "party"
@spriteset.screen_target(0, 0, 1)
# 메인 국면 플래그를 클리어
$game_temp.battle_main_phase = false
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (파티 커멘드 국면)
#--------------------------------------------------------------------------
def update_phase2
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 파티 커멘드 윈도우의 커서 위치에서 분기
case @party_command_window.index
when 0 # 싸우는
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
@escape = false
@phase = 0
if $game_temp.battle_turn == 0
$game_temp.battle_turn = 1
end
if @command_a == true
# 엑터 커멘드 국면 개시
start_phase3
else
$game_temp.battle_main_phase = true
end
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)
@phase = 0
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
$game_temp.battle_main_phase = true
if $game_temp.battle_turn == 0
update_phase2_escape
$game_temp.battle_turn = 1
for battler in $game_party.actors
battler.at -= @max / 2
end
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
@escape = true
for battler in $game_party.actors
@command_a = false
@command.delete(battler)
@action_battlers.delete(battler)
skill_reset(battler)
end
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
@help_window.set_text("도주 실패", 1)
@help_wait = @help_time
# 파티 전원의 액션을 클리어
$game_party.clear_actions
# 메인 국면 개시
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 = []
if @active_actor != nil
@active_actor.blink = false
end
# 메인 국면 플래그를 세트
$game_temp.battle_main_phase = true
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
if @skill_window != nil
# 스킬 윈도우를 해방
@skill_window.dispose
@skill_window = nil
end
if @item_window != nil
# 아이템 윈도우를 해방
@item_window.dispose
@item_window = nil
end
# 헬프 윈도우를 숨기는
@help_window.visible = false
# 루프
for enemy in $game_troop.enemies
# 에너미가 숨고 상태가 아닌 경우
unless enemy.hidden
# 획득 EXP, 골드를 추가
exp += enemy.exp
gold += enemy.gold
# 트레이닝 전기밥통 출현 판정
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
# 트레이닝 전기밥통의 수를 6 개까지 한정
treasures = treasures[0..5]
# EXP 획득
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor.cant_get_exp? == false
last_level = actor.level
actor.exp += exp
if actor.level > last_level
@status_window.level_up(i)
actor.damage[[actor, -1]] = "Level up!"
actor.up_level = actor.level - last_level
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(exp, 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
for actor in $game_party.actors
if actor.damage.include?([actor, 0])
@phase5_wait_count = 20
actor.damage_pop[[actor, 0]] = true
end
if actor.damage.include?([actor, -1])
@phase5_wait_count = 20
actor.damage_pop[[actor, -1]] = true
for level in actor.level - actor.up_level + 1..actor.level
for skill in $data_classes[actor.class_id].learnings
if level == skill.level and not actor.skill_learn?(skill.id)
actor.damage[[actor, 0]] = "New Skill!"
break
end
end
end
end
end
end
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 배틀 종료
battle_end(0)
end
end
#==============================================================================
# ■ Scene_Battle (분할 정의 3)
#------------------------------------------------------------------------------
# 배틀 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
#--------------------------------------------------------------------------
# ● 엑터 커멘드 국면 개시
#--------------------------------------------------------------------------
def start_phase3
if victory?
return
end
# 메인 국면 플래그를 클리어
$game_temp.battle_main_phase = false
@command_a = true
@active_actor = @command[0]
cnt = 0
for actor in $game_party.actors
if actor == @active_actor
@actor_index = cnt
end
cnt += 1
end
@active_actor.blink = true
unless @active_actor.inputable?
@active_actor.current_action.clear
phase3_next_actor
return
end
phase3_setup_command_window
# 카메라의 설정
@camera = "command"
plus = ($game_party.actors.size - 1) / 2.0 - @actor_index
y = [(plus.abs - 1.5) * 10 , 0].min
@spriteset.screen_target(plus * 50, y, 1.0 + y * 0.002)
end
#--------------------------------------------------------------------------
# ● 엑터의 커멘드 입력 종료
#--------------------------------------------------------------------------
def phase3_next_actor
@command.shift
@command_a = false
# 메인 국면 플래그를 세트
$game_temp.battle_main_phase = true
# 엑터 커멘드 윈도우를 무효화
@actor_command_window.active = false
@actor_command_window.visible = false
# 엑터의 명 멸망 효과 OFF
if @active_actor != nil
@active_actor.blink = false
end
action_start(@active_actor)
# 카메라를 바탕으로 되돌리는
if @camera == "command"
@spriteset.screen_target(0, 0, 1)
end
return
end
#--------------------------------------------------------------------------
# ● 엑터 커멘드 윈도우의 셋업
#--------------------------------------------------------------------------
def phase3_setup_command_window
# 파티 커멘드 윈도우를 무효화
@party_command_window.active = false
@party_command_window.visible = false
# 엑터 커멘드 윈도우를 유효화
@actor_command_window.active = true
@actor_command_window.visible = true
# 엑터 커멘드 윈도우의 위치를 설정
@actor_command_window.x = @actor_index * 160 +
(4 - $game_party.actors.size) * 80
# 인덱스를 0 로 설정
@actor_command_window.index = 0
end
#--------------------------------------------------------------------------
# ● 에너미 액션 작성
#--------------------------------------------------------------------------
def enemy_action(number)
enemy = $game_troop.enemies[number]
unless enemy.current_action.forcing
enemy.make_action
end
action_start(enemy)
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (엑터 커멘드 국면)
#--------------------------------------------------------------------------
def update_phase3
if victory? and @command_a
command_delete
@command.push(@active_actor)
return
end
# 에네미아로가 유효의 경우
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_command_window.active
update_phase3_basic_command
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (엑터 커멘드 국면 : 기본 커멘드)
#--------------------------------------------------------------------------
def update_phase3_basic_command
unless @active_actor.inputable?
@active_actor.current_action.clear
phase3_next_actor
return
end
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B) and @party == false
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
@party = true
end
if @party == true and
((@action > 0 and @action_battlers.empty?) or (@action == 0 and
&n