ページ 1 / 1
【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい
Posted: 2021年2月19日(金) 16:20
by 庚の字
戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたいです。
▼以下 詳細です。
デフォルトの戦闘では、パーティーコマンド→アクターコマンド→スキルやアイテムの選択という流れになっていますが、パーティーコマンドとアクターコマンドの処理を飛ばし、最初からスキルリストが表示され、スキルが選択ができるような改変を行いました。
具体的に言うと
Scene_Battle内を以下のようにいじっています。
コード: 全て選択
#--------------------------------------------------------------------------
# ● アクターコマンド選択の開始
#--------------------------------------------------------------------------
def start_actor_command_selection
#~ @status_window.select(BattleManager.actor.index) #デフォ文コメントアウト
#~ @party_command_window.close #デフォ文コメントアウト
#~ @actor_command_window.setup(BattleManager.actor) #デフォ文コメントアウト
#--------------------------------------------------------------------------
# ▼ 改変
#--------------------------------------------------------------------------
@skill_window.actor = BattleManager.actor
@skill_window.stype_id = 1 #表示するスキルタイプID
@skill_window.refresh
@skill_window.show.activate
#--------------------------------------------------------------------------
# ▲ ここまで
#--------------------------------------------------------------------------
end
当然、「防御」や「逃げる」、「アイテム」といった、本来パーティーコマンドやアクターコマンドで選択できる項目も飛ばされるため、これらの項目はスキルで作成する必要があります。このうち「防御」、「逃げる」はデフォルトの機能で実装が可能でしたが、「アイテム」コマンドのみデフォルトではどうしようもなく、お力をお借りしたい次第です。
(なお、正確に言うと「逃げる」も、デフォルトの特殊効果にある「逃げる」はアクター単位での逃走になるので、コモンイベントを利用して逃走確率を条件分岐し、「戦闘の中断」でむりやり処理しています。正直使い勝手は良くないので、こちらもパーティーコマンド上の「逃げる」と同じ処理を呼び出せる方法があればそちらに切り替えたいです……)
なんとなく、メモ欄に<逃げる>、<アイテム>と記述のあるスキルを、それぞれ逃げるコマンドとアイテムコマンドとして認識する…みたいなことができるようにすればいいのかな…などと考えましたが、恥ずかしながら考えただけで技術は全く伴っていませんでした…
以上よろしくお願いいたします。
Re: 戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい
Posted: 2021年2月19日(金) 21:54
by 名無し蛙
どうもこんにちは。
スクリプト素材書くの久々なんですけどなんとなく気になったので書いてみました。
多分こんな感じですかね。
おっしゃる通り、<逃げる><アイテム>とタグ打ちしたスキルを利用するのが一番簡単でしょう。
と言っても処理順序を整理するのに思ったよりも再定義が嵩みましたが。
余談ですがdef on_skill_ok内で@skillという変数を宣言していますが
これはプリセットスクリプトが内包する細かいミスの一つですね。
このメソッド以外で使用する変数ではないので本来ならば@は付けない方が良いです。
著作権は放棄するのでご自由に改変してください。
あとアクターコマンドスキップから連想して一人パーティを前提に書いたのでもしも違うようなら教えてください。
コード: 全て選択
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ○ スキルウィンドウの作成
# :キャンセル処理の無効化
#--------------------------------------------------------------------------
def create_skill_window
@skill_window = Window_BattleSkill.new(@help_window, @info_viewport)
@skill_window.set_handler(:ok, method(:on_skill_ok))
end
#--------------------------------------------------------------------------
# ○ パーティコマンド選択の開始
# :パーティコマンドのスキップ
#--------------------------------------------------------------------------
def start_party_command_selection
unless scene_changing?
refresh_status
@status_window.unselect
@status_window.open
@item_mode = false
if BattleManager.input_start
next_command
start_actor_command_selection
else
@party_command_window.deactivate
turn_start
end
end
end
#--------------------------------------------------------------------------
# ○ アクターコマンド選択の開始
# :アクターコマンドのスキップ
#--------------------------------------------------------------------------
def start_actor_command_selection
@status_window.select(BattleManager.actor.index)
command_skill
end
#--------------------------------------------------------------------------
# ○ コマンド[スキル]
# skill_type1固定
#--------------------------------------------------------------------------
def command_skill
@skill_window.actor = BattleManager.actor
@skill_window.stype_id = 1
@skill_window.refresh
@skill_window.show.activate
end
#--------------------------------------------------------------------------
# ○ アクター[キャンセル]
#--------------------------------------------------------------------------
def on_actor_cancel
@actor_window.hide
unless @item_mode
@skill_window.activate
else
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ○ 敵キャラ[キャンセル]
#--------------------------------------------------------------------------
def on_enemy_cancel
@enemy_window.hide
unless @item_mode
@skill_window.activate
else
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ○ スキル[決定]
#--------------------------------------------------------------------------
def on_skill_ok
@skill = @skill_window.item
if @skill.note =~ /\<逃げる\>/
@skill_window.hide
command_escape
return
elsif @skill.note =~ /\<アイテム\>/
@skill_window.hide
command_item
@item_mode = true
return
end
BattleManager.actor.input.set_skill(@skill.id)
BattleManager.actor.last_skill.object = @skill
if !@skill.need_selection?
@skill_window.hide
next_command
elsif @skill.for_opponent?
select_enemy_selection
else
select_actor_selection
end
end
#--------------------------------------------------------------------------
# ○ アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.hide
@skill_window.show.activate
@item_mode = false
end
end
Re: 戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい
Posted: 2021年2月19日(金) 22:23
by 庚の字
名無し蛙さん
早速のご解答ありがとうございます!
実はこの記事を書いた後、「スキル選択後にキャンセルをするとフリーズしてしまう」等いろいろと問題があり、頭を抱えていたところでした…アイテム、逃げるの実装に加え、フリーズの問題も解決し、無事動作することを確認しました。本当に有難うございます!
また、一人パーティを前提としたもの、とのことでしたが
スキルタイプが1つに限定されている箇所でしょうか?
実際には多人数パーティなのですが、こちらは書いていただいたスクリプトを元に自力で改変できそうですので、こちらをそのまま利用させていただきます。
スクリプト知識がないまま、なんとなくこうだろうくらいのいじり方しかできなかったのでご指摘もとてもありがたいです。この度は本当に有難うございました!この返信をもって解決済みとさせていただきます。
Re: 【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい
Posted: 2021年2月19日(金) 23:39
by 名無し蛙
他にもスキルウィンドウのキャンセル処理を無効化したり
アクター(エネミー)選択ウィンドウをキャンセルした場合の復帰処理、等を簡略化していますね。
上のコードのまま例えば一人目が仲間にアイテムを選択し、
二人目がスキルを選択し、対象を選ぶ前にキャンセルをすると不具合が起こります。
後者は気付くのが難しいと思うのでちょっとその辺修正しておきましょうか。
個人的には先頭のアクターがスキルウィンドウをキャンセルすると
無意味にキャンセル音が鳴るのが気に入らなかったのですが多人数パーティを想定しているのならこちらの方が良いでしょう。
自分が想定した範囲の不具合は解消すると思います。
コード: 全て選択
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ○ パーティコマンド選択の開始
# :パーティコマンドのスキップ
#--------------------------------------------------------------------------
def start_party_command_selection
unless scene_changing?
refresh_status
@status_window.unselect
@status_window.open
if BattleManager.input_start
next_command
start_actor_command_selection
else
@party_command_window.deactivate
turn_start
end
end
end
#--------------------------------------------------------------------------
# ○ アクターコマンド選択の開始
# :アクターコマンドのスキップ
#--------------------------------------------------------------------------
def start_actor_command_selection
@status_window.select(BattleManager.actor.index)
command_skill
end
#--------------------------------------------------------------------------
# ○ コマンド[スキル]
# skill_type1固定
#--------------------------------------------------------------------------
def command_skill
@skill_window.actor = BattleManager.actor
@skill_window.stype_id = 1
@skill_window.refresh
@skill_window.show.activate
@item_mode = false
end
#--------------------------------------------------------------------------
# ○ アクター[キャンセル]
#--------------------------------------------------------------------------
def on_actor_cancel
@actor_window.hide
unless @item_mode
@skill_window.activate
else
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ○ 敵キャラ[キャンセル]
#--------------------------------------------------------------------------
def on_enemy_cancel
@enemy_window.hide
unless @item_mode
@skill_window.activate
else
@item_window.activate
end
end
#--------------------------------------------------------------------------
# ○ スキル[決定]
#--------------------------------------------------------------------------
def on_skill_ok
@skill = @skill_window.item
if @skill.note =~ /\<逃げる\>/
@skill_window.hide
command_escape
return
elsif @skill.note =~ /\<アイテム\>/
@skill_window.hide
command_item
@item_mode = true
return
end
BattleManager.actor.input.set_skill(@skill.id)
BattleManager.actor.last_skill.object = @skill
if !@skill.need_selection?
@skill_window.hide
next_command
elsif @skill.for_opponent?
select_enemy_selection
else
select_actor_selection
end
end
#--------------------------------------------------------------------------
# ○ スキル[キャンセル]
#--------------------------------------------------------------------------
def on_skill_cancel
prior_command
end
#--------------------------------------------------------------------------
# ○ アイテム[キャンセル]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.hide
@skill_window.show.activate
@item_mode = false
end
end
Re: 【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい
Posted: 2021年4月17日(土) 15:43
by 庚の字
すみません、解決後記事を確認しておらずすっかりお返事が遅れてしまいました。
追加対応までしていただき有難うございます。
>アクター(エネミー)選択ウィンドウをキャンセルした場合の復帰処理、等を簡略化していますね。
>上のコードのまま例えば一人目が仲間にアイテムを選択し、
>二人目がスキルを選択し、対象を選ぶ前にキャンセルをすると不具合が起こります。
こちら、後からそういうことかと気が付いたのですが、
実は当方の制作ではCTB制バトルを採用しておりまして、偶然にもこれらの状況が生じないため
全く気が付いておりませんでした……
後だしの情報となってしまったにも拘らず細かな点まで対応していただき恐縮です…!
先日作成していただいたスクリプトも現在の制作に活用させていただいております。
おかげさまで思い描いていた処理やシステムの構築が可能となりました。
また中身も見やすく、どの処理をどう書いているのかも勉強になり、大変助かっております。
重ねてになりますがこの度は本当に有難うございました!