最終的解決
バッチファイル - 永字八法の続き。
DLLの作り方 - 永字八法を参考にして、カレントディレクトリ移動のDLLを組んでみた。いやー、思い出すのに苦労したぜ。
このDLLの詳細はまた後にして、結論から言うと、全くもって大成功と言ったところか。savedirに頼らず、セーブ場所を任意に指定することができました。
セーブする前に特定の変数にランダムの数値を代入、それを表示(して人間が覚える)。そしてセーブ。
その後一度NScripterを終了させ、再起動。今度はロード。そして特定の変数を表示させると、ちゃんとその数値になっていた。
つまり、「ディスクからの起動でセーブロードは技術的に可能」と言うことになるだろうか。おいおい、できちゃったよこれ。
貴重なコメントくださった皆様、ありがとうございます。しつこくやり続けた甲斐がありました。本当にありがとうございます。
スクリプト
*define defsub savegame defsub loadgame numalias save_num,100 numalias current_dir,101 numalias save_dir,102 numalias exec,103 game *savegame getparam %save_num getreg $save_dir,"Volatile Environment","APPDATA" mov $exec,"current.dll/107&"+$save_dir exec_dll $exec getret $current_dir _savegame %save_num mov $exec,"current.dll/107&"+$current_dir return *loadgame getparam %save_num getreg $save_dir,"Volatile Environment","APPDATA" mov $exec,"current.dll/107&"+$save_dir exec_dll $exec getret $current_dir _loadgame %save_num mov $exec,"current.dll/107&"+$current_dir return *start *main select "セーブする。",*save,"ロードする。",*load,"終了する。",*exit *save rnd2 %50,0,100 %50 savegame 1 goto *main *load loadgame 1 %50 goto *main *exit end
今後の課題
- グローバル変数もなんとかならんか?
- saveoff/saveonとの絡みはどうなってるんだろうか。
- savegame, savegame2, getsavestr, savefileexistの四つをこの方式に合うようにオーバーライド
- errorsaveはどう動くのか?
メモ
dllwrap current.cpp -o current.dll -mwindows nsdllbase.o -lm