最終的解決

バッチファイル - 永字八法の続き。
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