プログラミング

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

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

 

注目の記事

プログラミングで躓く人必見!一人前になるためのSDCとは
プログラミング
プログラミング学習
プログラミングで躓く人必見!一人前になるためのSDCとは

  「プログラミング学習を始めたけど中々身につかない」 「挑戦したいけど何から始めればいいかわからない」   プログラミング教育が始まるとともに、プログラミング学習のニーズも日々高まってきています。ですが、興味はあっても中々挑戦までは至らなかったり、始めたは良いものの現実は厳しく躓いてし...

引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58
プログラミング
PHP,PHPポケモン,ポケモン
引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58

今回のPHPポケモンでは内部の作り込みをしていきます。見た目への反映は無いので、プレイを楽しみにしている人や、ポケモンが好きで毎日チェックしてくれているような人は、ブラウザをバックしてもらって問題ありません。   それでは、前々回辺りから保留にしていた「メッセージIDに重複回避対策」についてです。 &...

PHPポケモン「レスポンス機能編」メッセージの返却 12
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「レスポンス機能編」メッセージの返却 12

  第12回PHPポケモンは「レスポンス機能編」です。 メッセージやデータのやり取り部分を、よりシステム風に作成していきます。   第1回はコチラ   レスポンス(Response)の実装  今までは結果(メッセージ等)はechoを使って出力していましたが処理が行われたタイミングで出力されてしまうため...

プログラミングとは?現役システムエンジニアが教える裏事情
プログラミング
システムエンジニア,プログラマー
プログラミングとは?現役システムエンジニアが教える裏事情

  プログラミングってよくわからない? 実際に何をやっているの?   最近注目されているSE(システムエンジニア)やPG(プログラマー)という職業ですが、「そもそもプログラミングとは?」といった疑問を抱えている方も多いですね。 今回は、そういった方へ向けて「プログラミングの基礎知識と裏事情」...

トレーナー戦編 トレーナー情報の作成 PHPポケモン 97
プログラミング
PHP,PHPポケモン,ポケモン
トレーナー戦編 トレーナー情報の作成 PHPポケモン 97

トレーナー戦 いよいよPHPポケモンでもトレーナー戦の実装に取り掛かっていきます。バトルシステム自体は野生ポケモンと同じですが、トレーナーバトルでは以下の項目が追加、または制限を設けることになります。 複数匹のポケモン 逃げられない 捕まえられない 賞金   複数匹のポケモン ざっくり...

フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】
フリーランス
フリーランス,独立,起業
フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】

  仕事ってどうやってとればいいの?   独立したい、起業したいと考えている人の多くが、仕事はどうやってとればいいのかと悩んで足踏みしています。 実は、基本的な3つのポイントさえ知っていれば、継続して仕事を受注することは簡単です。 今回は自分が実際にやっていることを例に「フリーランスなら...

命中率補正と交代技編 PHPポケモン 45
プログラミング
PHP,PHPポケモン,ポケモン
命中率補正と交代技編 PHPポケモン 45

命中率補正とは ダメージ計算や行動順判定には補正(ランク)を計算した結果を反映していましたが、命中率補正についてはまだ未実装だったため、今回はこちらを作成していきたいと思います。 まずはwikiを参考に、計算方法を見ていきましょう。 命中(ポケモンwiki) https:// wiki.ポケモン.com/wiki/命中 第...

連続攻撃技と一撃必殺技編 PHPポケモン39
プログラミング
PHP,PHPポケモン,ポケモン
連続攻撃技と一撃必殺技編 PHPポケモン39

連続攻撃技とは 追加効果だけでは処理できない技が、初代に限定していても数多くあります。その一つが「連続攻撃技」です。  連続攻撃技 https://wiki.ポケモン.com/wiki/連続攻撃技 連続攻撃技はさらに4パターンに分かれる。 攻撃回数が2回固定であるもの 攻撃回数が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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力