先日、ザ・プラン9のDVDをコンプリートした。好きな順位としては、面白いと思う物から、「なゐ震る」>「見晴らしのええマンション」>「禁洒法」>「功夫ジョン」>「ウルグアイから来た男」とかそんな感じだろうか。最近買った「室内の人々」は、4人組になってからの本公演で一番好きだが、最近過ぎて、主観的にさえ公正な判断が出来かねるため、候補から外している。
あと磁石のDVDも、なんだかんだで全部買っている。一番面白いと思う芸人を2組挙げろと言われれば、やはりこの2組になるのかなぁ。
さて、画像で判るとおり、またしてもツクールの話題に移る。落とし穴を作ってみたのだ。以前も落とし穴くらい作っていたし、殆どのツクールユーザーが、落とし穴を作ってきたことだろう。ただ俺のは、無駄に難易度を上昇させるために、落下した際にダメージを受ける。全員が最大HPの数割程度のダメージだ。しかし、鬼畜過ぎるので、ダメージを軽減する装備も用意した。
Wind Messer様の、特徴追加ベーススクリプトを利用し、落下ダメージという特徴を作り、それをひきも記様の、アイテム詳細表示に対応させることにした。しかし、最初のダンジョンにHPダメージ有りの落とし穴と視界制限を設けるのは、やり過ぎた気がしている。何か別に、小さなダンジョンでも作ろうかと考えているが、まだスキルを1つも作っていないことも気にかかり、遅々として進まない。
でまぁ今回はフロアアイテムを作ってみた。フロアアイテムとは、アークザラッド2をバカみたいに遊んでいた人なら知っているだろう。倒した敵のアイテムドロップとは別に、地域ごとの戦利品を獲ることが可能なシステムだ。たとえば、スライムが5%程度の確率で薬草を落とすと仮定する。となれば、フィールドでスライムを倒せば、薬草が手に入る可能性がある。また、洞窟でスライムを倒しても、同じく薬草を手に入れられる。しかし、フロアアイテムが設定されていた場合、フィールドでは薬草しか落とさなかったスライムが、洞窟では薬草以外にエクスカリバーを落とす可能性も秘めている、といったもの。炎の剣で苦戦した人も多かったのでは?
Game_Troopの最下部に、フロアアイテムの判定処理を作る。Game_Enemyに作らないのは、敵ごとに判定しても意味がないため。また、一応確率を倒した敵数に依存させるためにも、Troop内がいいと思う。また、タグの関係上、大なり小なりの<>が全角文字になっているから注意。実際は半角で表記する。
#--------------------------------------------------------------------------
# ☆ フロアアイテムの配列作成
#--------------------------------------------------------------------------
def make_floor_items
return [] if dead_members.size <= rand(10)
case $game_map.map_id
when 20,21 ; a=[244,245,246,247,248,249]
item = $data_items[a[rand(a.size)]] ; return [item]
else
return []
end
end これは勿論、たとえばだが、俺の場合は敵の最大出現数を「パーティメンバーの数+2」に設定しているため、最大8匹となる。rand関数で0~9まで乱数が入るので、もし8匹倒して戦闘を終えた場合、9割がたフロアアイテムが入手できるという処理になる。入手できない場合は、空の配列「[]」を返すこと。nilや、何も返さないのではエラーになる。次のcase文では、現在のMapIDによって分岐させている。設定の無いマップでは、やはり空の配列を返す。たとえば上記スクリプトの場合、マップ20と21で戦闘に勝利した時、ID244~249のアイテムのいずれか1つが手に入るようになっている。武器や防具も含めた複雑な分岐にするのも、イベント感覚で分岐させればいいだけ。効率のいいコンパクトな書き方は、スクリプターではないため知らない。あとは、これを反映させるために、BattleManagerに次のスクリプトを入れ込むだけ。
#--------------------------------------------------------------------------
# ● ドロップアイテムの獲得と表示
#--------------------------------------------------------------------------
def self.gain_drop_items
$game_troop.make_drop_items.each do |item|
$game_party.gain_item(item, 1)
$game_message.add(sprintf(Vocab::ObtainItem, item.name))
end
$game_troop.make_floor_items.each do |item|
$game_party.gain_item(item, 1)
$game_message.add(sprintf(Vocab::ObtainItem, item.name))
end
wait_for_message
end
この場合だと、敵のドロップアイテムが落ちた後にフロアアイテムが表示されるが、プレイヤーに対して違和感は無いので、たぶん気付かない。あと、先の分岐をMapIDに依存させているが、敵グループ毎にさせたい場合は、「@troop_id」を使えば可能。
そういえば、脱出スクリプトに関して、各サイトのエスケープスクリプトを参考に、自分に都合のよいスクリプトにしてみた。DEEP SEASONS様のエスケープスクリプトを改変、というか殆ど削ぎ落としただけのようなものだ。
#--------------------------------------------------------------------------
# ○ 定数(エスケープ使用可能判定スイッチ)
#--------------------------------------------------------------------------
ESCAPE_SWITCH = 17
#--------------------------------------------------------------------------
# ○ 定数(エスケープで呼び出すコモンイベントID)
#--------------------------------------------------------------------------
ESCAPE_COMMON = 65
ESCAPE_SIGNATURE = "<ESCAPE>"
class Scene_ItemBase
alias dsesc_use_item use_item
#--------------------------------------------------------------------------
# ○ アイテムの使用(再定義)
#--------------------------------------------------------------------------
def use_item
dsesc_use_item
if item.note.include?("<ESCAPE>")
$game_temp.reserve_common_event(ESCAPE_COMMON)
SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
end
end
end
class Game_BattlerBase
alias dsesc_usable_item_conditions_met? usable_item_conditions_met?
#--------------------------------------------------------------------------
# ○ スキル/アイテムの共通使用可能条件チェック(再定義)
#--------------------------------------------------------------------------
def usable_item_conditions_met?(item)
if item.note.include?(ESCAPE_SIGNATURE) && $game_switches[ESCAPE_SWITCH] == false
false
else
dsesc_usable_item_conditions_met?(item)
end
end
end
htmlタグの関係上、<ESCAPE>だけ括弧が全角文字になっている点に注意。実際には、半角で表記している。このエスケープ処理の利点は、アイテム選択画面ではエスケープ可能なスイッチ(上記の冷では17)がOFF(false)の時には、アイテムが許可状態にならないため、使うことが出来ない。もしスイッチが入っていて、アイテムを使った場合、コモンイベントを呼び出す(上記の例では65番を呼ぶ)ため、実際の場所移動処理などは全てイベントで組む事が可能。つまり、特にツクール2000に慣れ親しんだユーザーライクな仕様である。特に俺の場合、場所移動の際に時間による色調変化処理と、天候変化処理を挟む必要があったため、スクリプト自体を極力簡略化した。また、コモンイベントのほうでエスケープ用のスイッチは切っておくといい。
処理の名前を変えていないのは、そのまま再配布に抵触するのかと小一時間考えてみたが、そこを変えてオリジナルっぽくなると、改変であることが朧気になるような気がした。しかし、エスケープなどに簡単に戦闘アニメを挟んだり、条件分岐を使った処理、または隊列メンバー集合からそれをイベントに置き換えて主人公を透明化、画面最上部まで主人公グラのイベントを高速移動させて効果音が途切れると共に移動完了、という処理を簡単に組むには、スクリプトでは荷が重すぎる。大体そんな感じ。
あと磁石のDVDも、なんだかんだで全部買っている。一番面白いと思う芸人を2組挙げろと言われれば、やはりこの2組になるのかなぁ。
さて、画像で判るとおり、またしてもツクールの話題に移る。落とし穴を作ってみたのだ。以前も落とし穴くらい作っていたし、殆どのツクールユーザーが、落とし穴を作ってきたことだろう。ただ俺のは、無駄に難易度を上昇させるために、落下した際にダメージを受ける。全員が最大HPの数割程度のダメージだ。しかし、鬼畜過ぎるので、ダメージを軽減する装備も用意した。
Wind Messer様の、特徴追加ベーススクリプトを利用し、落下ダメージという特徴を作り、それをひきも記様の、アイテム詳細表示に対応させることにした。しかし、最初のダンジョンにHPダメージ有りの落とし穴と視界制限を設けるのは、やり過ぎた気がしている。何か別に、小さなダンジョンでも作ろうかと考えているが、まだスキルを1つも作っていないことも気にかかり、遅々として進まない。
でまぁ今回はフロアアイテムを作ってみた。フロアアイテムとは、アークザラッド2をバカみたいに遊んでいた人なら知っているだろう。倒した敵のアイテムドロップとは別に、地域ごとの戦利品を獲ることが可能なシステムだ。たとえば、スライムが5%程度の確率で薬草を落とすと仮定する。となれば、フィールドでスライムを倒せば、薬草が手に入る可能性がある。また、洞窟でスライムを倒しても、同じく薬草を手に入れられる。しかし、フロアアイテムが設定されていた場合、フィールドでは薬草しか落とさなかったスライムが、洞窟では薬草以外にエクスカリバーを落とす可能性も秘めている、といったもの。炎の剣で苦戦した人も多かったのでは?
Game_Troopの最下部に、フロアアイテムの判定処理を作る。Game_Enemyに作らないのは、敵ごとに判定しても意味がないため。また、一応確率を倒した敵数に依存させるためにも、Troop内がいいと思う。また、タグの関係上、大なり小なりの<>が全角文字になっているから注意。実際は半角で表記する。
#--------------------------------------------------------------------------
# ☆ フロアアイテムの配列作成
#--------------------------------------------------------------------------
def make_floor_items
return [] if dead_members.size <= rand(10)
case $game_map.map_id
when 20,21 ; a=[244,245,246,247,248,249]
item = $data_items[a[rand(a.size)]] ; return [item]
else
return []
end
end これは勿論、たとえばだが、俺の場合は敵の最大出現数を「パーティメンバーの数+2」に設定しているため、最大8匹となる。rand関数で0~9まで乱数が入るので、もし8匹倒して戦闘を終えた場合、9割がたフロアアイテムが入手できるという処理になる。入手できない場合は、空の配列「[]」を返すこと。nilや、何も返さないのではエラーになる。次のcase文では、現在のMapIDによって分岐させている。設定の無いマップでは、やはり空の配列を返す。たとえば上記スクリプトの場合、マップ20と21で戦闘に勝利した時、ID244~249のアイテムのいずれか1つが手に入るようになっている。武器や防具も含めた複雑な分岐にするのも、イベント感覚で分岐させればいいだけ。効率のいいコンパクトな書き方は、スクリプターではないため知らない。あとは、これを反映させるために、BattleManagerに次のスクリプトを入れ込むだけ。
#--------------------------------------------------------------------------
# ● ドロップアイテムの獲得と表示
#--------------------------------------------------------------------------
def self.gain_drop_items
$game_troop.make_drop_items.each do |item|
$game_party.gain_item(item, 1)
$game_message.add(sprintf(Vocab::ObtainItem, item.name))
end
$game_troop.make_floor_items.each do |item|
$game_party.gain_item(item, 1)
$game_message.add(sprintf(Vocab::ObtainItem, item.name))
end
wait_for_message
end
この場合だと、敵のドロップアイテムが落ちた後にフロアアイテムが表示されるが、プレイヤーに対して違和感は無いので、たぶん気付かない。あと、先の分岐をMapIDに依存させているが、敵グループ毎にさせたい場合は、「@troop_id」を使えば可能。
そういえば、脱出スクリプトに関して、各サイトのエスケープスクリプトを参考に、自分に都合のよいスクリプトにしてみた。DEEP SEASONS様のエスケープスクリプトを改変、というか殆ど削ぎ落としただけのようなものだ。
#--------------------------------------------------------------------------
# ○ 定数(エスケープ使用可能判定スイッチ)
#--------------------------------------------------------------------------
ESCAPE_SWITCH = 17
#--------------------------------------------------------------------------
# ○ 定数(エスケープで呼び出すコモンイベントID)
#--------------------------------------------------------------------------
ESCAPE_COMMON = 65
ESCAPE_SIGNATURE = "<ESCAPE>"
class Scene_ItemBase
alias dsesc_use_item use_item
#--------------------------------------------------------------------------
# ○ アイテムの使用(再定義)
#--------------------------------------------------------------------------
def use_item
dsesc_use_item
if item.note.include?("<ESCAPE>")
$game_temp.reserve_common_event(ESCAPE_COMMON)
SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
end
end
end
class Game_BattlerBase
alias dsesc_usable_item_conditions_met? usable_item_conditions_met?
#--------------------------------------------------------------------------
# ○ スキル/アイテムの共通使用可能条件チェック(再定義)
#--------------------------------------------------------------------------
def usable_item_conditions_met?(item)
if item.note.include?(ESCAPE_SIGNATURE) && $game_switches[ESCAPE_SWITCH] == false
false
else
dsesc_usable_item_conditions_met?(item)
end
end
end
htmlタグの関係上、<ESCAPE>だけ括弧が全角文字になっている点に注意。実際には、半角で表記している。このエスケープ処理の利点は、アイテム選択画面ではエスケープ可能なスイッチ(上記の冷では17)がOFF(false)の時には、アイテムが許可状態にならないため、使うことが出来ない。もしスイッチが入っていて、アイテムを使った場合、コモンイベントを呼び出す(上記の例では65番を呼ぶ)ため、実際の場所移動処理などは全てイベントで組む事が可能。つまり、特にツクール2000に慣れ親しんだユーザーライクな仕様である。特に俺の場合、場所移動の際に時間による色調変化処理と、天候変化処理を挟む必要があったため、スクリプト自体を極力簡略化した。また、コモンイベントのほうでエスケープ用のスイッチは切っておくといい。
処理の名前を変えていないのは、そのまま再配布に抵触するのかと小一時間考えてみたが、そこを変えてオリジナルっぽくなると、改変であることが朧気になるような気がした。しかし、エスケープなどに簡単に戦闘アニメを挟んだり、条件分岐を使った処理、または隊列メンバー集合からそれをイベントに置き換えて主人公を透明化、画面最上部まで主人公グラのイベントを高速移動させて効果音が途切れると共に移動完了、という処理を簡単に組むには、スクリプトでは荷が重すぎる。大体そんな感じ。