戦闘用アイテムとは
バトル中に使用できるアイテムはいくつかありますが、その中でも「バトル専用」のアイテムがあります。それが戦闘用アイテムであり、主にドーピングと呼ばれるものです。
アイテムカテゴリとして、プレイヤー対象(スプレーなど)、敵ポケモン対象(ボール類)、味方対象(キズぐすり)の3つに分類していましたが、今回実装するものは「戦闘中のポケモン」を対象にするものです。
プラスパワー
実装するアイテムは、初代からも人気が高い「プラスパワー」です。
プラスパワー(ポケモンwiki)
初代から第6世代までは「こうげき」のランクが1段階上昇というアイテムでしたが、第7世代より2段階上昇に修正されたため、PHPポケモンでは2段階上昇で実装します。買値・売値についても、最新世代のものを用います。
プラスパワー(/Classes/Item/ItemXAttack.php)
<?php
require_once(root_path('Classes').'Item.php');
/**
* プラスパワー
*/
class ItemXAttack extends Item
{
/**
* 正式名称
* @var string
*/
public const NAME = 'プラスパワー';
/**
* 説明文
* @var string
*/
public const DESCRIPTION = '戦闘中の ポケモンの 攻撃を 大きく あげる 道具。ひっこめると 元に 戻る。';
/**
* カテゴリ
* @var string::general|health|ball|important|machine
*/
public const CATEGORY = 'general';
/**
* 最大所有数
* @var integer
*/
public const MAX = 99;
/**
* 買値
* @var integer
*/
public const BID_PRICE = 1000;
/**
* 売値
* @var integer
*/
public const SELL_PRICE = 500;
/**
* 対象
* @var string::friend|enemy|player|friend_battle
*/
public const TARGET = 'friend_battle';
/**
* 使用できるタイミング
* @var array
*/
public const TIMING = ['battle'];
/**
* 効果
* @return array
*/
public static function effects($pokemon)
{
// 効果なし
if(
$pokemon->getRank('A') >= 6 ||
$pokemon->isFainting()
){
return [
'message' => '使っても効果がないよ',
'result' => false,
];
}
// メッセージを返却
return [
'message' => $pokemon->addRank('A', 2), # こうげきランクを2段階上昇
'result' => true,
];
}
}
対象に新しく「friend_battle」を追加しました。キズぐすりなどは控えのポケモンに対しても使用できますが、プラスパワーなどのランクに影響を与えるアイテムは対象選択の必要がありません。なので、ボールなどと同様に「使う」を押した時点で処理を行うようにformとしてボタンを追加します。
アイテムモーダル(/Resources/Partials/Common/Modals/Item/item.php)
<?php # バトル中の味方ポケモン対象のアイテム使用 ?>
<form method="post" data-button="use" data-item_target="friend_battle" style="display:none">
<?php input_token(); ?>
<input type="hidden" name="action" value="item">
<input type="hidden" name="order">
<button type="submit" class="btn btn-sm btn-php-dark">使う</button>
</form>
$.in_arrayを使った判定
このままではorderの値をセットしてくれないため、js側の判定も追加します。せっかくなので、jQueryの$.in_arrayについて少しだけ触れておきます。
// もしアイテムの対象がenemy,player,friend_battleの場合はアイテム番号(order)をセット
if(0 <= $.inArray(target, ['enemy', 'player', 'friend_battle'])){
use_btn.find('[name="order"]').val(order);
}
今回はこのような判定方法で、どの対象アイテムが選択されたかを判別しています。
$.inArray()という関数は、第1引数に指定した値が、第2引数の配列内に含まれているかどうかを確認してくれるものです。PHPではin_arrayを多用しているので馴染みがあるかも知れませんが、jQueryでは少し異なり、返り値に見つかった値の添字を返却します。そのため、最初の要素にヒットした場合は「0」が返ってくるため、単純にif内で関数の返り値だけを判定させると予期せぬ結果になってしまいます。
$.inArray()
判定に合わせ、それぞれ別の処理を行う場合はswitchが便利で、少量であればifとelseifを組み合わせて作るとスマートな記述になります。ですが、今回のように「いずれかであれば」といった判定をする際には、inArray(in_array)を用いることで簡潔かつ管理がしやすくなるのでオススメです。
便利な関数はjQueryはもちろん標準でもいくつか用意されています。なので、上手く使うことで記述量を減らしたり、より可視性の良いプログラミンができるようになります。
では、プラスパワーの挙動を見てみましょう。
しっかりと効果通りの結果が得られましたね。これで戦闘用アイテム「プラスパワー」の実装は完了です。
まとめ
いかがだったでしょうか。
今回のPHPポケモンでは「戦闘用アイテム プラスパワー」の実装方法をご紹介しました。
プログラミング学習に取り組んでいる方や、ゲームづくりに興味がある方は、ぜひ参考にしてみてくださいね。