【プチコン講座】ボス以外のエネミーの実装とバトルのバランス調整:後編

プチコン

プチコン RPG完成

こんにちは。継続の錬金術士なおキーヌです。

ブログ毎日更新は160日目になります。

前回「【プチコン講座】ボス以外のエネミーの実装とバトルのバランス調整:前編」でバトルの調整をしました。

しかし前回のままだと結構シビアな状態だったので今回も少し調整します。

ついでにボスバトルの処理も実装してしまいましょう。

そして今回がRPG制作講座の最後になります。

それではプチコンでRPG作り最終回を始めましょう。

  1. せいすいを手に入れよう
  2. せいすいを持っているときに分岐させよう
  3. ゲームクリアを作ろう
  4. プチコンRPG制作講座の振り返り

せいすいを手に入れよう

ボスのゴーストは聖水を持っていないと倒せないようにしたいです。

なのでスケルトンが守っている宝箱を取る必要があります。

まずはせいすいを入手できるようにしましょう。

ポーションのイベントを流用して数値を変更するだけですね。

早速宝箱イベントを追加しましょう。

1~5がエネミーで6がポーションでしたので7に聖水を加えます。


@EVENT001
DATA 3, 4,1,0,  2,0,1,  0,1,1

@EVENT002
DATA 3, 4,2,0,  2,0,1,  0,1,1

@EVENT003
DATA 3, 4,3,0,  2,0,1,  0,1,1

@EVENT004
DATA 3, 4,4,0,  2,0,1,  0,1,1

@EVENT005
DATA 3, 4,5,0,  2,0,1,  0,1,1

@EVENT006
DATA 7,  10,95,400,  3,1,268,  2,0,1,  1,1,0,  10,12,0,  1,2,0,  0,1,1
@EVENT006_1
DATA 2,  1,3,0,  0,0,0

@EVENT007
DATA 7,  10,95,400,  3,1,268,  2,1,1,  1,1,0,  10,12,0,  1,2,1,  0,1,1
@EVENT007_1
DATA 2,  1,3,0,  0,0,0

@EVENT008
DATA 7,  10,95,400,  3,1,268,  1,1,0,  10,12,0,  1,2,2,  2,2,1,  0,1,1


@ENEMYPARAMS
DATA 1,7,   5,3,3,0,10
DATA 1,20, 13,2,3,0,20
DATA 1,45, 15,6,3,0,40
DATA 1,30,  7,5,3,0,30
DATA 1,100,18,7,3,0,50
~~~ 省略 ~~~

イベント一覧にイベント7番目(せいすい)と8番目(ゲームクリアフラグ宝箱)と、
エネミーパラメーターの最終調整版も載せておきます。

これで聖水をゲットできます。

イベント8も追加していますが、ゲームクリアの項目でまたお話しします。

一旦プレイヤーの攻撃力を高めてスケルトンをそっこうで倒してせいすいを取れるかを確認しましょう。

プチコン表示結果その1

しかし今は宝箱イベントが発動したらポーションを強制的に入手するようになってしまっているので、
渡された数値によって分岐させなければいけません。

せいすい入手に関してはアイテムではなくフラグのON/OFFで管理します。

せいすいを持っているときに分岐させよう

まずはせいすいを入手したときにイベントを分岐するようにしてみましょう。

VAR G_HOLY_WATER = FALSE


# イベントキュー取り出し
DEF D_SHIFT_EV_DATA
  VAR TYPE = SHIFT(G_EV_QUEUE)
  VAR EVENT = SHIFT(G_EV_QUEUE)
  VAR RESERVE = SHIFT(G_EV_QUEUE)

  IF TYPE== 0 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 1 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 2 THEN
    IF EVENT == 0 THEN
      INC G_PLAYER_STATUS[7], RESERVE
    ELSEIF EVENT == 1 THEN
      G_HOLY_WATER = TRUE
    ENDIF
  ELSEIF TYPE == 3 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 4 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 10 THEN
  ~~~ 省略 ~~~
  ENDIF
  ~~~ 省略 ~~~
END

聖水用のフラグを設けました。

別にプレイヤースプライトの空いている変数でもいいですが、
分かりやすいようにグローバル変数しておきました。

SPVARの欠点は数値で管理するのでパッと見何かわかり辛いんですよね。

プチコン4ではそれが改善されていましたのでプチコン4の場合はスプライト変数に配列を持たせて
そこで管理すればいいと思います。

イベント2に0を渡したときはポーションで、1の時は聖水フラグをONにします。

これで聖水を取得することができました。

せいすいフラグをつかってボス戦の実装をしよう

ボス戦と言っても、普通の戦闘とは特に変わりません。

しかし、せいすいのフラグによってダメージの変化をしたいと思います。

せいすいがあればダメージ計算が普通のエネミーと同じになり、
なければ確実にダメージが0になるように設定します。

それではダメージ計算のところを改変しましょう。


# ダメージ計算
DEF D_BATTLE_DAMAGE A_ACTOR

  VAR DAMAGE = 0

  IF A_ACTOR == 0 THEN
    IF G_EV_ID_NOW != 5 THEN
      DAMAGE = G_PLAYER_STATUS[3] - ( G_ENEMY_BATTLE_PARAMS[3] + ( G_ENEMY_BATTLE_PARAMS[3] * G_BATTLE_GUARD_FLAG[A_ACTOR] ))
    ELSE
      IF G_HOLY_WATER THEN
        DAMAGE = G_PLAYER_STATUS[3] - ( G_ENEMY_BATTLE_PARAMS[3] + ( G_ENEMY_BATTLE_PARAMS[3] * G_BATTLE_GUARD_FLAG[A_ACTOR] ))
      ELSE
        DAMAGE = 0
      ENDIF
    ENDIF
  ELSE
    DAMAGE = G_ENEMY_BATTLE_PARAMS[2] - ( G_PLAYER_STATUS[4] + ( G_PLAYER_STATUS[4] * G_BATTLE_GUARD_FLAG[A_ACTOR] ))
  ENDIF

  # 最低でもダメージは1入るようにする
  IF DAMAGE <= 0 THEN
    IF G_EV_ID_NOW != 5 THEN
      DAMAGE = 1
    ELSE
      IF G_HOLY_WATER THEN
        DAMAGE = 1
    ENDIF
  ENDIF

  ~~~ 省略 ~~~

END

プチコン表示結果その2

ボスのIDが5なので現在のイベントIDを元に分岐させています。

5じゃないときは通常通りに計算します。

5の時で聖水があるときも同じように計算します。

聖水がないときだけ、ダメージを強制的に0にします。

そして、最低でもダメージが1にする仕様の部分でも同じ分岐を作ります。

この時もIDが5のときにせいすいの有無で最低の数値をきめます。

5でせいすいがない時だけダメージ補正はせずに0のままにします。

これでボス戦の実装ができました。

スケルトンを倒してせいすいをとらないとクリアできない仕組みにしました。

ゲームクリアを作ろう

ボス戦が実装できたので、倒すことが出来るようになりました。

ボスの後ろにある宝箱をとればゲームクリアです。

最初にイベント8個目の設定もしましたので、せいすいの次のアイテムの番号を渡しました。

もう一つのアイテムも実装しましょう。


# アイテム名用
VAR G_ITEMS_NAMES_LEN = 3

# アイテム名リスト
@ITEMDATA
DATA "ライフポーション", "せいすい", "ルビーのゆびわ"

これでボスの後ろの宝箱からルビーの指輪を取る準備が出来ました。

プチコン表示結果その3

実際には取得する必要はありませんが、せいすいを取ったときと同じように分岐させるためです。

VAR G_HOLY_WATER = FALSE


# イベントキュー取り出し
DEF D_SHIFT_EV_DATA
  VAR TYPE = SHIFT(G_EV_QUEUE)
  VAR EVENT = SHIFT(G_EV_QUEUE)
  VAR RESERVE = SHIFT(G_EV_QUEUE)

  IF TYPE== 0 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 1 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 2 THEN
    IF EVENT == 0 THEN
      INC G_PLAYER_STATUS[7], RESERVE
    ELSEIF EVENT == 1 THEN
      G_HOLY_WATER = TRUE
    ELSEIF EVENT == 2 THEN
      G_SCENE_FLAG = 5
    ENDIF
  ELSEIF TYPE == 3 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 4 THEN
  ~~~ 省略 ~~~
  ELSEIF TYPE == 10 THEN
  ~~~ 省略 ~~~
  ENDIF
  ~~~ 省略 ~~~
END

シーンを強制的に変更します。

まだシーン5はつくっていないので、そこをクリアしたときのシーンにします。

ゲームクリア用のシーン分岐を作りましょう。

# シーンの大元
DEF SCENE_PARENT

  IF G_SCENE_FLAG == 0 THEN
    D_CTRL_MAP_MODE
  ELSEIF G_SCENE_FLAG == 1 THEN
    IF G_EV_Q_FLAG == 0 THEN
      D_SHIFT_EV_DATA
    ELSEIF EV_Q_FLAG == 1 THEN
      D_EV_STOP_A_BTN
    ENDIF
  ELSEIF G_SCENE_FLAG == 2 THEN
    D_STATUS_MODE
  ELSEIF G_SCENE_FLAG == 3 THEN
    D_BATTLE_MODE
  ELSEIF G_SCENE_FLAG == 4 THEN
    D_GAMEOVER_MODE
  ELSEIF G_SCENE_FLAG == 5 THEN
    D_GAMECELAR_MODE
  ENDIF

  D_BTN_PRESS
  D_BTN_PRESS_COUNT

END

これでルビーの指輪の宝箱を開けたらシーン5に移動するようになりました。

シーンを変更出来たので、次にゲームクリアイベントを作ります。

これはゲームオーバーの処理を流用して簡単に作れます。

# ゲームオーバー用
D_GAMEOVER_SETUP
# ゲームクリア用
D_GAMECLEAR_SETUP



# ゲームクリアモード
DEF D_GAMECLEAR_MODE
  D_GAMECLEAR_PROCESS
END

# ゲームクリアセットアップ
DEF D_GAMECLEAR_SETUP
  SPSET 110, 67
  SPSET 111, 79
  SPSET 112, 78
  SPSET 113, 71
  SPSET 114, 82
  SPSET 115, 65
  SPSET 116, 84
  SPSET 117, 85
  SPSET 118, 76
  SPSET 119, 65
  SPSET 120, 84
  SPSET 121, 73
  SPSET 122, 79
  SPSET 123, 78
  SPSET 124, 83
  SPSET 125, 33

  SPVAR 110, 1, 0

  FOR G_I=110 TO 125
    SPHIDE G_I
    SPVAR G_I, 0, (G_SZ*4) + (G_I-110) * (G_SZ) - (G_SZ/2)
    SPOFS G_I, SPVAR(G_I, 0), 120
    SPCOLOR G_I, RGB(0,255,255,255)
  NEXT
END

# ゲームクリア処理
DEF D_GAMECLEAR_PROCESS
  VAR A = SPVAR(110,1)
  IF A <= 254 THEN
    INC A, 2
    IF A >= 255 THEN A=255
    SPVAR 110,1, A
    FOR G_I=110 TO 125
      SPSHOW G_I
      SPCOLOR G_I, RGB(A,255,255,255)
    NEXT
  ENDIF
END

セットアップを最初に実行しておいて後はシーン移動すれば、
ゲームオーバーと同じようにフェードインで文字が現れてゲーム終了です。

プチコン表示結果その4

簡単ですね。

プチコンRPG制作講座の振り返り

これでプチコンBIGによるRPG制作講座を終了します。

本当は昨日終わらせようとしたのですが、精神的に辛かったのでバトル調整だけにしました。

今回は1画面RPGですが、基本的なRPGはこんな感じで作っていきます。

しかし私の作り方は色んな作り方の中の1つにすぎません。

プログラミングに慣れて来たら色々なコードの書き方を覚えるので、
今回の私の講座で非効率な部分が見えてきたならプログラミングレベルが上昇しています。

この講座はプチコン4が出る前に作ったので、プチコンBIGの仕様になっていますが
同じように作ればこの講座でプチコン4で再現できます。

そして色々改善できるようにもしています。

すばやさでゲージの速度を変更したり、ダメージの計算式を変えたり色々できます。

基本的な仕組みを作ってしまえばあとは好きなように作れます。

──これ以降プチコンBIGの講座を書くことはあまりないと思います。

需要的にプチコン4のほうがありますので、今後は基本的にプチコン4の講座となります。

しかし今年は来年のイベントでゲームを販売したいのでペースは落ち気味かもしれません。

それではここまで見ていただいてありがとうございました。

色々抜けているコードは少しずつ修正していきます。