Godotで放置ゲームを作る⑥:中央制御システムで乗算バフを実装する

初心者向け実践開発

※本記事にはアフィリエイト広告(Udemy)を含みます。

前回のおさらい

前回⑤では、電力→酸素→部品という資源連鎖を実装しました。今回は、この3つの生産量すべてを底上げする「中央制御システム」を追加します。

今回のゴール

中央制御システムは、これまでの発電パネル・酸素生成装置・部品工場のように「特定の資源を生産する」設備ではありません。代わりに、既存の生産量に倍率をかける「乗算バフ」の役割を持ちます。

ここでいう乗算バフとは、たとえば「+10%」を単純に足し算していく加算バフとは違い、1基増えるごとに直前の生産量に対して倍率がかかっていく仕組みです。1基で1.1倍、2基で1.21倍(1.1の2乗)というように、買うほど効果が加速していきます。少ない基数でも実感しやすく、終盤まで意味のある設備であり続けるように、この方式を選びました。

中央制御システムを追加する

var central_control_count: int = 0
var central_control_cost: float = 20.0

const CENTRAL_CONTROL_COST_RATE: float = 1.4
const CENTRAL_CONTROL_BUFF_PER_UNIT: float = 0.1


func can_buy_central_control() -> bool:
    return parts_factory_count >= 1


func buy_central_control() -> bool:
    if not can_buy_central_control():
        return false
    if parts < central_control_cost:
        return false
    parts -= central_control_cost
    central_control_count += 1
    central_control_cost *= CENTRAL_CONTROL_COST_RATE
    resources_changed.emit()
    return true

コストの支払いに部品を指定しているのは、電力→酸素→部品という連鎖の中で部品が一番「上流の資源を経由してようやく手に入る」資源だからです。ここまで到達した人へのご褒美的な位置づけとして、あえて一番手に入りにくい資源をコストにしています。

乗算バフの計算式を作る

func get_production_multiplier() -> float:
    return pow(1.0 + CENTRAL_CONTROL_BUFF_PER_UNIT, central_control_count)

pow(底, 指数)は、底を指数の回数だけ掛け合わせる関数です。ここでは「1.1を中央制御システムの所持数だけ掛け合わせる」という計算をしています。中央制御システムを2基持っていれば1.1 × 1.1 = 1.21、3基なら1.1 × 1.1 × 1.1 = 1.331という具合に、所持数が増えるほど倍率の伸びが加速します。これが単純な足し算(加算バフ)ではなく、複利計算にしている理由です。

Tick処理にバフを適用する

⑤で作った_on_production_tick()を、バフを反映する形に書き直します。

func _on_production_tick() -> void:
    var multiplier: float = get_production_multiplier()

    if power_panel_count > 0:
        power += power_panel_count * POWER_PANEL_PRODUCTION * multiplier

    if oxygen_generator_count > 0:
        var required_power: float = oxygen_generator_count * OXYGEN_GENERATOR_POWER_COST
        if power >= required_power:
            power -= required_power
            oxygen += oxygen_generator_count * OXYGEN_GENERATOR_PRODUCTION * multiplier

    if parts_factory_count > 0:
        var required_oxygen: float = parts_factory_count * PARTS_FACTORY_OXYGEN_COST
        if oxygen >= required_oxygen:
            oxygen -= required_oxygen
            parts += parts_factory_count * PARTS_FACTORY_PRODUCTION * multiplier

    resources_changed.emit()

生産量(power +=oxygen +=などの右辺)にだけ* multiplierを掛けており、消費量(required_powerrequired_oxygenの計算)には掛けていません。もし消費量にもバフを掛けてしまうと、設備を増やすほど消費も増えてしまい、バフの恩恵が相殺されてしまいます。中央制御システムを「純粋に得をする」設備にするため、消費側には影響させない設計にしています。

UIに中央制御システムの購入行を追加する

これまでと同様、UpgradeListの中に購入行を追加します。表示テキストには、現在の乗算倍率も含めておくと、効果が実感しやすくなります。

central_control_row.visible = GameManager.can_buy_central_control()
if central_control_row.visible:
    central_control_info.text = "中央制御システム (%d基, 生産×%.2f) - 次: %d" % [
        GameManager.central_control_count,
        GameManager.get_production_multiplier(),
        int(GameManager.central_control_cost)
    ]
    central_control_buy_button.disabled = GameManager.parts < GameManager.central_control_cost

can_buy_central_control()により、部品工場を1基以上持っていないとこの行自体が表示されません。⑤までと同じく、設備を段階的に解禁する設計を踏襲しています。

動作確認

部品工場を1基購入した状態で、中央制御システムを購入してみてください。購入直後から、電力・酸素・部品すべての増加ペースが速くなっていれば成功です。表示されている倍率が、購入するたびに1.10→1.21→1.331…と伸びていくことも確認してみてください。

次回予告

次回⑦では、自動化モジュールを追加してクリック操作そのものを不要にし、あわせてセーブ/ロード機能を実装します。

Godot学習におすすめのオンライン講座

数値設計やバランス調整は、実際に手を動かしながら感覚をつかんでいく部分が大きいです。基礎を体系的に押さえておくと、こうした調整もスムーズになります。

Godotのコースを見る

参考リンク


コメント

タイトルとURLをコピーしました