질문과 답변

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 12400
RMVXA 쯔꾸르창이 전체화면으로 됩니다... 4 마맨 2014.01.11 29562
에러 해결 RMMV NW.js 프로필 오류 해결법 아시는분 있나요? 2 file MSM 2019.03.05 18988
기타 RPG만들기로 만든 게임은 에디트를 사용못하나요? 5 키키두두키 2011.10.09 13476
RMVXA 요즘 혜성 같이 나타난 RPG VX ACE 치트오메틱에 대해서입니다. 1 g223k 2013.04.10 11969
RMVXA RPG VX ACE 에서 조작키 바꾸는 법 3 째워잉 2013.08.17 10833
RMVX RGSS202.dll좀 주실분 2 알피지매니아스 2010.11.14 10515
RMVX RVDATA2 파일은 어떤 프로그램으로 열어야하나요? 2 글쓰니안쓰니 2013.03.28 10133
RMVX rpgvx계 게임을 받았는데 1 하구하구 2010.11.08 9686
RM2k3 2003 그래픽 (캐릭터,몬스터) xp에서도 사용 가능 하나요? 2 마우리 2012.03.20 8895
RMVX 대화창 스킵하는법 6 kaisis 2013.05.06 8720
RMVXA RPG VX ACE 윈도우 7유저의 한글 깨짐 현상. 3 kila233 2012.07.07 8627
RMVX RGSS202E.dll 이 없어요.. 어디서 구하죠? 2 C1님 2011.04.18 8103
RMVX RPGVX 오류(?) 2 『호┠심』군 2010.12.01 8057
RMVXA RPG만들기 VX ACE 이거에서 rgss3a파일 어떻게 열어요? 2 시에마 2013.07.28 7913
한글이 네모로 뜨며 깨집니다.(해결!) 4 file 꺄훌 2012.11.19 7841
기타 rvdata2 확장자는 무슨 제작툴을 쓴건가요? 6 식인곰푸 2014.06.17 7781
RMMV ~~.rpgmvp가 뭔가요? 2 file 무슨상관이라도 2016.08.25 7393
기타 사이트 이용 사운드 소재 란에 있는 사운드/효과음 소재들은 써도 되는 건가요? 2 jojiwell 2019.11.30 7384
RMVX 뱀파이어 액알에서 Die Self Switch A 어떻게 사용하는 건가요? 3 닉네임은2와20 2012.01.16 7268
RMVX 애니메이션 한 프레임당 초가 몇인지 알고싶습니다. 4 톰소여동생 2012.06.29 7182
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 516 Next
/ 516