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 6159
1021 메시지 Taylor's Simple Message System 2000 Alkaid 2020.07.05 242
1020 제작도구 [XP/VX/VXA] Doodad's Editor by newold Alkaid 2020.07.12 385
1019 이름입력 한글조합입력기(영어가능) file 조규진1 2019.11.10 499
1018 전투 전투중에 장비들 교체하기 file 레이스89 2017.08.19 595
1017 기타 [All RGSS] FileTest (Unicode) file Cheapmunk 2014.12.29 611
1016 맵/타일 맵연결 스크립트 (데모첨부) file 게임애호가 2018.06.15 689
1015 기타 에어리어 설정 by RPG Advocate 백호 2009.02.22 709
1014 기타 Boat Script 백호 2009.02.21 729
1013 기타 Localization by ForeverZer0, KK20 습작 2013.04.26 738
1012 기타 Materia System file 백호 2009.02.21 749
1011 기타 Real-Time Day Night 3 백호 2009.02.22 751
1010 스킬 SG_Escape Only Skills by sandgolem (SDK호환) 백호 2009.02.22 752
1009 기타 killer님 요청하신 스크립트 두번째입니다. 나뚜루 2009.02.21 759
1008 기타 Letter by Letter Message Window by slipknot@rmxp.org (SDK호환) 1 file 백호 2009.02.22 760
1007 기타 Advanced Gold display by Dubealex 1 백호 2009.02.22 761
1006 스킬 Skill Requirements by SephirothSpawn (SDK호환) file 백호 2009.02.22 763
1005 기타 Sphere Grid System file 백호 2009.02.21 765
1004 기타 AMS-Advanced Message Script Edited by Dubleax 3 file 백호 2009.02.21 765
1003 스킬 SG_Skill Break by sandgolem (SDK호환) 백호 2009.02.22 772
1002 기타 Activation_system file 백호 2009.02.22 775
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