わるあがき
そろそろ技のPPを実装段階にきたので、その前に「わるあがき」という技を作成しましょう。「わるあがきって何?」という人のために、どういった技なのか簡単に説明します。
全ポケモン使用可能。ただし、レベルアップなどで普通のわざとして覚えることはできず、自分の技がすべて選択不能になった場合のみ使用できる。
技のPPが尽きた場合や、技や持ち物の効果で選択できる技がなくなった場合に「たたかう」コマンドを選ぶと出される技。反動ダメージの存在から、両者が何もできない状況に陥った際にバトルを終わらせる為に存在する技であると言える。
わるあがき(ポケモンwiki)
使用できる技がないとき等に、バトルを終わらせるために存在する救済処置用で用意されている技です。他のRPGゲームなどであれば「通常攻撃」という概念が存在しますが、ポケモンにはそれがありませんので、ゲーム仕様上必要な技の一つです。
特別な場面で使用される技という以外は、基本的に他の技と同じため、同様にクラスとして作成しておきましょう。
わるあがき(/Classes/Move/Struggle.php)
<?php
require_once(__DIR__.'/../Move.php');
// わるあがき
class Struggle extends Move
{
/**
* 正式名称
* @var string
*/
protected $name = 'わるあがき';
/**
* 説明文
* @var string
*/
protected $description = '使用するたびに反動ダメージを受ける。';
/**
* タイプ
* @var string
*/
protected $type = 'TypeNull';
/**
* 分類
* @var string(physical:物理|special:特殊|status:変化)
*/
protected $species = 'physical';
/**
* 威力
* @var integer
*/
protected $power = 50;
/**
* 命中率
* @var integer
*/
protected $accuracy = null;
/**
* 使用回数
* @var integer
*/
protected $pp = null;
/**
* 優先度
* @var integer
*/
protected $priority = 0;
/**
* 追加効果
*
* @param array $args
* @return void
*/
public function effects(...$args)
{
/**
* @param Pokemon $atk 攻撃ポケモン
* @param Pokemon $def 防御ポケモン
*/
list($atk, $def) = $args;
// 自分の最大HPの1/4ダメージを受ける
$atk->calRemainingHp('sub', floor($atk->getStats('HP') / 4));
$this->setMessage($atk->getPrefixName().'は反動を受けた');
}
}
それでは一つずつ見ていきましょう。
技の反動
わるあがきには「最大HPの1/4、反動ダメージを受ける」という追加効果があります。威力50の物理技というお世辞にも強いとは言い難い技ではありますが、こちらもゲームが終わらないという状態を回避するための仕様上必要な追加効果だと言えます。
追加効果として、最大HP÷4の値(切り捨て)をcalRemainingHpを使って自らのHPから減算しています。反動を受けた旨のメッセージも返しておきましょう。
他の反動技(とっしん等)も同様の処理になります。
タイプ判定
次にタイプ判定です。わるあがきのクラスで気づいた方もいるかも知れませんが、わるあがきにはタイプの概念が存在しません。
/**
* タイプ
* @var string
*/
protected $type = 'TypeNull';
但し、nullをセットするとなれば、オートロードや技からタイプをインスタンス化するなどの処理すべてにnull時の分岐処理が必要になるため、今回は「TypeNull」という空タイプを用意しました。
タイプヌル(/Classes/Type/TypeNull.php)
<?php
require_once(__DIR__.'/../Type.php');
// タイプ無し
class TypeNull extends Type
{
/**
* 正式名称
* @var string
*/
protected $name = '';
/**
* 攻撃技で使用したときの判定
*/
/**
* こうかばつぐん
* @var integer
*/
protected $excellent = [];
/**
* こうかいまひとつ
* @var integer
*/
protected $not_very = [];
/**
* こうかがない
* @var integer
*/
protected $doesnt_affect = [];
}
※ポケモン「タイプ:ヌル」と名称被りになりますが、現段階ではそこまで作成することを想定していないのでスルーします
見たとおり、空タイプ(タイプ無し)です。あくまで、タイプ判定時にどのタイプでもないということが判別できれば問題ありません。
旧世代ではノーマルタイプの判定されていたり、場合によっては一部ノーマルタイプとして扱われるようなこともあったそうですが、最新世代を参考にして「どのタイプにも属さない」とします。
わるあがきの特別処理
わるあがきの準備が整えば、その実装に取り掛かりましょう。まずはバトルコントローラーに「初期値」のような扱いでわるあがきをセットします。
バトルコントローラー(/Classes/Controller/BattleController.php)
/**
* アクション
*
* @param string $action
* @param mixed $param
* @return void
*/
private function action($action, $param)
{
// 敵ポケモンの技をインスタンス化
$e_move = $this->getInstance($this->aiSelectMove());
switch ($action) {
/**
* にげる
*/
case 'run':
$this->run++;
if($this->checkRun()){
$this->endBattle();
}
$this->setMessage('逃げられない!');
// 敵ポケモンの攻撃
$p_damage = $this->attack($this->enemy, $this->pokemon, $e_move);
break;
/**
* たたかう
*/
case 'fight':
// 自ポケモンの技をインスタンス化
if(empty($param)){
// 技が未選択の場合は悪あがきをセット
$param = 'Struggle';
}
現在、actionメソッドの第2引数$paramは技の受け渡しでしか使用していませんが、アイテムやポケモン交代などを導入した際には別のパラメーターが入ることになります。なので、初期値としてセットせずに、fightの分岐内で$paramが空だった際にわるあがき(Struggle)をセットします。
現段階、通常ルートでactionメソッドからfight分岐にきた際に、$paramが空になることはありません。ですが、今後作り込んでいくことで技選択が不能な状況に陥った際に「わるあがきが発動する」ということを条件に含めることができます。
次に攻撃処理にわるあがきの分岐を追加しましょう。
攻撃用トレイト(/Traits/Battle/AttackTrait.php)
/**
* 攻撃
* (攻撃→ダメージ計算→ひんし判定)
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
protected function attack($atk_pokemon, $def_pokemon, $move)
{
// 行動チェック(状態異常・状態変化)
if(!$this->checkBeforeSa($atk_pokemon) || !$this->checkBeforeSc($atk_pokemon)){
// 行動失敗
return;
}
// チャージチェック
if($move->charge($atk_pokemon)){
// チャージターンならメッセージを格納して行動終了
$this->setMessage($atk_pokemon->getMessages());
$atk_pokemon->resetMessage();
return;
}
// わるあがきの確認
if(get_class($move) === 'Struggle'){
$this->setMessage($atk_pokemon->getPrefixName().'は出すことのできる技がない');
}
// 攻撃メッセージを格納
$this->setMessage($atk_pokemon->getPrefixName().'は'.$move->getName().'を使った!');
わるあがきを使用する際には、「〇〇は出すことのできる技がない」というメッセージが表示されます。なので、技の使用宣言前に技クラスをチェックして、もしわるあがきだと判定されればメッセージを表示しています。
それでは、実際にわるあがきを使ってみましょう。
※今回はミュウにわるあがきを覚えさせて検証しています
エラーに引っかからず、正常にわるあがきの使用メッセージが表示され、反動ダメージを受けるまでを確認することができました。
これで「わるあがき」の実装が完了です。
まとめ
いかがだったでしょうか。
今回のPHPポケモンでは「わるあがきの実装方法」をご紹介しました。
ゲーム上の都合技ではありますが、無くてはならない大切な技の一つです。ですがその分、他とは別処理が必要ということがわかりますね。
ゲームづくりに興味がある方、プログラミング学習に取り組んでいる方は、ぜひ参考にしてくださいね。