プログラミング

いかり編 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を使えるようになるための実践的な学び方
プログラミング
HTML,PHP,プログラミング学習
【変数とは】初心者が最短でPHPを使えるようになるための実践的な学び方

  ※PHP初心者へ向けた内容となりますので、ある程度HTMLの知識がある方を対象とした内容になります。予めご了承ください。    Webプログラミングを学ぶ方はHTML、そしてCSSを学び、そしてJavascriptやPHPという順に学んでいくひとが多いでしょう。 私も実際に、似たような手順で学んでいきました。   ...

YouTuber・ブロガー必見!知る人ぞ知るサムネイルの重要性とは
デザイン
Facebook,Instagram,Twitter,YouTuber,サムネイル,ブロガー
YouTuber・ブロガー必見!知る人ぞ知るサムネイルの重要性とは

  サムネイルって本当に重要? ブログの場合はフリー画像でもいいんじゃない?   そう考えている人はいませんか? 残念ですが、それは大きな間違いです。サムネイルを作り込むことは非常に重要であり、集客ポイントを拡大させるのはもちろん、ブランディングにもつながるのです。   今回は「知る人ぞ...

「諦めが上手い人」ほど成功する!正しい目標の立て方とは
雑記
PHP
「諦めが上手い人」ほど成功する!正しい目標の立て方とは

  「諦めたらそこで試合終了ですよ」   漫画の中でも有名なセリフですが、これからあなたは何を読み取りますか? 何か目標を達成するために努力が必要とされますが、その方法がわからずに試行錯誤したり、そもそも挑戦すらできずに終えてしまう人は多いのです。 努力をした人は、ほとんどがそれは結果的...

壁技編(リフレクター・ひかりのかべ)PHPポケモン 51
プログラミング
PHP,PHPポケモン,ポケモン
壁技編(リフレクター・ひかりのかべ)PHPポケモン 51

壁技とは 前回実装した「しろいきり」と同じく、初代から実装されたフィールド効果技が存在します。それが「壁技」です。 壁(ポケモンwiki) https://wiki.ポケモン.com/wiki/壁 壁とは、バトルにおける場の状態の一種、およびその場を形成するわざの総称。わざとしては第一世代から存在するが、場の状...

できるやつの「雑学力」
雑記
勉強法,雑学力
できるやつの「雑学力」

  テレビのコメンテーター、討論番組の出演者で活躍するほとんどの人は物知りだ。 あなたも「よくそんなことまで知っているな」と思ったことはあるだろう。 現代で起業して成功し続ける人のほとんどが、常に新しい情報を取り入れている。 そして得た情報に対して、歴史情報と照らし合わせ、自分なりの意見や解釈を...

フリーランス向けの営業コミュ力向上マニュアル
フリーランス
コミュニケーション能力,フリーランス,営業
フリーランス向けの営業コミュ力向上マニュアル

  せっかくの技術があっても、フリーランスで生計が立てられない 生計は立てられていても、技術レベルに比べて収入が見合っていない   そういった人は非常に多いです。 共通しているのは、営業力の弱さです。   営業は仕事に置いては基本であり究極です。 しかし、フリーランスになる方の多くは技術...

ポケモンセンター編 PHPポケモン 37
プログラミング
PHP,PHPポケモン,ポケモン
ポケモンセンター編 PHPポケモン 37

ポケモンセンター  バトルシステムを作る関係上、どうしてもダメージを受けることが多くなってきたので、そろそろポケモンセンターを建設(作成)します。 とは言っても、ポケモンセンターに行って交換やらボックス整理などができるわけではなく、ただ回復ポイントを設置するだけの簡単な処理です。   HPの回復 ...

ピカチュウから学ぶオブジェクト指向 〜トレイト編〜 4
プログラミング
PHP,PHPポケモン,オブジェクト指向,ポケモン
ピカチュウから学ぶオブジェクト指向 〜トレイト編〜 4

  ピカチュウから学ぶオブジェクト指向の第4弾は「トレイト(trait)の活用」についてです。更に、レベルシステムを導入すれば欠かせない経験値システムも合わせて実装します。 第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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力