終末前日譚は人知れず破滅に向かっている世界でダンジョンを辿り巡るローグライクRPG

制作物

タイトル:終末前日譚
ゲームジャンル:不思議なダンジョン
DL可能リンク(中間発表版):
https://drive.google.com/open?id=17ggontaZ90zQEdtHjSLca0AYYD19kO83

その他基本情報は readme に記載

制作経緯

ひとつ前につくってたローグライク風味(になる予定だった)2Dアクションゲームがいろいろ手に負えなくなったから普通のターン制ローグライクにしたっていうのが一番
フリーゲーム、elonaの改造版を作ろうと思ったけど10万行以上のHSPコードを1から解読するのは無理すぎて最初から作ったほうが絶対早いし楽だし安全、っていうのもある

ストーリー・世界観

ここがクソゲーの世界か
なるほど、だいたい分かった

冒険者

人間の限界まで鍛え上げたものだけが冒険者になれる
ダンジョンの攻略が主な仕事

ダンジョン

多くの冒険者が挑戦する謎多き場所
入るたびに内部構造が変わるタイプの奇天烈なものと神出鬼没で特に攻略後に割と早めに消えるタイプの摩訶不思議なものに大きく分けられる
不思議なダンジョンタイプは太古から存在するのに対し、神出鬼没タイプは比較的最近になって現れるようになった
人が突然消える神隠し現象も同時期から発生頻度が高まっていることと関係があるかもしれないといわれてるとかいわれてないとか

アビリティコア

神出鬼没タイプのダンジョンに落ちてる謎の石
人間や武器に様々な力を与えるが、専用スロットを介さないと強力すぎて危険
中級以上の冒険者が施術を許される改造手術により人体に生体スロットを増設することができ、それにコアを装着するとコアの力が少しずつ本人の力になっていく
コアの力を開放するバーストによって一時的に無敵の力を得ることができるが、すさまじい力に耐えることができずバーストした武器はコアごと消滅してしまう
生体バーストは当然として、装備バーストでも使用者への負担がとてつもない

世界

無限に存在にする世界の一つが主人公の世界
でも主人公の世界ではほかにも多くの世界が存在することはわかっていない
主人公の世界は元々不安定で実は不思議なダンジョンタイプのダンジョンはそれによって偶然こちらの世界にやってきてしまったものだった
元の世界で訓練として使われていた施設、だったのかもしれない

脅威

実は別世界に狙われている
でも誰も気づいていないので撃退とかはない
他世界への侵略を行っている連中、ゼロの国はエンチャントコアの生成・使用技術によって瞬く間にその世界を支配したが、それでは満足できず他世界の存在確認、行き来する技術の確立を行ってから今のような侵略行為をするようになった
主人公の世界のように不安定な世界では、同じような侵略行為を行っている集団との全面戦争が勃発してしまう可能性があり、侵略はかなり慎重になる
絶対勝てる格下にしか手を出さないカスども
でもゼロの国が本格的に襲撃を開始したら主人公たちの世界に勝ち目はほとんどない
襲撃とりやめした場合は他にも狙っていた集団がいたということなので、どちらにせよ厳しい

中にはまだ見ぬ強者を求めて、あるいは稼ぎのために勝手に訪問しているゼロの民がいるかもしれない

メインストーリー

敵が堂々と押し寄せてきてそれに立ち向かう、ということはないのでメインストーリーと呼べるものはほぼない(サブクエスト的なのは出すかも)
終末にあらがうシリアス冒険RPGではなく、終末突入前の世界を生きるほのぼのスローライフゲーム

システム

おばあちゃんが言っていた・・・
人のまねをするのも悪くない、本当の自分を見つけるためには(建前)

装備

まあローグライクなので
序盤は素のステータスを成長させることができないため装備の力に頼ることになる
また中盤以降は成長させることができるといっても、メインは装備でなんとかするスタイルになるはず、そうなるようにしたい

アビリティコア

スロット付き装備に装着できる装備用装備
改造手術により人体にも装着することができる
バーストによって一時的にパワーアップできるが、効果終了後にバーストした武器とその武器に装着されたコアは消滅
装備バーストは1ダンジョンに3回、1フロアに1回まで

カスタムアイテム

ユーザーによるアイテム自作機能
elona omakeの影響
でも実装済みのやつしか効果として選べなくて、効果値を設定できるくらい
拡張子をitemにしてUser以下の階層に置けばオッケー
アイコンに使う画像も同じくUser以下の階層に置かないといけない(既存のアイコン名と被ると後述する画像差し替えが発生してしまうので注意)
以下は設定可能パラメータ

name(必須): アイテム名
icon(必須): アイコンとして使う画像のファイル名から拡張子をとったもの(test.pngならtest)、既存アイコンを使用することもできる
script: 説明文
price: お店での額

power: 効果量
effect: 使用時の効果
効果リスト
recover_life: ライフを固定値回復
recover_energy: エナジーを固定値回復
damage_life: ライフに固定値ダメージ
damage_energy: エナジーに固定値ダメージ

usage: 用途(tool、eat、drink、read、throw、equip)

以下、装備(usageにequip)の場合
part(必須): 装備可能部位(head、hand、body、foot、other)

max_life: 最大ライフ
max_energy: 最大エナジー

physical_attack: 攻撃力
magic_attack: 魔力
fire_attack: 火属性攻撃力
ice_attack: 氷属性攻撃力
thunder_attack: 雷属性攻撃力
holy_attack: 聖属性攻撃力
darkness_attack: 闇属性攻撃力

plane_deffence: 無属性防御力
fire_deffence: 火属性防御力
ice_deffence: 氷属性防御力
thunder_deffence: 雷属性防御力
holy_deffence: 聖属性防御力
darkness_deffence: 闇属性防御力

hit_rate: 命中力
avoidance_rate: 回避力
critical_rate: クリティカル力
multihit_rate: 連撃力

デフォだと文字列は空白文、price以外の数値は 0、priceの場合 -1 となる

usage の tool、read、eat、drinkはメッセージログの「~は~を~した」の動詞部分が変わるくらいしか違いがない
上記4つを選ぶと勝手に投げれるようになりますが、usage を throw のみにすると投擲専用になる

サンプルとして4つのアイテムを同梱したのでそれを参考に

技能・魔法

ただの技、技能は基本的に物理攻撃で魔法は名前の通り魔法攻撃
MP的なやつであるエナジーを消費する
消費量を調節することができ、多く消費するほど威力も増す
でも多くしすぎると割に合わなくなってくる
熟練度が上がると割に合わなくなるラインを上げられる・・・ようにする予定

画像差し替え

User以下の階層に既存のものと同名の画像ファイルを置くと画像の差し替えを行うことができる
デフォ画像が気に入らないときに
拡張子はpngかjpgじゃないといけないので注意
画像名検索や既存判定を行えるツールをそのうち作って同梱したいところ

実装

レイドライズ

マップ生成

こちらの記事を参考にしました
qiita.com

簡単な流れは、

  • 長方形を用意
  • 最低サイズを守れるように分割
  • 分割によってできた各長方形に部屋を一つずつ作る
  • 部屋同士を適当な場所でつなげる

あとはマップチップの割り当てを適当に行えばオッケー
後述する敵移動アルゴリズムなどに後々つかえるように部屋とその部屋の出入り口の場所を保存

敵移動アルゴリズム

プレイヤーが近くにいる場合といない場合で大きく分かれる

プレイヤーが近くにいる場合

幅優先探索で最短になるようにプレイヤーに近づく
幅優先探索がどういうのかというと、幅を優先した探索法のことですね(進次郎並)
もう少し真面目に説明すると、木の階層の浅いところから調べていく方法
↓つまりこんな順番になるようなの
f:id:yuma1053:20200418171605p:plain

まあ幅優先探索っていうとなんかそれっぽく聞こえるけど、今回の場合は結局やってることは近くのマスから調べて指定歩数以内に主人公まで実際に到達可能か調べていくだけ
詳しいことは調べたり競プロ勢に聞くなりしてください(丸投げ)

とりあえず、周囲5マスを基準にしてるけど、広げれば千里眼で地獄の果てまで追いかけてくる
はずだけど、千里眼持ちが多くなるととても重くなる

マップ生成時に部屋の出入り口の場所だけでなく、どの部屋と繋がるのか、通路の長さはどれくらいかを保存して、同じ部屋にプレイヤーがいない場合は部屋と通路を使って探索するようにすれば解決しそうだけど、そもそもそんな広範囲を見渡せるやつばっかのダンジョン作らない気がするし、必要になるまでいいかなって

プレイヤーが近くにいない場合

部屋にいる場合はその部屋のランダムな出入り口をターゲットにしてそこに近づくようにする

部屋にいない場合やターゲット地点に到達した場合は次の部屋にたどり着くまで(どこかしらの部屋の出入り口に到達するまで)直進して前に進めなくなったら曲がる
曲がってもダメ(前からも何かがやってきたときとか)ならバック
これを繰り返せばだいたい大丈夫、たぶん

でもたまに止まったままの奴が出てくるときあるからガバパターンがあるっぽい・・・

ターン制御

ゴリラプログラミングゴリラプログライズキーをゴリライズできそうなほどのゴリ押し

行動したか、消滅したときに行動権消費
そのフレームで最初に行動したやつ(基本的にプレイヤー)のとった行動が移動なら、そのフレームで移動する予定だったやつらも行動(移動)できる
そのフレームで最初に行動したやつの取った攻撃それ以外(敵の場合は攻撃、プレイヤーの場合は他に道具の使用など)ならそのフレームで行動できるのはそいつだけ

移動にしても攻撃にしてもアニメーションが終わるまでターン処理を中断しないといけないので一度中断
指定時間後に渡した関数を実行するやつを用意しておいて、それを利用してアニメーション終了するころに中断解除関数が実行されるようにする
(アイテムや技を選択した後にメニューを閉じてから使うようにするのとかもそれ使ってる)

実は問題を抱えてて、そのフレームでギリギリアニメーションが終わらなかった場合にほぼ1フレーム余分に待たされてしまうことでなんかガクガクするようになることが結構ある
開発版では余分に過ぎた分を補正するようにしてなんとかなった、はず・・・

ID発行

ランダム生成物用のID発行方法
絶対に被らないようにしないといけない
このゲームではエポックマイクロ秒(1970年1月1日00:00からの経過時間をマイクロ秒単位にしたもの)に8桁くらいの1ずつ上がっていく数をつけたものをIDとしてる
時間を使うシステムは多いみたい(TwitterのツイートIDとかもそうで1053ランカーもそれを利用して時間を算出してる)
でもこれの場合はそのパソコンの時間を(たぶん)使ってるから時計いじられるとおしまい
まあ、そんなことすることほぼないだろうしセーフセーフ
ただ、デュアルブートで時計狂うときあるからそれで無意識のタイムトラベルをしてしまうことがあるかもしれない(実は自分のも先月に狂わないようにしたばかり)

大変だったこと

ストレス、フラストレーション
いずれもマッハ

フィールド描画

マップタイル、キャラ、落ちているアイテムとかの描画のこと
この手のはとても苦手で悠久の時を奪われて無限大のストレスが襲い掛かってきた
面倒な割にゲームとしては基本中の基本なのがクソ

ターン制御

これも手間の割に超基本、カス

セーブ・ロード

装備やコア、敵、お店、いろんなパラメータがランダムなのでそれの管理が地獄すぎて死神のパーティタイム
特にアイテムデータは不具合が起きた時のパターンが多くて面倒だった
デバッグ中にデータ崩壊するたびにデータ削除と新規データ作成を繰り返すのは無間地獄
これも(ry

素材集め

プログラムしかかけない者の永遠の課題
マス目ベースのゲームを作ろうとしてる方にはRPGツクールでの開発を強く勧めたい
規模小さめなゲームだと基本システム部分の作成割合が大きくてとても楽になるはずだし、規模大きめでもRPGツクール限定素材が使用可能という絶大な恩恵がある
見つけたいいかんじの素材がツクール限定だった時の絶望でファントム生み出せてしまうまである(ない)
マップエディタとかを自作する手間も省けるのもハイパームテキ
最近のやつはMacとかでも動いて、しかもスマホアプリも作れるらしい
拡張性がよくない印象だったけどそんなことはないらしい(ここらへんは実際に使ったことないからなんともいえない)

特に主人公用の8方向キャラチップに困ってて募集中です・・・

これから

おっと、わかってる
皆まで言うな
課題が多すぎる

敵、アイテムのグループ分け

実はもうすでに(一応)実装済

敵はグループ、アイテムはグループに加えてジャンルを割り振られていてそれに基づいて生成することができるようにした
グループは文化的な出身世界や種族、階級など、ジャンルは・・・なんというかまぁ、ジャンルで分けられる

例を出すとグループはこんなかんじ
実際はキャラとアイテムは別々に管理してるけど、面倒なのでまとめてしまった
f:id:yuma1053:20200418184752p:plain

たいしてジャンルのほうはこんな
f:id:yuma1053:20200418184828p:plain

(例での分類が間違ってる可能性あるけど許して)

これを使うことで出身世界によってある程度統一できるようになる、はず・・・

カスタムアイテムの場合は group 、genre パラメータでそれぞれ設定可能(デフォは root)
グループやジャンル自体もカスタム対応したいところ

レアリティ

これも実は実装済

中間版は道具、装備、コアの3種類で大きく分けて、それぞれ生成確立は違うけど道具だけ、装備だけでみると全部同じ確立になっている
でもやっぱレアアイテムとかそういうのがあったほうがよさそうなので
レアリティを使って生成頻度を 1 / (レアリティ + 補正) にとりあえずした
補正が大きくなるとレアアイテムと通常アイテムの生成頻度の差が縮まるので、高レベルダンジョンでは若干レアな奴が出やすくなる

カスタムアイテムの場合は rarity パラメータで設定可能(デフォは100)

XInputコントローラーへの対応

今の時点でも使えないことはないけど不便

オプション設定

入力感度やボリューム設定とかそこらへん

レパートリー増やし

敵、魔法、アイテムの種類とか魔法効果、アイテム効果、クエストの種類とか
でも効果とかはともかく、やっぱ実装系を先にしたいからどうしても後回しになりがち
いろいろ終わらせた後にレパートリー増やす気力残ってるかは知らない

スキル

このゲーム、装備やコアの力に頼ってばかりだけど成長要素も欲しいなってことで検討してるのがスキルシステム
魔法攻撃力を物理攻撃力に変換したり、1ターンで魔法を複数を放てたりが可能になるやつあるとロールプレイによさそうだけど、バランス調整が今の時点でもできてないのできつそう
戦闘系以外にも生活系のあってもいいかも(ペンギンの問題ザ・ワールドの採掘や釣りみたいなかんじの)

生体コア

実はまだ未実装の設定だけ存在してる状態

未実装ステータス

命中力とか連撃力とか

状態異常

まあ、ローグライクなので

カスタムスペル、マップ、キャラ、イベント

一通りカスタム対応したい

もっとちゃんとしたUI

さすがにセーブデータ作成やセーブデータ選択が雑すぎる

さいごに

お前がゲームを作らないのは勝手だ
けどそうなった場合、誰が代わりに作ると思う?
お前だよ