2019年 10月 18日
前回のイベントウインドウを使って、SAVE、LOADを表示して操作する画面を作る。
SAVEとLOADのボタンは次の通り。

SAVEボタンを押す。

セーブ箇所は表示の関係で 3つ、下のオートセーブはターン終了時に自動でセーブされる場所で、この画面ではセーブできない。
文字は後でグラソフトで描く事にする。
1番を押してみる。

ハイ、イイエはオートセーブの場所に表示する。
ハイを押すと

セーブしてセーブしたと表示される。
ロードを押す。

見た感じ変わらないので、後で画面のどこかに SAVE、LOADの表示を作ろうと思う。
1番を押してみる。

ハイを押すとロードする。

ロードの場合オートセーブからもロードできる。

それではソースを。
*save
trn1=0
dtf1=0 : exist "gm_data1.dat"
if strsize!-1 {
dtf1=1 : dim dtn2,strsize
bload "gm_data1.dat",dtn2
trn1=dtn2(3)
}
trn2=0
dtf2=0 : exist "gm_data2.dat"
if strsize!-1 {
dtf2=1 : dim dtn2,strsize
bload "gm_data2.dat",dtn2
trn2=dtn2(3)
}
trn3=0
dtf3=0 : exist "gm_data3.dat"
if strsize!-1 {
dtf3=1 : dim dtn2,strsize
bload "gm_data3.dat",dtn2
trn3=dtn2(3)
}
trn0=0
dtf0=0 : exist "gm_data0.dat"
if strsize!-1 {
dtf0=1 : dim dtn2,strsize
bload "gm_data0.dat",dtn2
trn0=dtn2(3)
}
svb=0 : savef=0
repeat
svky=save_key()
dg svky,1
dg dtf1,3
dg dtf2,4
dg dtf3,5
dg dtf0,6
stick svb
switch savef
case 0 ; 待機
if svb!256 or svky=4 : swbreak
if svky=0 : savef=10 : swbreak ; 終わり
dt_no=svky : savef=1
swbreak
case 1 ; セーブしますか
if svb!256 : swbreak
x=mousex : y=mousey
if 400<=x and svy1(4)<=y and 500>=x and svy2(4)>=y {
save2 : savef=2 : c=0
if dt_no=1 : trn1=dtn2(3) : dtf1=1
if dt_no=2 : trn2=dtn2(3) : dtf2=1
if dt_no=3 : trn3=dtn2(3) : dtf3=1
;if dt_no=4 : trn0=dtn2(3) : dtf0=1
swbreak
}
savef=0
swbreak
case 2 ; セーブしました
c+ : if c=100 : savef=10
if svb!256 : swbreak
savef=10
swbreak
swend
if savef=10 : break ; 終わり
redraw 0
color 0,0,0 : boxf : color 255,255,255
map_put ; マップ表示
color 190,190,190
boxf 400,svy1(4),500,svy2(4)
evw 0,28+16,24,35,13 ; イベントウインドウ表示
evw 1,28+16,24,35,13 ; イベントウインドウ表示
color 203,172,49
repeat 3,1
line svx1,24+8+cnt*64,svx2,24+8+cnt*64
loop
s="SAVE 1" : bfp s,svx1+32,svy1(1)+24,0
if dtf1=1 : s="TURN "+trn1 : bfp s,svx1+200,svy1(1)+24,0
s="SAVE 2" : bfp s,svx1+32,svy1(2)+24,0
if dtf2=1 : s="TURN "+trn2 : bfp s,svx1+200,svy1(2)+24,0
s="SAVE 3" : bfp s,svx1+32,svy1(3)+24,0
if dtf3=1 : s="TURN "+trn3 : bfp s,svx1+200,svy1(3)+24,0
evw 0,28+16,192+24+24+16,35,5 ; イベントウインドウ表示
evw 1,28+16,192+24+24+16,35,5 ; イベントウインドウ表示
switch savef
case 0
s="AUTO SAVE" : bfp s,svx1+32,svy1(4)+24,0
if dtf0=1 : s="TURN "+trn0 : bfp s,svx1+200,svy1(4)+24,0
swbreak
case 1
color 255,255,255
if dt_no=4 {
pos svx1+32,svy1(4)+24 : mes "AUTO SAVE にセーブしますか"
}
else {
pos svx1+32,svy1(4)+24 : mes ""+dt_no+" 番にセーブしますか"
}
pos 400,svy1(4)+24 : s="YES" : bfp s,400,svy1(4)+24,0
pos 400,svy1(4)+24 : s="NO" : bfp s,500,svy1(4)+24,0
swbreak
case 2
color 255,255,255
pos svx1+32,svy1(4)+24 : mes ""+dt_no+" 番にセーブしました"
swbreak
swend
dg_put
/*
n=255
repeat 4,1
color n,n,n : n-=64
boxf svx1,svy1(cnt),svx2,svy2(cnt)
loop
*/
redraw 1
await 1000/20
loop
return
*load
dtf1=0 : exist "gm_data1.dat"
if strsize!-1 {
dtf1=1 : dim dtn2,strsize
bload "gm_data1.dat",dtn2
trn1=dtn2(3)
}
dtf2=0 : exist "gm_data2.dat"
if strsize!-1 {
dtf2=1 : dim dtn2,strsize
bload "gm_data2.dat",dtn2
trn2=dtn2(3)
}
dtf3=0 : exist "gm_data3.dat"
if strsize!-1 {
dtf3=1 : dim dtn2,strsize
bload "gm_data3.dat",dtn2
trn3=dtn2(3)
}
dtf0=0 : exist "gm_data0.dat"
if strsize!-1 {
dtf0=1 : dim dtn2,strsize
bload "gm_data0.dat",dtn2
trn0=dtn2(3)
}
svb=0 : savef=0
repeat
svky=save_key()
dg svky,1
stick svb
switch savef
case 0 ; 待機
if svb!256 : swbreak
if svky=0 : savef=10 : swbreak ; 終わり
if svky=1 and dtf1=1 : dt_no=1 : savef=1
if svky=2 and dtf2=1 : dt_no=2 : savef=1
if svky=3 and dtf3=1 : dt_no=3 : savef=1
if svky=4 and dtf0=1 : dt_no=0 : savef=1
swbreak
case 1 ; ロードしますか
if svb!256 : swbreak
x=mousex : y=mousey
if 400<=x and svy1(4)<=y and 500>=x and svy2(4)>=y {
load2 : savef=2 : c=0
/*
if dt_no=1 : trn1=dtn2(3) : dtf1=1
if dt_no=2 : trn2=dtn2(3) : dtf2=1
if dt_no=3 : trn3=dtn2(3) : dtf3=1
if dt_no=4 : trn0=dtn2(3) : dtf0=1
*/
swbreak
}
savef=0
swbreak
case 2 ; ロードしました
c+ : if c=100 : savef=10
if svb!256 : swbreak
savef=10
swbreak
swend
if savef=10 : break ; 終わり
redraw 0
color 0,0,0 : boxf : color 255,255,255
map_put ; マップ表示
evw 0,28+16,24,35,13 ; イベントウインドウ表示
evw 1,28+16,24,35,13 ; イベントウインドウ表示
color 203,172,49
repeat 3,1
line svx1,24+8+cnt*64,svx2,24+8+cnt*64
loop
s="SAVE 1" : bfp s,svx1+32,svy1(1)+24,0
if dtf1=1 : s="TURN "+trn1 : bfp s,svx1+200,svy1(1)+24,0
s="SAVE 2" : bfp s,svx1+32,svy1(2)+24,0
if dtf2=1 : s="TURN "+trn2 : bfp s,svx1+200,svy1(2)+24,0
s="SAVE 3" : bfp s,svx1+32,svy1(3)+24,0
if dtf3=1 : s="TURN "+trn3 : bfp s,svx1+200,svy1(3)+24,0
evw 0,28+16,192+24+24+16,35,5 ; イベントウインドウ表示
evw 1,28+16,192+24+24+16,35,5 ; イベントウインドウ表示
switch savef
case 0
s="AUTO SAVE" : bfp s,svx1+32,svy1(4)+24,0
if dtf0=1 : s="TURN "+trn0 : bfp s,svx1+200,svy1(4)+24,0
swbreak
case 1
color 255,255,255
if dt_no=0 {
pos svx1+32,svy1(4)+24 : mes "AUTO SAVE からロードしますか"
}
else {
pos svx1+32,svy1(4)+24 : mes ""+dt_no+" 番からロードしますか"
}
pos 400,svy1(4)+24 : s="YES" : bfp s,400,svy1(4)+24,0
pos 400,svy1(4)+24 : s="NO" : bfp s,500,svy1(4)+24,0
swbreak
case 2
color 255,255,255
if dt_no=0 : pos svx1+32,svy1(4)+24 : mes "AUTO SAVE からロードしました" : swbreak
pos svx1+32,svy1(4)+24 : mes ""+dt_no+" 番からロードしました"
swbreak
swend
dg_put
/*
n=255
repeat 4,1
color n,n,n : n-=64
boxf svx1,svy1(cnt),svx2,svy2(cnt)
loop
*/
redraw 1
await 1000/20
loop
return
#defcfunc save_key ; SAVE画面入力
x=mousex : y=mousey : save_keyn=0
repeat 4,1 ; 選択
if svx1<=x and svy1(cnt)<=y and svx2>=x and svy2(cnt)>=y : save_keyn=cnt : break
loop
return save_keyn
; SAVE画面座標
svx1=28+16+8
svx2=28+16+8+34*16
dim svy1,4
dim svy2,4
repeat 3
svy1(cnt+1)=24+8+cnt*64
svy2(cnt+1)=svy1(cnt+1)+64
loop
svy1(4)=264
svy2(4)=264+64
始めに exist "gm_data1.dat"で、セーブデータがあるかどうか確認し、ターン数のデータを取得する。
strsizeにはデータ量が入るので、そのまま dimで大きさを定義するのに使っている。
今回は以上です。
次はタイトル画面を作ると思う。