질문과 답변

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 12391
RMMV 데미지 출력시 폰트 이미지 바꾸는방법이 있나요? 2 file Blur 2017.06.21 170
RMVX 메뉴 캐릭터의 직업란을 안보이게 하고싶습니다. 6 file 가온하제 2017.02.12 170
RMVXA DLC가 좀 이상해요 2 값틴프라이스 2016.10.24 170
RMVX 실제 플레이 하고있는 날짜 출력 2 아키Ra 2016.06.13 170
RMVXA 게임이 시작될때 이벤트씬 만드는법 질문이요. 2 ddmc 2016.01.27 170
RMMV 아직 일본 공식 사이트에 MV 튜토리얼은 안나왔나요? 2 asdfasdf111 2015.10.25 170
RMVXA 탈것의 초기위치 2 유우니사막 2015.08.31 170
RMVXA 스위치와 커먼 이벤트를 사용하여 빛 효과 적용시키는거 어떻게 하나요 4 file KIM곰 2015.08.04 170
RMVXA 표시할 수 있는 픽쳐의 제한을 깨는 스크립트는 없을까요? 양갱님 2015.07.04 170
RMVX 스크립트로 문장 크기 변경 2 KAHP 2015.04.26 170
RMMV 게임 시작을 파판6 오프닝 처럼 만들고 싶습니다. 2 시우A 2017.09.21 170
RMVXA 질문이 좀 많아요 ㅠㅠ (맵 만들기) 4 file 시니쓰 2018.04.24 170
기본툴 사용법 RM2k 타이틀화면에서 새게임 불러오기 종료의 테두리를 투명하게하고싶어요.. ㅠ file 초보자입니다 2022.04.18 170
이벤트 작성 RMVX 대화창 일러 크기 1 file 2021.08.20 169
기본툴 사용법 RMMV MV 입문자 이벤트 관련 질문입니다. 4 근거괴 2020.07.02 169
기본툴 사용법 RMMV 폴더에 그림을 넣어도 인게임 목록에 뜨지 않는 이유가 무엇일까요? 3 file 핸들 2020.05.23 169
이벤트 작성 RMVXA 캐릭터가................안 자요................... 2 file nucnuc 2019.12.17 169
기타 RMMV 맵 배경을 타일 맵이 아닌 직접 그린 그림 맵으로 대입하려면 어떻게 해야하나요? 3 Ri노 2019.11.23 169
스크립트 사용 RMVXA 동방프로젝트 탄막슈팅 스크립트 슈필러 2019.02.04 169
RMMV 액알 질문이 있습니다 2 잠행인 2017.08.04 169
Board Pagination Prev 1 ... 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 ... 516 Next
/ 516