Ace 스크립트

음.. 공부가 잘 안되면 여기 접속하는 아이미르입니다 ㅇㅅㅇ/

 

이번 작품은 장비 착용에 제한점을 설정하는 스크립트 입니다.

 

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

 

예제 :  http://db.tt/2pCPUAQc

 

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

 

사용법

 

무기나 방어구의 메모란에

 

<장착제한>

문구 +n

문구 m +n

</장착제한>

을 기입합니다.

 

문구 타입 1) 문구 +n

 

 LV|레벨 
 MHP|최대HP
 MMP|최대MP
 ATK|공격력
 DEF|방어력
 MAT|마법력
 MDF|마법방어
 AGI|민첩성
 LUK|운
 GOLD|골드

 

문구는 좌우 하나만 쓰면 됩니다. +n은 n이상을 의미하고, -n은 n이하를 의미합니다.

 

exa)

 

<장착제한>
LV +2
</장착제한>

 

위 장비는 레벨이 2 이상일때 장착 가능합니다.

 

<장착제한>
MHP -1000
</장착제한>

 

위 장비는 최대체력이 1000 이하일 때 장착 가능합니다.

 

!!주의!! 뒤의 n이 양수일지라도 앞에 +를 생략해서는 안됩니다. 음수면 당연히 -를 붙여야겠지요

 

문구 타입 2) 문구 m +n

 

 SWITCH|스위치
 VARIABLE|변수
  ITEM|아이템

 

역시 문구는 좌우 하나만 쓰면 됩니다. 앞의 m은 id입니다. 스위치의 경우 m번 스위치가 대상이 되며

변수의 경우는 m번 변수, 아이템의 경우 아이템 id가 m인 아이템이 판별의 대상이 됩니다.

 

+n은 해당 조건입니다. 스위치의 경우 n의 값에 상관없이 스위치가 on이 조건이 됩니다.

변수의 경우 절대값을 판별 조건으로 삼습니다. 문구 타입 1과 마찬가지로 양수일 경우는 n값 이상일 때

음수일 경우는 n값 이하일 때를 판별합니다.

아이템의 경우는 n값의 양, 음에 상관없이 절대값으로 판별합니다. n개이상 소지할 경우만을 판별의

대상으로 삼습니다.

 

P.S 의외로 간단해보이는 구조라서 일찍 하고 자려고 했는 데 어느새 4시간이나 지나갔네요...

아무리 설렁설렁했다고 해도 그렇지 ...;;;

 

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

 

module IMIR_Limited
 
  # 합성 레시피 인식용
  LIMIT = {
    :level   => "LV|레벨",
    :mhp     => "MHP|최대HP",
    :mmp     => "MMP|최대MP",
    :atk     => "ATK|공격력",
    :def     => "DEF|방어력",
    :mat     => "MAT|마법력",
    :mdf     => "MDF|마법방어",
    :agi     => "AGI|민첩성",
    :luk     => "LUK|운",
    :gold    => "GOLD|골드",
  }
 
  LIMIT_OPTION = {
    :switch  => "SWITCH|스위치",
    :variable=> "VARIABLE|변수",
    :item    => "ITEM|아이템",
  }
 
  # 정규 표현
  module Regexp
    module Limited
      # 제한문 개시
      BEGIN_LIMITED = /<(?:LIMITED|장착제한)>/i
      # 제한문 종료
      END_LIMITED = /<\/(?:LIMITED|장착제한)>/i
      # 제한문 옵션     'Str Dec +Dec'형태   exa) ITEM 1 3 등
      LIMITED_OPTION = /^\s*([^:\+\-\d\s]+)\s*(\d+)\s*([\+\-]\d+)\s*$/
      # 제한문 수치     'Str +Dec' 형태      exa) GOLD 200 등
      LIMITED = /^\s*([^:\+\-\d\s]+)\s*([\+\-]\d+)\s*$/
    end
  end
 
end

#==============================================================================
# ■ RPG::Weapon
#==============================================================================
class RPG::Weapon < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬를 생성
  #--------------------------------------------------------------------------
  def create_limited_cache
    @_limited = false
    @_limited_level = 0
    @_limited_mhp = 0
    @_limited_mmp = 0
    @_limited_atk = 0
    @_limited_def = 0
    @_limited_mat = 0
    @_limited_mdf = 0
    @_limited_agi = 0
    @_limited_luk = 0
    @_limited_gold = 0
    @_limited_switch = []
    @_limited_variable = []
    @_limited_item = []
   
    reset_limited_cache   
    set_limited_cache
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬 초기화
  #--------------------------------------------------------------------------
  def reset_limited_cache
    @_limited_level = 0
    @_limited_mhp = 0
    @_limited_mmp = 0
    @_limited_atk = 0
    @_limited_def = 0
    @_limited_mat = 0
    @_limited_mdf = 0
    @_limited_agi = 0
    @_limited_luk = 0
    @_limited_gold = 0
    @_limited_switch = []
    @_limited_variable = []
    @_limited_item = []

  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬를 셋팅
  #--------------------------------------------------------------------------
  def set_limited_cache
    limited_flag = false
    self.note.each_line { |line|
      case line
      when IMIR_Limited::Regexp::Limited::BEGIN_LIMITED
        # 장착제한 정의 개시
        limited_flag = true
        @_limited = true
      when IMIR_Limited::Regexp::Limited::END_LIMITED
        # 장착제한 정의 종료
        limited_flag = false
      when IMIR_Limited::Regexp::Limited::LIMITED_OPTION
        if limited_flag
          apply_limited_option($1, $2.to_i, $3.to_i)
        end
      when IMIR_Limited::Regexp::Limited::LIMITED
        if limited_flag
          apply_limited($1, $2.to_i)
        end
      else
        break
      end
    }
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 옵션을 입수
  #--------------------------------------------------------------------------
  def apply_limited_option(kind, id, value)
    IMIR_Limited::LIMIT_OPTION.each { |k, v|
      if kind =~ /(?:#{v})/i
        case k
        when :switch
          reset_limited_cache if @_limited_switch == nil
          @_limited_switch.push(id)
        when :variable
          reset_limited_cache if @_limited_variable == nil
          @_limited_variable.push([id, value])
        when :item
          reset_limited_cache if @_limited_item[id] == nil
          @_limited_item.push([id, value.abs])
        end
        break
      end
    }
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 기본옵션을 입수
  #--------------------------------------------------------------------------
  def apply_limited(aim, value)
    IMIR_Limited::LIMIT.each { |k, v|
      if aim =~ /(?:#{v})/i
        case k
        when :level
          reset_limited_cache if @_limited_level == nil
          @_limited_level += value
        when :mhp
          reset_limited_cache if @_limited_mhp == nil
          @_limited_mhp += value
        when :mmp
          reset_limited_cache if @_limited_mmp == nil
          @_limited_mmp += value
        when :atk
          reset_limited_cache if @_limited_atk == nil
          @_limited_atk += value
        when :def
          reset_limited_cache if @_limited_def == nil
          @_limited_def += value
        when :mat
          reset_limited_cache if @_limited_mat == nil
          @_limited_mat += value
        when :mdf
          reset_limited_cache if @_limited_mdf == nil
          @_limited_mdf += value
        when :agi
          reset_limited_cache if @_limited_agi == nil
          @_limited_agi += value
        when :luk
          reset_limited_cache if @_limited_luk == nil
          @_limited_luk += value
        when :gold
          reset_limited_cache if @_limited_gold == nil
          @_limited_gold += value
        end
        break
      end
    }
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 장비일까?
  #--------------------------------------------------------------------------
  def limited
    create_limited_cache if @_limited == nil
    return @_limited
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 레벨
  #--------------------------------------------------------------------------
  def limited_level
    create_limited_cache if @_limited_level == nil
    return @_limited_level
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 최대체력
  #--------------------------------------------------------------------------
  def limited_mhp
    create_limited_cache if @_limited_mhp == nil
    return @_limited_mhp
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 최대마력
  #--------------------------------------------------------------------------
  def limited_mmp
    create_limited_cache if @_limited_mmp == nil
    return @_limited_mmp
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 공격력
  #--------------------------------------------------------------------------
  def limited_atk
    create_limited_cache if @_limited_atk == nil
    return @_limited_atk
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 방어력
  #--------------------------------------------------------------------------
  def limited_def
    create_limited_cache if @_limited_def == nil
    return @_limited_def
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 마법공격력
  #--------------------------------------------------------------------------
  def limited_mat
    create_limited_cache if @_limited_mat == nil
    return @_limited_mat
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 마법방어력
  #--------------------------------------------------------------------------
  def limited_mdf
    create_limited_cache if @_limited_mdf == nil
    return @_limited_mdf
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 민첩성
  #--------------------------------------------------------------------------
  def limited_agi
    create_limited_cache if @_limited_agi == nil
    return @_limited_agi
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 운
  #--------------------------------------------------------------------------
  def limited_luk
    create_limited_cache if @_limited_luk == nil
    return @_limited_luk
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 골드
  #--------------------------------------------------------------------------
  def limited_gold
    create_limited_cache if @_limited_gold == nil
    return @_limited_gold
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 스위치
  #--------------------------------------------------------------------------
  def limited_switch
    create_limited_cache if @_limited_switch == nil
    return @_limited_switch
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 변수
  #--------------------------------------------------------------------------
  def limited_variable
    create_limited_cache if @_limited_variable == nil
    return @_limited_variable
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 아이템
  #--------------------------------------------------------------------------
  def limited_item
    create_limited_cache if @_limited_item == nil
    return @_limited_item
  end
 
end

#==============================================================================
# ■ RPG::Armor
#==============================================================================
class RPG::Armor < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬를 생성
  #--------------------------------------------------------------------------
  def create_limited_cache
    @_limited = false
    @_limited_level = 0
    @_limited_mhp = 0
    @_limited_mmp = 0
    @_limited_atk = 0
    @_limited_def = 0
    @_limited_mat = 0
    @_limited_mdf = 0
    @_limited_agi = 0
    @_limited_luk = 0
    @_limited_gold = 0
    @_limited_switch = []
    @_limited_variable = []
    @_limited_item = []
   
    reset_limited_cache   
    set_limited_cache
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬 초기화
  #--------------------------------------------------------------------------
  def reset_limited_cache
    @_limited_level = 0
    @_limited_mhp = 0
    @_limited_mmp = 0
    @_limited_atk = 0
    @_limited_def = 0
    @_limited_mat = 0
    @_limited_mdf = 0
    @_limited_agi = 0
    @_limited_luk = 0
    @_limited_gold = 0
    @_limited_switch = []
    @_limited_variable = []
    @_limited_item = []

  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 캐쉬를 셋팅
  #--------------------------------------------------------------------------
  def set_limited_cache
    limited_flag = false
    self.note.each_line { |line|
      case line
      when IMIR_Limited::Regexp::Limited::BEGIN_LIMITED
        # 장착제한 정의 개시
        limited_flag = true
        @_limited = true
      when IMIR_Limited::Regexp::Limited::END_LIMITED
        # 장착제한 정의 종료
        limited_flag = false
      when IMIR_Limited::Regexp::Limited::LIMITED_OPTION
        if limited_flag
          apply_limited_option($1, $2.to_i, $3.to_i)
        end
      when IMIR_Limited::Regexp::Limited::LIMITED
        if limited_flag
          apply_limited($1, $2.to_i)
        end
      else
        break
      end
    }
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 옵션을 입수
  #--------------------------------------------------------------------------
  def apply_limited_option(kind, id, value)
    IMIR_Limited::LIMIT_OPTION.each { |k, v|
      if kind =~ /(?:#{v})/i
        case k
        when :switch
          reset_limited_cache if @_limited_switch == nil
          @_limited_switch.push(id)
        when :variable
          reset_limited_cache if @_limited_variable == nil
          @_limited_variable.push([id, value])
        when :item
          reset_limited_cache if @_limited_item[id] == nil
          @_limited_item.push([id, value.abs])
        end
        break
      end
    }
  end 
  #--------------------------------------------------------------------------
  # ○ 장착제한의 기본옵션을 입수
  #--------------------------------------------------------------------------
  def apply_limited(aim, value)
    IMIR_Limited::LIMIT.each { |k, v|
      if aim =~ /(?:#{v})/i
        case k
        when :level
          reset_limited_cache if @_limited_level == nil
          @_limited_level += value
        when :mhp
          reset_limited_cache if @_limited_mhp == nil
          @_limited_mhp += value
        when :mmp
          reset_limited_cache if @_limited_mmp == nil
          @_limited_mmp += value
        when :atk
          reset_limited_cache if @_limited_atk == nil
          @_limited_atk += value
        when :def
          reset_limited_cache if @_limited_def == nil
          @_limited_def += value
        when :mat
          reset_limited_cache if @_limited_mat == nil
          @_limited_mat += value
        when :mdf
          reset_limited_cache if @_limited_mdf == nil
          @_limited_mdf += value
        when :agi
          reset_limited_cache if @_limited_agi == nil
          @_limited_agi += value
        when :luk
          reset_limited_cache if @_limited_luk == nil
          @_limited_luk += value
        when :gold
          reset_limited_cache if @_limited_gold == nil
          @_limited_gold += value
        end
        break
      end
    }
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 장비일까?
  #--------------------------------------------------------------------------
  def limited
    create_limited_cache if @_limited == nil
    return @_limited
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 레벨
  #--------------------------------------------------------------------------
  def limited_level
    create_limited_cache if @_limited_level == nil
    return @_limited_level
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 최대체력
  #--------------------------------------------------------------------------
  def limited_mhp
    create_limited_cache if @_limited_mhp == nil
    return @_limited_mhp
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 최대마력
  #--------------------------------------------------------------------------
  def limited_mmp
    create_limited_cache if @_limited_mmp == nil
    return @_limited_mmp
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 공격력
  #--------------------------------------------------------------------------
  def limited_atk
    create_limited_cache if @_limited_atk == nil
    return @_limited_atk
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 방어력
  #--------------------------------------------------------------------------
  def limited_def
    create_limited_cache if @_limited_def == nil
    return @_limited_def
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 마법공격력
  #--------------------------------------------------------------------------
  def limited_mat
    create_limited_cache if @_limited_mat == nil
    return @_limited_mat
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 마법방어력
  #--------------------------------------------------------------------------
  def limited_mdf
    create_limited_cache if @_limited_mdf == nil
    return @_limited_mdf
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 민첩성
  #--------------------------------------------------------------------------
  def limited_agi
    create_limited_cache if @_limited_agi == nil
    return @_limited_agi
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 운
  #--------------------------------------------------------------------------
  def limited_luk
    create_limited_cache if @_limited_luk == nil
    return @_limited_luk
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 골드
  #--------------------------------------------------------------------------
  def limited_gold
    create_limited_cache if @_limited_gold == nil
    return @_limited_gold
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 스위치
  #--------------------------------------------------------------------------
  def limited_switch
    create_limited_cache if @_limited_switch == nil
    return @_limited_switch
  end
 
  #--------------------------------------------------------------------------
  # ○ 장착제한 - 변수
  #--------------------------------------------------------------------------
  def limited_variable
    create_limited_cache if @_limited_variable == nil
    return @_limited_variable
  end

  #--------------------------------------------------------------------------
  # ○ 장착제한 - 아이템
  #--------------------------------------------------------------------------
  def limited_item
    create_limited_cache if @_limited_item == nil
    return @_limited_item
  end
 
end

#==============================================================================
# ■ Game_BattlerBase
#------------------------------------------------------------------------------
#  버틀러를 취급하는 기본의 클래스입니다.주로 능력치 계산의 메소드를 포함하고 있습니다.와
# 의 클래스는 Game_Battler 클래스의 슈퍼 클래스로서 사용됩니다.
#==============================================================================

class Game_BattlerBase 
  #--------------------------------------------------------------------------
  # ● 장비 제한 판정
  #--------------------------------------------------------------------------
  def limited?(item)
    ans = 0
    ans += 1 if item.limited_level > 0 && @level < item.limited_level
    ans += 1 if item.limited_mhp > 0 && mhp < item.limited_mhp
    ans += 1 if item.limited_mmp > 0 && mmp < item.limited_mmp
    ans += 1 if item.limited_atk > 0 && atk < item.limited_atk
    ans += 1 if item.limited_def > 0 && @def < item.limited_def
    ans += 1 if item.limited_mat > 0 && mat < item.limited_mat
    ans += 1 if item.limited_mdf > 0 && mdf < item.limited_mdf
    ans += 1 if item.limited_agi > 0 && agi < item.limited_agi
    ans += 1 if item.limited_luk > 0 && luk < item.limited_luk
    ans += 1 if item.limited_gold > 0 && $game_party.gold < item.limited_gold
   
    ans += 1 if item.limited_level < 0 && @level > item.limited_level.abs
    ans += 1 if item.limited_mhp < 0 && mhp > item.limited_mhp.abs
    ans += 1 if item.limited_mmp < 0 && mmp > item.limited_mmp.abs
    ans += 1 if item.limited_atk < 0 && atk >item.limited_atk.abs
    ans += 1 if item.limited_def < 0 && @def > item.limited_def.abs
    ans += 1 if item.limited_mat < 0 && mat > item.limited_mat.abs
    ans += 1 if item.limited_mdf < 0 && mdf > item.limited_mdf.abs
    ans += 1 if item.limited_agi < 0 && agi > item.limited_agi.abs
    ans += 1 if item.limited_luk < 0 && luk > item.limited_luk.abs
    ans += 1 if item.limited_gold < 0 && $game_party.gold > item.limited_gold.abs
   
    item.limited_switch.each{ |id|
      ans += 1 if $game_switches[id] == false
    }
   
    item.limited_variable.each{ |id, var|
      ans += 1 if var > 0 && $game_variables[id] < var.abs
      ans += 1 if var < 0 && $game_variables[id] > var.abs
    }
   
    item.limited_item.each{ |id, var|
      obj = $data_items[id]
      ans += 1 if var > $game_party.item_number(obj)
    }
   
    return false if ans > 0
    return true if ans == 0
  end
 
end

#==============================================================================
# ■ Window_EquipItem
#------------------------------------------------------------------------------
#  장비 화면에서, 장비 변경의 후보가 되는 아이템의 일람을 표시하는 윈도우입니다.
#==============================================================================

class Window_EquipItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● 아이템을 허가 상태로 표시할지
  #--------------------------------------------------------------------------
  def enable?(item)
    return true if item == nil
    return @actor.limited?(item) if item.limited
    return true
  end
end

#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  액터를 취급하는 클래스입니다.이 클래스는 Game_Actors 클래스($game_actors)
# 의 내부에서 사용되어 Game_Party 클래스($game_party)로부터도 참조됩니다.
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 최강 장비
  #--------------------------------------------------------------------------
  def optimize_equipments
    clear_equipments
    equip_slots.size.times do |i|
      next if !equip_change_ok?(i)
      items = $game_party.equip_items.select do |item|
        item.etype_id == equip_slots[i] &&
        equippable?(item) && item.performance >= 0 &&
        limited?(item)
      end
      change_equip(i, items.max_by {|item| item.performance })
    end
  end
end

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

 

Who's 아이미르

?

허루쿠... 임용고시 공부해야되는데 이러고 있다....

 

알만툴의 중독성은 쩔어준다는;;;

  • ?
    거북이뒤집기 2012.09.04 11:39
    우왓 감사합니다 ㅋㅋ
    그런데 혹시 능력치제한을 한개말고 여러개로 설정 할 수 있나요??
    레벨 10이상 힘 30이상 일 경우 장착가능 .. 이런식으로요 ㅎㅎ
  • ?
    아이미르 2012.09.04 14:41
    여러개 해도 적용됩니다만 같은 종류를 사용하면 꼬일 수 있습니다

    예를 들어 레벨 2 이상 5 이하로 하고 싶다고
    LV +2
    LV -5
    이렇게 넣으면 -3이 되서 3이하일때로 적용됩니다. 이런 조건은 설정되어있지 않으니까 주의해주세요
  • ?
    시옷청룡 2012.12.30 22:21
    좋은 자료 감사합니다~
  • ?
    닉네임이없다능 2013.01.15 09:42
    에러났어요!!!
  • ?
    빼리쏭 2013.07.22 17:19
    잘되네요~ 감사합니다ㅎㅎ
  • ?
    DaySchool 2013.11.20 23:06

    648번째줄에서 오류가 나네요..

  • ?
    아방님 2013.11.28 18:01 Files첨부 (1)

    00a726f76b55fc3c627bdcafcd3437bd.png

    에러났어요! 해결좀요!

  • ?
    디트리히 2014.12.26 22:47
    맨마지막줄 ------------------ 앞에 # 붙이세요
    ex) #-------------------------------
    아마 625번줄이던가...
  • ?
    AltusZeon 2014.12.26 23:24
    오류내용을 봤을 때는 그 문제가 아니라,
    스크립트 상단의 IMIR_Limited 모듈을 복사 안 하신 것 같군요.
  • ?
    LK 2013.12.17 16:05
    감사합니다~
  • ?
    TiTle 2015.04.20 18:46
    이제와서 죄송하지만... 혹시 직업 제한도 넣을 수 있나요?