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 6317
721 기타 레벨9999만들기스크립 23 해파리 2009.04.10 3348
720 퀘스트 퀘스트창 예제 21 지나가던사람 2009.04.05 5746
719 메뉴 [자작]명성치 사용 스크립트 16 Rainsy 2009.03.22 3392
718 이동 및 탈것 반칸 이동하기 14 file 느싱 2009.03.09 3463
717 맵/타일 [유니크급] RPG XP 게임을 3D화로 보자! Neo Mode7 script / 52 file 쉴더 2009.02.28 9452
716 기타 8방향 마우스 스크립트 10 file 아방스 2009.02.28 4063
715 기타 4방향 마우스 스크립트 12 file 아방스 2009.02.28 2667
714 액터 (killer님 요청)자동회복 스크립트 3 나뚜루 2009.02.22 2576
713 기타 멤버 교체 11 file 백호 2009.02.22 2532
712 메뉴 메뉴등에서 움직이는 엑터 9 file 백호 2009.02.22 3166
711 파티 파티 확장 11 file 백호 2009.02.22 3191
710 스킬 제한시간내 커맨드를 입력해야 스킬이 발동~ 3 file 백호 2009.02.22 2616
» 기타 회복으로 데미지를 받는 좀비 스크립트 7 백호 2009.02.22 2010
708 기타 플레이어 발소리 스크립트 20 백호 2009.02.22 3111
707 아이템 CSSR14-아이템 합성 3 file 백호 2009.02.22 2835
706 장비 CSSR8-장비품 생산&강화 시스템 18 file 백호 2009.02.22 3960
705 장비 CSSR5-장비품 중량 시스템 1 file 백호 2009.02.22 1736
704 장비 CSSR1-장비품 어빌리티포인트제 file 백호 2009.02.22 1600
703 전투 CSSR6-스태미너 시스템 1 file 백호 2009.02.22 2340
702 기타 Multiple Languages v2 by SephirothSpawn (SDK호환) file 백호 2009.02.22 1408
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ... 52 Next
/ 52