プログラミング

いかり編 PHPポケモン 42

PHP PHPポケモン ポケモン
いかり編 PHPポケモン 42

いかり(技)とは

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匹(ラ●チュウ)のレベルアップ技をすべて用意、実装することが出来ました。ただ、ポケモンの技はまだまだ多くあり、現状のシステムだけでは実装ができないものもあります。こちらも引き続き、ポケモンを追加しながら用意していきましょう。

プログラミング学習中の方や、ゲームづくりに興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

ポケモン預かりシステム編 システムの実装 PHPポケモン 87
プログラミング
PHP,PHPポケモン,ポケモン
ポケモン預かりシステム編 システムの実装 PHPポケモン 87

ポケモン預かりシステムの実装 システムの仕様とクラスも整ってきたので、いざ実装をしていきましょう。 前回までに作成した項目で、いくつか変更になったものがあるので、まずはじめに挙げておきます。   シャットダウン機能 ボックスの選択を解除するというものでしたが、こちらを不採用にしました。ボックスは...

データ軽量化編 β版へ向けて  PHPポケモン 90
プログラミング
PHP,PHPポケモン,ポケモン
データ軽量化編 β版へ向けて PHPポケモン 90

β版の実装に向けて 大型アップデートにより、ある程度機能改善や実装箇所も増えてきましたが、それと同時に次の段階への移行が本格的に見えてきました。それがβ版です。   PHPポケモンは2020年12月現在α版となっており、完全な試作段階のWEBアプリケーションです。セーブ機能はなく、セッションの有効期...

フリーランスが見積書を作るときに押さえておきたい3つのポイント+α
フリーランス
フリーランス,仕事依頼,独立,見積書
フリーランスが見積書を作るときに押さえておきたい3つのポイント+α

  仕事の依頼がきたけど、どれぐらいの金額を提示すればいいかわからない   駆け出しのフリーランスや、これから独り立ちしようとしている人に多い悩みです。 今回はそういった方のために「フリーランスが見積書を作るときに押さえておきたい3つのポイント+α」についてご紹介します。     時給...

PHPポケモン「野生ポケモン遭遇編」18
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「野生ポケモン遭遇編」18

  PHPポケモンが第18回にしていよいよバトルの第一歩、野生ポケモンとの遭遇編に突入です。 新しいコントローラーの作成と、バトル画面の作成、そしてポケモンデータの受け渡しなどを中心にご紹介します。   バトル画面の実装  ポケモンのゲームでも、野生ポケモンが現れるとバトル画面へ移管し...

くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは
雑記
フリーランス,独立,起業
くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは

  仕事ください アドバイスしてください 〇〇について教えてください   こういったくれくれ姿勢の人は多く、投げかけられた側からすると「メリットは?」と感じてしまいます。 ですが実はこのくれくれ姿勢には意外な成功の要因が隠れています。多くの自己啓発記事やツイートをする人はこの本質的なものに触...

バーアニメーションの不具合対応編 PHPポケモン 54
プログラミング
PHP,PHPポケモン,ポケモン
バーアニメーションの不具合対応編 PHPポケモン 54

最近は細々した対応が多くて「早く次のステップに進めよ!」と思っている方も多いでしょう。 ご意見ごもっともですが、残っている対応が意外にも追加しなければいけない処理が多く苦戦しているのが実情だったりします。そして、そのおかげか試行回数が多くなり見過ごしていた不具合や修正不備がポロポロ出てきていま...

人に相談しても期待はするな【行動もどきって?成功する人と失敗する人の違いとは】
雑記
自己啓発
人に相談しても期待はするな【行動もどきって?成功する人と失敗する人の違いとは】

  「とにかく行動しろ」 「いろんな人に会え」 「どんどん外注しろ」   どれも覚えておきたい教訓ではありますが、その本質が見抜けなければ逆効果になります。 行動であっても、それが行動もどきになっている人は多く、人に会って人生が変わるということも受け身であれば全く意味がありません。外注に...

初心者必見!仕事がデキる人のIllustrator活用術3選
デザイン
Adobe,Illustrator,サムネイル
初心者必見!仕事がデキる人のIllustrator活用術3選

  仕事の速い人の大半は、「効率の良い方法」や「便利な使い方」を知っていて使いこなしています。これは、デザインの現場でも同じです。 今回はその中でもIllustratorで知っておくと便利な機能を3つご紹介します。この3つを押さえておくだけで、作業効率は格段にアップするので、これからソフトの使い方を覚...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力