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
1021 아이템 흠..몬스터도감말고 아이템도감~ 9 백호 2009.02.21 2028
1020 전투 흠.. 아직도 이 스크립트가 없군요 ㅋㅋ(제가올림..) 1 file 백호 2009.02.21 3333
1019 전투 횡스크롤형식의 스크립트 7 백호 2009.02.21 2913
1018 기타 횡스크롤 스크립트 한국말 번역. 15 file 백호 2009.02.21 3311
» 기타 회복으로 데미지를 받는 좀비 스크립트 7 백호 2009.02.22 2004
1016 메뉴 화살표 모양 셀렉트 커서 사용 2 백호 2009.02.22 2118
1015 그래픽 화면을 부드럽게 해주는스크립트[ 아주 유용] 56 file - 하늘 - 2009.08.05 6561
1014 미니맵 화면에 축소된 미니맵을 표시하는 스크립트 - 한글 번역 - 6 file 백호 2009.02.21 2558
1013 화면에 축소된 맵을 표시하는 스크립트 7 file 백호 2009.02.21 2394
1012 기타 홈페이지 띄우기 (VX 상관없음.) 6 KNAVE 2009.08.25 2137
1011 메뉴 혹시있나해서-_-.. 대화창에 테두리치기 스크립트 7 백호 2009.02.22 2591
1010 기타 현재시간표시 33 file 코아 코스튬 2010.10.09 2528
1009 기타 현재 맵BGM을 그대로 전투 BGM으로 연결 from phylomortis.com 백호 2009.02.22 1180
1008 이름입력 한글조합입력기(영어가능) file 조규진1 2019.11.10 491
1007 메시지 한글자씩 뜨는 스크립트 6 백호 2009.02.21 2998
1006 키입력 한글입력스크립트 16 file 아방스 2007.11.09 11823
1005 키입력 한글입력기(자음, 모음 분리. 아마 중복일 듯...) 11 캉쿤 2011.09.13 3225
1004 키입력 한글입력기 6 백호 2009.02.22 4286
1003 이름입력 한글이름 입력기 스크립트 14 백호 2009.02.22 4205
1002 메시지 한글 채팅 스크립트 32 file こなた 2009.01.22 4947
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