
# ライブラリ「TETRAZ.排他理論」 ver.1.02 (Since 2005/11/20)
# by Tetra-Z
#
# ライブラリとか言っている割に非常にわかりづらい仕様ですが、
# 「とある配列(object)に、同時に存在させたくない組み合わせ」を設定する時に用います。
#
# 併用必須 : Tetra-Z作「TETRAZ.配列操作」
#------------------------------------------------------------------------------
# ★メゾット : TetraZ_Exclusive.follow_exclusive?(object, judge_array)
#
# judge_arrayに下記のように配列を返すメゾットを入れます。
#
# def judge_array
# array = []
# array.push([配列A中のobject保持許可数, [配列A], 配列B中のobject保持許可数, [配列B], ……, object配列所属許可数])
# :
# :
# (複数並べれば、多数設定可能)
# :
# :
# return array
# end
#
# 配列*中のobject保持許可数 : 配列*の中で、objectに保持を許可する数。
# object配列所属許可数 : objectに所属を許可する配列種数。
# 配列内に1つでも共通する要素があれば、
# 所属しているとみなされます。
#
# 配列*中のobject保持許可数, object配列所属許可数は省略可能。省略すると、
# 前者を省略すると不問扱い、後者を省略すると「1」扱いになります。また、
# array.push([項目A, 項目B, 項目C, ……])
# とすると、objectが保持を許可されるのは項目A, 項目B, 項目C, ……のうち
# 1つのみとなります。
#
# 以上の条件に適合している時にtrue、そうでない時にfalseを返します。
#------------------------------------------------------------------------------
# 例1 :
#
# object = [1, 3, 4, 6, 8]
#
# def judge_array
# array = []
# array.push[2, [1, 2, 3], 2, [7, 8, 9], 1, [5, 10], 2]
# ^^^^^^^^^^^^a ^^^^^^^^^^^^b ^^^^^^^^^^c d
# return array
# end
#
# a : 「1, 2, 3のうち、所持を許可するのは2つまで」
# objectが所持しているのは1, 3の2つなのでOK
# b : 「7, 8, 9のうち、所持を許可するのは2つまで」
# objectが所持しているのは8の1つだけなのでOK
# c : 「5, 10のうち、所持を許可するのは1つまで」
# objectが所持しているのは1つもないのでOK
# d : ここまでの配列で所属を許可するのは2つまで
# objectが所属しているのはa,bの2配列なのでOK
#
# 結果 : TetraZ_Exclusive.follow_exclusive?(object, judge_array) → true
#------------------------------------------------------------------------------
# 例2 : XMS.「セレクトスキル」拡張子「排他セレクトスキル」
#
# TetraZ_Exclusive.follow_exclusive?(after, exclusive_skills_array)
# # after : 仮想上の変更後セレクトスキル
#
# def exclusive_skills_array
# array = []
# array.push[[7, 8, 9], [10, 11, 12]]
# return array
# end
#
# ID 7〜9(ファイア系)とID 10〜12(アイス系)は、
# 同時にセレクトスキルに設定できない(排他である)ことを示しています。
#------------------------------------------------------------------------------
# ver.1.00(2005/11/20)
# 公開
# ver.1.01(2005/11/21)
# 修正、重複を加味するように(要:「TETRAZ.配列操作」)
# ver.1.02(2005/11/23)
# 配列*中のobject保持許可数の動作を修正
#==============================================================================
# TETRAZ_Exclusive
#==============================================================================
module TETRAZ_Exclusive
#--------------------------------------------------------------------------
# ● 排他理論に従っているか?
# object : 判断対象
# judge_array : 排他理論配列
#--------------------------------------------------------------------------
def self.follow_exclusive?(object, judge_array)
for judge in judge_array.dup
if (judge.size >= 2 and !(judge[0].is_a?(Array)) and !(judge[1].is_a?(Array)))
add = object.array_and_repeat(judge)
return false if add.size > 1
next
end
can_inclusion = judge[-1].is_a?(Array) ? 1 : judge[-1]
judge.pop if !(judge[-1].is_a?(Array))
i = 0
loop do
break if i >= judge.size
if !(judge[i].is_a?(Array))
able_number = judge[i]
i += 1
else
able_number = judge[i].size
end
add = object.array_and_repeat(judge[i])
return false if add.size > able_number
can_inclusion -= 1 if !(add.empty?)
return false if can_inclusion < 0
i += 1
end
end
return true
end
end