|
|
2016/3/5(Sat) 13:26:07|NO.74782
HSPの実行ファイル状態でHSPで書いた外部スクリプトを実行させる手立てが知りたいです。
やりたいこととしては、実行ファイル以外に保存した変数を実行ファイルのほうで読み込みたい&
可能ならば実行ファイルのほうで変更させた変数を外部ファイルに書き込む、と言う事も行いたいです。
検索はして、過去の質問で近いかもと言うものは発見できたのですが、理解できなかった感じです。
noteload命令を用いて行数指定を行い、対象行を読み込ませると言う手法なら理解できるのですが、
可能ならばHSPスクリプト形式での読み書きが行いたいのです。
|
|
2016/3/5(Sat) 19:25:36|NO.74787
>>やりたいこととしては、
>>実行ファイル以外に保存した変数を実行ファイルのほうで読み込みたい&
>>実行ファイルのほうで変更させた変数を外部ファイルに書き込む
>>noteload命令を用いて・・・手法なら理解できるのですが、
ノート系じゃ無くても、BLOAD/BSAVEを使うとか方法は複数有ります。
>>可能ならばHSPスクリプト形式での読み書きが行いたいのです。
実行させるのでは無く読み書きのみ?
非常に無意味になりますが、自前で構文を解釈すれば可能です。
もう少し具体的に質問しないと意図が伝わりません。
|
|
2016/3/6(Sun) 11:12:08|NO.74794
スペースさんがあげたスレッドのモジュールを読み込んだ後で、
compute関数を使えば出来そうです。
でも関数にほとんど対応していない。
モジュールの改良が必要かも。
|
|
2016/3/6(Sun) 14:19:06|NO.74795
HDDでhspcmp.hspというsampleを検索して出て来たのが参考になると思います
|
|
2016/3/8(Tue) 14:54:58|NO.74820
反応遅れてすみません、完全に説明不足でした。
やりたいことは、RPGでNPCキャラクターの台詞をtxtに保存した形式で、ユーザーが編集可能にする感じです。
例えば1人目.txtの中身を
1人目初期台詞="こんにちわ"
1人目待機台詞="がんばります"
・
・
・
としておき、実行ファイルを起動するたびに本体プログラムの1人目初期台詞に反映させる形にしたいのです。
開発中は
#addition "1.txt"
で読み込ませていたつもりだったのですが、この命令は結合してコンパイルであり外部のスクリプトを読み込む物ではないと今更になって気づいた状況です。
|
|
2016/3/8(Tue) 20:09:29|NO.74825
つまり、面倒くさいことはしないで「1人目初期台詞="こんにちわ"」と言う文字列で
”1人目初期台詞”という変数に、"こんにちわ"と代入させたいということですね。
前にも書いたように、やり方は色々ありますが「ちょこっと変えるだけ」なんていう
都合のいい方法はありません。
変数の個数自体は同じなのか、それとも追加した分は変数も増やしたいのかでも変わっ
てきます。要は今の作りがどうなっているかで方法も違ってきます。
|
|
2016/3/9(Wed) 01:15:22|NO.74828
むりやりやるとすれば、こんな感じですかね。
単純に 変数名="文字列" という形式の行が並んでいる
ファイルを読み込んで、変数を探して"文字列"を代入するだけですが。
#cmpopt varname 1
#module VarUtil
#uselib ""
#cfunc _seekvar "" int
#func _setva "" int,int,int,int
#define HSPVAR_FLAG_STR 2
#deffunc local init
mref ctx, 68
pvalHead = lpeek(ctx, 44)
dupptr exinfo, lpeek(ctx, 876), 196
dupptr sd, libptr(_seekvar), 28
lpoke sd, 24, lpeek(exinfo, 192)
dupptr sd, libptr(_setva), 28
lpoke sd, 24, lpeek(exinfo, 136)
return
// setstr "変数名", "文字列"
//
// "変数名"という名前の変数を探して"文字列"を代入する。
// 変数が見つからなければ何もしない。
#deffunc setstr str _varname, str _value
varname = _varname
value = _value
id = _seekvar(varptr(varname))
if (id >= 0) {
pval = pvalHead + 48 * id
_setva pval, 0, HSPVAR_FLAG_STR, varptr(value)
}
return
#global
init@VarUtil
// <テスト>
#module
#deffunc loadVars str _filename
notesel buf
noteload _filename
repeat notemax
noteget entry, cnt
idx = instr(entry, 0, "=")
if (idx < 0) : continue
varname = strmid(entry, 0, idx)
varname = strtrim(varname, 0, ' ')
data = strmid(entry, idx+1, strlen(entry)-idx-1)
data = strtrim(data, 0, ' ')
// 両端のダブルクオーテーションを取り除く
if (peek(data, 0) == '\"' && peek(data, strlen(data)-1) == '\"') {
data = strtrim(data, 0, '\"')
}
setstr varname, data
loop
noteunsel
return
#global
/*
【sample.txtの中身】
a="これは"
b="テスト"
c="です。"
*/
loadVars "sample.txt"
mes a
mes b
mes c
stop
| |
|
2016/3/9(Wed) 01:36:49|NO.74829
じゃあ、私は違う案ということで、Sqleleを使った移動方法を提案するとしましょうか。
1. 基本的にローディング時にすべてSqlite3のデータベース(テーブルはstr,strで)に変換
2. 必要になったらDBアクセスをかけて文字列を取得
DB化のコストと、項目検索の面倒臭さを比較して好きな方法を選べばいいと思うけど。
(いっそ編集UIをこっちで作ってDBに書き込ませるのも手)
|
|
2016/3/9(Wed) 18:09:23|NO.74839
|
|
2016/3/9(Wed) 19:03:44|NO.74840
#module 文字列加工
/*
str1とstr3で囲まれている文字列を返す(取得する)
str1 取得したい文字列の始まりを示すユニーク文字列
str2 取得したい文字列が入った変数、もしくは文字列
str3 取得したい文字列の終わりを示すユニーク文字列
ct 先頭から数えて何個目の文字列を取得するか。1つしかない場合は0で問題なし。
*/
#defcfunc cat str str1 ,str str2 ,str str3,int ct
ct2=ct
開始文字数 = strlen(str1)
終了文字数 = strlen(str3)
開始=str1
文字列=str2
終了=str3
開始in=0
開始in2=0
終了in=0
repeat ct2+1
開始in = instr(文字列,開始in2,開始)
if 開始in!-1:開始in+開始文字数+開始in2:else:break
開始in2=開始in
loop
if 開始in=-1:return ""
終了in = instr(文字列,開始in,終了)+開始in
最終=strmid(文字列,開始in,終了in-開始in)
return 最終
/*
該当する文字列を削除する。
パラメーターはstr1~3まではcatと同じ。
*/
#defcfunc delcat str str1 ,str str2 ,str str3
開始文字数 = strlen(str1)
全体文字数 = strlen(str2)
終了文字数 = strlen(str3)
開始=str1
最終=""
文字列=str2
終了=str3
開始in=0
repeat
開始in = instr(文字列,0,開始)
if 開始in!-1:{
終了in = instr(文字列,開始in,終了)
if 終了in!-1:{
終了in + 開始in
文字列=""+strmid(文字列,0,開始in)+""+strmid(文字列,終了in+終了文字数,全体文字数)+""
}else:break
}else:break
loop
return 文字列
/*
str1とstr3で囲まれている文字列を置換する。
str1 置換したい文字列の始まりを示すユニーク文字列
str2 検索される文字列が格納されている文字列型変数名
str3 置換したい文字列の終わりを示すユニーク文字列
str4 置換する文字列
*/
#defcfunc Cstrrep str str1 ,str str2 ,str str3,str str4
開始文字数 = strlen(str1)
全体文字数 = strlen(str2)
終了文字数 = strlen(str3)
置換文字数 = strlen(str4)
開始=str1
最終=""
文字列=str2
終了=str3
開始in=0
置換後=str4
Index=0
repeat
開始in2 = instr(文字列,Index,開始)
開始in = Index + 開始in2
if 開始in2!-1:{
終了in = instr(文字列,開始in,終了)+開始in
if 終了in!-1:{
文字列=""+strmid(文字列,0,開始in)+""+置換後+""+strmid(文字列,終了in+終了文字数,全体文字数)+""
}else:break
}else:break
Index + 開始in2 + 置換文字数
//Dialog ""+開始in2+","+置換文字数+","+Index+""
loop
return 文字列
/*
文字列がいくつ含まれているかを検索する
str1 検索される文字列が格納されている文字列型変数名、または文字列
str2 検索を始めるインデックス
str3 検索する文字列
*/
#defcfunc Cinstr str str1,int int2,str str3
文字列 = str1
Index = int2
検索文字列 = str3
検索文字数 = strlen(str3)
ヒット数=0
repeat
開始in2 = instr(文字列,Index,検索文字列)
開始in = Index + 開始in2
if 開始in2!-1:ヒット数+1:else:break
Index + 開始in2 + 検索文字数
loop
return ヒット数
#global
//サンプル
tex={"
1人目初期台詞="こんにちわ"
1人目待機台詞="がんばります"
1人目待機台詞="このモジュールは改変自由!ソフトの組み込み自由!自由に使ってね"
"}
repeat 3
mes "一人目"+cnt+":"+cat("=\"",tex,"\"",cnt)+""
loop
こんなやり方でもいいのかな?
| |
|
2016/3/9(Wed) 22:24:11|NO.74843
|
|
2016/3/11(Fri) 13:00:41|NO.74864
みなさん、ありがとうございます。
zeroさんの教えてくださったスクリプトが手間がなくベストでした。
確認遅れがちでスペースさんにもお手間かけさせてしまったのが申し訳ないです……
Module GSは、自分の理解力ではまだ分からない用語が多く使い方がわからない感じでした……
|
|
2016/8/2(Tue) 11:50:00|NO.76495
vsaveとかはだめなの?
|
|