【質問フォーム】
【重要!】 質問する前に必ず、過去に同じ質問がないか検索してください!
もし以下のケースで困った場合は、まずリンク先の文書内に答えがないか探してください。
・まずはこの中からお探し下さい → パーフェクトガイド
・バグかな?と思ったときは → よくある質問
・基本システムの設定方法が分からない場合 → 基本システム講座(by 藤田るいふ氏)
・イベントコマンドなどの仕様が分からない場合 → 公式マニュアル
※書き込む前に少なくとも1日2日は、自分で探したり挑戦する努力をしてみてください。
上記のことを全部やってもどうしても分からなかった場合だけ、以下のフォームから質問してください。
返信が遅くなり申し訳ございません。
ウディタ本体ではできないので、どうしてもやるならランチャーアプリを作れば不可能ではないという感じなんですね。
私の技術力ではちょっと手を出せそうにないのであきらめようかと思います。
AIも全然使ったことないので……
こういうやり方もあるというのを教えてくださりありがとうございました。
Masaqq様へ
返信ありがとうございます。
どうも、MOD(DLC)導入済みVerの配布や本体ファイルの改変を毛嫌いしているせいで、結果的に自分で面倒を増やしているようです。
――※私の投稿内容について、一部、誤情報がありました※―――
タイルセットの読み込みについては、ゲーム開始時から読み込みが入るため、
最初から画像ファイルが必須で、wolfファイルが優先され、外付けの画像は読み込まれません。
――――――――――――――――――――――――――――
MPSファイルについての記載は問題なく、
読み込みタイミングはマップ移動時であり、システムDB側の「0.マップ設定」を書き換えることで、拡張子の省略、Dataフォルダ外への参照が可能。
MPSファイル内容:
・マップサイズ情報
・マップレイヤ情報(ピクチャで表示するのであれば、csv読込でDB管理した方がいい)
・マップイベント情報
MPSファイルが露出しているウディタ製ゲームは、
名前をすり替えた別のMPSを読み込ませることで、
Editerを介さず、色々改変できるので、
新しいゲーム性を作れないか考えてみることにします。
X番の変数呼出により、システムDBのデータは動的に上書き可能なので、、
マップIDを浪費せず、複数パターンのマップサイズの空マップが生成できたり、
セーブ時点とロード再開時でマップを変えるといった動作の別解にはなるかもしれません。
としこ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上で自由に編集してもらうといった荒唐無稽な方法もありますが。
あとは、作者が追加コンテンツを作るだけならば
本体とは別ファイルを用意して作ればよい(コア部分の修正があったら同期する必要はある)気もしますが
その他の案は状況が分からない者の戯言とでも思ってください。
ウディタの機能制限部分もありますが
結局は“作者がどこまで事前に想定して環境を用意するか”に尽きるかと思います。
以上となります。
【やりたいこと】
ゲーム内容の一部の外部ファイル化(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に限れば、制作コストの見積もりで、ウディタを手放すのが惜しいです
>> としこCさん、Masaqqさん、
としこCさんのエディターコモンの案と、Masaqqさんの透明マップチップの合わせワザでいこうと思います。
一時的にレイヤー4〜5を使って番号を振り分け、XY配列をcsvファイル出力or読み込みを活用しようと思います。
透明マップチップをそのまま使い続けるのはバグの元になりそうなので、csvファイルに直そうかと思います。
他のものも そうゆう方法もあるのかと目から鱗で、他の処で活用できそうで大変参考になりました。
お力添えいただいき、ありがとうございました。
マップイベントと主人公の相対座標(X,Y)を文字列化して
それと合致する部分を切り出すことで、返却値を取り出せそうです
一マスの文字列データ『( X 、 Y ) 戻り値 \n 』
マップイベントXYが(5,6)
主人公XYが(3,5)
当たり判定データ
(-3,5)3
(-2,-1)4
(0,1)3
とした場合、
相対座標(3,5)-(5,6)で (-2,-1)
文字列操作の「指定文字以降を切り出し」で
"(-2,-1)"以降の
「4\n(0,1)3\n」が切り出されて、※\nは改行
切り出された「4\n(0,1)=3\n」をそのまま数値に代入すれば、4だけ取得できます
反対に、設定しているマスを取得したい場合は、
一行ずつ切り出して括弧()の中の座標XYを取り出していくことになります
※0904_07:37修正
横から失礼します。 制作環境がよく分からない部分はありますが とりあえずいくつかの案を挙げておきます (勘違いや良い方法がなかったらスミマセン) 案1:UDBにタグ番号DBを作る マップタグ番号が使えないとのことですが ユーザDBにタグ番号と同じようなものを作ればよいのではないでしょうか。 (参考資料として画像添付) ※ただ、タイルが多かったりタイルセットを複数使っているとDB入力作業がしんどい。 案2:使ってないレイヤーと透明タイルを活用する レイヤー3(Pro版なら4,5含む)の余りがあるなら、透明な専用のマップチップを そのレイヤーに置いて判定処理用に使うのも手かもしれません。 (タイル設定は〇でなく↓設定にするなど配慮する) 案3:マップタグ番号の定義を棲み分けする 1桁目を従来の機能(0〜9)、2桁目を仰ってる数値(0〜3?)にする。 仮に、タグ番号37なら ÷10で 3 に、%10で 7 になります 棲み分けできるかどうかは使う数値の範囲とやり方次第 数値を変えて÷30と%30で出来る可能性もある 案4:XY配列に全座標のそのトリガー数値を入れる 主人公が踏んだ場所で判定できるなら XY配列 データ番号:X座標、項番:Y座標とかに見立てて入れればよいかと。 (マップがあまりに大きいと処理時間とメモリ利用料域とかは増えそう) 以上になります
|
座標(XY)とその地点に入った時の返却値を返すなら、
私が書いたものを少し修正すれば可能ですが……、
特殊な当たり判定のマップイベントを別のマップでも複数作るなら、
座標と返却値の文字列を手書きで書き起こすのも手間ですね。
いっそのこと、ゲーム内にエディターコモンを作成すべきかも。
[1]ゲーム実行時に特定キーで設定用コモンを起動
[2]クリックした座標のイベントを原点にする(マップイベント名と、以降の計算用にXY座標を取得)
[3]0~9の数字キーを押して、返却値を設定
[4]座標をクリックすると、その座標(相対)と返却値を文字列変数に追加
[5]特定のキーで、DBをcsvファイル出力/csvファイルから読み込み
たとえば、返却値を(3)と設定した後に、原点マップイベントから(0,1)の座標をクリックした場合、
(0,1)=3
のような文字データを文字列に加算する。
同時に、設定中にマップ座標に合わせて設定値をピクチャ表示できれば、視覚的に分かりやすくなり設定ミスも防げます。
可変DBのタイプ内容としては、2つの文字列変数
・マップイベント名
・座標(XY)&返却値のデータリスト
となり、
「タイプ内容設定」の「データID設定方法」から
「最初の文字列データと同じ」を設定しておけば、
マップイベント名でデータ内容を参照できるようになります。
当たり判定を処理するコモンイベントには、マップイベント名を引数にして、
・マップイベント名からマップイベントID取得(文字列操作の隠しコード実行)
・マップイベントIDからマップイベント座標(XY)取得(変数操作+)
・マップイベント名から可変DBのデータリストを取得(DB操作)
以上の3つの情報を取得した上で、当たり判定処理を行うようにすれば、
マップイベント側は、自身のIDから取得できる自身のイベント名をコモンに投げるだけで、必要な値が返ってくることになります。
―――――――――――――
「ID」を直接使わず「マップイベント名」で参照するのは、これらのためです。
・マップイベントのコピペ並び替え(ID変動)
・別のマップでの流用
あと、正規表現を扱えると文字列操作が(特に置換操作で)短縮できると思います。
こんなところで、どうでしょうか?
としこCさん、早い回答ありがとうございます。 とりあえず試してみます。
やりたい事は画像のような感じです。 要はマップ上に主人公が立った時、こういった数値の並びを簡易な設定から 自動で取得できるようにしたいという感じです。そこで上げたのがXY配列で、対象が動かないのでマップイベントと主人公の距離を測る方法でなくてもいいという感じです。
また説明が分かりづらかったすみません。
|
XY配列を使うという説明に悩んでいるのですが……
判定がマス単位で、
「近づくと起動する」というのが「範囲内に入る」であれば、
比較的簡単につくれます。
中心座標にマップイベントを設置した上で、
マップイベントの常時実行から判定計算を行う。
増やしたい当たり判定を相対座標(例:1,-1)として文字列変数に記述しておき、
一行(一マス)ずつループで切り出して、
文字列変数から数値変数(XY)に代入変換したものを利用する。
取り出した相対座標と、
マップイベント座標と主人公座標の差(XY)を加算することで、
マスごとの主人公との距離になり
その、どれかが(0,0)になれば接触となる。
□□□□□
□■中■□
□□□□□
このような形であれば
-1,0
0,0
1,0
といった文字列で良い。
※マップイベント位置(中心)を当たり判定に加えない場合を想定して
※相対座標(0,0)も記述しておく
上記のような手段であれば、当たり判定の形を変える場合は、
文字列変数の中身を修正するだけですみます。
質問を読み違えていたらすみません。