ネコにこばん編 PHPポケモン73
2020年11月11日 (最終更新日:2020/11/12 16:10)

ネコにこばん編 PHPポケモン73

ネコにこばん編 PHPポケモン73

ネコにこばんとは

初代ポケモンでは、基本的にトレーナーとのバトルでしかお金を増やすことができず、もし手持ち金が0円の状態で金が必要なイベントが発生すると詰んでしまうという隠された落とし穴がありました。

ですが、初代でも唯一トレーナー意外からお金を得る方法があります。それが「ネコにこばん」というポケモンの技です。 

※売却を除きます

戦いが終わったら、この技の攻撃回数×レベル×5円のお金を拾える

 

散らばったお金

技の仕様は、技を使ったポケモンのレベル×5円をフィールドにバラまくというものです。複数回使用することで、上乗せで金額が増えていきます。散らばったお金を保管する場所には、バトル状態クラス(BattleState)を活用しましょう。

 

バトル状態クラス(/Classes/BattleState.php)
<?php
/**
* バトル状態クラス
*/
class BattleState
{
 
--省略
 
    /**
    * 散らばったお金
    * @var array
    */
    private $money = [];
 
--省略
 
    /**==================================================================
    * お金(ネコにこばん)
    ==================================================================**/
 
    /**
    * 散らばったお金の取得
    * @return integer
    */
    public function getMoney(): int
    {
        return array_sum($this->money);
    }
 
    /**
    * お金のセット
    * @param integer
    * @return void
    */
    public function setMoney($money): void
    {
        $this->money[] = $money;
    }
 
    /**
    * お金の初期化
    * @param integer
    * @return void
    */
    public function initMoney(): void
    {
        $this->money[] = [];
    }
}

 

お金は加算して保管せず、配列の要素として格納していき、最終的にarray_sumを使って合計金額を取得するという方式を取りました。状況によっては必要になる可能性も考慮し、初期化用メソッド(initMoney)も作成しました。

  

技の特別処理

 それでは、ネコにこばんの技クラスを作成しましょう。

 

ネコにこばん(/Classes/Move/MovePayDay.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// ネコにこばん
class MovePayDay extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'ネコにこばん';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '戦いが終わったらお金を拾える。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'TypeNormal';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 40;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 20;
 
    /**
    * 対象
    * @var string
    */
    protected $target = 'enemy';
 
    /**
    * ネコにこばんの特別処理
    * @param atk:object::Pokemon
    * @param battle_state:object::BattleState
    * @return void
    */
    public function exPayDay($atk, $battle_state)
    {
        // レベル x 5円をセット
        $battle_state->setMoney(
            $atk->getLevel() * 5
        );
    }
 
}

 

技を使った後にお金をバラまく(外れた場合は無効)という効果ですが、こちらは相手の残りHPに関係なく追加効果が発生します。なので、特別処理としてexPayDayというメソッドに格納しました。

 こちらを、攻撃トレイトのeffectメソッドが呼び出される直前にコールします。

 

攻撃用トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
// attackSuccessメソッド内
//
// ネコにこばんの特別処理(相手のHPに関係無く発動)
if(get_class($move) === 'MovePayDay'){
    $this->exPayDay($atk_pokemon, $move);
}
// 追加効果(相手にHPが残っていれば)
if($def_pokemon->getRemainingHp()){

 

特別処理用トレイト(/App/Traits/Service/Battle/ServiceBattleExTrait.php
/**
* ネコにこばんの特別処理
*
* @param atk:object::Pokemon
* @param move:object::Move
* @return void
*/
protected function exPayDay(object $atk, object $move): void
{
    $move->exPayDay($atk, $this->battle_state);
    setMessage('辺りにお金が散らばった');
}

 

処理自体は複雑ではないため、トレイトのみで完結させることができる量ですが、あくまで技の効果ということをわかりやすくするため、今回は「攻撃トレイト → 特別処理トレイト → 技クラス」という3工程を経由させました。

 

おこづかいの増加

散らばったお金は、おこづかいとして回収しなければなりません。なので、こちらはバトル終了直前にチェックして、トレーナーのおこづかいに加算します。

 

バトルコントローラー用トレイト(/App/Traits/Controller/BattleControllerTrait.php
/**
* バトル結果判定
*
* @return void
*/
private function judgment()
{
    if($this->fainting['friend']){
        // 味方がひんし状態になった
        setMessage('目の前が真っ暗になった');
    }else{
        // 相手がひんし状態になった(味方はひんし状態ではない)
        // 経験値の計算
        $exp = $this->calExp($this->pokemon, $this->enemy);
        // 経験値をポケモンにセット
        $this->party[$this->order]
        ->setExp($exp);
        // 努力値を獲得
        $this->party[$this->order]
        ->setEv($this->enemy->getRewardEv());
        // もしポケモンが「へんしん状態」であれば変更後の状態を引き継ぎ
        if($this->pokemon->checkSc('ScTransform')){
            $this->pokemon
            ->judgmentTransform($this->party[$this->order]);
        }
    }
    // 散らばったお金の取得
    $money = getBattleState()->getMoney();
    if($money){
        setMessage($this->player->getName().'は、'.$money.'円拾った');
        $this->player
        ->addMoney($money);
    }
    // バトル終了判定用メッセージの格納
    setEmptyMessage('battle-end');
}

 

ネコにこばんでは、「にげる」や「ふきとばし」などによるバトル終了ではお金を拾うことができません。なので、それらが通過しないjudgmentメソッド内に判定処理を追加しました。

 

それでは、実際の動きを見てみましょう。

 

使用回数分のお金が獲得できましたね。これでネコにこばんの実装は完了です。

 

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは「ネコにこばん」の実装方法をご紹介しました。

現在プログラミング学習に取り組んでいる方や、挑戦しようと興味を持たれている方は、ぜひ参考にしてみてくださいね。

 

Copyright © 2016-2020 YQUAL All Rights Reserved.