わざマシンによる技習得
前回、わざマシンのアイテムクラスを作成したので、今回は実際に使用するまでの処理を作成していきます。
まずは、アイテムクラスに使用時の処理(effectsメソッド)を増設しましょう。
わざマシン01(/Classes/Item/ItemTM01.php)
<?php
require_once(root_path('Classes').'Item.php');
/**
* わざマシン01
*/
class ItemTM01 extends Item
{
/**
* 正式名称
* @var string
*/
public const NAME = 'わざマシン01';
/**
* 説明文
* @var string
*/
public const DESCRIPTION = '';
/**
* カテゴリ
* @var string::general|health|ball|important|machine
*/
public const CATEGORY = 'machine';
/**
* 技(わざマシンのみ)
* @var string
*/
public const MOVE = 'MoveMegaPunch';
/**
* 最大所有数
* @var integer
*/
public const MAX = 1;
/**
* 買値
* @var integer
*/
public const BID_PRICE = 3000;
/**
* 売値
* @var integer
*/
public const SELL_PRICE = 1500;
/**
* 対象
* @var string::friend|enemy|player|friend_battle
*/
public const TARGET = 'friend';
/**
* 使用できるタイミング
* @var array
*/
public const TIMING = ['home'];
/**
* 使用できるポケモン
* @var string
*/
public const POKEMON = 'tm.MoveMegaPunch';
/**
* アイテム効果
* @return object:Pokemon
*/
public static function effects(Pokemon $pokemon)
{
// 使用不可
if(!in_array(get_class($pokemon), static::getUsePokemon(), true)){
return [
'message' => $pokemon->getNickname().'は、'.static::NAME.'との相性が悪かった',
'result' => false,
];
}
// 技を覚えさせる
return [
'result' => $pokemon->isLearnMachineMove(get_class()),
];
}
}
引数で使用するポケモンを受け取り、対象ポケモンのリストに入っているかどうかをチェックしています。
もしリスト内に存在していなければ失敗、存在していればポケモンクラスのわざマシンによる習得メソッドを呼び出しています。この流れは全わざマシン共通となるので、わざマシン専用のメソッドを親クラスに用意しても良さそうです。
技マシンとの相性判定
では、技を習得させるためのisLearnMachineMoveメソッドを見てみましょう。
ポケモン用確認関係トレイト(/App/Traits/Class/Pokemon/ClassPokemonIsTrait.php)
<?php
trait ClassPokemonIsTrait
{
/**
* 現在のレベルで覚えられる技があるか確認する処理
* @return void
*/
public function isLevelMove()
{
// レベルアップして覚えられる技があれば習得する
$level_move_keys = array_keys(
array_column(static::LEVEL_MOVE, 0),
$this->level
);
foreach($level_move_keys as $key){
$move = static::LEVEL_MOVE[$key][1];
// 技習得処理
$this->actionLearnMove($move);
}
}
/**
* 技マシンで覚えられるかどうかの確認処理
* @param item:string
* @return boolean
*/
public function isLearnMachineMove(string $item): bool
{
// アイテムクラスの存在チェック
if(
!class_exists($item) ||
$item::CATEGORY !== 'machine' ||
!defined($item.'::MOVE') ||
!class_exists($item::MOVE)
){
return false;
}
// 技の習得処理
return $this->actionLearnMove($item::MOVE);
}
使用されたわざマシンが、本当に使えるかものかどうかを厳格にチェックして、もし不正なものであればfalse、有効なものであれば更に技習得メソッドへとつなぎました。
習得処理の呼び出し
技の習得処理は、isLevelMoveメソッドの中で行なっていた処理と同じになるため、処理を共通化させました。既存の処理をうまく活用しながら、機能拡張をしていきます。
ポケモン用アクション関係トレイト(/App/Traits/Class/Pokemon/ClassPokemonActionTrait.php)
<?php
trait ClassPokemonActionTrait
{
/**
* 技習得処理
* @param move:string
* @return boolean
*/
protected function actionLearnMove(string $move): bool
{
// 覚えようとしている技(クラス)が存在かつ重複していないか
if(in_array($move, array_column($this->move, 'class'), true)){
response()->setMessage($this->getNickname().'は、既に'.$move::NAME.'を覚えています');
// 失敗
return false;
}
// 習得処理
if(count($this->move) < 4){
/**
* 技が4つ未満なら即習得
*/
// 技クラスをセット
$this->setMove($move);
response()->setMessage($this->getNickname().'は、新しく'.$move::NAME.'を覚えた!');
}else{
/**
* 技選択用モーダルの返却
*/
// メッセージIDを生成
$msg_id = response()->issueMsgId();
// レベルアップメッセージ
response()->setMessage($this->getNickname().'は、'.$move::NAME.'を覚えたい');
response()->setMessage('しかし、技を4つ覚えるので精一杯だ');
response()->setMessage($move::NAME.'の代わりに、他の技を忘れさせますか?', $msg_id);
// レスポンスデータをセット
response()->setResponse([
'toggle' => 'modal',
'target' => '#'.$msg_id.'-modal',
'move' => $move,
'pokemon_id' => $this->id
], $msg_id);
// モーダル用のレスポンスをセット
response()->setModal([
'id' => $msg_id,
'modal' => 'acquire-move',
'new_move' => $move,
'pokemon_id' => $this->id
]);
// 諦めメッセージを事前に用意しておく
response()->setMessage($this->getNickname().'は、'.$move::NAME.'を覚えるのを諦めた');
}
// 成功(確認状態も成功とみなす)
return true;
}
}
現在習得している技の中にあればfalse、覚えている技が4未満であれば新規に習得、既に4つ覚えていれば確認という3つの分岐を行なっています。
技習得チェックを通過すれば、trueを返しているため、そのまま返り値をアイテムクラスへ返却することで、アイテムの使用判定まで一貫することができます。
メッセージボックスの共通化
技習得の処理自体は呼び出せるようになったので、フロント画面の操作パネル(メッセージボックス)がホーム画面でも使用できるように共通化しましょう。
バトル画面専用、進化画面専用のパーツや不要なものもあるので、これらはgetPageName関数を使って判定しながら作成します。
メッセージボックス(/Resources/Partials/Common/message-box.php)
<?php # data-controlsはバトル画面で不要 ?>
<div class="message-box border p-3" <?php if(getPageName() !== 'battle'): ?> data-controls="message-box" <?php endif; ?>>
<?php # メッセージエリア ?>
<?php foreach(response()->messages() as $key => list($msg, $status, $auto)): ?>
<?php $class = $key === response()->getMessageFirstKey() ? 'active' : ''; ?>
<?php $last_class = $key === response()->getMessageLastKey() ? 'last-message' : ''; ?>
<p class="result-message <?=$class?> <?=$last_class?> <?=$status ?? ''?>"
data-action='<?=response()->responses()[$status]['action'] ?? ''?>'
data-target='<?=response()->responses()[$status]['target'] ?? ''?>'
data-param='<?=response()->responses()[$status]['param'] ?? ''?>'
data-toggle='<?=response()->responses()[$status]['toggle'] ?? ''?>'
data-auto='<?=$auto ?? ''?>'>
<?=$msg?>
</p>
<?php endforeach; ?>
<i class="fas fa-hand-point-up fa-2x message-scroll-icon text-php-dark m-1"></i>
<?php if(getPageName() === 'evolve'): ?>
<button type="button" id="cancel-evolve" class="btn btn-sm btn-danger d-soft-none">
進化させない
</button>
<?php endif; ?>
</div>
では実際に、わざマシン01を使用してみましょう。
ピカチュウがわざマシン01によってメガトンパンチを習得することができましたね。これで、技の習得処理は完成です。
まとめ
いかがだったでしょうか。
今回のPHPポケモンでは「わざマシンを使った技習得」の実装方法をご紹介しました。
プログラミングやゲームづくりに興味がある人は、ぜひ参考にしてみてくださいね。