投稿記事

ローグライクRPGの記事 (4)

梔子 2023/04/19 14:32

【ゲーム制作日記#11】進捗と苦労した部分の話。次の作業予定【RPGツクールMZ】

どうも、こんにちは。
毎日進んではいますが、進捗はそんなに予定通りは行ってません。
新しいもの実装するたびに色んなバグが出てきて想像以上に時間がかかってます。
前回から4日くらいでこんな感じのものを実装できたよっていう報告です。

戦闘システムの進捗

バフデバフの実装と敵のバリア、バリアゲージ実装ができた。

まだ仮だが、動画の通りウィッチレイスは奇数ターンにバフで自分の攻撃力をアップ、ラミアはバリア貼りと攻撃をランダムで、アイススライムはこちらの攻撃力を下げるデバフを打ってくる。

苦労した部分1

まずダメージ計算を全てコモンイベントでやっているので、ターゲットした相手がどのデバフ状況であるかを調べる事に苦戦。
最初はプラグインを作ってやろうとしていたが、コモンイベントで事足りることに気づいてコモンイベントで管理することにした。


最終的にはそんな難しくなく、そのまんまの実装になった。
やな様のBeforeCommonプラグインを利用し、ターゲットのIDを変数83に入れてターゲット対象が敵か味方か判定し、それに応じてデバフの付与をisStateAffectedで調べてダメージ倍率を計算している。
素の状態のままだとRPGツクールの変数に小数を入れると整数になってしまうので、トリアコンタン様の変数小数演算プラグインを使っている。
デバフ時の倍率はこれから作るレリック等で変更可能にしようとしているため、変数92~95で倍率を管理している。
例えば炎症デバフの場合は今は150が素で入っているので、100で割って、1.5倍するような計算にしているが、レリックの効果で1.75倍にしたい場合は敵炎症倍率変数の92番に175と代入すればよい。

苦労した部分2

バリアを張った敵に対して、バリアグラフィックの表示と敵1体ごとのバリア数値管理。戦闘開始時に相手の位置を全て変数で取得し、それに応じてごにょごにょすることにより解決した。
戦闘開始時に下記のようなコモンイベントを動かしている。


ci-enにコード記入するとぶっ壊れて投稿できなくなるので、画像ですいません。

ちなみに、少し見ればわかると思うがこの仕様だと8体以上の敵が出ると、X座標がY座標の領域まで来てしまうためバグってしまう。
私は多くて6体までということに決めているので、このような仕様にした。

敵が増えれば増える程、バリアゲージ、魔力アップアイコンなどの数を増やさなければいけないことと、画面の狭さ的にも基本3体くらいが限界のため、6体をマックスとした。

苦労した部分3

バフデバフ状況によって、敵の行動予測、ヘルプテキストを変更する事。
敵の行動予測はtomoaky様のTMFutureSight.jsを使用させていただいているが、大分改変させてもらっている。TMFutureSight.jsのプラグイン内でデバフの判定をし、それに応じて苦労した部分1と同じようなダメージ計算を行ってテキスト化している。

また、文字を作成している部分を計算してもリアルタイムで反映されてないため、プラグインのupdate部分で文字を変更するようにし、リアルタイムでデバフのダメージ計算が反映されるようにした。

主人公側のヘルプテキストは更に無理やり実装している。
rmmz_window.jsに直接このように書きこんでいる。


カードは全て内部ではアイテム扱いなので、setItem関数にて処理。
アイテムタイプIDが1かつ取得TP量が1の場合はダメージ系カードとして判定して、計算し、取得TP量が2の場合は防御系カードとして判定している。それ以外は特にヘルプテキストをいじらずそのまま処理している。

ヘルプテキスト内から上手く数字を取り出すことができなかったため、parseInt関数を使いテキスト内の先頭の数字を取り出す処理をしてゴリ押ししている。
なので、全てのカードのヘルプテキストで最初に出てくる数字はダメージやバリア値にしなくてはいけない。

もっといい方法を思いついたらおそらく変わると思う仕様。

苦労した部分4

手札を引いた順番通りに手札に配置すること。
先ほども言ったが、カードは全て内部ではアイテム扱いなのである。RPGツクールの仕様だと同じアイテムは一つにまとまり、その中で個数の情報を持って管理される。
つまり、同じアイテムの中で並び順も糞もないのである。
まずデフォルトの状態だと同じアイテムは重なって個数表示され、アイテムIDの若い順に自動で並べられてしまう。
まず、アイテムが重ならないようにするのにノリミツ様の『NLM_ItemDilution.js』を使用させていただいた。しかし、アイテムIDの若い順に並べられてしまう問題は解決しなかったため、ゲーム内コモンイベントでドローした時にドローした順番をゲーム内変数に保管し、その情報を元に並び替えるように改変した。
改変したが問題のある仕様であり、同じアイテム内でどのアイテムを使用したかはどう頑張っても取得できなさそうなため、同じアイテムが複数手札にある場合は一番左のアイテムから使用されていく仕様になっているのが気持ち悪い。が、仕方ない。

例:手札が『ファイア バリア ファイア ファイア ファイア』となっている時、3,4,5番目のファイアを使用しても1番目のファイアが消えてしまう。

ここまで来て、そもそもカードをアイテムとして管理せず自分で作れば良かったと後悔もあるが、アイテムであることでかなり楽出来てる部分もあるので仕方ない。
というかそこまですると、本当にRPGツクールを利用している意味が会話部分だけになりそうである。

次の作業予定

前回言ったマップ作成システムも作りたいが、先にSlaytheSpireで言うレリック的な物を実装しようと思っている。これもバフデバフの一種のようなものなので。
これはRPGツクール内の武器か何かとスイッチでリンクするように所持を管理して、実装しようかなと考え中。
例:武器1を所持していると、武器1所持スイッチがオンになり、武器1所持スイッチがオンの場合は炎症デバフ倍率1.75倍になる。
また、手に入れた順番もできれば変数で管理し、画面の左上に入手した順でアイコンを表示したい……。

これも実装するたびに今までの部分がバグったりするんだろうなぁ。
目標としては4月中に戦闘、マップ、報酬画面のゲーム部分を完成させること。
出来ればボス敵やバランス調整も。
元々は1作目のため、4月中にゲーム自体完成させるくらいのつもりで始めたが、戦闘システムに凝り出したのが終わりの始まりだった。
今は5月中完成目指してます。

それではバイバイ。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

梔子 2023/04/15 15:58

【ゲーム制作日記#10】ステートの重ねがけでターン数が蓄積されるプラグイン【RPGツクールMZ】

どうも、こんにちは。
絶賛毎日制作中ですが、現在もまだゲームシステム部分のコードの修正、改変などで時間を使っています。

大体は自分専用の仕様であったりするので、あまり公開してもしょうがないものなのですが、今回は微妙に需要がありそうで簡単な仕様なので紹介します。

RPGツクールでステートをかけると、ターン数が蓄積されずに設定したターンにリセットされてしまう仕様を、蓄積する仕様に変更するプラグインです。

※本プラグインにより生じたいかなる問題においても、一切の責任を負いかねます。もし使用した方でバグ報告して頂いたら、私の可能な範囲であれば修正するかもしれません。また、他のプラグインとの競合は考えられておりません。

作成したプラグイン

『StateAddMZ.js』
https://github.com/Kuchinashi-W/Plugin/blob/main/StateAddMZ.js

ステートを重ね掛けしたとき、ターン数を初期化せず蓄積するように仕様変更致します。指定したステートは対象外にして往来の仕様のまま使えます。
また、メモ欄に記入することで本来の継続ターン数に追加のターン数を付与することが可能になります。

使用例の動画

炎のステートを継続ターン数1、氷のステートを継続ターン数2に設定し、
氷のステートは対象外に設定しているため、蓄積されない。
テストとして設定しているステート付与攻撃を3回撃った結果、炎3氷2となっている。

ステートが横ならべに表示して残りターン数が表示されているものは
NUUN様の『NUUN_StateIconSideBySide.js』プラグイン
を使用しております。

元コードの処理の場所

改変箇所を書く。
『プロジェクト→jsフォルダ→rmmz_object.js』内にあるresetStateCounts関数で、ステートターンを毎回代入してリセットしているので、ここをプラグインによって処理を追加している。
実際にコードを書いたらなぜかCi-enで記事が投稿できないので、省略する。

ゲームの進捗、予定

戦闘処理の部分は残りはステートの中身処理くらいで終わりそう。
『このステートがついてる時はダメージが1.5倍』のようなステートを作るのに結局自分でプラグインを作ることになりそう……。

これが終わったら次はマップ処理の作成に移る予定である。
試しに一つ作ってみたマップ画像がこちら。


骸骨がバトル、黒い骸骨が強敵、?がランダムイベント、Gが商店、焚火が回復、プレゼントが特殊アイテム取得
一番左の部屋3つから好きな部屋を1つ選んでスタートして、線が繋がってる先に自分で選んで進めるという想定で考えている。
このようなマップをダンジョン1つにつき多くて10個ほど用意して、ダンジョンの入り口に入る時にランダムで1つ渡すようにしてダンジョンを組み立てるようなシステムを作る予定。

後は戦闘終了時の報酬の処理を作成すれば、ゲームの遊び部分は完成になる。

あまりにもダンジョン部分に力を入れ過ぎてしまったため、メインヒロインを一人に減らしてゲーム中のダンジョンエロのボリュームを増やそうか検討中。

?のランダムイベントマスで回復して貰ったりカードを貰ったり下の娘とエロイベントが起きたり等々妄想中。

それではまた。


ウンディーネちゃん(NovelAI絵)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

梔子 2023/04/09 04:32

【ゲーム制作日記#09】カードバトルRPG、ゲームシステム進捗【RPGツクールMZ】

どうも、こんばんは。
ご無沙汰しておりました。

毎日ゲームシステムの実装についてアレコレ考えて試していたら、気づいたら1週間経っていてビックリです。書きたいことはいっぱいあるのですが、作るのが楽しすぎてとりあえずそちらに集中しております。

前回書いた妄想のゲームシステムが大分形になってきたので、現在の進捗状況を動画にしてみました。

もろSlay the Spire風ゲームです。
自分でターン終了するまでマナがある限り何回もカードを使えます。
山札が空になると、自動的に捨て札が山札に戻ります。
ターン終了した時に発生してる謎の攻撃は一応PTに存在して自動戦闘にしている主人公君です。

前回の日記では、RPGツクールの戦闘をカードバトルにするのは大変そうなので見送って簡略化したもので実装する予定でしたが、いざゲームシステムを弄り始めると面白くて面白くて……。
気づいたら、プラグインの改変や直接コードをいじってここまで辿り着いていました。

いざ実装してみると、カードのイラスト大量生産でAIのメリットをかなり生かせそうなので良かった。戦闘画面も華やか。
ここから何十枚とカードの実装をしないといけないですが……。

本格的に作り始めてから20日目くらいですが、やればやるほどやることが出てきて楽しい!
しかも1人で制作しているので、完全に自分のペースで作業が出来るのもまた面白いです。

作ったシステムの解説もいつかしたいですが、もう自分でも何が何やらで、力押しで解決してる部分が多すぎて人に紹介できるものじゃないですね……。

短いですが、おやすみ~。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

梔子 2023/03/31 22:02

【ゲーム制作日記#08】ダンジョン攻略、RPGゲーム部分のシステムの妄想【RPGツクールMZ】

どうも、こんにちは。

メインストーリー等のテキスト部分が思うように進まずにぐだぐだしているので、頭の中にあるゲーム部分のダンジョン攻略、戦闘システム等について書き起こして実装の仕方を考えてみる。
テキストもいざ書いてみると難しいことだらけ……

現在の戦闘の仕様

超初歩的なシステム

今実装している戦闘はRPGツクールの初期状態のフロントビューのターン制戦闘であり、ダンジョン内のシンボルエンカウントのモンスターに触れると戦闘という超初歩的なスタイルである。
戦闘部分を標準にしていた理由は、「ありとあらゆるノウハウが一切ない1作目から気合を入れ過ぎると力尽きてしまい、完成しないかな」という想いが強かった。

その代わりと言っては何だが、成長システムとして砂川赳様の多重職業によって自由度の高い成長システムを実現【RPGツクールMZプラグイン】を使わせていただき、ジョブ的なものを成長させて覚えたスキルやパッシブスキルをコスト内で付け替えできるようにして少しでもゲーム性を出そうとしていた。

メリット

  • 標準の戦闘システムを使うのでその部分は実装する必要がない。
  • ダンジョンの実装もマップに適当に敵を配置するだけなので楽。
  • プレイヤー側も慣れ親しんでいるので特に説明もいらず、とっつき易い。

デメリット

  • ダメージの計算式でのバランス調整が難しい、直感的ではない。
  • レベルアップのバランス調整も難しい。
  • エロRPGなのでレベル上げの苦労などをさせたくはないが、バランス調整がうまくいかないとただボタンを連打しているだけのゲームになりやすい。
  • バランスがちゃんとしていても面白いのかよくわからないものに対して苦労することへのストレス。(制作のモチベーションに関わる)
  • まとめるとゲーム性を出すのが難しい。

解決法を考えてみる

  • ダメージのバランス調整が難しい。
    →計算式でバランス調整が難しいなら、敵もプレイヤーも基本防御力を0にし1~2桁の固定ダメージでのバトルにすればよい。(戦略性はあるシステムにする)
  • レベルアップのバランス調整も難しい。
    →レベルアップの概念を無くし、拠点に持ち帰った経験値でパッシブアビリティ的な物を選んで強化できるシステムにすればよい。これにより際限なくレベルアップしステータスが上昇することを抑え、プレイヤーの上限の強さを調整し易くなる。

新しい戦闘の仕様(妄想)

Slay the Spire風

これらのことを踏まえて、コマンドバトルのままなんちゃってSlay the Spire風(※)のシステムを実装できるかを考えた。

Slay the Spire
今更私が説明する必要ないかもしれないSteamの超有名ゲー。
めっちゃ面白い。

私が今までプレイした同人エロゲでは、以下の2つの作品がカードバトルも再現したSlay the Spire風の戦闘システムであった。非常に面白かったのでオススメ。

サキュバス☆コネクト!!

Lost Chapter

Slay the Spireから取り入れたい要素

  • 戦闘で1ターンに好きなだけ行動できるようにするが、1つ1つの行動をスタミナ(エナジー)消費制にする。
  • 相手の行動を予測表示にし、防御等の価値を上げて戦略性を生む。
  • HPの価値を高めるために、ダンジョン攻略中のHP回復行動を貴重にする。
  • ランダムなダンジョンとランダムなイベント、どのルートを通るかある程度自分で選べるようにマップを用意。

実装方法を考える

『スタミナ(エナジー)消費制』の実装について

この仕様の実装は既にあるプラグインのおかげでそこまで難しくなさそうだ。

1,Ruたん様のTorigoya_QuickSkill を使わせていただき、ターン消費なしスキルを実装し通常攻撃も全てコレにし、消費MPを設定する→MPを消費しきるまで行動し放題になる。
2,毎ターンMPを全回復する設定をアクターにつける。

この2つの実装で、疑似的なスタミナ(エナジー)制にできるだろう。
ただし、このままでは強いスキルを打つだけのゲームになってしまうため、そのターンにスキルを使用できるかをスキルごとに乱数で管理し、カードバトルのランダム制(ドロー)を疑似的に再現する。


例:
主人公の最大MP3

スキル【通常攻撃】
100%の確率でスキル欄に表示され6ダメージ。消費MP1

スキル【正拳突き】
60%の確率でスキル欄に表示され15ダメージ。消費MP2

スキル【力を溜める】
30%の確率でスキル欄に表示され次の攻撃のダメージを2倍にする。消費MP1

スキル【防御】
100%の確率でスキル欄に表示され6ダメージ防ぐ。消費MP1

このような形でスキルを実装していき、毎ターンランダムな選択肢から最適解をプレイヤーが考えて行動する楽しさを用意する。

確率でスキルを使用可能にする処理は、さすらいのトム様のスキル使用条件拡張 - ExtendSkillCondition.jsの変数が~より高い時の条件を利用させていただくことで実装可能だと思う。
また、変数の中身に乱数を入れる処理を戦闘開始時とターン終了時に行う。

戦闘開始時に乱数を入れる処理はmunokura様の戦闘開始/終了コモンイベントMZプラグインを利用させていただくと、戦闘開始時にコモンイベントで変数に乱数を代入することができそうだ。

『相手の行動の予測表示』の実装について

tomoaky様のエネミー行動予測 - TMFutureSight.jsを利用することにより行動は表示可能だが、こちらはRPGツクールMV用のためMZで動かすと一部機能が使用できなかった。

シンプルなコードのようなので、出来るか分からないが内容を見てMZ用の改変に挑戦する予定。
もしコードの改変が上手くできなくても、力技になるが敵用のスキルとしてスキル名を「攻撃 6」、「攻撃 10」のようなスキルをたくさん用意し、攻撃ダメージまで予測できるようにすることは可能。

『HPの価値を高める』の実装について

ダンジョンに持ち込める消費アイテムを1度に3個等に制限することで、消費アイテムの価値を上げる。また、強さのバランスも調整しやすくする。
ダンジョン内で手に入れたアイテムでやりくりすることでローグライク感を出す。
またダンジョンのランダムイベントの当たりとしてHP回復を実装する。

『ランダムなダンジョン』の実装について

完全に動的なランダム生成にすると、難易度調整込でRPGツクールでの実装が難しいため10パターンくらいマップを用意してそこからランダムで選ばれる疑似的なランダムダンジョンとする。
起きるイベントや出てくる敵に関してはランダム性を持たせ、同じダンジョンマップを引いたからといって必ずしも同じことが起きるわけではなくする。

この仕様にすれば、特にプラグインを使わずとも実装可能だろう。

考えてみた感想

実際に遊んで面白くなるかはわからないが、作るスキルの内容などを考えるだけでワクワクするので戦闘面を作る楽しさが自分にとって増加すると思う。

作ることが楽しい仕様の方が結果的に速く完成する可能性も高いので、今日明日から実際に実装に向けて動いてみる。

Slay the Spireをやったこと無い人は、ゲームの全体像がピンとこないかもしれないが完成したら実際のゲームの流れを動画か何かで公開したい。

今日はそんなところで終了。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

限定特典から探す

記事を検索