2008年8月22日金曜日

テキストFILEの更新 ver02

データに決まった内容を書き込むサンプルスクリプトはできましたが
今度は入力した内容をデータに書き込みます

変更前のテキストFILE
FILE名:dat\\y_tack_page.txt
NO.001
TITLE:ずざざん ざん♪
URL :http://space.geocities.jp/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002
TITLE:TACK BLOG
URL :http://space.geocities.yahoo.co.jp/gl/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.003
TITLE:ブログを ずざざん ざん♪
URL :http://ytack.blogspot.com/
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:


テキストFILEの更新のスクリプトver02

以前作成したdiv_strモジュールを使用しています
#include "FILE_div_str.hsp"

bt_str_01="NO.001"
bt_str_02="NO.002"
bt_str_03="NO.003"

sl_bt_str_01="→NO.001"
sl_bt_str_02="→NO.002"
sl_bt_str_03="→NO.003"
sl_NO=1

bt_cmd_str_01="項目"
bt_cmd_str_02="TEXT"

sl_bt_cmd_str_01="→項目"
sl_bt_cmd_str_02="→TEXT"
sl_CMD=1

sdim s_title,1000
s_title=""
sdim s_url ,1000
s_url=""
sdim s_memo ,2000
s_memo=""
t_null ="TITLE:\nURL :\nmemo1:\nmemo2:\nmemo3:\n"
t_null+="memo4:\nmemo5:\nmemo6:\nmemo7:"
sdim s_text ,4000
s_text=t_null

sdim to_chg_topic,4,256
to_chg_topic.1="HSPTV!"
to_chg_topic.2="http://hsp.tv/"
to_chg_topic.3="ONION software"

sdim to_chg_text,10,256
to_chg_text.1="TITLE:HSPTV!"
to_chg_text.2="URL :http://hsp.tv/"
to_chg_text.3="memo1:ONION software"
to_chg_text.4="memo2:"
to_chg_text.5="memo3:"
to_chg_text.6="memo4:"
to_chg_text.7="memo5:"
to_chg_text.8="memo6:"
to_chg_text.9="memo7:"

gosub *ld_dat
gosub *set_topic_pre

*begin
cls 0
gosub *draw_button
if sl_CMD==1{ gosub *draw_topic }
if sl_CMD==2{ gosub *draw_text }
stop

*set_topic_pre
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
s=""
gosub *get_inside
s_title=t
i++
gosub *get_inside
s_url=t
i++
s_memo=""
repeat 7
gosub *get_inside
s_memo+=t
i++
loop
return

*get_inside
noteget s,i
l=strlen(s)
l-=6
t=strmid(s,6,l)
return

*set_text_pre
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
s_text=""
s=""
repeat 9,i
noteget s,cnt
s_text+=s+"\n"
loop
return

*set_topic_tmp
s_title=to_chg_topic.1
s_url =to_chg_topic.2
s_memo =to_chg_topic.3
return

*set_text_tmp
s_text=""
repeat 9,1
s_text+=to_chg_text.cnt+"\n"
loop
return

*draw_text
pos 120,25
mesbox s_text,480,450,1,-1
return

*draw_topic
pos 120,25
mes "title"
mesbox s_title,360,40,1,-1
mes "URL"
mesbox s_url,360,100,1,-1
mes "memo"
mesbox s_memo,360,250,1,-1
return

*draw_button
objsize 120.25
pos 0,0
if sl_CMD==1{
button sl_bt_cmd_str_01,*cmd01 }
else{ button bt_cmd_str_01,*cmd01 }
if sl_CMD==2{
button sl_bt_cmd_str_02,*cmd02 }
else{ button bt_cmd_str_02,*cmd02 }
button "tmplate挿入",*cmd_insert
button "更新",*cmd_chg
button "RESET",*cmd_reset
button "LOAD",*cmd_load
pos 120,0
if sl_NO==1{
button sl_bt_str_01,*sl_1 }
else{ button bt_str_01,*sl_1 }
pos 240,0
if sl_NO==2{
button sl_bt_str_02,*sl_2 }
else{ button bt_str_02,*sl_2 }
pos 360,0
if sl_NO==3{
button sl_bt_str_03,*sl_3 }
else{ button bt_str_03,*sl_3 }
return

*sl_1
sl_NO=1
goto *set_dat
*sl_2
sl_NO=2
goto *set_dat
*sl_3
sl_NO=3
goto *set_dat

*set_dat
if sl_CMD==1{ gosub *set_topic_pre }
if sl_CMD==2{ gosub *set_text_pre }
goto *begin

*cmd01
sl_CMD=1
goto *set_dat
*cmd02
sl_CMD=2
goto *set_dat

*cmd_insert
if sl_CMD==1{ gosub *set_topic_tmp }
if sl_CMD==2{ gosub *set_text_tmp }
goto *begin

*ld_dat
sdim dat,1024
notesel dat
noteload "dat\\y_tack_page.txt"
return

*cmd_chg
if sl_CMD==1{ gosub *topic2text}
if sl_CMD==2{ gosub *mb2text}
stop
*topic2text
s = "TITLE:"+div_one_at_div_str(s_title)
t = "URL :"+div_one_at_div_str(s_url)

init_at_div_str 16
set_str_at_div_str s_memo
div_str_at_div_str 16
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
noteadd s,i,1 :i++
noteadd t,i,1 :i++
j=3
k=1
repeat 7,i
noteadd ("memo"+k+":"+get_str(j)),cnt,1
j++
k++
loop
notesave "dat\\chg_dat.dat"
exec "notepad dat\\chg_dat.dat"
stop

*mb2text
init_at_div_str 16
set_str_at_div_str s_text
div_str_at_div_str 16
if sl_NO==1:i=1
if sl_NO==2:i=11
if sl_NO==3:i=21
j=1
repeat 9,i
noteadd get_str(j),cnt,1
j++
loop
notesave "dat\\chg_dat.dat"
exec "notepad dat\\chg_dat.dat"
stop

*cmd_load
sdim dat,2048
notesel dat
noteload "dat\\chg_dat.dat"
goto *set_dat

*cmd_reset
gosub *ld_dat
goto *set_dat

ToDoリストによるとまだまだ
作成すべき機能もありますが
サンプルスクリプトも作成するのがめんどうなので
サンプルスクリプトの作成は一段落させて
本体のスクリプトを作成していこうと思います

2008年8月21日木曜日

文字列を改行での分割モジュールver02:テストコード

テストコードA
#include "FILE_div_str.hsp"

string_1="1ab\n\n3cd\n4ef\n\n6gh\n7ij\n8kl";c=8
string_2="1ab\n\n3cd\n4ef";c=4
string_3="1ab\n\n3cd\n4ef\n";c=5
string_4="1\n2\n3\n4\n5\n\n7\n8\n\n10\n11\n"

init_at_div_str 16
set_str_at_div_str string_1
div_str_at_div_str 10

logmes "1a:"+get_str(1)
logmes "2a:"+get_str(2)
logmes "3a:"+get_str(3)
logmes "4a:"+get_str(4)
logmes "5a:"+get_str(5)
logmes "6a:"+get_str(6)
logmes "7a:"+get_str(7)
logmes "8a:"+get_str(8)

init_at_div_str 16
set_str_at_div_str string_2
div_str_at_div_str 4

logmes "1b:"+get_str(1)
logmes "2b:"+get_str(2)
logmes "3b:"+get_str(3)
logmes "4b:"+get_str(4)
logmes "5b:"+get_str(5)
logmes "6b:"+get_str(6)
logmes "7b:"+get_str(7)
logmes "8b:"+get_str(8)

init_at_div_str 8
set_str_at_div_str string_3
div_str_at_div_str 10

logmes "1c:"+get_str(1)
logmes "2c:"+get_str(2)
logmes "3c:"+get_str(3)
logmes "4c:"+get_str(4)
logmes "5c:"+get_str(5)
logmes "6c:"+get_str(6)
logmes "7c:"+get_str(7)
logmes "8c:"+get_str(8)

init_at_div_str 16
set_str_at_div_str string_4
div_str_at_div_str 16

logmes "1d:"+get_str(1)
logmes "2d:"+get_str(2)
logmes "3d:"+get_str(3)
logmes "4d:"+get_str(4)
logmes "5d:"+get_str(5)
logmes "6d:"+get_str(6)
logmes "7d:"+get_str(7)
logmes "8d:"+get_str(8)
logmes "9d:"+get_str(9)
logmes "10d:"+get_str(10)
logmes "11d:"+get_str(11)
logmes "12d:"+get_str(12)
logmes "13d:"+get_str(13)
logmes "14d:"+get_str(14)
logmes "15d:"+get_str(15)
logmes "16d:"+get_str(16)
stop


テストコードB
#include "FILE_div_str.hsp"
sdim word,4096

repeat 1000,1
if cnt\10==9{word+="\n"}
else{word+=str(cnt)+"\n"}
loop

init_at_div_str 2048
set_str_at_div_str word
div_str_at_div_str 1000

repeat 1000,1
logmes str(cnt)+":"+get_str(cnt)
loop
stop

文字列を改行での分割モジュールver02

分割は一行か七行と決めうちして、モジュールを作成したのですが
十行の分割がやりたくなったので
何行の分割もできるようにモジュールを改造しました

FILE名:FILE_div_str.hsp
#module div_str
/* グローバル変数
変数
max_ar ar_locとar_sの配列の最大
index 分割した数
string 分割する文字列
len Stringの長さ

配列
ar_loc \nの場所
ar_s 分割した文字列を格納
**/

// グローバル変数の初期化
#deffunc init_at_div_str int max
max_ar=max
dim ar_loc,max
sdim ar_s,max,256
sdim string,1024
index=0
return

// setter
#deffunc set_str_at_div_str str p
string=p
len=strlen(string)
return

// getter
#defcfunc get_str int p
if p>index:return ""
return ar_s.p

// 文字列分割
#deffunc div_str_at_div_str int div_num
num=0
if div_num>=max_ar{count=max_ar}
else{count=div_num}
count--

// \nの位置を調べて配列にar_loc\nの位置を格納
num++
if instr(string,ar_loc.0,"\n")==-1{ar_loc.1=-1}
else{ ar_loc.1=instr(string,ar_loc.0,"\n")+2}
repeat count,1
tmp=cnt+1
num++
if instr(string,ar_loc.cnt,"\n")==-1{ar_loc.tmp=-1:break}
else{ ar_loc.tmp=instr(string,ar_loc.cnt,"\n")+ar_loc.cnt+2 }
loop
index=num

// 一つ目の\nの位置までの文字列を配列ar_sに格納
if num>=1{
hoge=ar_loc.1-2
ar_s.1=strmid(string,0,hoge)
}

// \nの位置から次の\nの位置までの文字列を配列ar_sに格納
repeat count,1
n=cnt+1
if (num>=n)&(ar_loc.cnt!=-1){
hoge=ar_loc.n-ar_loc.cnt-2
ar_s.n=strmid(string,ar_loc.cnt,hoge)
}
loop

// 文字列に\nが含まれてないので、文字列を配列ar_sに格納
if ar_loc.1==-1{
ar_s.1=string
}

// 最後の\nの位置から、文字列の最後までを配列ar_sに格納
repeat count,1
nn=cnt+1
if ar_loc.nn==-1{
hoge=len-ar_loc.cnt
ar_s.nn=strmid(string,-1,hoge)
break
;mes nn ;コメントアウト
}
loop
return

// 複数行の文字列から、最初の一行
// 単一行の文字列であれば文字列全部を返す
#defcfunc div_one_at_div_str var pre
loc=instr(pre,0,"\n")
if loc==-1:return pre
return strmid(pre,0,loc)

#global

2008年8月20日水曜日

テキストFILEの更新

データの編集操作の一環で
データに決まった内容を書き込みます

データに書き込むのは
決まってない内容ですが
まずは決まった内容を書き込むスクリプトを書いてみました

変更前のテキストFILE
FILE名:dat\\y_tack_page.txt
NO.001
TITLE:ずざざん ざん♪
URL :http://space.geocities.jp/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.002
TITLE:TACK BLOG
URL :http://space.geocities.yahoo.co.jp/gl/digital_clock_2006
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:
NO.003
TITLE:ブログを ずざざん ざん♪
URL :http://ytack.blogspot.com/
memo1:author
memo2:y.tack
memo3:
memo4:
memo5:
memo6:
memo7:


そして、テキストFILEの更新のスクリプト
// 変更用文字列を配列で用意
sdim to_chg,10,256
to_chg.1="TITLE:HSPTV!"
to_chg.2="URL :http://hsp.tv/"
to_chg.3="memo1:ONION software"
to_chg.4="memo2:"
to_chg.5="memo3:"
to_chg.6="memo4:"
to_chg.7="memo5:"
to_chg.8="memo6:"
to_chg.9="memo7:"

*begin
mes "何番のデータを更新しますか?"
button "NO.001",*chg_001
button "NO.002",*chg_002
button "NO.003",*chg_003
stop

// 変更前dat読み込み
*ld_dat
sdim dat,1024
notesel dat
noteload "dat\\y_tack_page.txt"
return

// ボタンAを押した時の処理
*chg_001
gosub *ld_dat
i=0
goto *chg_func

// ボタンBを押した時の処理
*chg_002
gosub *ld_dat
i=10
goto *chg_func

// ボタンCを押した時の処理
*chg_003
gosub *ld_dat
i=20
goto *chg_func

// datの書き換え
*chg_func
repeat 9,1
j=i+cnt
noteadd to_chg.cnt,j,1
loop

// datを保存して、それをnotepadで開く
notesave "dat\\changed_dat.txt"
exec "notepad dat\\changed_dat.txt"
stop

2008年8月19日火曜日

文字列を改行での分割モジュール

複数行入力されることが予想される
入力された文字列から一行もしくは七行
改行文字で分割した文字列を配列に格納するための
文字列の分割モジュールです
分割して取得する行数は一行か七行と決め打ちしているので
拡張性は考えていません

確か開発wikiに分割モジュールがあった気がしますが
文字列処理は好きな分野なので
面白半分でモジュールを作成してみました

注:スクリプトは変更したので削除

シンプルな文字列操作

簡単なテストで文字列操作のやり方がわかってきたところで関数を一つ
文字列の中に\nがあればそれ以前
文字列の中に\nがなければ文字列全部
を返す関数を作ってみました
複数行の文字列から、最初の一行
単一行の文字列であれば文字列全部を返す関数です
goto *@f
#defcfunc div_one var pre
loc=instr(pre,0,"\n")
if loc==-1:return pre
return strmid(pre,0,loc)
*@
s="123\n45"
logmes "s:"+div_one(s)
t="12345"
logmes "t:"+div_one(t)
stop

シンプルな関数ですが意外と使い道がありそう

そうそう。久しぶりに実験室を更新しました

button命令による割り込み時の繰り返し命令の動作

簡単な文字列操作のテスト

久しぶりにTACK Local Linksの開発です
今回の目標はデータファイルを入力する文字列群で更新することです

そのために、まずは複数行文字列を\nで分割して
文字列配列に格納したいです

文字列の分割の前に、文字列操作関数の復習から

// \nの位置を調べる
s="abc\ndef"
loc=instr(s,0,"\n")
logmes str(loc)

// 文字列sを\nで二つに区切る
l=strlen(s)
l-=loc+2
t=strmid(s,0,loc)
u=strmid(s,(loc+2),l)
logmes t
logmes u
stop

2008年8月13日水曜日

サイトのデザイン変更しました

tytyさんのアドバイスを参考にサイトのデザインを変更しました
変更箇所が広範囲というか
ほぼサイト全域に及んでいて、変更はめんどくさかったんですけど
ジオシティーの更新ツールが便利で
案外、簡単に更新できました

白や黒はありきたりで嫌だったので
灰色を基調にデザインしてみました
大分、見やすくなったと思うけれど
まだ見にくい。という意見があれば
白か黒を基調にデザインの変更を行うので
ゲストブックにでも書き込んでください

それと、今までみやすい配色を行うという視点が欠けていて
自分の好きな色ばかり使っていたことをお詫び致します
どうもすみませんでした

僕のサイトはスクリプトを参考にしたいというより
こんなスクリプト書いたんだぜー。というような
スクリプトの発表の場であり
単なる自己満足のためでもあり
あんまり、参考にして欲しくて書いている訳ではありません

参考にすべきサイトは他にたくさんあり
そのようなサイトを参考にして
僕のスクリプトはちょろっと見る程度でかまわない
というスタンスです
でもやっぱり僕のスクリプトも参考にして欲しい気持ちもあり
そんな矛盾にはさまれていたりします

特にブログにスクリプトやToDoリストを書くのは
wikiに書きながらスクリプトを書いていくように
自分で眺めながら開発するという趣旨が強いです

それから、最近、自分のサイトのバナーを書いてから
少し、LINK活動をしています
自分のサイトより参考になるサイトは
たくさんあることは強く認識しているので
そのうちLINKも充実させたいです
といってもLINKは
自分でたくさん集めるよりも
LINK集の充実しているサイトからジャンプする方が
効率的なのも知っているので
そういうことを視野に入れながら、増やしていきたいです

2008年8月10日日曜日

calc_priceモジュール TESTコード

モジュールを作ったらTESTせねばってことでTEST

関数cmp_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
logmes "cmp:LV1:0:50"
logmes str(cmp_price(1,0,50))
logmes "cmp:LV1:0:49"
logmes str(cmp_price(1,0,49))
logmes "cmp:LV16:2:0"
logmes str(cmp_price(16,2,0))
logmes "cmp:LV16:0:0"
logmes str(cmp_price(16,0,0))
stop


命令get_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
repeat 24,1
a=0
b=0
get_price cnt,a,b
logmes str(cnt)+"a:"+a
logmes str(cnt)+"b:"+b
loop
stop


命令sub_priceのTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
repeat 24,1
a=0:b=0
sub_price cnt,a,b
logmes str(cnt)+"a:"+str(a)
logmes str(cnt)+"b:"+str(b)
loop
stop


型変換がきちんとなされているか?のTEST
 #include "longint.hsp"
#include "FILE_calc_price_slv_0_3.hsp"
init_calc_price
a=9999999
b=9999999
sub_price 20,a,b
mes ""+a+"M"+b
stop

calc_priceモジュール

INT二つで値を処理するモジュールを作ってみました
コピペしようが何しようが
モジュールに手を加えた後はいじりたくないので
別FILEにして#includeした方が良いか検討中です
ですがとりあえず
FILEの中身をモジュールのみにしてTESTしてみます

FILE名:FILE_calc_price_slv_0_3.hsp
#module calc_price
#deffunc init_calc_price
// レベルから計算する価格の表示用
price_a=0
price_b=0
dim sep_of_price,2,64
sep_of_price.0.1 = 0
sep_of_price.1.1 = 50
sep_of_price.0.2 = 0
sep_of_price.1.2 = 100
sep_of_price.0.3 = 0
sep_of_price.1.3 = 200
sep_of_price.0.4 = 0
sep_of_price.1.4 = 400
sep_of_price.0.5 = 0
sep_of_price.1.5 = 800
sep_of_price.0.6 = 0
sep_of_price.1.6 = 1600
sep_of_price.0.7 = 0
sep_of_price.1.7 = 3200
sep_of_price.0.8 = 0
sep_of_price.1.8 = 6400
sep_of_price.0.9 = 0
sep_of_price.1.9 = 12800
sep_of_price.0.10 = 0
sep_of_price.1.10 = 25600
sep_of_price.0.11 = 0
sep_of_price.1.11 = 51200
sep_of_price.0.12 = 0
sep_of_price.1.12 = 102400
sep_of_price.0.13 = 0
sep_of_price.1.13 = 204800
sep_of_price.0.14 = 0
sep_of_price.1.14 = 409600
sep_of_price.0.15 = 0
sep_of_price.1.15 = 819200
sep_of_price.0.16 = 1
sep_of_price.1.16 = 638400
sep_of_price.0.17 = 3
sep_of_price.1.17 = 276800
sep_of_price.0.18 = 6
sep_of_price.1.18 = 553600
sep_of_price.0.19 = 13
sep_of_price.1.19 = 107200
sep_of_price.0.20 = 26
sep_of_price.1.20 = 214400
sep_of_price.0.21 = 52
sep_of_price.1.21 = 428800
sep_of_price.0.22 = 104
sep_of_price.1.22 = 857600
sep_of_price.0.23 = 209
sep_of_price.1.23 = 715200
sep_of_price.0.24 = 419
sep_of_price.1.24 = 430400
return

#deffunc sub_price int lv,var have_a,var have_b
to_sub=LongInt(sep_of_price.1.lv)
to_sub+=sep_of_price.0.lv*1000000
of_sub=LongInt(have_b)
of_mul=LongInt(have_a)
of_mul=of_mul*1000000
of_sub+=of_mul
of_sub-=to_sub
chg_sub=LongInt(of_sub)
chg_sub=chg_sub/1000000
have_a=int(chg_sub)
chg_sub=LongInt(of_sub)
chg_sub=chg_sub\1000000
have_b=int(chg_sub)
return
#defcfunc cmp_price int lv,int have_a,int have_b
if sep_of_price.0.lv < have_a{return 2}
if sep_of_price.0.lv > have_a{return -2}
if sep_of_price.1.lv <= have_b{return 1}
return -1


#deffunc get_price int lv,var have_a,var have_b
have_a=sep_of_price.0.lv
have_b=sep_of_price.1.lv
return
#global

sep_of_price配列の値の計算は手動じゃないです
2倍、4倍...と計算して
頭に文字列くっつけてlogmesで出力させたのをコピペしました

SKILL POINT開発再開

HSPコンテストに向けてPOINT生成連打RPG、SKILL POINT
の開発を行っています
着想は2年くらい前でしょうか
忘れた頃、忘れた頃に作成していて
現在、スクリプトの長さ約2500行
といっても、ほとんどプロジェクトすぅぃったの原理で
シナリオですけど
構造エディタを使っているためスクリプトを分割してないので
この長さになったとも言います

で、ゲームの趣旨はMAGIC POINTなりSKILL POINTなりマナなり
POINTを貯めるのが趣旨なので
INT型以上に貯めたいので
LongIntのdllを使ってみました
手始めにマナのPOINTの管理をLongIntのdllを使って
二つのINTで表現してみました

試行錯誤して、その処理のサブルーチン作成がなかなか上手くいって
メインスクリプトに組み込んでみた
よしよし上手く動く
で、下位のINTに999999。上位のINTにも999999代入してテストしてみた
(下位を100000で割った値を上位のINTで表現)
すると、動作が変だ
原因は型変換の不徹底
HSPはあまり型変換を意識する必要のないプロセッサーなので
型変換が不徹底でした

型変換を徹底させるときちんと動きました
これからスクリプトに組み込むぞ!ヲー!