忘れさせる技の選択
PHPポケモンでは技習得時に忘れさせる技の選択が出来ず、古いものから順番に消えていっていました。ですが、これでは主力技として使っているものが、覚えたくもない技に消されてしまうということが起こってしまいます。
実際のゲームでも、技を覚えようとした際に既に最大数の4枠が埋まっていれば、代わりに忘れさせる技を選ぶことができます。今回はその「忘れさせる技の選択」を実装していきましょう。
技習得時の分岐
まず、技習得時の分岐について考えてみましょう。
忘れさせる技を選択させる以上、強制的に技を置き換える処理は一旦中断させなければなりません。なので、技習得時の選択肢は以下の2つになります。
- 新しい技を覚えるのを諦める
- 現在覚えている技を指定して忘れさせる
新しい技を覚えるのを諦める
まずは処理が簡単な方から実装していきます。「新しい技を覚えるのを諦める」のは、現在の技構成から変更する必要がありません。なので、レスポンスに対して処理を行わなければ現在の技構成を維持することが可能です。
まずは、レベルアップ処理時の技習得処理に処理を加えていきましょう。
ポケモンクラスのチェック用トレイト(/App/Traits/Class/Pokemon/ClassPokemonCheckTrait.php)
/**
* 現在のレベルで覚えられる技があるか確認する処理
*
* @return void
*/
protected function checkMove()
{
// レベルアップして覚えられる技があれば習得する
$level_move_keys = array_keys(
array_column($this->level_move, 0),
$this->level
);
foreach($level_move_keys as $key){
$move_class = $this->level_move[$key][1];
// 覚えようとしている技(クラス)が存在かつ重複していないか
if(!in_array($move_class, array_column($this->move, 'class'), true)){
// インスタンス化
$move = new $move_class;
if(count($this->move) < 4){
/**
* 技が4つ未満なら即習得
*/
// 技クラスをセット
$this->setMove($move);
$this->setMessage($move->getName().'を覚えた!');
}else{
/**
* 技選択用モーダルの返却
*/
// メッセージIDを生成
$msg_id = $this->issueMsgId();
// レベルアップメッセージ
$this->setMessage($this->getNickName().'は'.$move->getName().'を覚えたい');
$this->setMessage('しかし技を4つ覚えるので精一杯だ');
$this->setMessage($move->getName().'の代わりに他の技を忘れさせますか?', $msg_id);
// レスポンスデータをセット
$this->setResponse([
'toggle' => 'modal',
'target' => '#'.$msg_id.'-modal',
'move' => $move_class
], $msg_id);
// モーダル用のレスポンスをセット
$this->setModal([
'id' => $msg_id,
'modal' => 'selectmove',
'move' => array_merge($this->getMove(), [[
'class' => $move,
'remaining' => $move->getPp(),
'correction' => 0,
]]),
]);
// 諦めメッセージを事前に用意しておく
$this->setMessage($this->getNickName().'は'.$move->getName().'を覚えるのを諦めた');
}
}
}
}
現在習得している技が4つ未満であれば、今まで通りの処理です。もし4つ以上だった場合は強制的に書き換えるのではなく、確認メッセージを返却するようにしています。
モーダルのパラメータ(move)には、現在覚えている技と、新しく覚えようとしている技を配列で返却しています。この時点では覚えている技は変わっておらず、あくまで新しい技はレスポンス(モーダル)に追加しただけになります。
また、諦めメッセージについてですが、こちらは技習得段階で用意しておきましょう。諦めるという選択をした際にJavaScriptで追加するよりも処理が簡単で、もし諦めなかった場合はその時点でフォームの送信が発生するためメッセージはそのまま破棄することができるからです。
次に、返却されたモーダルの作成です。
忘れさせる技の選択モーダル(/Resources/Partials/Battle/Modals/selectmove.php)
<!-- Modal -->
<div class="modal fade" id="<?=$modal['id']?>-modal" tabindex="-1" role="dialog" aria-labelledby="<?=$modal['id']?>-modal-title" aria-hidden="true" data-keyboard="false" data-backdrop="static">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="<?=$modal['id']?>-title">忘れさせる技を選ぶ</h5>
</div>
<div class="modal-body">
<?php # 覚えている技 ?>
<table class="table table-bordered table-sm table-hover">
<thead class="thead-light">
<tr>
<th scope="col">覚えている技</th>
<th scope="col">タイプ</th>
<th scope="col">PP</th>
</tr>
</thead>
<tbody>
<?php foreach($modal['move'] as $key => $move): ?>
<tr class="move-detail-link forget-selectmove <?php if($key === 4) echo 'active new-move'; ?>"
data-target="#<?=$modal['id']?>_<?=get_class($move['class'])?>-content"
data-name="<?=$move['class']->getName()?>"
data-num="<?=$key?>">
<th scope="row" class="w-50"><?=$move['class']->getName()?></th>
<td><?=$move['class']->getType()->getName()?></td>
<td><?=$move['remaining']?>/<?=$move['class']->getPp($move['correction'])?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php # 技説明 ?>
<div class="overflow-auto p-3 border" style="height:160px;">
<?php foreach($modal['move'] as $key => $move): ?>
<div class="move-detail-content <?php if($key === 4) echo 'active'; ?>" id="<?=$modal['id']?>_<?=get_class($move['class'])?>-content">
<h6><?=$move['class']->getName()?></h6>
<hr>
<p><?=$move['class']->getDescription()?></p>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="modal-footer">
<button type="button"
class="btn btn-danger btn-sm"
id="btn-forget-move"
data-msg_id="<?=$modal['id']?>"
style="display:none;">
<span class="move-name"></span>を忘れる</button>
<button type="button" class="btn btn-secondary btn-sm action-message-box" id="btn-abandon-move" data-dismiss="modal">
<?=$modal['move'][4]['class']->getName()?>を諦める
</button>
</div>
</div>
</div>
</div>
ホーム画面用の技詳細と同じテーブルを使用しました。忘れさせる手順は、テーブルから技を選択して、決定ボタンを押すという流れです。技を忘れさせる場合は別のボタンを用意し、モーダルを閉じるだけの処理を行います。
もし「忘れさせる」ボタンを押せば、そこで必要データをPOSTして処理を行います。諦める場合は、そのままモーダルを閉じることで、事前に用意した諦めメッセージが表示されます。
それでは、技習得時の流れを確認してみましょう。
問題なくモーダルが表示されました。技選択を諦める場合はモーダルをそのまま閉じて処理を進行させているだけなので、レベルアップ後のステータス表示処理とさほど変わりませんね。
これで、技選択の分岐1が完成です。
まとめ
いかがだったでしょうか。
今回のPHPポケモンは「技を忘れさせる(諦める)」の処理作成についてご紹介しました。
いろんな処理を作成しましたが、処理途中で分岐が入るのがWEBプログラミング(PHP)にとってはそこそこ厄介だということが、後編を見ればわかるはずです。ですが、実現できないわけではありません。
それでは、後編を乞うご期待ください。