GameMaker 日本語掲示板

テキスト外部ファイル化の良い方法を知りたいです。

10 コメント
views
16 フォロー

今までゲーム内テキストは全部ソースコードに直打ちしていたのですが、「翻訳頼むときに困るよ!」との声を頂き、今後翻訳を依頼する予定もあるので最近、テキストをすべて外部ファイル化しました。
(外部ファイル化に関してはこの掲示板の過去トピを参考にさせて頂きましたm(__)m)

そこまでは良いのですが、実行ファイル生成後の仕様に頭を抱えています。
テキストの多いゲームなので複数のテキストファイルを使っており、exeファイルと同じ階層に並べたくはないのですが、フォルダ作ったりを試していましたがエラーになってしまい、結局テキストファイルをそのまま並べている現状です。

文字を扱うゲームだと必ず付きまとう問題だと思うのですが、ここの皆さんがどう解決しているのか、ご教授いただければ幸いです。
(私の解決案では、取り合えず全部を1つのファイルに纏めて拡張子はdatにしておくことで目立たせない方法を考えているのですが、出来ればファイルは分けておきたいので、もっと良い方法がないかと思った次第です)

hanigura
作成: 2022/07/17 (日) 02:43:45
通報 ...
1

私の場合、exeと同じ場所に外部ファイルがある形にしてます。
(exeファイルと同じ場所に置きたくないという要望を満たす回答にはならずすみません)

雑にしか理解してないんですが、GMS1.4の頃は外部ファイルも全部exeファイルの中に入る形にビルドされていたので、配布するゲームは外部ファイルが見えない(というか存在しない)形になっていたんですが、GMS2になってそれができなくなり、今の形になりました。
インストーラーで外部ファイルを展開する場所をC:\Users\username\AppData\以下などに指定できたらいいのですが、その方法は、私の知る限りは無いようです。

■すぐに見つからない場所に置く(隠す)
上記のように、方法は無いっぽいです。

■拡張子を変える
少しは効果があるかもしれませんが、データを見てやろうという意思がある人は開いちゃうと思います。

■難読化する
ファイルを開いても内容を読めなくすることは選択肢の1つだと思います。これも完全じゃないですが多くの人は読むことを諦めるでしょう。



ということで現在は「ソロプレイのゲームなら」という条件つきですが、「読みたい人は読めばいい、プレイする本人が自分の意志で見たくて見るならそれを止める理由は無いかもしれないな」と開き直って、それ以上考えないようにしてます!🙈

他の人がどうやってるのか、私も知りたいです!

2

ありがとうございます!
やっぱり場所は変えられないんですね…
自分も絶対見られてはいけない訳ではないので、ひとまず1ファイルで管理できるiniファイルに差し替えてやっていくことにしました。(iniファイルなら覗かれにくいと信じて…)

私も他の方の方法も気になるので、解決とは書かずに置いておきます。

3
生高橋 2022/07/17 (日) 20:57:44

翻訳者の人が作業中にどうしても実行中に値を変更したい場合はどうしようもないですが
別にそうでないなら翻訳者のデータをそのまま構造体や配列などに変換して直接ソースコードにコピーするのも手です。
データを隠蔽できますし、ファイル読み込み処理もなくて済みます。
ただし、翻訳者のデータが変更されるたびにソースコードに変換する作業が必要になりますけどね...

4

なるほど逆転の発想・・・
しかしキャラがよく喋るゲームで、最終的に何文字になるかも分からないので今回は外部ファイルの方向性で行くつもりです。
ありがとうございました!

5
名前なし 2022/07/22 (金) 18:49:06 修正

「exeファイルと同じ階層に並べたくはない」というのは、

test_game.exe
└scenario
 ├en
 └ja
  └test01.txt

という形式でtest01.txtなどを置きたくないということなのでしょうか?

データファイルを読み込むために使う「file_text_open_read(file_path)」などは、ゲームオプション設定で保存場所として設定した場所なら読み書きできます。
Windowsの場合は、「%localappdata%<ゲーム名>」「%appdata%<ゲーム名>」か選べる様になっているので、そのフォルダ以下にファイルやフォルダがあれば読み込むことができます。

%localappdata%<ゲーム名>
└scenario
 ├en
 └ja
  └test01.txt

fname = "scenario\\ja\\test01.txt";
fh = file_text_open_read(fname);
text01 = file_text_read_string(fh);

とすれば、localappdataのゲーム名フォルダ以下にあるファイルを読み込むことができます。

exeファイルと同じ階層に並べたくはないという要望があった場合、私ならlocalappdataなどにシナリオの言語リソースを入れます。
そのまま中身が見える問題は、暗号化や難読化したりすれば良いと思います。

localappdataなどにファイルをどうやって置くかは、インストーラーなどでファイルをコピーするなどが考えられます。

GameMaker標準機能でインストーラーを作る場合、「NSIS(Nullsoft Scriptable Install System)」というインストーラー作成システムを使用しています。
ゲームオプション設定でインストーラーを作るためのNSIS用スクリプトを指定できるので、標準状態の(NSIS用スクリプト)設定から変えることで、好きなファイルを好きな場所に入れることができます。
NSIS用スクリプトは、インストーラーの持っているファイルをどこにコピーする、といった様なスクリプトになっています(他にもいろいろなことができます)ので、NSISの公式サイトのマニュアルやgoogleなどで検索すれば、設定スクリプトの書き方が出てきます。

しかし、好きなところにコピーできたとしても、上記しましたが、GameMaker製のゲームから見える世界は、ゲーム自身があるフォルダ、ゲームオプション設定で選んだ「%localappdata%<ゲーム名>」か「%appdata%<ゲーム名>」しかないので、それ以外のフォルダにファイルを入れても読み込むことはできません。

6
asa 2022/07/24 (日) 12:27:47 修正

保存場所、サンドボックスの設定はこれで、
画像1

インストーラー作成時のNSISについての設定がこれですね。
画像2

NSISというのでデプロイに関して指定できるんでしょうか、NSISというのは全然知りませんでした!
ここで教えてもらえてよかったです!

haniguraさんのやりたいこともこれで実現できるでしょうか。

7

おお、すごい情報・・・
返事遅くなりすみません、ありがとうございます。

file_text_open_readはそういえばセーブデータの管理に使っていました。
最初からファイルを置くことは無理だと思っていましたがインストーラーを作ることで出来るんですね。

参考にさせていただきます。

8

最終的に、やっぱりインストーラーより実行ファイルが良い!となったので以下のように落ち着きました。
フォルダにdatファイルを並べてdatafilesフォルダに入れておき、以下のコードでビルド前に以下のコードのworking_directoryとprogram_directoryを入れ替えることで正しく動く…というやり方です。(exeファイルより深い階層であれば良かったので、フォルダを作れることが分かっただけで解決する話でした)

// テキストファイルのディレクトリ
//
// ビルド時にはdatafilesフォルダの中身を更新してprogram_directoryを読み込む

//dir = program_directory + "/system/";
dir = working_directory + "/system/";


// ファイルからテキストを読み込むための変数
fid = 0;

readA = array_create(30, "");
readB = array_create(30, "");
readC = array_create(30, "");


// テキストファイルの読み込み
fid = file_text_open_read(dir + "scroll_player.dat");
for(i=0;i<18;i++){
	readA[i] = file_text_read_string(fid);
	file_text_readln(fid);
}
file_text_close(fid);
9
名前なし 2022/08/03 (水) 07:43:46 修正 >> 7

test_game.exe
 └system
  └scroll_player.dat

file_text_open_readで読み込むときは、working_directory等を付けなくても読み込むことが可能です。

▼マニュアル working_directoryについて
https://manual.yoyogames.com/GameMaker_Language/GML_Reference/File_Handling/File_Directories/working_directory.htm

dir = "system/";
fid = file_text_open_read(dir + "scroll_player.dat");

で読み込めます。

file_text_open_read実行時には、ゲームの実行ファイルのある場所が基準となりますので、事項ファイルのある場所以下のパスを入れることで読み込むことができます。デバッグ時も変わらないはずです。

上にあった、appdata等からも読み込むことができますが、優先順位があります。

file_text_open_readなどで読み込む際には、ファイルが存在するか?読み込めるか調べて無かった場合、順位が下のファイルが存在するか?読み込めるかを調べていくようです。

1.「%localappdata%<ゲーム名>」or「%appdata%<ゲーム名>」のパス以下
2.ゲームの実行パス以下

ビルド前に

dir = program_directory + "/system/";

を有効化する必要もないと思います。

fid = file_text_open_read("system/scroll_player.dat");

なら、実行ファイルのある場所以下systemフォルダのscroll_player.datを読み込めます。

datafilesに入れたフォルダやファイルは、exeのある場所にそのまま配置されるので、デバッグ時でもプログラムを変える必要はないと思います。デバッグ時もexeが出来たときと同じように読み書きできます。

datafiles(インクルードファイル)
 └system
  └scroll_player.dat

で実行ファイルを作成するとファイルの配置は

test_game.exe
 └system
  └scroll_player.dat

となります。

マニュアルのFile Systemページにファイルの仕組みが解説されていますので参考にしてみてください。
https://manual.yoyogames.com/Additional_Information/The_File_System.htm

10

>> 9
ご丁寧にありがとうございます!
program_directoryやworking_directoryは最初省略してたんですが恐らくほかの原因で上手くいかないのが続いてて疑心暗鬼になってたのでつけてました・・・
よく読んで外してやってみます!助かります