HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0305
re-gz実行ファイルの状態からHSPで書かれた外部スクリプトを読み込む方法について13解決


re-gz

リンク

2016/3/5(Sat) 13:26:07|NO.74782

HSPの実行ファイル状態でHSPで書いた外部スクリプトを実行させる手立てが知りたいです。

やりたいこととしては、実行ファイル以外に保存した変数を実行ファイルのほうで読み込みたい&
可能ならば実行ファイルのほうで変更させた変数を外部ファイルに書き込む、と言う事も行いたいです。

検索はして、過去の質問で近いかもと言うものは発見できたのですが、理解できなかった感じです。


noteload命令を用いて行数指定を行い、対象行を読み込ませると言う手法なら理解できるのですが、
可能ならばHSPスクリプト形式での読み書きが行いたいのです。



この記事に返信する


KA

リンク

2016/3/5(Sat) 19:25:36|NO.74787

>>やりたいこととしては、
>>実行ファイル以外に保存した変数を実行ファイルのほうで読み込みたい&
>>実行ファイルのほうで変更させた変数を外部ファイルに書き込む
>>noteload命令を用いて・・・手法なら理解できるのですが、
ノート系じゃ無くても、BLOAD/BSAVEを使うとか方法は複数有ります。

>>可能ならばHSPスクリプト形式での読み書きが行いたいのです。
実行させるのでは無く読み書きのみ?
非常に無意味になりますが、自前で構文を解釈すれば可能です。

もう少し具体的に質問しないと意図が伝わりません。



スペース

リンク

2016/3/5(Sat) 19:43:00|NO.74788

まぁこういうのは上手く伝えるのは難しいから仕方ないかもしれないけど、イマイチ伝わらない。
とりあえずその似た質問のURLを貼って頂けませんか?

ぱっと思い浮かんだのはこのスレ。
http://hsp.tv/play/pforum.php?mode=pastwch&num=42969



kanamaru

リンク

2016/3/6(Sun) 11:12:08|NO.74794

スペースさんがあげたスレッドのモジュールを読み込んだ後で、
compute関数を使えば出来そうです。
でも関数にほとんど対応していない。
モジュールの改良が必要かも。



Y_repeat(旧y.tack)

リンク

2016/3/6(Sun) 14:19:06|NO.74795

HDDでhspcmp.hspというsampleを検索して出て来たのが参考になると思います



re-gz

リンク

2016/3/8(Tue) 14:54:58|NO.74820

反応遅れてすみません、完全に説明不足でした。

やりたいことは、RPGでNPCキャラクターの台詞をtxtに保存した形式で、ユーザーが編集可能にする感じです。

例えば1人目.txtの中身を


1人目初期台詞="こんにちわ"
1人目待機台詞="がんばります"





としておき、実行ファイルを起動するたびに本体プログラムの1人目初期台詞に反映させる形にしたいのです。

開発中は
#addition "1.txt"

で読み込ませていたつもりだったのですが、この命令は結合してコンパイルであり外部のスクリプトを読み込む物ではないと今更になって気づいた状況です。



KA

リンク

2016/3/8(Tue) 20:09:29|NO.74825

つまり、面倒くさいことはしないで「1人目初期台詞="こんにちわ"」と言う文字列で
”1人目初期台詞”という変数に、"こんにちわ"と代入させたいということですね。

前にも書いたように、やり方は色々ありますが「ちょこっと変えるだけ」なんていう
都合のいい方法はありません。

変数の個数自体は同じなのか、それとも追加した分は変数も増やしたいのかでも変わっ
てきます。要は今の作りがどうなっているかで方法も違ってきます。



zero

リンク

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



Velgail

リンク

2016/3/9(Wed) 01:36:49|NO.74829

じゃあ、私は違う案ということで、Sqleleを使った移動方法を提案するとしましょうか。

1. 基本的にローディング時にすべてSqlite3のデータベース(テーブルはstr,strで)に変換
2. 必要になったらDBアクセスをかけて文字列を取得

DB化のコストと、項目検索の面倒臭さを比較して好きな方法を選べばいいと思うけど。
(いっそ編集UIをこっちで作ってDBに書き込ませるのも手)



KA

リンク

2016/3/9(Wed) 18:09:23|NO.74839

ちょうど考え方が似たスレが出たので参考にしましょう。

http://hsp.tv/play/pforum.php?mode=all&num=74834



スペース

リンク

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

こういうのも、あるんやで(´∀`
http://dev.onionsoft.net/seed/info.ax?id=765



re-gz

リンク

2016/3/11(Fri) 13:00:41|NO.74864

みなさん、ありがとうございます。
zeroさんの教えてくださったスクリプトが手間がなくベストでした。

確認遅れがちでスペースさんにもお手間かけさせてしまったのが申し訳ないです……

Module GSは、自分の理解力ではまだ分からない用語が多く使い方がわからない感じでした……



SquidSky

リンク

2016/8/2(Tue) 11:50:00|NO.76495

vsaveとかはだめなの?



ONION software Copyright 1997-2018(c) All rights reserved.