[掲示板へもどる]
一括表示

記事No: 21759 [関連記事]
タイトルゲーム内容の一部の外部ファイル化(MOD対応)
投稿日: 2025/09/06 09:00
投稿者としこC [FreiFeWL855]

【やりたいこと】
ゲーム内容の一部の外部ファイル化(MOD対応)

理想の動作としては、
ゲームの既存ファイルを上書きしない形で、
専用フォルダにファイルを任意で投下/削除することで、
ゲーム内容を追加/削除する、というものです。


【追加コンテンツの内容想定】

・(*1)マップデータ(&マップイベント)
・(*2)タイルセット
・(*3)コモンイベント
※データベース関連は、データ数を増やすことはあってもデータタイプを拡張しない
あるいは文字列で万能DBを設定できる

特に高負荷となりえるマップ描画は、ウディタ標準機能を活用したいです。

追加コンテンツを実装する場合に、
最低限の独自システムで、どこまで外部化できるか

現在versionでの技術限界を教えていただけると助かります。


【詳細】

※追記0907
※誤情報修正:タイルセットは、ゲームの起動タイミングに読み込まれるため、ファイルが実在する必要あり


(*1)マップデータと(*2)タイルセットについては、
該当マップに移動するタイミングで必要ファイルが読み込まれるため、逆を言えば、初期設定したファイル名が実在しなくても、ゲーム起動中にエラーは発生しない。

規則性のある名前を設定しておき、追加コンテンツ側のリソース名をそれに合わせることで、任意の追加/削除が可能になる。

ただし、リソース名を固定する都合で、ファイル不在エラーの回避のために、マップ上で使用しないタイル番号にもそれ専用の画像を用意する必要がある。

加えて、追加コンテンツのファイルを削除した場合でも、ロード時点で追加マップにいなければエラーは生じないことから、セーブ時には専用マップに一旦移動して、マップ番号&座標を保存し、ロード時には改めて追加コンテンツの有無を取得して、存在しないマップへの移動回避を行うことになる。

あとは、追加コンテンツで使用するマップ番号を本体側に認識させる用のテキストファイルを同封すれば、追加マップへの誘導が可能。


※追記0907
※誤情報修正:タイルセットは、ゲームの起動タイミングに読み込まれるため、ファイルが実在する必要あり



[Data] バニラ環境は、Data.wolf暗号化して追加コンテンツを空Dataに投下
 ├[MapData]-(*マップ番号).mps
 ├[MapChip]-[*タイルセット番号].wolf(タイル画像)
 └[ModInfo]-[*任意].wolf(マップ番号を記したテキスト、チップ通行設定など)

マップ番号とタイルセット番号が不一致のため、一つの暗号化ファイルにまとめることはできず、チップ設定(通行など)は、マップへ侵入する度に「チップ処理」コマンドでバニラ設定から上書き更新する必要がある。

※マップ、タイルセット番号の重複には対応できない。


(*3)コモンイベントについては単体ファイルに保存されるため、後から追加はできない。
  テキスト→コマンドの変換実行コモンを本体に組み込むしかなさそう。
  ※現在versionでは外部.Commonを指定実行する機能が削除されている


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
標準のマップ描画システムを借りない場合は、文字列ピクチャを利用して、
アニメーションパターン数 * レイヤー数  個のピクチャ番号だけでマップを表現できますが、カウンター属性をピクチャ番号で表現するなら、マップイベントのグラフィックをピクチャリンクに置換する必要がありそう。
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

ウディタ環境でできないこと
・マップデータやタイルセット画像の参照パスの動的変更
・コモンイベントの動的追加

 ……くらいの理解度なのですが、

本体ファイルの上書きなし、ウディタのマップ処理システムを利用する場合、
かつ、ユーザー側の手間を最小限にする方法は、どのようなものになりますか?


ここまでするなら、DXライブラリ/C++で構築しろとも思うのですが、
JRPGに限れば、制作コストの見積もりで、ウディタを手放すのが惜しいです


記事No: 21760 [関連記事]
タイトルRe: ゲーム内容の一部の外部ファイル化(MOD対応)
投稿日: 2025/09/07 00:31
投稿者Masaqq [reFeepeO402]

としこCさまへ

大体ご理解されてる通りなのかなという気もしますが
一応内容を、返すだけ返しておきます。


周囲の熟練使用者?にも聞いてみましたが
そもそも、ある程度のMOD作成ルールを
作者側が想定して事前用意しておく必要があったと考えます。


<先だし結論>
1)マップデータ&マップEv:事前に作者が想定して環境用意がないと無理。
2)タイルセット:事前に作者が想定して環境用意してないと無理。
3)外部コモンイベント:事前に作者が専用コモンを用意してないと無理
 
→外部MOD対応Verを作者が作ってリリースする。
 もしくは、本体とは別のMOD(DLC?)導入済みVerを作者がリリースする
 
<メイン内容>
・マップサイズ:ゲーム内から変更不可なので、上限サイズで未設置マップを事前用意する必要性あり。

・タイルセット:代用として、ピクチャ表示をタイルとして描写後
        〇×の付いた透明タイルでの移動範囲の処理や既にあるタイルで対処する
  ピクチャはXY配列に取り込んでおき、それをピクチャ表示すれば元ファイルが消えても表示はできる。
        一部のチップはピクチャ表示などで表示レイヤーを調整する

 【ピクチャ番号 -100000〜-199999 のピクチャ】
 --- キャラ・▲属性のマップチップ ---
 【ピクチャ番号 -200000〜-299999 のピクチャ】

・マップ内容:MOD作者がtxt(CSV形式など)でタイル番号や通行可能不可設定を作る→インポート用コモンで処理。

・マップイベント:隠しコードMAKE_EVENTで生成できるようになったため(ver3.5以降)、
         テキスト処理などで作ることはできる。

・独自コモンイベント:テキスト処理で、スクリプト的に処理させることで実装可能
 ※あらかじめ作者がテキスト処理するコモンを用意して何ができるか情報開示する必要があります。

  <スクリプト例>
@cself=10
self turn_player /* 主人公を向く */
speak "ここはMODダンジョンです" /* なにかセリフ */

<サブ内容> 
・平文テキストがイヤ→独自暗号化させる。またはBase64変換などで簡易なフィルタはかけられる。
   (Base64デコード機能はないので要コモン制作)
 .wolfなどが取り込める部分は独自検証して実装する

・ピクチャ類:Base64や
ゲーム内でMOD的な機能を実装するという案も

> ウディタ環境でできないこと
おっしゃる通り、動的な変更/追加はできませんが
作者が想定して用意してれば似たようなことは可能。


<その他の案>
あるいはMOD制作者には、Editor上で作成されたMPSファイル配布形式をとる。
(マップEvにコモンイベント呼出などが必要な場合は中身のないモックを渡す等する)
※モック……入出力設定とコモン名が合致するが実処理は入ってないもの

作者がソースコードを開示しても良いゲームならば
ウディタEditor上で自由に編集してもらうといった荒唐無稽な方法もありますが。

あとは、作者が追加コンテンツを作るだけならば
本体とは別ファイルを用意して作ればよい(コア部分の修正があったら同期する必要はある)気もしますが
その他の案は状況が分からない者の戯言とでも思ってください。


ウディタの機能制限部分もありますが
結局は“作者がどこまで事前に想定して環境を用意するか”に尽きるかと思います。


以上となります。


記事No: 21761 [関連記事]
タイトルRe: ゲーム内容の一部の外部ファイル化(MOD対応)
投稿日: 2025/09/07 03:43
投稿者としこC [FreiFeWL855]

Masaqq様へ

返信ありがとうございます。


どうも、MOD(DLC)導入済みVerの配布や本体ファイルの改変を毛嫌いしているせいで、結果的に自分で面倒を増やしているようです。


――※私の投稿内容について、一部、誤情報がありました※―――
タイルセットの読み込みについては、ゲーム開始時から読み込みが入るため、
最初から画像ファイルが必須で、wolfファイルが優先され、外付けの画像は読み込まれません。
――――――――――――――――――――――――――――


MPSファイルについての記載は問題なく、
読み込みタイミングはマップ移動時であり、システムDB側の「0.マップ設定」を書き換えることで、拡張子の省略、Dataフォルダ外への参照が可能。

MPSファイル内容:
・マップサイズ情報
・マップレイヤ情報(ピクチャで表示するのであれば、csv読込でDB管理した方がいい)
・マップイベント情報

MPSファイルが露出しているウディタ製ゲームは、
名前をすり替えた別のMPSを読み込ませることで、
Editerを介さず、色々改変できるので、

新しいゲーム性を作れないか考えてみることにします。




X番の変数呼出により、システムDBのデータは動的に上書き可能なので、、
マップIDを浪費せず、複数パターンのマップサイズの空マップが生成できたり、
セーブ時点とロード再開時でマップを変えるといった動作の別解にはなるかもしれません。