음.. 공부가 잘 안되면 여기 접속하는 아이미르입니다 ㅇㅅㅇ/
이번 작품은 장비 착용에 제한점을 설정하는 스크립트 입니다.
------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
사용법
무기나 방어구의 메모란에
<장착제한>
문구 +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
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------