질문과 답변

Extra Form

안녕하세요~

지난번에 한 질문이 조용히 묻혀버려서..ㅠㅠ

 

변수를 이용해서,

스크립트로 데미지 공식을 변경해서

추가데미지라는 개념을 만들려고 하는데요

 

데미지 공식을 변경하면

모든 데미지가 데미지 공식대로 적용되어서요

 

스크립트로 특정 액터만 데미지 공식을 변경하려면 어떻게 해야할지 궁금해요

Comment '2'
  • ?
    아이미르 2012.02.21 10:36

    특정 액터와는 관련이 좀 떨어집니다만... 데미지 계산식 변경에 관해 짤막하게 한번 짜보았습니다.

     

    -------------------------------------------------------------------------------------------------------------------------------

    class Game_Enemy < Game_Battler
      attr_accessor :att_math #데미지 계산식 번호
      #--------------------------------------------------------------------------
      # ● 데미지 계산식 설정
      #--------------------------------------------------------------------------
      def att_math
        return @note =~ /<계산식=(\d+)\s*>/  ? $1.to_i : 0
      end
    end

    class Game_Actor < Game_Battler
      attr_accessor :att_math #데미지 계산식 번호
      #--------------------------------------------------------------------------
      # ● 데미지 계산식 설정
      #--------------------------------------------------------------------------
      def att_math
        @att_math = 0 if @att_math == nil
        unless weapons.compact == []
          for item in weapons.compact
            n = item.note =~ /<계산식=(\d+)\s*>/  ? $1.to_i : 0
            @att_math = n if @att_math <= n
          end
        end
         
        return @att_math
      end
    end

    module RPG
      class UsableItem < BaseItem
        #--------------------------------------------------------------------------
        # ● 데미지 계산식 설정
        #--------------------------------------------------------------------------
        attr_accessor :skill_math
        def skill_math
          return @note =~ /<계산식=(\d+)\s*>/  ? $1.to_i : 0
        end
      end
    end


    class Game_Battler
      #--------------------------------------------------------------------------
      # ● 데미지 계산함수 설정
      #--------------------------------------------------------------------------
      def calculate_attack_damage(attacker)
        damage = 0
        case attacker.att_math
        when 1 # 방어력 무시
          damage += attacker.atk * 4
        when 2 # 공격력 대신 정신력으로
          damage += attacker.spi * 4 - self.def * 2
        when 3 # 방어자가 중독이면 추가 데미지
          damage += attacker.atk * 4 - self.def * 2        # 기본 계산
          damage += self.maxhp / 8 if self.state?(2) # 방어자가 중독 상태인가?
        when 4 # 공격자가 중독이면 추가 데미지
           damage += attacker.atk * 4 - self.def * 2        # 기본 계산
           damage += attacker.maxhp / 8 if attacker.state?(2) # 공격자가 중독 상태인가?
        when 5 # 방어력을 공격력에 추가
           damage += attacker.atk * 4 - self.def * 2        # 기본 계산
           damage += attacker.def * 2
        else
          damage += attacker.atk * 4 - self.def * 2        # 기본 계산
        end
        return damage
      end
     
      #--------------------------------------------------------------------------
      # ● 통상 공격에 의한 데미지 계산
      #     attacker : 공격자
      #    결과는 @hp_damage 에 대입한다.
      #--------------------------------------------------------------------------
      def make_attack_damage_value(attacker)
        damage = calculate_attack_damage(attacker)
       
        damage = 0 if damage < 0                        # 마이너스라면 0 에
        damage *= elements_max_rate(attacker.element_set)   # 속성 수정
        damage /= 100
        if damage == 0                                  # 데미지가 0
          damage = rand(2)                              # 1/2 의 확률로 1 데미지
        elsif damage > 0                                # 데미지가 정의 수
          @critical = (rand(100) < attacker.cri)        # 위기 판정
          @critical = false if prevent_critical         # 위기 방지?
          damage *= 3 if @critical                      # 위기 수정
        end
        damage = apply_variance(damage, 20)             # 분산
        damage = apply_guard(damage)                    # 방어 수정
        @hp_damage = damage                             # HP 에 데미지
      end
     
      #--------------------------------------------------------------------------
      # ● 데미지 계산함수 설정
      #--------------------------------------------------------------------------
      def calculate_skill_damage(user, obj)
        damage = obj.base_damage                        # 기본 데미지를 취득
        if damage > 0
          case obj.skill_math
          when 1 # 마법 방어력 무효
            damage += user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage += user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자
            unless obj.ignore_defense                     # 방어력 무시 이외
              damage -= self.def * 2 * obj.atk_f / 100    # 타격 관계도: 대상자
            end
          when 2 # 물리 방어력 무효
            damage += user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage += user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자
            unless obj.ignore_defense                     # 방어력 무시 이외
              damage -= self.spi * 1 * obj.spi_f / 100    # 타격 관계도: 대상자
            end
          when 3 # 공격력 대신 방어력으로
            damage += user.def * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage += user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자    
            unless obj.ignore_defense                     # 방어력 무시 이외
              damage -= self.def * 2 * obj.atk_f / 100    # 타격 관계도: 대상자
              damage -= self.spi * 1 * obj.spi_f / 100    # 정신 관계도: 대상자
            end
          when 4 # 공격자 체력 비율을 반영
            damage += user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage += user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자
            damage *= 100 + ( 100 * user.hp ) / user.maxhp
            unless obj.ignore_defense                     # 방어력 무시 이외
              damage -= self.def * 2 * obj.atk_f / 100    # 타격 관계도: 대상자
              damage -= self.spi * 1 * obj.spi_f / 100    # 정신 관계도: 대상자
            end
          else # 기본 계산
            damage += user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage += user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자    
            unless obj.ignore_defense                     # 방어력 무시 이외
              damage -= self.def * 2 * obj.atk_f / 100    # 타격 관계도: 대상자
              damage -= self.spi * 1 * obj.spi_f / 100    # 정신 관계도: 대상자
            end
          end
          damage = rand(2) if damage <= 0
       
        elsif damage < 0
          case obj.skill_math
          when 1 # 체력 50% 이하면 2배 회복
            damage -= user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage -= user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자       
            ratio = (100 * self.hp) / self.maxhp
            damage *= 2 if ratio <= 50
          when 2  # 공격력, 정신력 대신 최대체력, 최대마력으로
            damage -= user.maxhp * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage -= user.maxmp * 2 * obj.spi_f / 100      # 정신 관계도: 사용자    
          else
            damage -= user.atk * 4 * obj.atk_f / 100      # 타격 관계도: 사용자
            damage -= user.spi * 2 * obj.spi_f / 100      # 정신 관계도: 사용자        
          end
        end
             
        return damage
      end
     
      #--------------------------------------------------------------------------
      # ● 스킬 또는 아이템에 의한 데미지 계산
      #     user : 스킬 또는 아이템의 사용자
      #     obj  : 스킬 또는 아이템
      #    결과는 @hp_damage 또는 @mp_damage 에 대입한다.
      #--------------------------------------------------------------------------
      def make_obj_damage_value(user, obj)
        damage = calculate_skill_damage(user, obj)
       
        damage *= elements_max_rate(obj.element_set)    # 속성 수정
        damage /= 100
        damage = apply_variance(damage, obj.variance)   # 분산
        damage = apply_guard(damage)                    # 방어 수정
        if obj.damage_to_mp 
          @mp_damage = damage                           # MP 에 데미지
        else
          @hp_damage = damage                           # HP 에 데미지
        end
      end
    end

    ----------------------------------------------------------------------------------------------------------------------------------

     

    사용법은 에너미의 경우는 에너미의 메모란에, 장비의 경우는 무기의 메모란에( 방어구는 써넣어도 무시당합니다.)

     

    스킬의 경우 스킬의 메모란에 <계산식=n>이라고 쓰면 스크립트 상의 n번 계산식을 따라가게 되어 있습니다.

     

    원하시는 게 어떤 방식의 계산인지 잘몰라서 광범위하게 해버렸네요.

     

    주의사항이라면 만일 최대체력, 체력, 최대마력, 마력, 공격력, 방어력, 정신력, 민첩성 이외의 수치를 계산식에

     

    첨가할때는 수치가 어느 한쪽만 있진 않은지 주의해주세요. 이를테면 레벨같은 경우는 액터쪽만 있고 에너미쪽에

     

    없기 때문에 계산식에 집어넣으면 에러나올 가능성이 있습니다.

  • ?
    뱀딸기 2012.02.21 19:36

    우왕..................

    .....

    너무 감사합니다............그런데.........

    제가 하려는 거에 어떻게 적용시켜야 할지는 잘 모르겠습니다........ㅠㅠ

     

    저는 vx기본기능에서 주어지는 데미지 계산이 좀 마음에 안들어서요

    공격력은 '완력', 방어력은 '건강'으로 용어를 바꾸고 사용하고 있습니당..

    그래서 좀 힘든 부분이..

    장비 부분 계산이 되었습니다...

    기본 기능대로 라면 장비를 착용했을 때, '완력'과 '건강'이 증가하는 방식이 될테니까요..(여타 게임들과 비슷하게 만들어보려는 욕심으로)

    그래서 실제 공격력과 방어력이라 할 수 있는 부분을 각 캐릭터 별 변수로 하려 했거든요.

    그렇게 하면 장비 착용과 패시브스킬까지 좀 손쉽게 해결할 수 있을 거 같아서요.

    그런데...

    각 캐릭터 행동마다 변수가 적용되게 하려하니 그 부분이 막혀서요....

    그래서 질문 게시판에 올리게 된 거예요

    일단 제가 질문을 올리게 된 이유는 그렇습니다.....흐흐...ㅠㅠ


List of Articles
종류 분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 12451
RMVX 스크립트로 문장 크기 변경 2 KAHP 2015.04.26 170
RMVX 스크립트로 세이브하기 아키Ra 2016.06.17 146
RMVX 스크립트로 이벤트를 생성하는 방법(SRPG 스크립트 관련) 3 file 재즈돈 2015.02.24 220
스크립트 추천 RMVX 스크립트로 인벤토리 조합 어케해요 2021.08.20 68
RMVX 스크립트로 직업의 속성유효도를 게임중에 바꿀 수 있을까요? 4 형철스 2011.04.19 1108
RMVX 스크립트로 특정 액터만 데미지 공식 변경하기 2 뱀딸기 2012.02.18 1109
RMVX 스크립트로 파티원을 능력치에 따라 정렬 할 수 있을까요? 형철스 2011.03.18 1290
RMVX 스크립트를 끼워넣었는데 작동을 안합니다 18 file KeV 2012.12.31 761
RMVX 스크립트를 도중에 추가할 수 있나요? 2 우아니아랱치 2011.07.13 1117
RMVX 스크립트를 배우고 싶은데 추천받을만한 곳이 있을까요? 8 레이니콘 2012.12.12 727
RMVX 스크립트를 보고 쓰게됬는데.. 2 아키Ra 2016.05.18 154
RMVX 스크립트를 이벤트로 적용시키는법 1 한월이 2014.09.18 451
RMVX 스크립트를 이용한 특정 액터의 데미지 공식 변경과 스위치 조작 뱀딸기 2012.02.12 1486
RMVX 스크립트를 잘못 수정한 것 같아 질문드립니다. 5 미즈 2012.08.02 1019
RMVX 스크립트안돼요 1 file 어두운메이커 2011.02.09 723
RMVX 스크립트에 대해 간략히 정리된 강좌 있을까요? 3 천공의계시 2011.07.28 1261
RMVX 스크립트에 산출된 수치를 변수로 옮기는 법이 잇나요? 3 은둔자 2010.12.27 545
RMVX 스크립트에서 cache 75line에 오류가 뜹니다 1 아브렐라 2012.12.15 651
RMVX 스크립트에서 조건을 연산으로 걸 수도 있나요? 6 형철스 2011.04.04 1245
RMVX 스크립트오류 1 아카로스 2011.02.25 738
Board Pagination Prev 1 ... 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ... 127 Next
/ 127