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 키입력 한글입력스크립트 16 file 아방스 2007.11.09 11823
1020 온라인 채팅 가능 온라인 스크립트 배포 107 file 아방스 2009.01.03 10680
1019 온라인 RPG 만들기 xp 온라인 스크립트 33 아방스 2007.11.09 9592
1018 맵/타일 [유니크급] RPG XP 게임을 3D화로 보자! Neo Mode7 script / 52 file 쉴더 2009.02.28 9441
1017 온라인 온라인 스크립트 Unis Net RMXP 공식 배포! 25 file 뮤바보 2011.12.25 9400
1016 온라인 광넷[ 광땡 온라인 + 넷플레이 ] 62 - 하늘 - 2009.08.02 9003
1015 전투 [액알]neo_a-rpg_module_1[1][1].2 스크립트 83 file 은빛바람 2009.10.03 8298
1014 이름입력 대화창에 얼굴, 이름 띄우기 37 킬라롯 2008.11.09 7496
1013 온라인 넷플레이1.7.0+abs5.5+한챗 49 쀍뛝쒧 2009.01.24 7286
1012 메뉴 메이플스토리처럼 메뉴를^^ 57 file 딸기님 2010.07.13 7140
1011 메시지 대화창에 얼굴 그래픽 띠우기 73 아방스 2007.11.09 7117
1010 스킬 ABP액알 v1.2 스킬추가, 버그수정판 36 file 백호 2009.02.22 6919
1009 전투 [신기술 체험] 강회된 횡스크롤 액알 13 file 백호 2009.02.22 6841
1008 메뉴 온라인메뉴처럼!! 메이플 메뉴처럼!! 변신~스크립트 33 WMN 2008.03.17 6815
1007 그래픽 화면을 부드럽게 해주는스크립트[ 아주 유용] 56 file - 하늘 - 2009.08.05 6561
1006 온라인 Mr.Metring NPE 1.0 [RPG XP 온라인 스크립트] 35 아방스 2009.01.07 6535
1005 이름입력 케릭터 위에 또는 NPC 위에 이름 뛰우기 [헬악이님 제공] 49 file 아방스 2007.11.09 6406
1004 액터 시트르산의 XP용 감정 말풍선 표시 스크립트 37 file 시트르산 2011.01.25 6110
1003 HUD 주인공,NPC이름 머리 나타내기 49 file 송긔 2010.11.28 6060
1002 전투 액알 스크립트 24 백호 2009.02.22 6013
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