기타

능력치에 따른 스테이트변화 / 능력치한계지정

by Evangelista posted May 26, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

자작 스크립트입니다.

 

################################################################################
#                                                                              #
# DEST21C : 파라미터변화에 따른 스테이트 자동 추가 / 해제 스크립트 V0.8        #
# DEST21C : 파라미터제한수치 설정 스크립트 V1.0                                #
#                                                                              #
# 버그보고 및 리퀘스트 : dest21c@nate.com                                      #
#                                                                              #
# 추후예정 : 현재 HP나 MP가 MAXHP나 MAXMP의 일정 %일때 스테이트 자동 추가/해제 #
#                                                                              #
################################################################################
=begin

@ 주의사항
 - Game_Battler 클래스의 일부 항목을 재정의합니다.
 - 같은 개소를 재정의하는 스크립트와 경합할 우려가 있습니다.
 - 재정의한 항목
  : def maxhp_limit
  : def maxhp
  : def maxmp
  : def atk
  : def def
  : def spi
  : def agi
  : def maxhp=
  : def maxmp=
  : def atk=
  : def def=
  : def spi=
  : def agi=
  : Game_Actor 클래스의 def maxhp_limit
 
=end

module DEST21C
  module PARAMETER_STATE
    # 커스터마이즈 항목
    # ID : 조건합치시 추가할 스테이트 ID의 배열 ([1, 2, 3번째...])
    # CON1 : 계산의 조건 파라미터 수치([1, 2, 3번째...])
    # CON2 : CON1초과이면 0, 이하이면 1 (예: [0, 1, 0...])
    # CON3 : 파라미터종별
    #   (1 : STR / 2 : DEF / 3 : SPI / 4 : AGI / 5 : MAXHP / 6 : MAXMP)
    #   ([1, 2, 3번째...])
    #
    # 예시) MAXHP가 50이하일 때 30번 스테이트 추가 / SPI가 100초과일때 10번 추가
    # STATE_ID = [30, 10]
    # STATE_CON1 = [50, 100]
    # STATE_CON2 = [1, 0]
    # STATE_CON3 = [5, 3]
    STATE_ID = [20, 21, 22, 23]
    STATE_CON1 = [50, 50, 50, 50]
    STATE_CON2 = [0, 1, 0, 1]
    STATE_CON3 = [1, 2, 3, 4]
  end
  module PARAMETER_LIMIT
    # 커스터마이즈 항목
    # MAXHP : MAXHP의 한계치
    # MAXMP : MAXMP의 한계치
    # ATK : ATK의 한계치
    # DEF : DEF의 한계치
    # SPI : SPI의 한계치
    # AGI : AGI의 한계치
    MAXHP = 999
    MAXMP = 999
    ATK = 999
    DEF = 999
    SPI = 999
    AGI = 999
  end
end


 

class Game_Battler
  STATEID_LIST = DEST21C::PARAMETER_STATE::STATE_ID
  STATECON1_LIST = DEST21C::PARAMETER_STATE::STATE_CON1
  STATECON2_LIST = DEST21C::PARAMETER_STATE::STATE_CON2
  STATECON3_LIST = DEST21C::PARAMETER_STATE::STATE_CON3
  # 각종 파라미터를 읽을 시 스테이트의 추가/해제 판정
  def atk
    # 통상 처리의 실행
    n = [[base_atk + @atk_plus, 1].max, DEST21C::PARAMETER_LIMIT::ATK].min
    for state in states do n *= state.atk_rate / 100.0 end
    n = [[Integer(n), 1].max, DEST21C::PARAMETER_LIMIT::ATK].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 1
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def
   
  def def
    # 통상 처리의 실행
    n = [[base_def + @def_plus, 1].max, DEST21C::PARAMETER_LIMIT::DEF].min
    for state in states do n *= state.def_rate / 100.0 end
    n = [[Integer(n), 1].max, DEST21C::PARAMETER_LIMIT::DEF].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 2
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def
 
  def spi
    # 통상 처리의 실행
    n = [[base_spi + @spi_plus, 1].max, DEST21C::PARAMETER_LIMIT::SPI].min
    for state in states do n *= state.spi_rate / 100.0 end
    n = [[Integer(n), 1].max, DEST21C::PARAMETER_LIMIT::SPI].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 3
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def
 
  def agi
    # 통상 처리의 실행
    n = [[base_agi + @agi_plus, 1].max, DEST21C::PARAMETER_LIMIT::AGI].min
    for state in states do n *= state.agi_rate / 100.0 end
    n = [[Integer(n), 1].max, DEST21C::PARAMETER_LIMIT::AGI].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 4
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def

  def maxhp_limit
    return DEST21C::PARAMETER_LIMIT::MAXHP
  end
 
  def maxhp
    # 통상 처리의 실행
    n = [[base_maxhp + @maxhp_plus, 1].max, maxhp_limit].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 5
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def
 
  def maxmp
    # 통상 처리의 실행
    n = [[base_maxmp + @maxmp_plus, 0].max, DEST21C::PARAMETER_LIMIT::MAXMP].min
    # 조건의 파라미터 종별을 검색한다.
    for s in 0...STATECON3_LIST.size
      if STATECON3_LIST[s] == 6
        # 수치 초과의 조건이라면
        if STATECON2_LIST[s] == 0
          n_id = STATEID_LIST[s]
          if n > STATECON1_LIST[s]
            add_state(n_id)
          elsif n <= STATECON1_LIST[s]
            remove_state(n_id)
          end
        # 수치 이하의 조건이라면
        elsif STATECON2_LIST[s] == 1
          n_id = STATEID_LIST[s]
          if n <= STATECON1_LIST[s]
            add_state(n_id)
          elsif n > STATECON1_LIST[s]
            remove_state(n_id)
          end
        end
      end
    end
    return n
  end #def

  # 최대HP의 설정
  def maxhp=(new_maxhp)
    @maxhp_plus += new_maxhp - self.maxhp
    @maxhp_plus = [[@maxhp_plus, -DEST21C::PARAMETER_LIMIT::MAXHP].max, DEST21C::PARAMETER_LIMIT::MAXHP].min
    @hp = [@hp, self.maxhp].min
  end
 
  # 최대MP의 설정
  def maxmp=(new_maxmp)
    @maxmp_plus += new_maxmp - self.maxmp
    @maxmp_plus = [[@maxmp_plus, -DEST21C::PARAMETER_LIMIT::MAXMP].max, DEST21C::PARAMETER_LIMIT::MAXMP].min
    @mp = [@mp, self.maxmp].min
  end
 
  # ATK의 설정
  def atk=(new_atk)
    @atk_plus += new_atk - self.atk
    @atk_plus = [[@atk_plus, -DEST21C::PARAMETER_LIMIT::ATK].max, DEST21C::PARAMETER_LIMIT::ATK].min
  end
 
  # DEF의 설정
  def def=(new_def)
    @def_plus += new_def - self.def
    @def_plus = [[@def_plus, -DEST21C::PARAMETER_LIMIT::DEF].max, DEST21C::PARAMETER_LIMIT::DEF].min
  end
 
  # SPI의 설정
  def spi=(new_spi)
    @spi_plus += new_spi - self.spi
    @spi_plus = [[@spi_plus, -DEST21C::PARAMETER_LIMIT::SPI].max, DEST21C::PARAMETER_LIMIT::SPI].min
  end
 
  # AGI의 설정
  def agi=(new_agi)
    @agi_plus += new_agi - self.agi
    @agi_plus = [[@agi_plus, -DEST21C::PARAMETER_LIMIT::AGI].max, DEST21C::PARAMETER_LIMIT::AGI].min
  end
 
end #class Game_Battler

# 상기 실행만으로는 곧바로 적용되지 않으므로 파라미터를 불러들여 처리한다.
# Scene_Menu 클래스에서 각종 파라미터를 불러들인다.
class Scene_Menu < Scene_Base
  alias dest21c_parameter_state_start start
  def start
    parameters_load_module
    dest21c_parameter_state_start
  end
end

# Scene_Item 클래스에서 각종 파라미터를 불러들인다.
class Scene_Item < Scene_Base
  alias dest21c_parameter_state_update update
  def update
    parameters_load_module
    dest21c_parameter_state_update
  end
end

# Scene_Skill 클래스에서 각종 파라미터를 불러들인다.
class Scene_Skill < Scene_Base
  alias dest21c_parameter_state_update update
  def update
    parameters_load_module
    dest21c_parameter_state_update
  end
end

# Scene_Status 클래스에서 각종 파라미터를 불러들인다.
class Scene_Status < Scene_Base
  alias dest21c_parameter_state_start start
  def start
    parameters_load_module
    dest21c_parameter_state_start
  end
end

# Scene_Equip 클래스에서 각종 파라미터를 불러들인다.
class Scene_Equip < Scene_Base
  alias dest21c_parameter_state_update update
  def update
    parameters_load_module
    dest21c_parameter_state_update
  end
end

# Scene_Battle 클래스에서 각종 파라미터를 불러들인다.
class Scene_Battle < Scene_Base
  alias dest21c_parameter_state_update update
  def update
    parameters_load_module
    dest21c_parameter_state_update
  end
end

# 액터의 최대HP한계치를 설정한다.
class Game_Actor < Game_Battler
  def maxhp_limit
    return super()
  end
end

# 각종 파라미터를 불러들이는 모듈
def parameters_load_module
  $game_party.members.each{|actor|
    a = actor.atk}
  $game_party.members.each{|actor|
    a = actor.def}
  $game_party.members.each{|actor|
    a = actor.spi}
  $game_party.members.each{|actor|
    a = actor.agi}
  $game_party.members.each{|actor|
    a = actor.maxhp}
  $game_party.members.each{|actor|
    a = actor.maxmp}
end

 

 

 

 

버그보고나 리퀘스트는 본문의 메일로 보내셔도 되지만 리플이나 쪽지로 남기셔도 좋습니다.

가능하면 사용시에는  메일이나 리플, 쪽지로 사용보고를 해 주시면 감사하겠습니다.