XP 스크립트

#--------- 여기서부터
#┌───────────────────────────────────────
#│
#│  TRCS. 6
#│  "좀비 기구 도입" ver1. 20 (2005.09. 20 h19)
#│  by NO
#│  http://chobi.net/~no/
#│ 
#└───────────────────────────────────────

module TRCS6_ZOMBIE
  #--------------------------------------------------------------------------
  # ○설정 항목
  #--------------------------------------------------------------------------

  # 스테이트[좀비]의 이름
  ZOMBIE_STATE_NAME = "좀비"
   
  # 스테이트[전투 불능]의 ID
  DEAD_STATE_ID = 1
 
  # 필터의 색
  ZOMBIE_FILTER = Color.new(64, 64, 64, 128)
 
  #--------------------------------------------------------------------------
  # ○스테이트[좀비]의 ID를 탐색
  #--------------------------------------------------------------------------
  def zombie_state_id
    for id in 1...$data_states.size
      return id if $data_states[id]. name == ZOMBIE_STATE_NAME
    end
    return 0
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ○인클루드
  #--------------------------------------------------------------------------
  include TRCS6_ZOMBIE
  #--------------------------------------------------------------------------
  # ○오브젝트 초기화
  #--------------------------------------------------------------------------
  alias trcs6_initialize initialize
  def initialize
    # 스테이트[좀비]의 ID를 취득
    @zombie_id = zombie_state_id
    # 귀환시킨다
    trcs6_initialize
  end
  #--------------------------------------------------------------------------
  # ☆ (재정의) HP 0 판정
  #--------------------------------------------------------------------------
  def hp0?
    # 좀비도 편의상HP 0 으로 한다
    return (not @hidden and (@hp == 0 or @states.include? (@zombie_id)))
  end
  #--------------------------------------------------------------------------
  # ○통상 공격의 효과 적용
  #    attacker : 공격자 (버틀러)
  #--------------------------------------------------------------------------
  alias trcs6_attack_effect attack_effect
  def attack_effect(attacker)
    # 대상자에게 스테이트[좀비]가 부가 또한 공격자의 해제 스테이트에[전투 불능]이 있는 경우
    if self.state? (@zombie_id) and attacker.minus_state_set.include? (DEAD_STATE_ID)
      # 위기 플래그를 클리어
      self.critical = false
      # 제일 명중 판정
      hit_result = (rand(100) < attacker.hit)
      # 명중의 경우
      if hit_result == true
        # 기본 데미지를 계산
        atk = [attacker.atk - self.pdef / 2, 0]. max
        self.damage = atk * (20 + attacker.str) / 20
        # 속성 수정
        self.damage *= elements_correct(attacker.element_set)
        self.damage /= 100
        # 데미지의 부호가 정의 경우
        if self.damage > 0
          # 위기 수정
          if rand(100) < 4 * attacker.dex / self.agi
            self.damage *= 2
            self.critical = true
          end
          # 방어 수정
          if self.guarding?
            self.damage /= 2
          end
        end
        # 분산
        if self.damage.abs > 0
          amp = [self.damage.abs * 15 / 100, 1]. max
          self.damage += rand(amp+1) + rand(amp+1) - amp
        end
        # 제2 명중 판정
        eva = 8 * self.agi / attacker.dex + self.eva
        hit = self.damage < 0 ?  100 : 100 - eva
        hit = self.cant_evade?  ?  100 : hit
        hit_result = (rand(100) < hit)
      end
      # 명중의 경우
      if hit_result == true
        # 스테이트 변화
        @state_changed = true
        add_state(DEAD_STATE_ID)
        self.damage = "DEATH"
      # 미스의 경우
      else
        # 데미지에 "Miss" 를 설정
        self.damage = "Miss"
        # 위기 플래그를 클리어
        self.critical = false
      end
      # 메소드 종료
      return true
    else
      # 귀환시킨다
      trcs6_attack_effect(attacker)
    end
  end
  #--------------------------------------------------------------------------
  # ○스킬의 효과 적용
  #    user  : 스킬의 사용자 (버틀러)
  #    skill : 스킬
  #--------------------------------------------------------------------------
  alias trcs6_skill_effect skill_effect
  def skill_effect(user, skill)
    # 대상자에게 스테이트[좀비]가 부가되고 있는 경우
    if self.state? (@zombie_id)
      # 위기 플래그를 클리어
      self.critical = false
      # 스킬의 효과 범위가 HP 1 이상의 아군으로, 자신의 HP 가 0,
      # 또는 스킬의 효과 범위가 HP 0 의 아군으로, 자신의 HP 가 1 이상의 경우
      if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
        ((skill.scope == 5 or skill.scope == 6) and not self.hp0? )
        # 메소드 종료
        return false
      end
      # 유효 플래그를 클리어
      effective = false
      # 코먼 이벤트 ID 가 유효의 경우는 유효 플래그를 세트
      effective |= skill.common_event_id > 0
      # 제일 명중 판정
      hit = skill.hit
      if skill.atk_f > 0
        hit *= user.hit / 100
      end
      hit_result = (rand(100) < hit)
      # 불확실한 스킬의 경우는 유효 플래그를 세트
      effective |= hit < 100
      # 명중의 경우
      if hit_result == true
        # 위력을 계산
        power = skill.power + user.atk * skill.atk_f / 100
        if power > 0
          power -= self.pdef * skill.pdef_f / 200
          power -= self.mdef * skill.mdef_f / 200
          power = [power, 0]. max
        end
        # 배율을 계산
        rate = 20
        rate += (user.str * skill.str_f / 100)
        rate += (user.dex * skill.dex_f / 100)
        rate += (user.agi * skill.agi_f / 100)
        rate += (user.int * skill.int_f / 100)
        # 기본 데미지를 계산
        self.damage = power * rate / 20
        # 속성 수정
        self.damage *= elements_correct(skill.element_set)
        self.damage /= 100
        # 데미지의 부호가 정의 경우
        if self.damage > 0
          # 방어 수정
          if self.guarding?
            self.damage /= 2
          end
        end
        # 분산
        if skill.variance > 0 and self.damage.abs > 0
          amp = [self.damage.abs * skill.variance / 100, 1]. max
          self.damage += rand(amp+1) + rand(amp+1) - amp
        end
        # 제2 명중 판정
        eva = 8 * self.agi / user.dex + self.eva
        hit = self.damage < 0 ?  100 : 100 - eva * skill.eva_f / 100
        hit = self.cant_evade?  ?  100 : hit
        hit_result = (rand(100) < hit)
        # 불확실한 스킬의 경우는 유효 플래그를 세트
        effective |= hit < 100
      end
      # 명중의 경우
      if hit_result == true
        # [전투 불능]의 해제라면, 반대로[전투 불능]을 부가한다
        if skill.minus_state_set.include? (DEAD_STATE_ID)
          add_state(DEAD_STATE_ID)
          self.damage = "DEATH"
          @state_changed = true
          return true
        end
        # 위력 0 이외의 물리 공격의 경우
        if skill.power != 0 and skill.atk_f > 0
          # 스테이트 충격 해제
          remove_states_shock
          # 유효 플래그를 세트
          effective = true
        end
        # HP 로부터 데미지를 감산
        last_hp = self.hp
        # 데미지치가 부라면, 반전한다
        if self.damage < 0
          self.hp += self.damage
        else
          self.hp -= self.damage
        end
        effective |= self.hp != last_hp
        # 스테이트 변화
        @state_changed = false
        effective |= states_plus(skill.plus_state_set)
        effective |= states_minus(skill.minus_state_set)
        # 위력이 0 의 경우
        if skill.power == 0
          # 데미지에 공문자열을 설정
          self.damage = ""
          # 스테이트에 변화가 없는 경우
          unless @state_changed
            # 데미지에 "Miss" 를 설정
            self.damage = "Miss"
          end
        end
      # 미스의 경우
      else
        # 데미지에 "Miss" 를 설정
        self.damage = "Miss"
      end
      # 전투중이 아닌 경우
      unless $game_temp.in_battle
        # 데미지에 nil 를 설정
        self.damage = nil
      end
      # 메소드 종료
      return effective
    else
    # 귀환시킨다
    trcs6_skill_effect(user, skill)
    end
  end
  #--------------------------------------------------------------------------
  # ○아이템의 효과 적용
  #    item : 아이템
  #--------------------------------------------------------------------------
  alias trcs6_item_effect item_effect
  def item_effect(item)
    # 대상자에게 스테이트[좀비]가 부가되고 있는 경우
    if self.state? (@zombie_id)
      # 위기 플래그를 클리어
      self.critical = false
      # 아이템의 효과 범위가 HP 1 이상의 아군으로, 자신의 HP 가 0,
      # 또는 아이템의 효과 범위가 HP 0 의 아군으로, 자신의 HP 가 1 이상의 경우
      if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
        ((item.scope == 5 or item.scope == 6) and not self.hp0? )
        # 메소드 종료
        return false
      end
      # 유효 플래그를 클리어
      effective = false
      # 코먼 이벤트 ID 가 유효의 경우는 유효 플래그를 세트
      effective |= item.common_event_id > 0
      # 명중 판정
      hit_result = (rand(100) < item.hit)
      # 불확실한 경우는 유효 플래그를 세트
      effective |= item.hit < 100
      # 명중의 경우
      if hit_result == true
        # [전투 불능]의 해제라면, 반대로[전투 불능]을 부가한다
        if item.minus_state_set.include? (DEAD_STATE_ID)
          add_state(DEAD_STATE_ID)
          self.damage = "DEATH"
          @state_changed = true
          return true
        end
        # 회복량을 계산
        recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
        recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
        if recover_hp < 0
          recover_hp += self.pdef * item.pdef_f / 20
          recover_hp += self.mdef * item.mdef_f / 20
          recover_hp = [recover_hp, 0]. min
        end
        # 속성 수정
        recover_hp *= elements_correct(item.element_set)
        recover_hp /= 100
        recover_sp *= elements_correct(item.element_set)
        recover_sp /= 100
        # 분산
        if item.variance > 0 and recover_hp.abs > 0
          amp = [recover_hp.abs * item.variance / 100, 1]. max
          recover_hp += rand(amp+1) + rand(amp+1) - amp
        end
        if item.variance > 0 and recover_sp.abs > 0
          amp = [recover_sp.abs * item.variance / 100, 1]. max
          recover_sp += rand(amp+1) + rand(amp+1) - amp
        end
        # 회복량의 부호가 부의 경우
        if recover_hp < 0
          # 방어 수정
          if self.guarding?
            recover_hp /= 2
          end
        end
        # HP 회복량의 부호는 정이므로, 그대로 데미지의 값으로 설정
        self.damage = recover_hp
        # [좀비]이므로 HP에 데미지, SP 는 통상 처리
        last_hp = self.hp
        last_sp = self.sp
        self.hp -= recover_hp
        self.sp -= recover_sp
        effective |= self.hp != last_hp
        effective |= self.sp != last_sp
        # 스테이트 변화
        @state_changed = false
        effective |= states_plus(item.plus_state_set)
        effective |= states_minus(item.minus_state_set)
        # 파라미터 상승치가 유효의 경우
        if item.parameter_type > 0 and item.parameter_points != 0
          # 파라미터로 분기
          case item.parameter_type
          when 1  # MaxHP
            @maxhp_plus += item.parameter_points
          when 2  # MaxSP
            @maxsp_plus += item.parameter_points
          when 3  # 완력
            @str_plus += item.parameter_points
          when 4  # 손재주가 있음
            @dex_plus += item.parameter_points
          when 5  # 민첩함
            @agi_plus += item.parameter_points
          when 6  # 마력
            @int_plus += item.parameter_points
          end
          # 유효 플래그를 세트
          effective = true
        end
        # HP 회복율과 회복량이 0 의 경우
        if item.recover_hp_rate == 0 and item.recover_hp == 0
          # 데미지에 공문자열을 설정
          self.damage = ""
          # SP 회복율과 회복량이 0, 파라미터 상승치가 무효의 경우
          if item.recover_sp_rate == 0 and item.recover_sp == 0 and
            (item.parameter_type == 0 or item.parameter_points == 0)
            # 스테이트에 변화가 없는 경우
            unless @state_changed
            # 데미지에 "Miss" 를 설정
              self.damage = "Miss"
            end
          end
        end
      # 미스의 경우
      else
        # 데미지에 "Miss" 를 설정
        self.damage = "Miss"
      end
      # 전투중이 아닌 경우
      unless $game_temp.in_battle
        # 데미지에 nil 를 설정
        self.damage = nil
      end
      # 메소드 종료
      return effective
    else
      # 귀환시킨다
      trcs6_item_effect(item)
    end
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ○인클루드
  #--------------------------------------------------------------------------
  include TRCS6_ZOMBIE
  #--------------------------------------------------------------------------
  # ○오브젝트 초기화
  #    viewport : 뷰포트
  #    battler  : 버틀러 (Game_Battler)
  #--------------------------------------------------------------------------
  alias trcs6_initialize initialize
  def initialize(viewport, battler = nil)
    # 스테이트[좀비]의 ID를 취득
    @zombie_id = zombie_state_id
    # 귀환시킨다
    trcs6_initialize(viewport, battler)
  end
  #--------------------------------------------------------------------------
  # ○프레임 갱신
  #--------------------------------------------------------------------------
  alias trcs6_update update
  def update
    # 귀환시킨다
    trcs6_update
    # 스테이트[좀비]가 부가되고 있는 버틀러에[회색 필터]를
    if @battler_visible and @battler.state? (@zombie_id)
      self.blend_type = 0
      self.color = ZOMBIE_FILTER
    end
  end
end
#-------------끝

사용법

1, 스테이트의 준비
·이하의 이름이 붙은 스테이트를 준비해 주세요. ID는 뭐든지 괜찮습니다.

스테이트명:좀비 (스크립트 내에서 수정 가능합니다 약17줄)

2, 스크립트내의 설정 항목을 고쳐 써 주세요.
#-------------------------------------------------------------------------------------
<<사양 -본스크립트->>
·이 스크립트는 데미지치가 부의 경우는 정말로 하고 있습니다. (스테이트[좀비]를 가지는 경우)
 그러므로, 회복 처리를 변경하는 스크립트보다 하위의 섹션에 삽입해 주세요.

·소생 아이템등을 스테이트[좀비]를 가지는 버틀러에 사용했을 경우,
 스테이트[전투 불능]을 강제 부가해 즉사를 재현 하고 있습니다.

·현재, 아군 단체(HP0)를 아군에게 사용했을 경우에도 즉사합니다.

·필터의 색은 Sprite_Battler로 정의하고 있습니다.

#-------------------------------------------------------------------------------------
<<사양 -경합에 관해서―>>
·이 스크립트는 재정의를 실시하고 있습니다.

·변경·alias 부분은 이하와 같습니다.

(Game_Battler)
1, 메소드 initialize
2, 메소드 attack_effect
3, 메소드 skill_effect
4, 메소드 item_effect
5, 메소드 hp0?  의 재정의

(Sprite_Battler)
1, 메소드 main
2, 메소드 update

출처는 트르크카운터

Who's 백호

?

이상혁입니다.

http://elab.kr

Comment '7'
  • ?
    나뚜루 2009.02.22 22:42
    살짝 비효율적인 감이 있군요..
    차라리 아이디를 쓰지;
    이름을 저장해서.. 모든 스테이트를 돌려서 이름이 같으면 그 아이디를 돌려준다니..
  • ?
    강냉 2009.07.19 16:57

    이거 그런게 아니고요 스테이트 설정을해서 회복스킬로 공격하는겁니다 이거 예전에 제가 올렸던건데 그대로 올라와있네요

    지금은 병용하는게 나왔어요 메이플처럼 아군하고 적군 힐하는걸로 나와가지고 쓸만합니다

  • ?
    완전초보 2009.07.24 13:13

    뭔말??????????????????????????

  • ?
    Amaster 2009.07.30 18:39
    글쎄요.. +ㅁ+ ,,,
  • ?
    맑은하늘의 나라 2010.01.04 13:45

    좋군요?

     

  • ?
    카비 2010.01.05 13:23

    재미있는 스크립트네요~

  • ?
    리체 2010.07.30 00:20

    나뚜루// 아이디를 쓰면 게임을 제작 중이던 사람은 싹다 바꿔야 하겠지만, 이름으로 검색해서 쓰면 제작 중이던 게임에도 쉽게 적용할 수 있죠.


    뭐, 비효율 적인 것은 인정...


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
74 기타 Trailing Characters ver.1 by SephirothSpawn 6 file 백호 2009.02.22 1551
73 기타 KGC_UsableWeapon file 백호 2009.02.22 1384
72 기타 Multiple Languages v2 by SephirothSpawn (SDK호환) file 백호 2009.02.22 1404
71 기타 플레이어 발소리 스크립트 20 백호 2009.02.22 3107
» 기타 회복으로 데미지를 받는 좀비 스크립트 7 백호 2009.02.22 2004
69 기타 멤버 교체 11 file 백호 2009.02.22 2525
68 기타 4방향 마우스 스크립트 12 file 아방스 2009.02.28 2662
67 기타 8방향 마우스 스크립트 10 file 아방스 2009.02.28 4063
66 기타 레벨9999만들기스크립 23 해파리 2009.04.10 3344
65 기타 한글 입력 스크립트 입니다. (vx -> xp) 23 file 헤르코스 2009.04.18 3397
64 기타 XP 각종 스크립트입니다. 36 file 쿠도신이치 2009.04.26 4266
63 기타 [◆ 안 됨?지?값개조 - KGC_DamageAlter ◆]데미지값을 개조[ 해석하지못함 ㅠㅠ;;] 1 file 제로스S2 2009.08.02 1753
62 기타 [Game_Actor] 게이지바 표시 스크립트 8 file - 하늘 - 2009.08.03 4174
61 기타 스탭 롤 9 file 허걱 2009.08.13 2905
60 기타 클리어 횟수 기록하기 1 file 허걱 2009.08.22 2188
59 기타 홈페이지 띄우기 (VX 상관없음.) 6 KNAVE 2009.08.25 2137
58 기타 한계 돌파스크립트 8 G MAX 2009.09.03 2205
57 기타 rpgxp [체험판] 입니다. 6 file 인웅이 아부지 2010.01.12 2289
56 기타 스탯 13 file 이안 2010.01.17 2320
55 기타 턴제새로운거. 39 file 이안 2010.01.17 3296
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 Next
/ 13