질문과 답변

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 12388
RMXP 오토타일 추가법.. 4 Lighna 2012.02.20 2080
RMVXA 캐릭터 이동패턴 늘리는 법 없나요? 1 밝은길 2012.02.20 2190
RMVXA 맵 중앙 정렬 2 비비드 2012.02.19 2041
RMVXA 색조 조절 문의 3 비비드 2012.02.19 2078
RMVXA 전투 방식 수정 2 비비드 2012.02.19 2073
RMVXA 말하는 속도 조절 2 비비드 2012.02.19 2691
RMVXA 자체 글씨체 질문 2 file 환장 2012.02.19 2603
RMVX RPG VX 사이드뷰시 적 이미지가 보행칩 자체로 나와요 ㅜㅜ 6 file 아방가르등 2012.02.19 3068
RMVX 스크립트로 특정 액터만 데미지 공식 변경하기 2 뱀딸기 2012.02.18 1109
RMVX 아이콘 변경 3 쿠쿠밥솥 2012.02.18 2736
RMVX 이벤트가 계속 반복됩니다. 3 블루스 2012.02.18 2232
RMVXA 캐릭터 칩셋을 입력했는데 2 비비드 2012.02.18 2253
RMVX 아이템 획득, 사용 관련 질문 드려봅니다. 5 블루스 2012.02.18 2690
RMVXA 한글이 깨집니다 2 환장 2012.02.18 2609
RMXP 전투 화면 그래픽 바꾸기 1 끼룩 2012.02.18 2451
RMVXA 스크립트 제작 문의 3 비비드 2012.02.18 1690
RMVXA 기본 캐릭터 얼굴 질문 2 비비드 2012.02.18 2256
RMVXA 혹시 마을채로 공유하는 곳도 있나요? 4 비비드 2012.02.18 2007
RMXP xp에서 조작키 바꾸기 2 난현이라는 2012.02.18 2213
RMVX 낮과 밤과 빛 스크립트 응용 1 Raychel 2012.02.18 2046
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