忘れさせる技の選択
わざマシンによる技習得処理を作成しましたが、既に覚えている技が4つあると、モーダルが表示されて選択をしても習得することができません。これは、技習得用のサービスがホーム画面には用意されていないからです。
なので今回は、わざマシンを使った際の技の入れ替え処理を実装していきましょう。
サービスの作成
では、技習得用のサービスを作成していきましょう。こちらはバトル画面や進化画面で使っている「LearmMoveService.php」とほとんど同じ内容になります。
技習得用サービス(/App/Services/Home/LearnMoveService.php)
<?php
// 親クラス
require_once(app_path('Services').'Service.php');
/**
* 技の習得処理
*/
class LearnMoveService extends Service
{
/**
* @var array
*/
protected $before_responses;
protected $before_messages;
protected $before_modals;
/**
* @param integer
* @param before_response:array
* @param before_messages:array
* @param before_modals:array
* @return void
*/
public function __construct($before_responses, $before_messages, $before_modals)
{
$this->before_responses = unserializeObject($before_responses);
$this->before_messages = $before_messages;
$this->before_modals = unserializeObject($before_modals);
}
/**
* @return void
*/
public function execute()
{
// 技の置き換え
$this->replaceMove();
// レスポンスの引き継ぎ
response()->setResponse(
$this->getUntreatedResponses($this->before_responses)
);
// メッセージの引き継ぎ
response()->setMessage(
$this->getUntreatedResponses($this->before_messages, 'message')
);
// モーダルの引き継ぎ
response()->setModal(
$this->getUntreatedResponses($this->before_modals, 'modal'), true
);
}
/**
* 技の置き換え
* @return void
*/
private function replaceMove()
{
// 技を習得する対象のポケモンのIDを旧レスポンスから取得
$pokemon = player()->getPartner(
$this->before_responses[request('param.id')]['pokemon_id'], 'id'
);
// 忘れる技を取得
$forget_move = $pokemon->getMove(request('param.forget'))['class'];
// 覚えさせる技を旧レスポンスから取得
$new_move = $this->before_responses[request('param.id')]['move'];
// 技を覚えさせる
$pokemon->setMove($new_move, request('param.forget'));
// メッセージの返却
response()->setMessage('1 2の ……ポカン!');
response()->setMessage($pokemon->getNickname().'は、'.$forget_move::NAME.'の使い方をキレイに忘れた!そして......');
response()->setMessage($pokemon->getNickname().'は新しく、'.$new_move::NAME.'を覚えた!');
}
/**
* 未処理レスポンス・メッセージ・モーダルの引き継ぎ処理
* @param response:array
* @param param:string::response|message|modal
* @return array
*/
private function getUntreatedResponses(array $responses, string $param='response'): array
{
$cnt = 1;
switch ($param) {
/********
* メッセージの引き継ぎ
*/
case 'message':
$key = array_search(
request('param.id'),
array_column($responses, 1), # メッセージIDの位置は1番目
true
);
// 対象メッセージを含め3つ目までを削除
$cnt = 3;
break;
/********
* モーダルの引き継ぎ
*/
case 'modal':
$key = array_search(
request('param.id'),
array_column($responses, 0), # メッセージIDの位置は0番目
true
);
break;
/********
* レスポンスの引き継ぎ
*/
default:
// メッセージIDのレスポンスが入った位置を取得
$key = array_search(
request('param.id'),
array_keys($responses),
true
);
break;
}
// 未処理だけを切り出して返却
return array_splice($responses, $key + $cnt);
}
}
内容はほぼ同じですが、新しくファイルを作成しました。サービスはコントローラーから分岐後の処理の根幹になるため、別コントローラー上では共通化をせずに作成しています。
ただ、処理によっては共通化できるものがあるので、それらは必要に応じてトレイトを作成してひとまとめにすると、管理が楽になります。
ホーム画面ではポケモンの描画処理が必要ないため、現在のポケモンは特定する必要がありません。
では、技習得サービスへ分岐させるための分岐を、ホームコントローラーに追加しましょう。
ホームコントローラー(/App/Controllers/Home/HomeController.php)
// ブランチメソッド内
/******************************************
* 技の習得
*/
case 'learn_move':
// サービス実行
$service = new LearnMoveService(
$_SESSION['__data']['before_responses'],
$_SESSION['__data']['before_messages'],
$_SESSION['__data']['before_modals']
);
$service->execute();
break;
習得技とポケモン情報の取得
技を習得させるポケモンや、忘れさせる技を特定するためには、post値を使用せずに旧レスポンスから値を取り出して使用しています。
こうすることで、ノードを直接変更して「フシギダネ」に「メガトンパンチ」などを覚えさせるなどの状態を回避しています。
では実際に作成したサービスを使って、技を4つ習得しているポケモンにわざマシンを使用してみましょう。
無事技の置き換えができましたね。
これでわざマシンの一連の流れが完成しました。
まとめ
いかがだったでしょうか。
今回のPHPポケモンでは「わざマシンによる技選択」の方法についてご紹介しました。
プログラミングに興味がある方は、ぜひ参考にしてみてくださいね。