XP 스크립트



사이드뷰 방식의 스크립트입니다.
이 스크립트는 창도나 RPGXP 포럼에서 한번 정도는 보셨을 겁니다.
저도 이 스크립트를 어디서 가져왔는지 생각이 나지 않습니다. ㅡㅡ;;
제가 올린 스크린샷으로 어떻게 생긴 것인지 확인하실 수 있습니다.

이 스크립트는 원본 번역판입니다.
제가 사용할 시 오류가 발생했는데 이 부분에 대한 수정은 아래 설명을
읽어보시길 바랍니다.
그냥 번역판 그대로 사용하셔도 아무런 이상이 없는 분들은 그냥 사용해도
무방합니다..

--------------------------------------------------------------------------
원본 번역판입니다.
*주의사항*
만일 258번 줄에서 오류가 나신 분들은
if @battler_white_flash로 바꿔주시길 바랍니다.
원본 번역판으로 아무런 이상없이 진행이 가능하다면 번역판을 그대로 이용하시고
258번줄 이외의 오류에 대해서 물어보신다면 대답해드릴 수 없음을 알려드립니다.ㅡㅡ;;;

다음 아래부터 복사하시길 바랍니다.
-------------------------------------------------------------------------
=begin
사이드뷰 스크립트
■개요
RPG 트크르 XP의 디폴트 전투를, 보행 그래픽을 이용해
사이드 뷰로 변경합니다.
■사양
·이하의 클래스를 변경, 추가하고 있습니다.벌써 다른 기능을 위해서
고쳐 쓰고 있는 경우, 간섭해 에러가 될 가능성이 있습니다.
·Game_Actor
·Sprite_Actor (추가)
·Spriteset_Battle
·Scene_Battle (스크립트 에디터내 Scene_Battle 4에 상당)
·「제자리 걸음」을 이용한 루프 애니메이션
·대기 상태, 데미지시 , 핀치, 전투 불능의 그래픽 변경
·표시에 사용하는 그래픽의 종류를, 이론상 무한하게 늘릴 수 있습니다.
■사용 방법
스크립트 에디터, main 위에 모두 코피페 해 주세요.
또, 전투에 참가하는 모든 액터에 대해서,
"(캐릭터 파일명) _b1"라고 하는 보행 그래픽을
Graphics/Characters에 임포트 해 주세요.각각,
1단째(보행 그래픽:하향)에 대기 상태
둘째 단( 동:좌향) 시
삼단메( 동:오른쪽 방향)에 핀치(HP가1/4이하, 혹은 배드 스테이트시)
4단째( 동:하향)에 전투 불능 상태
하지만 대응하고 있습니다.
새롭고"배드 스테이트"라고 하는 속성을 만들어, 배드 스테이트에는
그 속성을 주세요.
■그 외
개변, 사용, 전재는 자유롭게 아무쪼록.(RGSS판의 룰에 따릅니다.)
개인적으로는, 개변한 것은 공개해 모두에게 환원하며 가 주었으면 한다
(GPL같이)(이)라고는 생각합니다만.
RGSS판:http://jbbs.shitaraba.com/game/14836/
※■한층 더 덧붙여 씀
 「###」의 코멘트 부분에서 표기되고 있는 부분은,
 전 버젼의 작자와는 다른 인간이 프로그램을 추가하고 있습니다만,
 운용에 관한 폴리시에 관해서는 상기 사항과 같습니다.
 "(캐릭터 파일명) _b2"라고 하는 보행 그래픽을
Graphics/Characters에 임포트 하면,
1단째(보행 그래픽:하향)에 통상 공격시
둘째 단( 동:좌향)에 방어중
삼단메( 동:오른쪽 방향)에 스킬 사용시
4단째( 동:하향)에 아이템 사용시
그렇다고 하는 모션을 할 수 있는 것처럼 됩니다.
=end

# Game_Actor 클래스를 재정의한다.
class Game_Actor < Game_Battler
# 아크세사의 설정
attr_accessor :pattern # 패턴
attr_accessor :direction # 방향
attr_accessor :anime_count # 애니메이션 카운트
attr_accessor :move_speed # 속도
attr_accessor :damaged # 공격 대상인지 어떤지
#initialize 의 재정의
def initialize(actor_id)
super()
@damaged = false
setup(actor_id)
end
# 셋업을 재정의
def setup(actor_id)
actor = $data_actors[actor_id]
@actor_id = actor_id
@name = actor.name
@character_name = actor.character_name
@character_hue = actor.character_hue
@class_id = actor.class_id
@weapon_id = actor.weapon_id
@armor1_id = actor.armor1_id
@armor2_id = actor.armor2_id
@armor3_id = actor.armor3_id
@armor4_id = actor.armor4_id
@level = actor.initial_level
@exp_list = Array.new(101)
make_exp_list
@exp = @exp_list[@level]
@skills = []
@hp = maxhp
@sp = maxsp
@states = []
@states_turn = {}
@maxhp_plus = 0
@maxsp_plus = 0
@str_plus = 0
@dex_plus = 0
@agi_plus = 0
@int_plus = 0
# 스킬 습득
for i in 1..@level
for j in $data_classes[@class_id].learnings
if j.level == i
learn_skill(j.skill_id)
end
end
end
# 오토 스테이트를 갱신
update_auto_state(nil, $data_armors[@armor1_id])
update_auto_state(nil, $data_armors[@armor2_id])
update_auto_state(nil, $data_armors[@armor3_id])
update_auto_state(nil, $data_armors[@armor4_id])

# 사이드 뷰용으로 정의
@battler_name = actor.character_name + "_b1"
@battler_hue = actor.character_hue
@pattern = 0
@direction = 2
@move_speed = 3
@anime_count = 0
end

# 이벤트의 「액터의 그래픽 변경」에 대응
def set_graphic(character_name, character_hue, battler_name, battler_hue)
@character_name = character_name
@character_hue = character_hue
@battler_name = character_name + "_b1"
@battler_hue = character_hue
end

# 전투시의 표시 위치를 설정
# 기호에 따라 변경해 주세요.

# x방향
def screen_x
if self.index != nil
return self.index * 30 + 450
else
return 0
end
end

# y방향
def screen_y
if self.index != nil
return self.index * 30 + 220
else
return 0
end
end

# z방향
def screen_z
if self.index != nil
return self.index
else
return 0
end
end

# 애니메이션 시키기 위해서 그래픽을 갱신시킨다
def update
@anime_count += 1
if @anime_count > 18 - @move_speed * 2
@pattern = (@pattern + 1) % 4
@anime_count = 0
end
end

# 배드 스테이트를 감시하기 위한 메소드 정의
def bad_state?
k = $data_system.elements.index("배드 스테이트")
@states.each{|i|
if $data_states[i].guard_element_set.include?(k)
return true
end
}
return false
end

# 그래픽의 변경 메소드
# 하나의 캐릭터 파일에서는 4 패턴 밖에 설정할 수 없기 때문에,
# 장래적으로 패턴을 추가하고 싶은 경우에 comment out를 해제해 주세요.
def battle_graphic_to_1
@battler_name = @character_name + "_b1"
end

def battle_graphic_to_2
@battler_name = @character_name + "_b2"
end

end

# 새롭고 Sprite_Actor 클래스를 정의
# 기본적으로는 Sprite_Battler와 같습니다.
# 변경한 점은 코멘트로 표기.
class Sprite_Actor < RPG::Sprite

# 아크세사의 설정
attr_accessor :battler # 버틀러

# 오브젝트 초기화
def initialize(viewport, battler = nil)
super(viewport)
@battler = battler
@battler_visible = false
@damage_view = false # 데미지 표시중 플래그
end

# 해방
def dispose
if self.bitmap != nil
self.bitmap.dispose
end
super
end

# 업데이트
def update
super
# 버틀러가 nil 의 경우
if @battler == nil
self.bitmap = nil
loop_animation(nil)
# 메소드 종료
return
end

# 파일명이나 색상이 현재의 것과 다른 경우
if @battler.battler_name != @battler_name or
@battler.battler_hue != @battler_hue
@battler_name = @battler.battler_name
@battler_hue = @battler.battler_hue
end
# ●비트 맵을 버틀러로부터 캐릭터로 변경.
# Sprite_Character로부터 이끌어 오고 있습니다.
self.bitmap = RPG::Cache.character(@battler.battler_name,
@battler.battler_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
sx = @battler.pattern * @cw
sy = (@battler.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
# 애니메이션 ID 가 현재의 것과 다른 경우
if @battler.damage == nil and
@battler.state_animation_id != @state_animation_id
@state_animation_id = @battler.state_animation_id
loop_animation($data_animations[@state_animation_id])
end
# 명 멸망
if @battler.blink
blink_on
else
blink_off
end
# 불가시의 경우
unless @battler_visible
# 출현
if not @battler.hidden and not @battler.dead? and
(@battler.damage == nil or @battler.damage_pop)
appear
@battler_visible = true
end
end
# 가시의 경우
if @battler_visible
# 흰색 플래시
if @battler.white_flash
whiten
@battler.white_flash =true
end
# ●캐릭터의 방향을 설정
# 상태에 따라 변경시킵니다.
# 그래픽을 2개 이상 이용하는 경우, 표준으로"(캐릭터명) _b1"를
# 지정해 있기 때문에, if로 분기 한 직후에 Game_Actor 클래스에서 정의했다
# 그래픽 변경 메소드를 실행해 주세요.
@battler.battle_graphic_to_1 # 그래픽을"(캐릭터명) _b1"로 한다
# 전투 불능 때
if @battler.damage == nil and @battler.dead?
$game_system.se_play($data_system.actor_collapse_se)
@battler.direction = 8
@battler_visible = false
# 데미지중 플래그가 On 때
elsif @damage_view
@battler.direction = 4
# 애니메이션을 표시시킨다
elsif @battler.animation_id != 0
animation = $data_animations[@battler.animation_id]
animation(animation, @battler.animation_hit)
# 애니메이션이 「대상」측, 한편 데미지가 0이상 때
if @battler.damaged and @battler.damage.to_i >= 0
@battler.direction = 4
# 데미지중 플래그를 On로 한다
@damage_view = true
end
@battler.animation_id = 0


### 방어중 때
elsif @battler.guarding?
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 4
###

### 통상 공격시
elsif @battler.current_action.motion == 1
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 2
###

### 스킬 발동시
elsif @battler.current_action.motion == 2
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 6
###

### 아이템 사용시
elsif @battler.current_action.motion == 3
@battler.battle_graphic_to_2 # 그래픽을"(캐릭터명) _b2"로 한다
@battler.direction = 8
###

# 핀치 혹은 배드 스테이트 때
elsif @battler.hp <= @battler.maxhp / 4 and @battler.damage == nil or
@battler.bad_state?
@battler.direction = 6
# 그렇지 않으면
else
@battler.direction = 2
end
if @battler.damage_pop
if @battler.damage.to_i >= 0
@battler.direction = 4
end
damage(@battler.damage, @battler.critical)
@battler.damage = nil
@battler.critical = false
@battler.damage_pop = false
end
end
# 데미지중 플래그를 조작한다
if @damage_view == true
# 효과가 비표시로 데미지가 nil라면
if self.effect? == false and @battler.damage == nil
# 데미지 표시 플래그, 공격 대상인가 아닌가의 플래그를 클리어
@damage_view = false
@battler.damaged = false
end
end
# 스프라이트의 좌표를 설정
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
end
end

# Spriteset_Battle의 수정
class Spriteset_Battle
def initialize
# 뷰포트를 작성
@viewport1 = Viewport.new(0, 0, 640, 320)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport4 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 101
@viewport3.z = 200
@viewport4.z = 5000
# 배틀 백 스프라이트를 작성
@battleback_sprite = Sprite.new(@viewport1)
# 에너미 스프라이트를 작성
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
end
# 액터 스프라이트를 작성
# ●Sprite_Battler로부터 Sprite_Actor로 변경한다
@actor_sprites = []
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
@actor_sprites.push(Sprite_Actor.new(@viewport1))
# 기후를 작성
@weather = RPG::Weather.new(@viewport1)
# 픽쳐 스프라이트를 작성
@picture_sprites = []
for i in 51..100
@picture_sprites.push(Sprite_Picture.new(@viewport3,
$game_screen.pictures[i]))
end
# 타이머 스프라이트를 작성
@timer_sprite = Sprite_Timer.new
# 프레임 갱신
update
end

def update
# 액터 스프라이트의 내용을 갱신 (액터의 교체에 대응)
@actor_sprites[0].battler = $game_party.actors[0]
@actor_sprites[1].battler = $game_party.actors[1]
@actor_sprites[2].battler = $game_party.actors[2]
@actor_sprites[3].battler = $game_party.actors[3]
# 배틀 가방의 파일명이 현재의 것과 다른 경우
if @battleback_name != $game_temp.battleback_name
@battleback_name = $game_temp.battleback_name
if @battleback_sprite.bitmap != nil
@battleback_sprite.bitmap.dispose
end
@battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
@battleback_sprite.src_rect.set(0, 0, 640, 320)
end

# ●추가
# 패턴을 갱신시키기 위해서 Game_Actor의 인스턴스를 갱신시킨다
$game_party.actors.each{|actor|
actor.update
}
# 여기까지

# 버틀러 스프라이트를 갱신
for sprite in @enemy_sprites + @actor_sprites
sprite.update
end
# 기후 그래픽을 갱신
@weather.type = $game_screen.weather_type
@weather.max = $game_screen.weather_max
@weather.update
# 픽쳐 스프라이트를 갱신
for sprite in @picture_sprites
sprite.update
end
# 타이머 스프라이트를 갱신
@timer_sprite.update
# 화면의 색조와 시이크 위치를 설정
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
# 화면의 플래시색을 설정
@viewport4.color = $game_screen.flash_color
# 뷰포트를 갱신
@viewport1.update
@viewport2.update
@viewport4.update
end
end

# Scene_Battle 클래스를 수정한다
class Scene_Battle
#--------------------------------------------------------------------------
# ● 기본 액션 결과 작성
#--------------------------------------------------------------------------
def make_basic_action_result
# 공격의 경우
if @active_battler.current_action.basic == 0
# 애니메이션 ID 를 설정
@animation1_id = @active_battler.animation1_id
@animation2_id = @active_battler.animation2_id
# 행동측 버틀러가 에너미의 경우
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
target = $game_troop.random_target_enemy
elsif @active_battler.restriction == 2
target = $game_party.random_target_actor
else
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
end
# 행동측 버틀러가 액터의 경우
if @active_battler.is_a?(Game_Actor)
@active_battler.current_action.motion = 1 ###1행 추가
if @active_battler.restriction == 3
target = $game_party.random_target_actor
elsif @active_battler.restriction == 2
target = $game_troop.random_target_enemy
else
index = @active_battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
end
end
# 대상측 버틀러의 배열을 설정
@target_battlers = [target]
# 통상 공격의 효과를 적용
for target in @target_battlers
target.attack_effect(@active_battler)
end
return
end
# 방어의 경우
if @active_battler.current_action.basic == 1
# 헬프 윈도우에 "방어" 를 표시
@help_window.set_text($data_system.words.guard, 1)
return
end
# 도망치는 것 경우
if @active_battler.is_a?(Game_Enemy) and
@active_battler.current_action.basic == 2
# 헬프 윈도우에 "도망치는" 을 표시
@help_window.set_text("도망친다", 1)
# 도망친다
@active_battler.escape
return
end
# 아무것도 하지 않는 것 경우
if @active_battler.current_action.basic == 3
# 액션 강제 대상의 버틀러를 클리어
$game_temp.forcing_battler = nil
# 스텝 1 에 이행
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
# ● 스킬 액션 결과 작성
#--------------------------------------------------------------------------
def make_skill_action_result
# 스킬을 취득
@skill = $data_skills[@active_battler.current_action.skill_id]
# 강제 액션이 아니면
unless @active_battler.current_action.forcing
# SP 조각등에서 사용할 수 없게 되었을 경우
unless @active_battler.skill_can_use?(@skill.id)
# 액션 강제 대상의 버틀러를 클리어
$game_temp.forcing_battler = nil
# 스텝 1 에 이행
@phase4_step = 1
return
end
end
# SP 소비
@active_battler.sp -= @skill.sp_cost
# 스테이터스 윈도우를 리프레쉬
@status_window.refresh
# 헬프 윈도우에 스킬명을 표시
@help_window.set_text(@skill.name, 1)
# 애니메이션 ID 를 설정
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# 코먼 이벤트 ID 를 설정
@common_event_id = @skill.common_event_id
# 대상측 버틀러를 설정
set_target_battlers(@skill.scope)
@active_battler.current_action.motion = 2 ###1행 추가
# 스킬의 효과를 적용
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
end
#------------------------------------------------------------------------
# ● 아이템 액션 결과 작성
#--------------------------------------------------------------------------
def make_item_action_result
# 아이템을 취득
@item = $data_items[@active_battler.current_action.item_id]
# 아이템 조각등에서 사용할 수 없게 되었을 경우
unless $game_party.item_can_use?(@item.id)
# 스텝 1 에 이행
@phase4_step = 1
return
end
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
end
# 헬프 윈도우에 아이템명을 표시
@help_window.set_text(@item.name, 1)
# 애니메이션 ID 를 설정
@animation1_id = @item.animation1_id
@animation2_id = @item.animation2_id
# 코먼 이벤트 ID 를 설정
@common_event_id = @item.common_event_id
# 대상을 결정
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
# 대상측 버틀러를 설정
set_target_battlers(@item.scope)
@active_battler.current_action.motion = 3 ###1행 추가
# 아이템의 효과를 적용
for target in @target_battlers
target.item_effect(@item)
end

end


# 대상측 애니메이션 때, 대상인 것을 Game_Actor에게 전한다
def update_phase4_step4
# 대상측 애니메이션
for target in @target_battlers
target.animation_id = @animation2_id
target.animation_hit = (target.damage != "Miss")
# 만약 액터라면
if target.is_a?(Game_Actor)
target.damaged = true
end
end
# 애니메이션의 길이에 관계없이, 최저 8 프레임 기다린다
@wait_count = 8
@active_battler.current_action.motion = 0 ###1행 추가
# 스텝 5 에 이행
@phase4_step = 5
end

end

class Game_BattleAction
attr_accessor :motion ###모션용 플래그 추가
def clear
@speed = 0
@kind = 0
@basic = 3
@skill_id = 0
@item_id = 0
@target_index = -1
@forcing = false
@motion = 0 ###초기화에 추가
end
end

----------------------------------------------------------------------------------------------
*사용방법*
본 스크립트의 이용방법은 복사하신 후 스크립트에디터의 main 위에 삽입하여 새로운 스크립트를
만든 후 본문에 붙여넣기를 하면 됩니다. 스크립트의 제목은 아무거나 해주시면 됩니다.

*스크립트 사용과 관련해서 뱀다리를 붙이자면*
본 스크립트는 보행그래픽이 필요합니다.
반드시 보행그래픽은 Graphics/Characters에 "(캐릭터 파일명) _b1"라는 이름으로
저장되어 있어야 합니다.
그렇지 않으면 이 파일이 없다고 나옵니다.

추가 파일로 010-Lancer02_b1.png을 올립니다.
본 파일을 Graphics/Characters에 저장시킨 뒤 스크립트를 적용하면 대충 어떤 스크립트
인지 알 수 있으실 겁니다.


------------------------------------------------------------------------------------

Comment '8'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6202
821 기타 Chaos Project Debug System 1.06b by Blizzard file Alkaid 2010.09.07 1370
820 메시지 XRXS9 - 메세지 표시 업그레이드 X file Alkaid 2010.09.07 3312
819 HUD HUD Menu 2.0 by Raziel 3 Alkaid 2010.09.07 2038
818 맵/타일 Map Image Maker 3.0 by rey meustrus file Alkaid 2010.09.06 1608
817 전투 Active Time Battle 2.62 by パラ犬 file Alkaid 2010.09.06 1660
816 메뉴 Stormtronics CMS 5.39b - Hybrid Edition by Blizzard 4 file Alkaid 2010.09.06 1745
815 스킬 RO Job/Skill System 2.01b by Blizzard 2 file Alkaid 2010.09.05 1862
814 메뉴 Ryex's Collapsing CMS 2.51 3 Alkaid 2010.09.05 1667
813 전투 GubiD's Tactical Battle System 1.5.1.4 (RMXP용) GTBS 2 Alkaid 2010.09.03 2456
812 메뉴 자작 메뉴 스크립트들(L's Simple CMS and menu scenes) (SDK 호환?) 10 Alkaid 2010.09.02 3461
811 기타 House Decoration System 1.6 by MephistoX (SDK 2.x, MACL 2.x 필요) 1 file Alkaid 2010.09.02 1494
810 스킬 Grouping and Detail 7.2 by DerVVulfman 1 file Alkaid 2010.09.02 1513
809 기타 Phylomortis.com 스크립트들. file Alkaid 2010.09.02 1776
808 장비 Multislots! 2.1 by DerVVulfman 3 file Alkaid 2010.09.02 1540
807 키입력 AInput Module 3.10 by vgvgf (전체키, 마우스 입력) 6 file Alkaid 2010.09.01 3030
806 저장 키라링님이 올리신 [KGC_2PaneSave] 번역 1 무뇌인 2010.08.18 1476
805 HUD 강화 나침반 스크립트 (원본 by 허걱) 16 file JACKY 2010.08.16 3110
804 HUD 캐릭터 아래 SP,HP표시해주는 스크립트 33 file 김!제스! 2010.08.04 4273
803 기타 액알 30 지존!! 2010.07.26 5099
802 기타 명령어들 6 지존!! 2010.07.24 2288
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 52 Next
/ 52