아방스에서 심플액알 스크립트를 구했습니다.
무려 비밀소년님이 제작한 것이었는데요
그중에
#=================================================
# ■ Simple_Action
#-------------------------------------------------
# Author: Bimilist[비밀소년] + [kcss] + pyunhb[난나나나솨]
# Desc: 액션 알피지의 간단한 버젼입니다.
# 고의적으로 함수를 한국어로 만들었으므로,
# 일본어로 번역시 작동여부는 불투명합니다.
#=================================================
#───────────────────────
# ♧ 그냥 유용한 함수
#───────────────────────
def 전멸했니?
# 전이벤트의 루프
for event in $game_map.events.values
# 이벤트의 좌표와 트리거가 일치했을 경우
if event.액션하니?
return false
end
end
return true
end
def 파티바꿔!
$game_player.rotate_party
end
# ━━━━━━━━━━━━━━━━━━━━━━━━
# ♣ Game_Event
# Game_Event를 액션용으로 바꾸어 줍니다.
# ━━━━━━━━━━━━━━━━━━━━━━━━
class Game_Event < Game_Event
attr_accessor :gauge
#───────────────────────
# ♧ 프레임 갱신
#───────────────────────
def update
super
return if not 액션하니?
지워져! if 죽었니? and not 지워졌니?
리젠! if 죽었니? and 리젠되니?
어택!
end
#───────────────────────
# ♧ 되살리기 기능 추가
#───────────────────────
def unerase
@erased = false
refresh
end
#───────────────────────
# ♧ moveto(-10,-10)이 안되는 것을 대신.
#───────────────────────
def moveto_outside
@x = -10
@y = -10
@real_x = @x * 128
@real_y = @y * 128
@prelock_direction = 0
end
#───────────────────────
# ♧ 간편함을 위한 함수들
#───────────────────────
def 액션하니?
return (@hp != nil)
end
def 죽었니?
return false if not 액션하니?
return (@hp == 0)
end
def 리젠되니?
return (@regen_time != nil)
end
def 지워졌니?
return (@erased == true)
end
#───────────────────────
# ♧ 생명력과 타격치를 설정함으로서 액션을 시작
#───────────────────────
def 액션(hp, dmg)
return if 액션하니?
@maxhp = @hp = hp
@dmg = dmg
end
#───────────────────────
# ♧ 리젠한다. time은 초단위. 소수점도 가능.
#───────────────────────
def 리젠(time)
return if not 액션하니?
@regen_time = time
@regen_count = 0
end
#───────────────────────
# ♧ 추가로 돈과 경험치도 지급
#───────────────────────
def 상금(gold, exp)
@gold = gold
@exp = exp
end
#───────────────────────
# ♧ 아이템
#───────────────────────
def 아이템(id, rate = 100)
@item_id = id
@item_rate = rate
end
#───────────────────────
# ♧ 장비
#───────────────────────
def 장비(id, rate = 100)
@armor_id = id
@armor_rate = rate
end
#───────────────────────
# ♧ 스위치
#───────────────────────
def 스위치(스위치아이디, 방식)
@스위치아이디 = 스위치아이디
@방식 = 방식
end
#───────────────────────
# ♧ 변수
#───────────────────────
def 변수(변수아이디, 방법, 수치)
@변수아이디 = 변수아이디
@방법 = 방법
@수치 = 수치
end
#───────────────────────
# ♧ 자신에게 데미지를 준다
#───────────────────────
def 데미지(dmg)
return if not 액션하니?
@hp = [@hp - dmg, 0].max
@gauge = @hp.to_f / @maxhp.to_f
end
#───────────────────────
# ♧ 자신을 죽인다
#───────────────────────
def 지워져!
if @방식 == 1 or @방식 == "온" or @방식 == "on"
$game_switches[@스위치아이디] = true
end
if @방식 == 2 or @방식 == "오프" or @방식 == "off"
$game_switches[@스위치아이디] = false
end
if @방식 == 3 or @방식 == "교환" or @방식 == "change"
if $game_switches[@스위치아이디] == true
$game_switches[@스위치아이디] = false
end
if $game_switches[@스위치아이디] == false
$game_switches[@스위치아이디] = true
end
end
if @방법 == 1
$game_variables[@변수아이디] += @수치
end
if @방법 == 2
$game_variables[@변수아이디] -= @수치
end
if @방법 == 3
$game_variables[@변수아이디] *= @수치
end
if @방법 == 4
$game_variables[@변수아이디] /= @수치
end
item = nil
if (@item_id and @item_rate)
if rand(100) < @item_rate
item = $data_items[@item_id]
end
end
armor = nil
if (@armor_id and @armor_rate)
if rand(100) < @armor_rate
armor = $data_armors[@armor_id]
end
end
if (@gold and @exp)
$game_player.보상(@gold, @exp, item, armor)
elsif (item)
$game_player.보상(0, 0, item)
elsif (armor)
$game_player.보상(0, 0, armor)
end
moveto_outside
erase
return if 리젠되니?
@hp = nil
@dmg = nil
@gold = nil
@exp = nil
@item_id = nil
@item_rate = nil
@armor_id = nil
@armor_rate = nil
end
#───────────────────────
# ♧ 리젠한다.
#───────────────────────
def 리젠!
return if not 리젠되니?
if @regen_count < @regen_time * 40
@regen_count += 1
return
end
moveto(@event.x, @event.y)
@hp = @maxhp
@regen_count = 0
unerase
end
#───────────────────────
# ♧ 자신이 공격한다
#───────────────────────
def 어택!
단거리_공격_간단히_주인공만
end
#───────────────────────
# ♧ 간단히 주인공만 공격하는 함수
# 간단함을 유지하기 위해서 딜레이를 위한 변수를
# 따로 만들지 않고 1.0초로 고정한다.
# 어택() 함수와 분리한 이유는 장거리 공격으로의
# 확장을 위해서이다.
# ps. 1초에 한번씩 주인공을 바라보며 공격하므로 강하다!!
#───────────────────────
def 단거리_공격_간단히_주인공만
if @delay == nil or @delay == 0
@delay = 40
else
@delay -= 1
return
end
dist = (x - $game_player.x).abs + (y - $game_player.y).abs
if dist == 1
turn_toward_player
$game_player.animation_id = 4
$game_player.데미지(@dmg)
end
end
end
# ━━━━━━━━━━━━━━━━━━━━━━━━
# ♣ Game_Player
# Game_Player를 액션용으로 바꾸어 줍니다.
# 간단함을 유지하기 위해 다음과 같이 만들었습니다.
# 1. 액션에 참여하는 액터는 오로지 파티맴버의
# 첫번째 케릭터가 되겠습니다.
# 2. 죽을 경우 파티 맴버들의 순서를 바꾸며,
# 모두 죽는 경우에는 게임오버로 처리됩니다.
# 3. 파티에 아무도 없는 경우 전투를 하지 않습니다.
# 4. 데미지 공식은 간단히 체력 빼기 타격치입니다.
# 즉, 방어력, 회피율, 힘 등은 모두 무시됩니다.
# 필요에 따라 개조하여 사용하세요.
# ━━━━━━━━━━━━━━━━━━━━━━━━
class Game_Player < Game_Player
attr_accessor :gauge
#───────────────────────
# ♧ 프레임 갱신
#───────────────────────
def update
super
return if not 액션하니?
다이 if 죽었니?
어택
end
#───────────────────────
# ♧ 간편함을 위한 함수들
#───────────────────────
def 파티있니?
return ($game_party.actors.size != 0)
end
def 액션하니?
return 파티있니?
end
def 죽었니?
return false if not 파티있니?
return ($game_party.actors[0].hp == 0)
end
#───────────────────────
# ♧ 보상받고 메세지로 표기
#───────────────────────
def 보상(gold, exp, item, armor = nil)
if 파티있니?
$game_party.actors[0].exp += exp
$game_party.gain_gold(gold)
case armor
when RPG::Armor
$game_party.gain_armor(armor.id, 1)
end
end
if not item and not armor
간단메세지(sprintf("돈: %d, 경험: %d 를 획득 했습니다.", gold, exp))
elsif not armor
간단메세지(sprintf("돈: %d, 경험: %d, 아이템: %s 를 획득 했습니다.", gold, exp, item.name))
elsif not item
간단메세지(sprintf("돈: %d, 경험: %d, 장비: %s 를 획득 했습니다.", gold, exp, armor.name))
elsif not gold and not exp
간단메세지(sprintf("아이템:%s, 장비:%s를 획득 했습니다.", item.name, armor.name))
else
간단메세지(sprintf("돈: %d, 경험: %d, 아템: %s, 장비: %s", gold, exp, item.name, armor.name))
end
case item
when RPG::Item
$game_party.gain_item(item.id, 1)
when RPG::Weapon
$game_party.gain_weapon(item.id, 1)
end
end
#───────────────────────
# ♧ 자신에게 데미지를 준다
#───────────────────────
def 데미지(dmg)
return if not 액션하니?
dmg = (dmg - $game_party.actors[0].pdef)
dmg = (dmg - $game_party.actors[0].agi)
if dmg <= 0
dmg = 1
end
$game_party.actors[0].hp -= dmg
보조메세지(sprintf("몬스터로부터 %d 의 데미지를 받았다", dmg))
@gauge = $game_party.actors[0].hp.to_f / $game_party.actors[0].maxhp.to_f
end
#───────────────────────
# ♧ 자신을 죽인다
#───────────────────────
def 다이
# 게임 오버 판정
rotate_party
$game_temp.gameover = $game_party.all_dead?
end
def rotate_party
return if $game_party.actors.size < 2
actor = $game_party.actors[0]
for i in 0..($game_party.actors.size - 2)
$game_party.actors[i] = $game_party.actors[i + 1]
end
$game_party.actors[$game_party.actors.size - 1] = actor
$game_player.refresh
end
#───────────────────────
# ♧ 자신이 공격한다
#───────────────────────
def 어택
단거리_공격_간단히_주인공만
end
#───────────────────────
# ♧ 적합한 이벤트를 골라내어 공격한다
# 간편함을 위해서 딜레이... 없음...!!!!
#───────────────────────
def 단거리_공격_간단히_주인공만
# 결정키가 눌리면
if Input::trigger?(Input::C)
# 정면의 좌표를 계산
new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# 전이벤트의 루프
for event in $game_map.events.values
# 이벤트의 좌표와 트리거가 일치했을 경우
if event.x == new_x and event.y == new_y and
event.데미지($game_party.actors[0].atk)
event.데미지($game_party.actors[0].str)
보조메세지(sprintf("몬스터에게 %d 의 데미지를 주었다", $game_party.actors[0].str+$game_party.actors[0].atk))
end
end
end
end
end
# ━━━━━━━━━━━━━━━━━━━━━━━━
# ♣ Sprite_Character > 작은게이지
# 케릭터에 작은 게이지를 표시합니다
# ver. SimpleAction
# ━━━━━━━━━━━━━━━━━━━━━━━━
class Sprite_Character < Sprite_Character
def update
super
if @character.gauge != nil
gauge(@character.gauge)
@character.gauge = nil
end
if @_gauge_setup then
@_gauge_duration = [@_gauge_duration - 5, 0].max
@_gauge_sprite_b.x = self.x
@_gauge_sprite_b.y = self.y - self.oy
@_gauge_sprite_b.opacity = @_gauge_duration
@_gauge_sprite.x = self.x
@_gauge_sprite.y = self.y - self.oy
@_gauge_sprite.opacity = @_gauge_duration
end
end
def gauge(p)
setup_gauge if not @_gauge_setup
@_gauge_sprite.src_rect = Rect.new(0, 0, p * 30, 2)
@_gauge_duration = 255
end
def setup_gauge
dispose_gauge
@_gauge_setup = true
@_gauge_sprite = Sprite.new(self.viewport)
@_gauge_sprite.bitmap = Bitmap.new(30, 2)
@_gauge_sprite.bitmap.fill_rect(0, 0, 30, 2, Color.new(255, 255, 0))
@_gauge_sprite.ox = 15
@_gauge_sprite.oy = -1
@_gauge_sprite.z = 1000
@_gauge_sprite_b = Sprite.new(self.viewport)
@_gauge_sprite_b.bitmap = Bitmap.new(32, 4)
@_gauge_sprite_b.bitmap.fill_rect(0, 0, 32, 4, Color.new(0, 0, 0))
@_gauge_sprite_b.bitmap.fill_rect(1, 1, 30, 2, Color.new(255, 0, 0))
@_gauge_sprite_b.ox = 16
@_gauge_sprite_b.oy = 0
@_gauge_sprite_b.z = 999
end
def dispose_gauge
return if not @_gauge_setup
@_gauge_setup = false
@_gauge_sprite.dispose
@_gauge_sprite_b.dispose
end
def dispose
dispose_gauge
super
end
end
이부분이 문제입니다.
근거리공격은 되는데 원거리 공격이 되지 않아서요.
스크립트를 고치고싶어도 용어를 알아먹질 못해서 안돼는군요.
첨부파일에서 다른건 건드리지 마시고 스크립트만 조정해주세요. 아직 미완성입니다.
스크립트 수정후에는 사용법도 올려주셨으면 합니다.