2021年12月29日水曜日

【ウディタ】イルシェラート(仮称)の制作記録(3)戦闘・移動AIの詳細

 以前、「詳細は省く」なんて言ってましたが、制作が長期化しそう(たぶん来年公開も無理だろう)と思うので、自分が忘れないよう記録を残しておこうと思います。
今もだいぶ忘れているけど……。
アクションRPGをシステム自作でやろうという人の参考にもなれば。

ざっくりですが、概要は以下の記事を参照。話の流れでこの記事と一部内容重複はします。

戦闘・移動AIは、以下の流れで処理されます。
1.『特殊行動』判定
2.『技能使用/予約技能使用』判定
3.『移動』判定

『特殊行動』判定

これは、以下6項目10条件のうち1条件を指定して設定できる、いわゆる『固定行動』を実行するか判定する処理です。
①自身の残りHPが一定%以下/以上
②自身の残りSPが一定%以下/以上
③行動回数がn回目
④敵との間合いが一定以下/以上
⑤味方との間合いが一定以下/以上
⑥特定の状態が付与された
この特殊行動は、1つのAIに4つまで設定可能で、以下4つのどれかを実行します。
①AIを切り替える
 1つのキャラに1つのAIではなく、複数のキャラが1つのAIを使用できるようにしたことで実装できた機能です。いわゆる『HP減ったから本気出す』やつを実装するための機能。
 道中の雑魚敵は近距離型、遠距離型といったふうにざっくり作っておき、細かい部分の差別化はスキルやステータス等で調整するというふうに設定していますし、逆にボスは1体で4つ以上使う場合もあります。
②指定技能発動
 特定のタイミングだけ撃つ強力な技の設定用です。
③技能セット切替
 NPCに4スキル/1セットを5セット設定可能で、そのスキルセットを任意のものに変更する機能です。
 『ケルリート』までは、使用技能を1つずつ任意のものに変更するしかなかったですが、設定がめんどうくさかったので、実装しました。
④マップEv起動
 疑似マップイベントIDを指定し、そのイベントを実行する機能。増援はこの機能を使用して実行します。

これら特殊行動は、1度使用すると使用できなくなりますが、仕様上AI切替え後は使用可能になります。
AI切替えを含むAIの設定方針は、あえて名前をつけるなら「一方通行」「循環」の2パターンあります。
「一方通行」は、AI①からAI②に切り替え後、AI②からAI①には戻りません。一般的なコマンドタイプのRPGでも同じだと思います。
「循環」は、AI①からAI②に切り替え後、AI②からAI①に戻ることができます。例えば、HP50%以下の条件を満たしAI②に移行し、その後自然回復等によりAI①へ戻る条件(たとえばHP55%以上)を満たしたらAI①へ移行する……といったふるまいをします。『ケルリート』でいえば、エハルト地下墓地の魔物のすみかボスがこのタイプのAIで動いています。

『技能使用/予約技能使用』判定

読んで字のごとくですね。『レイユウサイ』『ケルリート』と同じ確率ベースですが、状況に応じて確率を可変させられるようにしました。
①~⑤の順番で判定処理をします。

①【確率】技能使用キャンセル判定
 端的に言えば手加減させる処理です。
②技能使用間合い内の敵味方が存在するか確認
 範囲内にいない場合は空振りになるので使わないようにしています。
 (空振り分の負荷を低減させたい目的もある)
③【確率】回復技使用判定
④【確率】補助技使用判定
⑤攻撃技使用判定

③、④について、新規に導入した概念は「重視度」。回復技使用率は自身の残HP%で使用率に上昇補正をかけることができます(低ければ低いほど補正量も増える)し、補助技(強化)使用率は補助技で付与できる状態が自身にかかっていない場合に使用率上昇補正がかかるようになっています。
また、ある特定の種類(攻撃、補助、回復)の技が複数、同一スキルセットに登録されていた場合は、間合い、かかっている状態等を考慮して使い分けるようになっています。例えば、近接攻撃技と遠距離攻撃技の2つを同一スキルセットに登録していた場合、敵が近接攻撃技の当たる範囲内にいれば近接攻撃技を選択しますし、そうでないなら遠距離攻撃技を選択します。

『予約技能使用』は、スキル発動前にジャンプといったアクションを挟む等、すぐにスキルを発動しないとき、時間がきたら後回しにされたスキルを100%の確率で発動するだけの処理です。

『移動』判定

名前の通りの処理です。
半マス単位からドット単位(処理の関係で2ピクセル単位ですが)移動に移行した関係で、戦闘システムは大きくは変わらないのに処理方法から検討し直し、コモンは書き直しとなった処理です。結局条件分岐のゴリ押しがベースになってしまいましたが……。

①【確率】移動キャンセル判定
 技能使用判定同様、手加減用の処理です。
②ターゲット確認
 移動先を決めるための基準となる相手をDBから取得してくる処理です。
 ターゲット選定条件は、任意の範囲内に行動キャラの敵属性がいる場合は敵を参照、いない場合は味方を参照します。そのうち任意の残HP%以下のキャラを参照する設定をしていれば判定し、任意の残HP%以下のキャラがいればそのキャラを、いなければ最寄りのキャラをターゲットとします。
③(回避フラグONなら)障害物回避
 障害物回避先の座標が登録されていれば、そこへの移動を実行します。
 ハマり防止のために、移動が完了していない場合でも、一定時間経過したら指定座標をリセットします。
④移動タイプ判定
 ターゲットに対しての間合いに応じて、接近/直角移動/離れるのいずれかを実行します。
⑤通行可不可判定
 ④実行時、移動方向に地形障害物またはキャラクターがいるか判定します。
 いなければ、そのまま④を実行します。
 いるならば、障害物回避先座標を設定し、次回以降で移動を実行します。

2021年11月29日月曜日

【ケルリート】なるべく低めのレベルでプレイしてみるやつ

 Twitterでやってたやつのまとめです。

ケルリートの洞窟

ケルリートの洞窟ボスですが、まっすぐボス部屋へ向かう進路上にいる雑魚敵を掃討していくと、いい塩梅のレベルになるよう調整してあります。
ただ、なるべく低めのレベルでということで、ここは全スルーで挑戦。
Lv1では強い一撃や火あぶりなどといった、攻撃系前提パッシブ(剣術の鍛錬、魔道の心得)Lv1で取れるスキルまでしか取れず、TPの関係で自然回復パッシブと両立不可 。正直言ってだいぶハード。
 

イトバの森

これがもうキツイ。さすがにLv2で挑む気にはならず、ちょっとだけ上げてLv6で挑戦。
計算機上では最大火力を食らってもギリ耐えする最低ラインがLv6です。 実際耐える。
このあたりで自然の加護(SP自動回復量アップ)を取りたいところですがTPは足りず。
火あぶりではあまり不自由なく回っていたものが、安全をとって氷柱の守りに変えたら途端に苦しくなりました。わずかな消費SPの差が顕著に出てきますね。
ぐだっている様子は動画で観れます。

涸れ井戸

ここは特筆すべき点がないですね。普通です。 火焔ばしらつえーってくらい。
ちなみに難易度むずかしい限定で出てくる難敵「フォルトカイト」は地形ハメで倒してます。自由にさせてどうにかするのは結構しんどい。

エハルト地下墓地

 ついにこのプレイの重要スキルが登場。「吸魂術法」です。
これは状態付与スキルで、与ダメージの一定割合ぶん自身のHPを回復する状態を付与・・・だけではなく、しれっと最大HPも強化されるスキル。1枠割くだけの強さは実際あります。
あとは普通ですね。バフかけて殴るだけです。

対戦会

ツイートがすべてを語っています。 消化試合だったということです。
付与呪文とは、最大HP強化状態付与の「力戦の誓い」。最大HP強化効果持ちの吸魂術法との掛け合わせが非常に強い。バフは乗算なので……。

ミューダ洗掘洞

ちょっとだけレベルが低いですね。このボスは過去のバージョンアップ でかなり強くなってます。最初が弱すぎたんだけど。
吸魂術法の前提には雷属性攻撃スキル「稲妻走り」がありますが、ここで活躍。場効果変わったら火焔ばしらに変更。

フェンミの洞窟

リーズは正直言って強い。ちょっと盛りすぎたかもしれない。弱くするつもりもないけども。
火力特化にすると、難易度むずかしい限定のおかわりが入る前に決着がつくこともありますが、残念ながらそこまで火力出ないので、おかわりを食らってます。
雷鳴招来の採用理由は、火焔ばしら撃ってくる地形を壊しやすいのと、乱戦状態で適当に撃っても当たるから。

ティオライ氷穴

いわゆるラスボス。Lv53だと最大HP強化が必須。
他にも確定数を考えるとダメージ軽減は欲しいし……等考えて、ダメージ計算機(作者の特権)を使ってビルドを練って挑戦。
回復は吸魂術法で……と思っていたものの、無敵時間の関係でほしいときに当たらないことがあり、ちょっと不安定。
魔道の知識には「傷をふさぐ」を装備したほうが安定するでしょう。
通常プレイでも十分優秀。法陣:災厄を2hit食らっても生きていられるのが強い。
重要スキルは「魔道の衣」。「HP被ダメージを一定割合軽減し、軽減した分SP回復」という動作をするため、被ダメージ軽減パッシブとして使える。法陣:災厄を軽減できる数少ない方法です。

2021年11月26日金曜日

【ケルリート】v1.0.33を公開しました

 約1年ぶりのアップデートです。
DLは、
でできます。好きなほうを選んでね。

内容は、以下の通りです。

1.できごと「月日の影」が完了しない不具合の修正
2.門番長イベントのひとつが文字化けしている不具合の修正
3.イベントフラグ制御処理の一部機能の不具合を修正
4.イベントを3件追加
5.追加詠唱型付与呪文の動作改善

1.できごと「月日の影」が完了しない不具合の修正

完了設定をしたはずが行方不明になってました。
条件を満たしたら完了するようにしました。
不具合が発生しているデータは、アップデートすると完了します。

2.門番長イベントのひとつが文字化けしている不具合の修正

イトバの森入場可能になったあたりで出現する、門番長のイベントが文字化けしていて読めない不具合を修正しました。

原因は、イベントテキストデータが格納されているテキストドキュメントの文字コードに、ウディタで使用できないものが設定されていたためです。
テストプレイ時も読んだと思ったんですが、気付いていなかったあたり読んでいなかったのだと思います。ほんとすみません……。

なお本アップデート以降実装されるテキストは、保存時のデフォルト文字コードをShiftJIS(ウディタはこれでないと読めない)に設定したVSCodeで執筆されていますので、ウディタの仕様が変わらない限り文字化けは無くなるはずです。

3.イベントフラグ制御処理の一部機能の不具合を修正

これはケルリートで追加した「リレー判定」機能を指します。
この機能は、指定したEvの起動条件を満たしたとき、指定元のEvが消滅する動作を提供するものです。
すなわち、EvAに、リレー判定機能でEvBを指定すると、EvBの起動条件を満たしたときEvAが消滅します。
この機能、欲しいほしいと思って実装したわりに、ケルリートではちっとも使われておらず、今回のアップデートで初めて使おうとしたときに正常動作せず不具合が発覚しました。アホですね。

4.イベントを3件追加

3で言ってた機能を使って、イベントを3件追加しました。
レベッカの看病をしようと思わなければ気付くことはないでしょう。

5.追加詠唱型付与呪文の動作改善

これが今回のアップデートで一番実感できるアップデートかもしれないです。
動作改善とは? と思うかと思いますので、細かく書いていきますが……

改善前
(付与対象技能+付与呪文)
攻撃技+回復技=両方とも効果を発揮する
回復技+攻撃技=両方とも効果を発揮する
攻撃技+攻撃技=付与対象技能だけ効果を発揮する
回復技+回復技=付与対象技能だけ効果を発揮する

問題は下ふたつで、同じタイプの技を重ねると、付与対象技能の命中後に発生するダメージ無効時間が邪魔して、付与呪文の効果が思ったように発動しません。

改善後は、いずれの組み合わせでも、付与対象技能のダメージ無効時間に邪魔されず付与呪文の効果を得ることができます。
これは、ダメージ無効時間の付与タイミングを調整することで実現しています。
v1.0.33からは例えば「斬る+火の追撃」の組み合わせで攻撃した場合、

「斬る」が命中、ダメージ付与
「火の追撃」発動、攻撃エフェクト表示、当たり判定実行
命中すればダメージ付与し、「火の追撃」のダメージ無効時間を付与
付与対象技能「斬る」のダメージ無効時間で命中した相手のダメージ無効時間を上書き

といった動作をします。
改善前は、火の追撃が発動する前に斬るのダメージ無効時間が相手に付与されていましたので、火の追撃は当たり判定で弾かれていました。

この処理変更で、有効な付与呪文の組み合わせは増加したはずです。射程をうまく合わせる必要がありますが、火力は大きくアップします。
状態付与系の付与呪文同様、追加詠唱系もスキルレベルは付与対象技能のスキルレベルに依存しますので、ぜひ鍛えたスキルに付与して試してみてください。

次回以降のアップデートは未定ですが、次回作の内部処理の改良等があればそれを反映していきたいと思っています。

2021年10月24日日曜日

【ケルリート】ダメージ計算式

RPG作っていたらいつかはしたいなと思っていた、ダメージ計算式の紹介をします。

基本形は2作目『レイユウサイ』で完成していて、『ケルリート』の計算式にはそれを少し調整したものを使っています。

用語

『ケルリート』を遊んだことない人は、以下の単語をこのように読み替えてください。
力:物理攻撃力
知能:魔法攻撃力
生命力:物理防御力
信仰心:魔法防御力

基本式

(固定値+(攻撃側攻撃力×スキル倍率×力・知能依存比率×防御軽減A×防御軽減B×Lv補正B-防御減算))×Lv補正A×耐性補正×クリティカル・ガード補正×難易度補正
※計算結果が0未満の場合、1~5のダメージを与えます。

場効果や付与呪文、パッシブスキルによる補正まで書くと大変なので、ここでは省略しますが、それを除いて計算式全体を網羅したものが上の通りです。
各項については以下に詳細を書いていきます。

1.固定値
技能ごとに設定されている固定値。

2.攻撃側攻撃力
式:攻撃側の力および知能×バフ・デバフ補正

複数ある場合は乗算でかかります。×1.5が2つあったら、×2.25です。
防御側防御力も同様です。

3.スキル倍率
技能ごとに設定されている数値。
力、知能それぞれに設定可能。(設定を変えれば生命力、信仰心にもできる)
ちなみに付与呪文の「スキル威力を上げる/下げる」効果は、この値に加算します。

4.力・知能依存比率
式:力or知能依存スキル倍率/(力依存スキル倍率+知能依存スキル倍率)

たいていはどちらか一方しか使わないですが、「剣を使う魔法攻撃」みたいな謎のスキルを実装するために入れているものです。
どちらも100%ステータスを使えてしまうと強すぎるからね。

5.防御軽減A
式:(100-((生命力or信仰心×バフデバフ補正×力・知能依存比率/4)/(攻撃側攻撃力×力・知能依存比率/50)))/100
※計算結果が0.7未満の場合は、計算結果を0.7とする。
※力・知能依存比率が0の場合は、計算結果を1とする。

内部では反応防御と呼んでいます。最大で30%ダメージ軽減できるってことですね。
スゲー強い攻撃は受け止めるのしんどいですよね? じゃあ防御側の防御能力に対して強い攻撃を受けたら防御力がききづらくしよう! ということで作られた補正です。
4とか50といった定数は、調整用です。深い意味は無いです。

6.防御軽減B
式:((1-生命力or信仰心×バフデバフ補正×防御側レベル/40/500)
※計算結果が0.5未満の場合は、計算結果を0.5とする。

内部では素防御と呼んでいます。最大で50%ダメージ軽減できるってことですね。
こちらはキャラクターの成長に応じて軽減能力が強くなっていくという、いわゆる成長感をブーストする補正です。
バフデバフ補正後のステータスを使う関係で、バフデバフがわりといい仕事します。
40とか500といった定数は、調整用です。深い意味は無いよ。
当たり前っちゃ当たり前ですが、到達想定レベルをもとに調整しています。『ケルリート』ではLv70付近で補正が最大になります。

7.Lv補正B
式:((攻撃側レベル-防御側レベル)/-2+100)/100
※計算結果が0.7未満の場合、計算結果を0.7とする。
※計算結果が1.25超の場合、計算結果を1.25とする。

防御軽減を適用した後のダメージにレベル補正をかけて、数値の過激な変動を抑制する補正。
攻撃側のレベルが防御側のレベルより高いと、ダメージが軽減されます。
これだけだったらよかったんですが、Lv補正Aくんのせいであまり機能していない……。

8.防御減算
式:(生命力or信仰心×バフデバフ補正)/2

防御軽減AとBだけでは(とくに序盤が)弱いので、減算処理もします。

9.Lv補正A
式:((攻撃側レベル-防御側レベル)+100)/100
※計算結果が0.5未満の場合、計算結果を0.5とする。
※計算結果が1.5超の場合、計算結果を1.5とする。 
 
最終ダメージに補正をかけるもの。正直いらんかった気がしている補正ですね。

10.耐性補正
防御側の属性耐性を乗算で反映します。

11.クリティカル・ガード補正
クリティカル発生時、×1.5。またクリティカル発動した場合はガードが発動しない。
ガード発生時、×0.5。前回被弾時と同じ技を食らってガード発動した場合は、×0.33。
ちなみに パッシブスキル(生命の灯火など)のダメージ補正は、この補正の後にかかります。
 
12.難易度補正
難易度ふつう:主人公→敵は×1.2、敵→主人公は×0.8
難易度やさしい:主人公→敵は×1.5、敵→主人公は×0.6

難易度むずかしいは補正ないです。
 
補正爆盛りすぎて扱いづらさがあるのを感じていたので、次回作のダメージ計算式は少し単純になってます。

2021年9月30日木曜日

【ウディタ】テキスト読込みでメッセージを表示する

何番煎じかわからないが、このシステムを作ってから3作完成、1作作成中なので、その経験もふまえて記録を残せたらなということで、書いてみる。

作った背景

作った人のブログを見て、自分もやってみたくなった。
いざ作ってみて使ってみたら便利だったので、もっと便利にしたくなって機能拡張を続けている。
継ぎ足して作られた秘伝のソースなので、コモンの中身は魔境

作ってよかった点

イベント編集ウィンドウがすっきりする。(これが一番大きい)
イベントの編集・修正が簡単になる。
同じテキストを複数箇所で簡単に呼び出せる(あとから読み返せるチュートリアルとか)。
    

しんどい点

コマンドを覚えて打ち込む必要がある(超キツイ)。
ファイル数がとにかくスゲー増えるので、楽な管理方法を考える必要がある
(うちのシステムではファイルパスを一つ一つDBに登録しなければならないので、この作業がとてつもなくだるい。ちなみに、ファイル数は『MoebirinAdventure』で155、『レイユウサイ』で155、『ケルリート』で214)。
呼び出すテキストを間違えると大変なことになる場合がある(フラグ周りとかね)。

システムの構成

1.テキストドキュメント
コマンド行+パラメータ指定(数値、文字列)行という形で記述されている。
コマンド行頭には、コマンド行を示す記号を入れてパラメータ指定行と区別している。
以前はWindows標準の「メモ帳」を使って書いていたが、今はVSCodeで書いている。
2.UDB「テキスト登録」
1.で作成したテキストドキュメントのパスを入れておくDB。
3.コモンEv「テキスト表示」他、補助コモン
2.で登録したテキストを呼出し、表示するコモンEv。
1コモンではさすがにしんどいので、いくつか補助コモンがある。
4.CDB「コマンド一時保存」
テキスト表示前に、このDBへテキストドキュメントのデータを保存する。
正直言って、実装した当初の目的はわすれた。
ただ、バックログ機能で役に立っている(処理の共通化)ので、目的はこれかもしれない。しらんけど。 
 

コマンド記述でできること

コマンド記述で以下の機能が使用できる。大半は補助コモンと他システムとの連携で実現している。
1.テキスト表示
中核の機能。
次回作向けのバージョンでは、名前表示無しの場合は3行、名前表示有りの場合は2行まで同時表示可能。
2.顔グラフィック表示
あらかじめDBに登録した顔グラフィックを呼び出す機能。
高解像度向けの歩行グラフィックをコモンで切り抜いて表示している。
3.音響関係の操作
システムDBに登録されている効果音やBGMを再生できる。
4.ウェイトをかける
微妙な会話の間なんかに使う機能。
5.画面エフェクトをかける
白・黒・赤の画面フラッシュ、トランジション、縦・横揺れエフェクト、暗転処理ができる。
6.コモン呼び出し
指定した名称のコモンを呼び出す。引数も指定可能。
7.イベント操作
指定した(疑似)マップEvを操作(歩行、向き変更)できる。
8.ウィンドウ透過
文字通りの機能。実装したけど正直なところ使ってない。一枚絵背景にテキスト表示とかするのに使えると思う。
9.ピクチャ表示
専用DBに登録したピクチャをプリセット座標(左寄り・中央・右寄り)、指定拡大率で表示する機能。
文字列ピクチャも出せて、文字列は自由に座標を指定できる。
微妙に不便なので改善の余地ありな機能。
10.変数操作
変数呼び出し値で指定した変数に、指定数値を加算または代入できる。
フラグ操作用ですね。
11.背景画像表示
9.ピクチャ表示と似ているけど、こっちは直接フォルダ内のピクチャを指定する。
表示座標は左上X0、Y0で固定。
正直9と統合したい。次回作完成後にそういう整理をする作業をやりたい……。
12.選択肢表示
自作選択肢コモンを呼び出す機能。選択肢は10個まで指定できる。選んだ選択肢に応じて、指定されたテキストを呼び出す。
選択肢の選択後に、選択肢を再表示するオプション付き。チュートリアルとか重要な選択肢とかで使う。
13.変数分岐
変数Aと変数B or 数値が指定条件を満たしているか否かで、次に呼び出すテキストを変化させる機能。
条件は、同じ/以上/以下/超/未満の5種類。
特定のフラグが立っていたらテキストを変化させるのに使う。
14.場所移動
ウディタ標準のマップ移動コマンドと同じ動作をする機能。
移動時のトランジションや効果音も一緒に指定できる。
15.条件起動
指定した変数の指定条件を満たしていたら次コマンド以降を処理し、満たさない場合は終了する機能。
普通のテキスト表示ではあまり使わない。難易度に応じて操作する変数を増やすといった処理をしたいときに使う。13.変数分岐でも同様の処理は可能ではあるけど、これはtxtファイルを増やさず実装可能。
16.別テキスト呼出
指定したテキストを呼び出す機能。
選択肢でテキストを一時的に分岐させるが、差分程度で残りはテキストが共通……というときに使う。
身もふたもないけどコピペでええんちゃう?という感じもしなくはない。
        

コモンEvの機能

コマンドとは別に、コモンEv側の機能として実行可能なものが以下の通り。
1.テキスト直打ちで表示する
1つのコマンドしか使えない(テキスト表示でもBGM再生でもなんでもいい)が、コモンEvの引数指定欄に直打ちして実行できる。
2.バックログ機能
文字通りの機能。画面いっぱいに出るのではなく、メッセージを1つ1つ遡っていくタイプ。
テキスト読ませるゲームだったら怒られそう。ここも今後改善したい。
ちなみに選択肢表示中にも使える。
3.オートモード機能
ADVによくある、オートでテキスト送りしてくれる機能。
テキスト送り待ち時間はコンフィグで調整可能。
4.テキスト送りボタン連打で瞬間表示
テキスト表示途中にテキスト送りボタンを押すと、残りを瞬間表示する機能。
5.スキップ機能
現在読み込んでいるテキストドキュメントの残りを全てすっ飛ばして終了することができる。
本当はテキストドキュメント単位ではなく、イベント単位で飛ばしたいが、実現できていない。
6.未読/既読判定
スキップ実行時、未読だったらスキップするか確認画面を出せる(出さないようにもできる)。
ただ、現状は一度読んだ後ロードし直すと未読のままになる仕様。正直言ってこれはアホ仕様だと思うので、次回作公開までに既読フラグはシステムセーブに収めるようにしたい。
    
あらためて書き出すとすごく多い。ただ、作り直したい箇所はそれなりにあるし、まだまだ機能が足りないので、次回作を出した後、機能がさらに増える気がする。
VSCodeを使ったコマンド記述は、気が向いた時に紹介します。

2021年3月25日木曜日

【ウディタ】可変DBを後から変更する方法

ゲーム完成させて公開したは良いけど、
・後からパーティに加わるキャラを増やしたい
・装備IDを変えたい
といった願望が出てくることはしばしばあるとおもいます。
でもウディタは可変DBを後から変更しても、既存セーブデータには反映されない仕様があるので、制作者がくふうをしないと賽の河原仕様になってしまいます。
これでは寛容なフリゲプレイヤーもかなしみを背負ってしまいますので、先人たちが残してきた方法をここで改めてまとめておきたいと思います。

1.バージョン情報を用意しよう

読み込んでいるセーブデータがどのバージョンのものなのかわからないと、大変困ったことになってしまうので、バージョン情報を管理するようにします。

1)空いている文字列変数をひとつ、バージョン情報用として確保します
2)タイトル画面で最新バージョン(ver110、みたいな感じで)をバージョン情報用文字列変数に書き込んでおきます

これで、ニューゲームで始めれば最新バージョンの情報が文字列変数に書き込まれた状態でデータを作ることができます。

2.ロード後一度だけ呼び出すコモンを用意しよう

これを用意すると乱数固定防止処理とか、いろいろできるので便利。バージョン情報の更新にも使うので、用意します。

1)使っていない通常変数または予備変数をひとつ確保します
2)セーブコマンドの直前で、確保した変数に任意の値を代入します(1でいいです)
3)セーブコマンドの直後で、確保した変数に任意の値を代入します(2)で代入した値以外だったらなんでもいいですが、0でいいです)
4)「ロード後処理」とかなんかわかりやすい適当な名前のコモンを用意します。
  起動条件「自動実行」、条件に1)で確保した変数を指定、値は2)で代入する値を指定、最後の条件は「~と同じ」。


5)作成したコモンの最終行で、1)で確保した変数に3)で代入する値を代入します。

これで、
・セーブ後もゲームを続行したら起動しない
・セーブ後ゲームを終了したら、次回ロード時に自動起動する
という動作をするコモンができます。

3.バージョン情報に応じて可変DBをいじろう

1)バージョン情報に応じて、バージョン情報を書き換えたり可変DBをいじるコモンを用意します。2.で用意したコモンに直接書いてもいいけど、独立させた方が管理が楽です。
2)バージョン情報で条件分岐させて、そのバージョンで変更した差分を可変DBなどに書き込んでいきます。代入方法を間違えると悲惨なことになるので注意!
 初期値のまま変わらない項目:=で代入。
  (変わらない項目は可変DBではめったにないけど、例えばキャラ名とか)
 ゲーム進行で数値変わる項目:+=で代入。
  (例えばステータスはゲーム進行で変わるので、初期値増減分だけ反映)
 条件分岐の括りの中の最後は忘れずにバージョン情報を書き換えてください。
 また、条件分岐は複数指定(文字列変数なら4+1あります)せず1つだけ指定にしたほうが、バージョンアップを繰り返していった際、楽になります。
 例えば、セーブデータがv1.0.0、最新版がv1.0.2だった場合。
 枝番号が特にない限りはたいていv1.0.0、v1.0.1、v1.0.2の3つのパターンが存在し得ますが、複数指定してしまうと、v1.0.0ならv1.0.1とv1.0.2の更新差分、v1.0.1ならv1.0.2の更新差分……といったように、それぞれの条件分岐内で同じ記述をする必要が出てきます。これが10回20回とアップデートしていくと、もう地獄です。
 しかし、1つだけ指定なら、バージョンを1つずつ上げる形になるので、記述のダブりが無くなります。おすすめ。

3)2.で作ったコモンで、ここで作ったコモンを呼び出すようコマンドを入れます

2021年1月9日土曜日

【ウディタ】イルシェラート(仮称)制作記録(2):NPCのAI

久しぶりの次回作制作記録です。

ただでさえ遅い制作スピードが麻雀にはまってしまった影響でさらに遅くなっていますが、一応すすんでます。心もまだヒビひとつない状態でやっています。

今は、山場の戦闘処理改修作業をしています。ここさえ乗り越えれば、あとは基幹処理の共通化が済んでて淡々と作業すればおわるメニュー処理とか、中身の実装作業とかなので、気楽になれます。

で、今回の記事はNPCのAI処理について書いておきます。
ケルリートのAI処理については、制作中に消しカスほども触れていないせいで、ブログに取り上げることすらできないのですが、レイユウサイ制作中の自分が詳しい記事を残してくれていましたので、参考にリンクを置いておきます。

基本の設計は当時とほとんど変わらず。「確率行動+条件付き固定行動」です。
青:レイユウサイ、緑:ケルリートでの追加、橙:イルシェラート(仮称)での追加です。
①味方属性のNPCの存在を考慮すること。
②味方/敵の仲間同士で補助ができるような処理をつくること。
③RPGらしく一定HP切ったら本気モードとかできるようにしたい。
④ある程度NPCが手加減できる仕様を入れること。
⑤状況に応じて多少戦い方を変えられるとなおよし。

⑥動作が軽いこと(NPC10体くらいを1画面内に出しても処理落ちしない)。
⑦NPCの移動に特徴を出せるようにすること(近づいたら逃げるとか)。
⑧動作設定が簡単であること。
⑨状況に応じた技能選択ができるようにすること。
⑩NPC移動方法の遷移が短時間で頻発しない工夫をすること(チャタリング防止)。
⑪SP消費の概念を持ち込むこと。
⑫壁や障害物に引っかかって止まるケースを可能な限り減らすこと。

細かい仕様や挙動は書くと長くなるので省略しますが、大筋はレイユウサイ時代とだいたい同じです。
ただ、レイユウサイ時代のままではどうにもならない部分を、ケルリートで手をいれて改良し、それでもまだ足りない部分をイルシェラート(仮称)で手を入れるというイメージでやっています。

移動処理ひとつとっても、
レイユウサイでは対象に接近するしかなかったのが、ケルリートでは接近/距離を保つ/離れると改良しています。⑩は、この3つの移動方法の使い分けの設定点が1つしかなく、その設定点付近を保つような動作をプレイヤー/NPCが取ると挙動が変になる事象を改善することを意識した項目です。2点制御化するか、一定時間遷移しないとするかで迷っているところです。
壁や障害物に関してもケルリートでだいぶ対応処理を増やしたのですが、どうも穴があるようで、デバッグログを見るとたまにエラーを吐くし、投稿されているプレイ実況を見てもちょくちょく変な場所で引っかかっているので、修正しておきたいところ。

技能使用処理に関しては、味方NPCの存在が大きくなるので、イルシェラート(仮称)ではかなり手を入れる予定です。
また、味方NPCの存在を考慮する(=複数種類の技の使い分けが可能になる)ように改良することで、これまでボスでも通常行動ではひとつかふたつの技をランダムで使ってくるくらいの表現しかできなかったのを、4種類の技をフルに使ってくるような設定が可能となるようになります。4種類の技を状況に応じて使い分けできるようになることで、今までよりも手ごたえがでるという算段。使いこなすのも難しくなりそうだけど。
これを実現するための方策としては、これまでのようなランダム行動に頼らず、戦闘中に変化するもの(相手との間合い、強化弱体化の付与、残りHPなど)を参照させて、適当な技を使うような処理を入れる予定です。

逆に改良作業の関係で妥協せざるを得ないものもあって、
確実に増える設定項目数の関係で⑧は苦しいし、いろいろな判定を増やす関係でおそらく⑥の動作の軽さも落ちるはず。軽量化はがんばってみますが、無理ならマップ設計で補うしかないですね。

といった感じの方針をもとに今週末はDBから手を入れてます。
先は長いです……。