いかり(技)とは
2020年10月段階での最新シリーズである「ソード・シールド」では、今まであった技が使用不可能になっているものが数多くあります。その1つが「いかり」という技です。
いかり(ポケモンwiki)
使えなくなっている技の中には、世代を経る毎に追加された要素に対応すべくゲームバランスを整えるために残念ながら不採用になったものなどもありますが、いかりについては他の技と判定の基準が大きく違っていたり、各世代においてバグが連発したなど様々な理由があるのではないかと考えています(あくまで想像です)。
ですが、立派な初代から実装されてきた技の1つで、御三家である「ヒトカゲ一族」が覚える技でもあるので、PHPポケモンでは用意します。
ではまず、技の詳細を見てみましょう。
自分をいかり状態にする。このときダメージを受けるとこうげきランク補正が1段階上がる。
いかりが外れたり、無効化されたときでもいかり状態になる。
いかり状態は次の自分の行動まで維持される。状態異常/状態変化により行動できなかった場合や、道具を使ったとき、にげようとして失敗したときもいかり状態は解除される。
攻撃をすることで、自らをいかり状態にしてその状態に応じて効果が適用されるというものです。なので、技クラスに関しては通常技と同じ要領で作成していきましょう。
いかり(/Classes/Move/Rage.php)
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
// いかり
class Rage extends Move
{
/**
* 正式名称
* @var string
*/
protected $name = 'いかり';
/**
* 説明文
* @var string
*/
protected $description = 'いかり状態になり、ダメージを受けるたびにこうげきが1段階上がる。';
/**
* タイプ
* @var string
*/
protected $type = 'Normal';
/**
* 分類
* @var string(physical:物理|special:特殊|status:変化)
*/
protected $species = 'physical';
/**
* 威力
* @var integer
*/
protected $power = 20;
/**
* 命中率
* @var integer
*/
protected $accuracy = 100;
/**
* 使用回数
* @var integer
*/
protected $pp = 20;
/**
* 優先度
* @var integer
*/
protected $priority = 0;
/**
* 追加効果
*
* @param array $args
* @return void
*/
public function effects(...$args)
{
/**
* @param Pokemon $atk 攻撃ポケモン
* @param Pokemon $def 防御ポケモン
*/
list($atk, $def) = $args;
// 攻撃ポケモンを怒り状態にする
$atk->setSc('ScRage');
}
}
いかり(状態変化)
いかりを使用すると、自身を「いかり状態」にしなければなりません。なのでこちらは「状態変化」の1つとして作成します。
いかり:状態変化(/Classes/StateCange/ScRage.php)
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/StateChange.php');
// いかり
class ScRage extends StateChange
{
/**
* 正式名称
* @var string
*/
protected $name = 'いかり';
/**
* 発動した際のメッセージ
* @var string
*/
protected $active_msg = '::pokemonの怒りのボルテージが上がっていく!';
}
いかり状態で必要なメッセージは、攻撃を受けていかりが発動したときに表示されるもの1つだけです。他のメッセージとは少し異なったタイミングのため、active_msgというプロパティを用意しておきます。
合わせて、親クラスに初期値と取得用メソッドを追加しておきましょう。
状態変化クラス(/Classes/StateChange.php)
// 状態変化
abstract class StateChange
{
// プロパティの初期値
protected $sicked_msg = '';
protected $sicked_already_msg = '';
protected $turn_msg = '';
protected $failed_msg = '';
protected $recovery_msg = '';
protected $active_msg = '';
--省略
/**
* 発動時のメッセージを取得
*
* @param string $pokemon
* @return string
*/
public function getActiveMessage($pokemon)
{
return str_replace('::pokemon', $pokemon, $this->active_msg);
}
}
それでは、作成したクラスを機能に実装していきましょう。
発動条件
まずは発動条件です。いかりを使用すると「いかり状態」になり、その状態下で技によるダメージを受ければこうげきランクが1段階上昇します。これは、今まで作成した状態変化の確認タイミング(checkBeforeSc, checkAfterSc)のどちらにも属していません。
もし相手が「連続攻撃」を使用した場合は、ヒットする度に判定が行われるため、ターンに1回ではなく「ダメージ判定直後」にチェックを導入します。
攻撃トレイト(/App/Traits/Service/Battle/ServiceBattleTrait.php)
/**
* 攻撃判定成功時の処理
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
private function attackSuccess($atk_pokemon, $def_pokemon, $move)
{
--省略
// 追加効果(相手にHPが残っていれば)
if($def_pokemon->getRemainingHp()){
// 追加効果
$move->effects($atk_pokemon, $def_pokemon);
// 追加効果のメッセージをセット
$this->setMessage($move->getMessages());
$move->resetMessage();
// いかり判定
if($def_pokemon->checkSc('ScRage') && !empty($damage ?? 0)){
$rage = new ScRage;
// いかり発動メッセージをセット
$this->setMessage($rage->getActiveMessage($def_pokemon->getPrefixName()));
// こうげきランクを1段階上昇
$msg = $def_pokemon->addRank('Attack', 1);
$this->setMessage($msg);
}
return;
}
}
もし防御側のポケモンがいかり状態且つダメージがあれば、メッセージを返却して攻撃ランクを1段階上昇させています。これで技によるダメージを受ける度に発動させることができます。
解除のタイミング
発動タイミングが実装できたので、次はいかり状態の解除についてです。いかり状態は、次に自分が行動するまで残り続けます。なので、もし後手であれば、いかりを発動した次のターンに攻撃を受ければ、いかり状態の効果が発動します。これも、2つの状態変化のチェックタイミングと異なっているため、個別で「攻撃ポケモンの行動前」に処理を追加します。
たたかう用サービス(/App/Services/Battle/FightService.php)
/**
* 行動順に攻撃処理
*
* @return boolean (false: ひんしポケモン有り)
*/
private function actionAttack($orders)
{
foreach($orders as list($atk, $def, $move)){
// 攻撃ポケモンの怒り解除
$atk->releaseSc('ScRage');
// 攻撃
$this->attack($atk, $def, $move);
// ひんしチェック
$this->fainting = [
$atk->getPosition() => $this->checkFainting($atk),
$def->getPosition() => $this->checkFainting($def),
];
// どちらかがひんし状態なら処理終了
if($this->fainting['friend'] || $this->fainting['enemy']){
$result = false;
break;
}
} # endforeach
// 結果返却
return $result ?? true;
}
こちらはサービス内の行動処理のループ最初に記述しておきます。後手の場合、相手の行動でダメージを受ければ、いかり状態が解除される前のため判定が行われることになります。
更に「にげる」実行時にも解除処理を追加します。
状態異常/状態変化により行動できなかった場合や、道具を使ったとき、にげようとして失敗したときもいかり状態は解除される。
説明ではこの通り、にげるに失敗した際にも解除されると記されています。なので、こちらはにげるサービス内の失敗時の分岐に処理を追加しましょう。
にげる用サービス(/App/Services/Battle/RunService.php)
/**
* @return void
*/
public function execute()
{
if($this->checkRun()){
// 逃走成功
$this->setResponse(true, 'result');
$this->setMessage('上手く逃げ切れた');
// バトル終了判定用メッセージの格納
$this->setMessage(' ', 'battle-end');
}else{
// 逃走失敗
$this->setResponse(false, 'result');
$this->setMessage('逃げられない!');
// 攻撃ポケモンの怒り解除
$atk->releaseSc('ScRage');
// 相手ポケモンの攻撃
if(!$this->enemyAttack()){
// どちらかがひんし状態なら処理終了
$this->exportProperty('fainting');
return;
}
}
// 行動後の状態異常・変化をチェック
$this->afterCheck();
// 指定したプロパティを返却
$this->exportProperty('fainting');
}
これで「にげる」に失敗した際も残り続けず、正常に解除することができます。
それでは実際に使用してみましょう。
いかりを使ったターン、攻撃を受けると攻撃ランクが1段階アップしました。
これで「いかり」の実装は完了です。
まとめ
いかがだったでしょうか。
今回のPHPポケモンでは「いかり」の実装方法を紹介しました。
これで、初代御三家とピカチュウを含めた計10匹+1匹(ラ●チュウ)のレベルアップ技をすべて用意、実装することが出来ました。ただ、ポケモンの技はまだまだ多くあり、現状のシステムだけでは実装ができないものもあります。こちらも引き続き、ポケモンを追加しながら用意していきましょう。
プログラミング学習中の方や、ゲームづくりに興味がある方は、ぜひ参考にしてみてくださいね。