이번에는 아예 다 써드릴게요;;;
#==============================================================================
# ■ Interpreter (분할 정의 7)
#------------------------------------------------------------------------------
# 이벤트 커멘드를 실행하는 interpreter입니다.이 클래스는 Game_System 곳간
# 스나 Game_Event 클래스의 내부에서 사용됩니다.
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 에너미의 HP 증감
#--------------------------------------------------------------------------
def command_331
# 조작하는 값을 취득
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# HP 가 0 이 아닌 경우
if enemy.hp > 0
# HP 를 변경 (전투 불능이 허가되어 있지 않으면 1 으로 한다)
if @parameters[4] == false and enemy.hp + value <= 0
enemy.hp = 1
else
enemy.hp += value
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 SP 증감
#--------------------------------------------------------------------------
def command_332
# 조작하는 값을 취득
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# SP 를 변경
enemy.sp += value
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 스테이트 변경
#--------------------------------------------------------------------------
def command_333
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# 스테이트의 옵션 [HP 0 상태로 간주하는] 이 유효의 경우
if $data_states[@parameters[2]].zero_hp
# 불사신 플래그를 클리어
enemy.immortal = false
end
# 스테이트를 변경
if @parameters[1] == 0
enemy.add_state(@parameters[2])
else
enemy.remove_state(@parameters[2])
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 전회복
#--------------------------------------------------------------------------
def command_334
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# 전회복
enemy.recover_all
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 출현
#--------------------------------------------------------------------------
def command_335
# 에너미를 취득
enemy = $game_troop.enemies[@parameters[0]]
# 숨어 플래그를 클리어
if enemy != nil
enemy.hidden = false
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 변신
#--------------------------------------------------------------------------
def command_336
# 에너미를 취득
enemy = $game_troop.enemies[@parameters[0]]
# 변신 처리
if enemy != nil
enemy.transform(@parameters[1])
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 애니메이션의 표시
#--------------------------------------------------------------------------
def command_337
# 이테레이타로 처리
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# 애니메이션 ID 를 설정
battler.animation_id = @parameters[2]
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 데미지의 처리
#--------------------------------------------------------------------------
def command_338
# 조작하는 값을 취득
value = operate_value(0, @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# HP 를 변경
battler.hp -= value
# 전투중이라면
if $game_temp.in_battle
# 데미지를 설정
battler.damage = value
battler.damage_pop = true
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 액션의 강제
#--------------------------------------------------------------------------
def command_339
# 전투중이 아니면 무시
unless $game_temp.in_battle
return true
end
# 턴수가 0 이라면 무시
if $game_temp.battle_turn == 0
return true
end
# 이테레이타로 처리 (편의적인 것으로, 복수가 될 것은 없다)
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# 액션을 설정
battler.current_action.kind = @parameters[2]
if battler.current_action.kind == 0
battler.current_action.basic = @parameters[3]
else
battler.current_action.skill_id = @parameters[3]
end
# 행동 대상을 설정
if @parameters[4] == -2
if battler.is_a?(Game_Enemy)
battler.current_action.decide_last_target_for_enemy
else
battler.current_action.decide_last_target_for_actor
end
elsif @parameters[4] == -1
if battler.is_a?(Game_Enemy)
battler.current_action.decide_random_target_for_enemy
else
battler.current_action.decide_random_target_for_actor
end
elsif @parameters[4] >= 0
battler.current_action.target_index = @parameters[4]
end
# 강제 플래그를 설정
battler.current_action.forcing = true
# 액션이 유효하고 [곧바로 실행] 의 경우
if battler.current_action.valid? and @parameters[5] == 1
# 강제 대상의 버틀러를 설정
$game_temp.forcing_battler = battler
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 배틀의 중단
#--------------------------------------------------------------------------
def command_340
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 메뉴 화면의 호출
#--------------------------------------------------------------------------
def command_351
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 메뉴 호출 플래그를 세트
$game_temp.menu_calling = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 세이브 화면의 호출
#--------------------------------------------------------------------------
def command_352
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 세이브 호출 플래그를 세트
$game_temp.save_calling = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 게임 오버
#--------------------------------------------------------------------------
def command_353
# 게임 오버 플래그를 세트
$game_temp.gameover = true
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 타이틀 화면에 되돌린다
#--------------------------------------------------------------------------
def command_354
# 타이틀 화면에 되돌리는 플래그를 세트
$game_temp.to_title = true
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 스크립트
#--------------------------------------------------------------------------
def command_355
# script 에 1 행 째를 설정
script = @list[@index].parameters[0] + "n"
# 루프
loop do
# 다음의 이벤트 커멘드가 스크립트 2 행 째 이후의 경우
if @list[@index+1].code == 655
# script 에 2 행 째 이후를 추가
script += @list[@index+1].parameters[0] + "n"
# 이벤트 커멘드가 스크립트 2 행 째 이후가 아닌 경우
else
# 루프 중단
break
end
# 인덱스를 진행시킨다
@index += 1
end
# 평가
result = eval(script)
# 반환값이 false 의 경우
if result == false
# 종료
return false
end
# 계속
return true
end
end
이상입니다.
그다음은 메인이죠?
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
# 각 클래스의 정의가 끝난 후, 여기로부터 실제의 처리가 시작됩니다.
#==============================================================================
begin
# 트란지션 준비
Graphics.freeze
# 씬 오브젝트 (타이틀 화면)를 작성
$scene = Scene_Title.new
# $scene 가 유효한 한계 main 메소드를 호출한다
while $scene != nil
$scene.main
end
# 페이드아웃
Graphics.transition(20)
rescue Errno::ENOENT
# 예외 Errno::ENOENT 를 보충
# 파일을 오픈할 수 없었던 경우, 메세지를 표시해 종료한다
filename = $!.message.sub("No such file or directory - ", "")
print("파일 #{filename} 가 발견되지 않습니다.")
end
#==============================================================================
# ■ Interpreter (분할 정의 7)
#------------------------------------------------------------------------------
# 이벤트 커멘드를 실행하는 interpreter입니다.이 클래스는 Game_System 곳간
# 스나 Game_Event 클래스의 내부에서 사용됩니다.
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 에너미의 HP 증감
#--------------------------------------------------------------------------
def command_331
# 조작하는 값을 취득
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# HP 가 0 이 아닌 경우
if enemy.hp > 0
# HP 를 변경 (전투 불능이 허가되어 있지 않으면 1 으로 한다)
if @parameters[4] == false and enemy.hp + value <= 0
enemy.hp = 1
else
enemy.hp += value
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 SP 증감
#--------------------------------------------------------------------------
def command_332
# 조작하는 값을 취득
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# SP 를 변경
enemy.sp += value
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 스테이트 변경
#--------------------------------------------------------------------------
def command_333
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# 스테이트의 옵션 [HP 0 상태로 간주하는] 이 유효의 경우
if $data_states[@parameters[2]].zero_hp
# 불사신 플래그를 클리어
enemy.immortal = false
end
# 스테이트를 변경
if @parameters[1] == 0
enemy.add_state(@parameters[2])
else
enemy.remove_state(@parameters[2])
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 전회복
#--------------------------------------------------------------------------
def command_334
# 이테레이타로 처리
iterate_enemy(@parameters[0]) do |enemy|
# 전회복
enemy.recover_all
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 출현
#--------------------------------------------------------------------------
def command_335
# 에너미를 취득
enemy = $game_troop.enemies[@parameters[0]]
# 숨어 플래그를 클리어
if enemy != nil
enemy.hidden = false
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 에너미의 변신
#--------------------------------------------------------------------------
def command_336
# 에너미를 취득
enemy = $game_troop.enemies[@parameters[0]]
# 변신 처리
if enemy != nil
enemy.transform(@parameters[1])
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 애니메이션의 표시
#--------------------------------------------------------------------------
def command_337
# 이테레이타로 처리
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# 애니메이션 ID 를 설정
battler.animation_id = @parameters[2]
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 데미지의 처리
#--------------------------------------------------------------------------
def command_338
# 조작하는 값을 취득
value = operate_value(0, @parameters[2], @parameters[3])
# 이테레이타로 처리
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# HP 를 변경
battler.hp -= value
# 전투중이라면
if $game_temp.in_battle
# 데미지를 설정
battler.damage = value
battler.damage_pop = true
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 액션의 강제
#--------------------------------------------------------------------------
def command_339
# 전투중이 아니면 무시
unless $game_temp.in_battle
return true
end
# 턴수가 0 이라면 무시
if $game_temp.battle_turn == 0
return true
end
# 이테레이타로 처리 (편의적인 것으로, 복수가 될 것은 없다)
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# 버틀러가 존재하는 경우
if battler.exist?
# 액션을 설정
battler.current_action.kind = @parameters[2]
if battler.current_action.kind == 0
battler.current_action.basic = @parameters[3]
else
battler.current_action.skill_id = @parameters[3]
end
# 행동 대상을 설정
if @parameters[4] == -2
if battler.is_a?(Game_Enemy)
battler.current_action.decide_last_target_for_enemy
else
battler.current_action.decide_last_target_for_actor
end
elsif @parameters[4] == -1
if battler.is_a?(Game_Enemy)
battler.current_action.decide_random_target_for_enemy
else
battler.current_action.decide_random_target_for_actor
end
elsif @parameters[4] >= 0
battler.current_action.target_index = @parameters[4]
end
# 강제 플래그를 설정
battler.current_action.forcing = true
# 액션이 유효하고 [곧바로 실행] 의 경우
if battler.current_action.valid? and @parameters[5] == 1
# 강제 대상의 버틀러를 설정
$game_temp.forcing_battler = battler
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
end
end
# 계속
return true
end
#--------------------------------------------------------------------------
# ● 배틀의 중단
#--------------------------------------------------------------------------
def command_340
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 메뉴 화면의 호출
#--------------------------------------------------------------------------
def command_351
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 메뉴 호출 플래그를 세트
$game_temp.menu_calling = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 세이브 화면의 호출
#--------------------------------------------------------------------------
def command_352
# 배틀 중단 플래그를 세트
$game_temp.battle_abort = true
# 세이브 호출 플래그를 세트
$game_temp.save_calling = true
# 인덱스를 진행시킨다
@index += 1
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 게임 오버
#--------------------------------------------------------------------------
def command_353
# 게임 오버 플래그를 세트
$game_temp.gameover = true
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 타이틀 화면에 되돌린다
#--------------------------------------------------------------------------
def command_354
# 타이틀 화면에 되돌리는 플래그를 세트
$game_temp.to_title = true
# 종료
return false
end
#--------------------------------------------------------------------------
# ● 스크립트
#--------------------------------------------------------------------------
def command_355
# script 에 1 행 째를 설정
script = @list[@index].parameters[0] + "n"
# 루프
loop do
# 다음의 이벤트 커멘드가 스크립트 2 행 째 이후의 경우
if @list[@index+1].code == 655
# script 에 2 행 째 이후를 추가
script += @list[@index+1].parameters[0] + "n"
# 이벤트 커멘드가 스크립트 2 행 째 이후가 아닌 경우
else
# 루프 중단
break
end
# 인덱스를 진행시킨다
@index += 1
end
# 평가
result = eval(script)
# 반환값이 false 의 경우
if result == false
# 종료
return false
end
# 계속
return true
end
end
이상입니다.
그다음은 메인이죠?
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
# 각 클래스의 정의가 끝난 후, 여기로부터 실제의 처리가 시작됩니다.
#==============================================================================
begin
# 트란지션 준비
Graphics.freeze
# 씬 오브젝트 (타이틀 화면)를 작성
$scene = Scene_Title.new
# $scene 가 유효한 한계 main 메소드를 호출한다
while $scene != nil
$scene.main
end
# 페이드아웃
Graphics.transition(20)
rescue Errno::ENOENT
# 예외 Errno::ENOENT 를 보충
# 파일을 오픈할 수 없었던 경우, 메세지를 표시해 종료한다
filename = $!.message.sub("No such file or directory - ", "")
print("파일 #{filename} 가 발견되지 않습니다.")
end