#==============================================================================
# 「アクター・キーワード・システム」(ACE) ver2.2 by奈々
#
# ◇使用規約
# 使用される場合はスクリプト作成者として「奈々」を明記して下さい。
# このスクリプトを改変したり、改変したものを配布するなどは自由ですが
# その場合も元のスクリプトの作成者として名前は載せて下さい。
#
#------------------------------------------------------------------------------
#
# アクター毎に「キーワード」を付けることができます。
# キーワードはそれ単体ではゲームに何も影響を与えませんが
# イベントコマンドで判定ができるので幅広い応用が可能です。
#
# ・キーワードの追加と削除
# イベントコマンドの「スクリプト」に書く。
# nak_add(ID, "○○"):ID番のアクターに「○○」というキーワードを追加
# nak_add_p(No, "○○"):No番のパーティメンバーにキーワードを追加
# nak_add_all("○○"):アクター全員に「○○」というキーワードを追加
#
# nak_remove(ID, "○○"):ID番のアクターから「○○」のキーワードを削除
# nak_remove_p(No, "○○"):No番のパーティメンバーからキーワードを削除
# nak_remove_all("○○"):アクター全員から「○○」のキーワードを削除
#
# nak_reset(ID):ID番のアクターのキーワードを全て削除
# nak_reset_p(No):No番のパーティメンバーのキーワードを全て削除
# nak_reset_all:アクター全員のキーワードを全て削除
#
# ・初期キーワードの追加
# データベースのアクター・職業のメモ欄に書く。
# <初期キーワード "○○">:ゲーム開始時に「○○」というキーワードを追加
#
# ・常時キーワードの追加
# データベースのアクター・職業・武器・防具・ステートに書く。
# <常時キーワード "○○">:アクターに「○○」というキーワードを付与
# *常時キーワードはコマンドで削除することはできない。
# *装備中はキーワードが付与され、装備を外すとキーワードも消える。
#
# ・キーワードの判定
# イベントコマンドの条件分岐「スクリプト」に書く。
# nak_check(ID, "○○"):ID番のアクターに「○○」というキーワードがあるか
# nak_check_p(No, "○○"):No番のパーティメンバーにキーワードがあるか
# nak_check_pa("○○"):パーティメンバーの誰かがキーワードを持っているか
# これらはコマンドの頭に!をつけると、そのキーワードがないか、という条件になり
# また&&(and)や||(or)で繋げることで複数の条件をまとめることも可能。
#
# ・キーワード判定+ID取得
# イベントコマンドの「スクリプト」に書く。
# XX番の変数に「キーワードを持つアクターのID」を代入するコマンド
# nak_who(XX, "○○"):アクターリストから検索する(ID順)
# nak_who_p(XX, "○○"):パーティメンバーから検索する(隊列順)
#
# 「○○」を持つアクターがいなかった場合は0が代入される。
# 通常は検索して最初にヒットした候補のIDが代入されるが
# nak_who(XX, "○○", 2)やnak_who_p(XX, "○○", 3)のように
# 3つ目の引数を設定することで1番目以外の候補を探すこともできる。
#
# ・一部合致コマンド
# nak_remove2(ID, "○○"):ID番のアクターから「○○」を含むキーワードを全て削除
# nak_remove2_p(No, "○○"):No番のパーティメンバーからキーワードを全て削除
# nak_remove2_all("○○"):アクター全員から「○○」を含むキーワードを全て削除
#
# nak_check(ID, "○○"):ID番のアクターに「○○」を含むキーワードがあるか
# nak_check_p(No, "○○"):No番のパーティメンバーにキーワードがあるか
# nak_check_pa("○○"):パーティメンバーの誰かがキーワードを持っているか
#
# ・備考
# キーワードは文字列であり、ユーザーが自由に追加することができます。
# アクター1人につき、何個でもキーワードを保持できますが
# 同じ名前のキーワードは1つに纏められます。複数追加する意味はありません。
# スクリプトコマンドに「p $game_actors[ID].nana_actor_keyword」と入れることで
# ID番のアクターのキーワード一覧をコンソールに表示できます。確認用にどうぞ。
# キーワードの具体的な使用例はブログをご覧下さい。
#
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ● アクターキーワード(常時)
#--------------------------------------------------------------------------
def actor_keyword_a
list = []
@note.scan(/<常時キーワード\s?"(.*)"\s?>/) {|s| list.push($1.to_s) if $1}
return list
end
#--------------------------------------------------------------------------
# ● アクターキーワード(初期)
#--------------------------------------------------------------------------
def actor_keyword_f
list = []
@note.scan(/<初期キーワード\s?"(.*)"\s?>/) {|s| list.push($1.to_s) if $1}
return list
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :actor_keyword_t # アクターキーワード(一時)
#--------------------------------------------------------------------------
# ○ セットアップ(エイリアス再定義)
#--------------------------------------------------------------------------
alias nak_setup setup
def setup(actor_id)
nak_setup(actor_id)
set_nak_f
end
#--------------------------------------------------------------------------
# ● アクターの初期キーワードをセット
#--------------------------------------------------------------------------
def set_nak_f
@actor_keyword_t = []
list = self.actor.actor_keyword_f
list |= self.class.actor_keyword_f
@actor_keyword_t |= list
end
#--------------------------------------------------------------------------
# ● アクターキーワードの参照
#--------------------------------------------------------------------------
def nana_actor_keyword
list = @actor_keyword_t
list |= self.actor.actor_keyword_a
list |= self.class.actor_keyword_a
self.equips.each do |equip|
next unless equip
list |= equip.actor_keyword_a
end
self.states.each do |state|
list |= state.actor_keyword_a
end
return list
end
end
class Game_Interpreter
#--------------------------------------------------------------------------
# ● アクターキーワードの追加
#--------------------------------------------------------------------------
def nak_add(actor, keyword)
t = [keyword]
$game_actors[actor].actor_keyword_t |= t if $game_actors[actor]
end
#--------------------------------------------------------------------------
# ● アクターキーワードの追加(パーティ)
#--------------------------------------------------------------------------
def nak_add_p(actor, keyword)
t = [keyword]
$game_party.members[actor].actor_keyword_t |= t if $game_party.members[actor]
end
#--------------------------------------------------------------------------
# ● アクターキーワードの追加(全員)
#--------------------------------------------------------------------------
def nak_add_all(keyword)
t = [keyword]
for actor in 1...$data_actors.size
$game_actors[actor].actor_keyword_t |= t
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除
#--------------------------------------------------------------------------
def nak_remove(actor, keyword)
t = [keyword]
$game_actors[actor].actor_keyword_t -= t if $game_actors[actor]
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除(パーティ)
#--------------------------------------------------------------------------
def nak_remove_p(actor, keyword)
t = [keyword]
$game_party.members[actor].actor_keyword_t -= t if $game_party.members[actor]
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除(全員)
#--------------------------------------------------------------------------
def nak_remove_all(keyword)
t = [keyword]
for actor in 1...$data_actors.size
$game_actors[actor].actor_keyword_t -= t
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除(一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_remove2(actor, keyword)
$game_actors[actor].actor_keyword_t.delete_if{|key|
key.include?(keyword)
}
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除(パーティ、一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_remove2_p(actor, keyword)
$game_party.members[actor].actor_keyword_t.delete_if{|key|
key.include?(keyword)
}
end
#--------------------------------------------------------------------------
# ● アクターキーワードの削除(全員、一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_remove2_all(keyword)
for actor in 1...$data_actors.size
$game_actors[actor].actor_keyword_t.delete_if{|key|
key.include?(keyword)
}
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードのリセット
#--------------------------------------------------------------------------
def nak_reset(actor)
$game_actors[actor].actor_keyword_t = []
end
#--------------------------------------------------------------------------
# ● アクターキーワードのリセット(パーティ)
#--------------------------------------------------------------------------
def nak_reset_p(actor)
$game_party.members[actor].actor_keyword_t = []
end
#--------------------------------------------------------------------------
# ● アクターキーワードのリセット(全員)
#--------------------------------------------------------------------------
def nak_reset_all
for actor in 1...$data_actors.size
$game_actors[actor].actor_keyword_t = []
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定
#--------------------------------------------------------------------------
def nak_check(actor, keyword)
if $game_actors[actor]
return $game_actors[actor].nana_actor_keyword.include?(keyword)
else
return false
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定(パーティ)
#--------------------------------------------------------------------------
def nak_check_p(actor, keyword)
if $game_party.members[actor]
return $game_party.members[actor].nana_actor_keyword.include?(keyword)
else
return false
end
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定(パーティ全体)
#--------------------------------------------------------------------------
def nak_check_pa(keyword)
$game_party.members.each{|member|
return true if member.nana_actor_keyword.include?(keyword)
}
return false
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定(一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_check2(actor, keyword)
if $game_actors[actor]
$game_actors[actor].nana_actor_keyword.each{|key|
return true if key.include?(keyword)
}
end
return false
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定(パーティ、一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_check2_p(actor, keyword)
if $game_party.members[actor]
$game_party.members[actor].nana_actor_keyword.each{|key|
return true if key.include?(keyword)
}
end
return false
end
#--------------------------------------------------------------------------
# ● アクターキーワードの判定(パーティ全体、一部合致、アドバンスド)
#--------------------------------------------------------------------------
def nak_check2_pa(keyword)
$game_party.members.each{|member|
member.nana_actor_keyword.each{|key|
return true if key.include?(keyword)
}
}
return false
end
#--------------------------------------------------------------------------
# ● キーワード所持アクターのID特定
#--------------------------------------------------------------------------
def nak_who(val, keyword, number = 1)
number = 1 if number < 1
temp = 0
for actor in 1...$data_actors.size
if $game_actors[actor].nana_actor_keyword.include?(keyword)
temp = actor.id
number -= 1
if number == 0
$game_variables[val] = temp
return
end
end
end
$game_variables[val] = temp
end
#--------------------------------------------------------------------------
# ● キーワード所持アクターのID特定(パーティ)
#--------------------------------------------------------------------------
def nak_who_p(val, keyword, number = 1)
number = 1 if number < 1
temp = 0
$game_party.members.each{|member|
if member.nana_actor_keyword.include?(keyword)
temp = member.id
number -= 1
if number == 0
$game_variables[val] = temp
return
end
end
}
$game_variables[val] = temp
end
end