2022年 5月 27日
ゲームスタート時に、色々な設定をできるスタート画面を作った。

設定できるのは「マップサイズ」「プレイヤー人数」「操作人数」「国の数」「キャラクターユニットの登場数」「ユーザーカラーの使用」「マップ表示速度」「戦闘表示速度」「戦闘表示種類」となっている。
SUI(スクロール・ユーザー・インターフェイス、適当)の考えにより、画面は縦にスクロールする。



マップサイズは画面の x(横)の大きさ事で、1~3画面まで設定できる。
プレイヤー数は勢力数の事で、最大 20勢力で争う事ができる。
操作人数は操作する勢力数の事で、普通は 1人、これは最大勢力数まで、つまり全員操作まで設定できる。
LANDは国の数、各勢力の国数が均等になるように、勢力数の倍数になるようにしている。
キャラクターユニットは、0なら出現無し、1~3はそのレベルのキャラクターユニットまで出現する。
レベル 1なら、Lv1の攻撃指揮官、防御指揮官、軍師、民生官、君主が出る。
ゲームレベルはゲームの難易度を設定する、1が簡単~5が難しい。
ユーザーカラーは USE(使う)の時にオリジナルカラーをプレイヤー 1に設定できる。
オリジナルカラーは元の色はシルバーで、その色を変えて使う。
ランダムの場合は 20色をバラバラに割り当てる。
マップの表示ウエイトを設定できます。
戦闘の表示ウエイトを設定できます。
戦闘表示の種類、画面切り替え ← → 簡易表示の設定をします。
以上を任意に設定して右下の STARTを押すとゲームが始まります。

ソース
////////// ゲームスタート ///////////
*game_start_ini
gs_ly=0 ; スクロール座標
gs_cly1=109 ; 背景分割ライン1
gs_cly2=829 ; 背景分割ライン2
gs_fgx1=245 ; 数字のケタ
gs_fgx2=270-50-1
gs_fgx3=270+1
gs_fgx4=270-75-2
gs_fgx5=270-25
gs_fgx6=270+25+2
; 矢印上下
gs_arux=540/2-192/2
gs_aruy=gs_cly1-23
gs_ardx=gs_arux
gs_ardy=gs_cly2+8
gs_arux1=170
gs_arux2=370
gs_aruy1=gs_aruy-4
gs_aruy2=gs_cly1-3
gs_ardx1=170
gs_ardx2=370
gs_ardy1=gs_ardy-4
gs_ardy2=gs_ardy1+24
; キー入力
dim gs_kx1,11
dim gs_kx2,11
dim gs_ky1,11
dim gs_ky2,11
; MAP SIZE
gs_sy1=117
gs_msx1=102
gs_msx2=245
gs_msx3=388
gs_msy1=gs_sy1+79
; PLAYR
gs_sy2=gs_sy1+185
gs_kx1(1)=70
gs_kx2(1)=gs_kx1(1)+130
gs_ky1(1)=gs_sy2+46
gs_ky2(1)=gs_ky1(1)+120
gs_kx1(2)=340
gs_kx2(2)=gs_kx1(2)+130
gs_ky1(2)=gs_ky1(1)
gs_ky2(2)=gs_ky2(1)
; OPERATION PLAYER
gs_sy3=gs_sy2+185
gs_kx1(3)=70
gs_kx2(3)=gs_kx1(3)+130
gs_ky1(3)=gs_sy3+46
gs_ky2(3)=gs_ky1(3)+120
gs_kx1(4)=340
gs_kx2(4)=gs_kx1(4)+130
gs_ky1(4)=gs_ky1(3)
gs_ky2(4)=gs_ky2(3)
; LAND
gs_sy4=gs_sy3+183
gs_kx1(5)=70
gs_kx2(5)=gs_kx1(5)+130
gs_ky1(5)=gs_sy4+46
gs_ky2(5)=gs_ky1(5)+120
gs_kx1(6)=340
gs_kx2(6)=gs_kx1(6)+130
gs_ky1(6)=gs_ky1(5)
gs_ky2(6)=gs_ky2(5)
; CHARACTER UNIT
gs_sy5=gs_sy4+197
dim gs_cux,4
k=109
gs_cux(0)=84
gs_cux(1)=gs_cux(0)+k
gs_cux(2)=gs_cux(1)+k
gs_cux(3)=gs_cux(2)+k
gs_cuy1=gs_sy5+83
; GAME LEVEL
gs_sy6=gs_sy5+201
dim gs_lvx,6
k=92
gs_lvx(1)=61
gs_lvx(2)=gs_lvx(1)+k
gs_lvx(3)=gs_lvx(2)+k
gs_lvx(4)=gs_lvx(3)+k
gs_lvx(5)=gs_lvx(4)+k
gs_lvy1=gs_sy6+83
; COLOR CHANGE
gs_sy8=gs_sy6+202;246
gs_sy9=gs_sy8+73
gs_c9x1=115 ; USE
gs_c9x2=288 ; RANDOM
gs_ccx1=94 ; ゲージ
gs_ccy1=gs_sy9+74
gs_ccy2=gs_sy9+149
gs_ccy3=gs_sy9+224
; Map display speed
gs_sy10=gs_sy9+344
dim gs_mdx,6
k=92
gs_mdx(1)=61
gs_mdx(2)=gs_mdx(1)+k
gs_mdx(3)=gs_mdx(2)+k
gs_mdx(4)=gs_mdx(3)+k
gs_mdx(5)=gs_mdx(4)+k
gs_mdy1=gs_sy10+83
; Battle display speed
gs_sy11=gs_sy10+199
dim gs_bdx,6
k=92
gs_bdx(1)=61
gs_bdx(2)=gs_bdx(1)+k
gs_bdx(3)=gs_bdx(2)+k
gs_bdx(4)=gs_bdx(3)+k
gs_bdx(5)=gs_bdx(4)+k
gs_bdy1=gs_sy11+83
; 戦闘表示 FULL SIMPLE
gs_sy12=gs_sy11+199
gs_sy13=gs_sy12+73
gs_c13x1=115 ; FULL
gs_c13x2=288 ; SIMPLE
gs_cckf=283.0/176.0 ; 間隔
gs_ccarlx=38 ; ←
gs_ccarrx=460 ; →
gs_lyb=1430 ; スクロール最下段
gs_btx1=26 ; back
gs_bty1=861
gs_btx2=277 ; start
gs_bty2=861
return
#deffunc gs_fg_put int _gs_fg_putn
n=_gs_fg_putn
s=str(n)
f=strlen(s)
if f=1 { ; 1ケタ
pos gs_fgx1,y+25 : celput fg50grw,n
return
}
if f=2 { ; 2ケタ
n2=n/10 : pos gs_fgx2,y+25 : celput fg50grw,n2
n2=n\10 : pos gs_fgx3,y+25 : celput fg50grw,n2
return
}
if f=3 { ; 3ケタ
n2=n/100 : pos gs_fgx4,y+25 : celput fg50grw,n2
n2=n/10 : n2=n2\10 : pos gs_fgx5,y+25 : celput fg50grw,n2
n2=n\10 : pos gs_fgx6,y+25 : celput fg50grw,n2
return
}
return
#deffunc gs_put
gmode 2
; 背景
pos 0,gs_cly1 : celput gs3Bw
; MAP SIZE
y=gs_sy1-gs_ly
if y>0 and y<gs_cly2 : pos 167,y : celput gsft4w
y=gs_msy1-gs_ly : if y>0 and y<gs_cly2 {
pos gs_msx1 ,y : celput fg50orw,1
pos gs_msx2 ,y : celput fg50orw,2
pos gs_msx3 ,y : celput fg50orw,3
if scf=1 : pos gs_msx1-25,y-25 : celput gswd1w,0,0.8,0.8
if scf=2 : pos gs_msx2-25,y-25 : celput gswd1w,0,0.8,0.8
if scf=3 : pos gs_msx3-25,y-25 : celput gswd1w,0,0.8,0.8
}
; ALL PLAYER
y=gs_sy2-gs_ly
if y>0 and y<gs_cly2 : pos 180,y : celput gsft5w
y+=56 : if y>0 and y<gs_cly2 {
pos 100,y : celput gsar1w,0,0.7,0.7
pos 368,y : celput gsar2w,0,0.7,0.7
gs_fg_put plb
}
; OPERATION PLAYER
y=gs_sy3-gs_ly
if y>0 and y<gs_cly2 : pos 47,y : celput gsft6w
y+=56 : if y>0 and y<gs_cly2 {
pos 100,y : celput gsar1w,0,0.7,0.7
pos 368,y : celput gsar2w,0,0.7,0.7
gs_fg_put spln
}
; LAND
y=gs_sy4-gs_ly
if y>0 and y<gs_cly2 : pos 210,y : celput gsft7w
y+=56 : if y>0 and y<gs_cly2 {
pos 100,y : celput gsar1w,0,0.7,0.7
pos 368,y : celput gsar2w,0,0.7,0.7
gs_fg_put ldb
}
; CHARACTER UNIT
y=gs_sy5-gs_ly
if y>0 and y<gs_cly2 : pos 67,y : celput gsft8w
y=gs_cuy1-gs_ly : if y>0 and y<gs_cly2 {
;boxf gs_cux1-25,y-25,gs_cux1+72,y+72
repeat 4
pos gs_cux(cnt),y : celput fg50orw,cnt
loop
pos gs_cux(cusf)-25,y-25 : celput gswd1w,0,0.8,0.8
}
; GAME LEVEL
y=gs_sy6-gs_ly
if y>0 and y<gs_cly2 : pos 130,y : celput gsft9w
y=gs_lvy1-gs_ly : if y>0 and y<gs_cly2 {
repeat 5,1
pos gs_lvx(cnt),y : celput fg50blw,cnt
loop
pos gs_lvx(glv)-25,y-25 : celput gswd1w,0,0.8,0.8
}
; FULL DICE
y=gs_sy7-gs_ly
if y>0 and y<gs_cly2 : pos 155,y : celput gsft11w
y=gs_diy1-gs_ly : if y>0 and y<gs_cly2 {
pos gs_dix1,y : celput fg50grw,8
pos gs_dix2,y : celput fg50grw,1
pos gs_dix2+48,y : celput fg50grw,2
pos gs_dix3,y : celput fg50grw,1
pos gs_dix3+48,y : celput fg50grw,6
if dcb=8 : pos gs_dix1-44,y-41 : celput gswd1w,0,1.1,1.1
if dcb=12 : pos gs_dix2-17,y-41 : celput gswd1w,0,1.1,1.1
if dcb=16 : pos gs_dix3-18,y-41 : celput gswd1w,0,1.1,1.1
}
; COLOR CHANGE
y=gs_sy8-gs_ly
if y>0 and y<gs_cly2 : pos 131,y : celput gsft12w
y=gs_sy9-gs_ly
if y>0 and y<gs_cly2 {
pos gs_c9x1,y : celput gsft13w
pos gs_c9x2,y : celput gsft14w
if clcgf=1 : pos gs_c9x1-42,y+2 : celput guidew ; USE
if clcgf=0 : pos gs_c9x2-42,y+2 : celput guidew ; RANDOM
}
; RGBゲージ
y=gs_ccy1-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
color cld(55),cld(56),cld(57)
k=int(double(cld(55)-48)*gs_cckf)
boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
pos gs_ccx1,y : celput gaugew,0,0.8,0.8
pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
pos gs_ccx1+14+k,y+5 : celput gspow
}
y=gs_ccy2-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
color cld(55),cld(56),cld(57)
k=int(double(cld(56)-48)*gs_cckf)
boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
pos gs_ccx1,y : celput gaugew,0,0.8,0.8
pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
pos gs_ccx1+14+k,y+5 : celput gspow
}
y=gs_ccy3-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
color cld(55),cld(56),cld(57)
k=int(double(cld(57)-48)*gs_cckf)
boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
pos gs_ccx1,y : celput gaugew,0,0.8,0.8
pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
pos gs_ccx1+14+k,y+5 : celput gspow
}
; Map display speed
y=gs_sy10-gs_ly
if y>0 and y<gs_cly2 : pos 40,y : celput gsft16w
y=gs_mdy1-gs_ly : if y>0 and y<gs_cly2 {
repeat 5,1
pos gs_mdx(cnt),y : celput fg50piw,cnt
loop
pos gs_mdx(bpwt1f)-25,y-25 : celput gswd1w,0,0.8,0.8
}
; Battle display speed
y=gs_sy11-gs_ly
if y>0 and y<gs_cly2 : pos 113,y : celput gsft17w
y=gs_bdy1-gs_ly : if y>0 and y<gs_cly2 {
repeat 5,1
pos gs_bdx(cnt),y : celput fg50piw,cnt
loop
pos gs_bdx(bpwt2f)-25,y-25 : celput gswd1w,0,0.8,0.8
}
; 戦闘表示
y=gs_sy12-gs_ly
if y>0 and y<gs_cly2 : pos 80,y : celput gsft18w
y=gs_sy13-gs_ly
if y>0 and y<gs_cly2 {
pos gs_c13x1,y : celput gsft19w
pos gs_c13x2,y : celput gsft20w
if btl_putf=0 : pos gs_c13x1-42,y+2 : celput guidew ; USE
if btl_putf=1 : pos gs_c13x2-42,y+2 : celput guidew ; RANDOM
}
; 背景
pos 0,0 : celput gs3Aw
pos 0,gs_cly2 : celput gs3Cw
; 枠
gmulcolor 255,255,255
repeat 12
pos 40+cnt*40,0 : celput gswk5w
pos 40+cnt*40,920 : celput gswk8w
loop
repeat 22
pos 0 ,40+cnt*40 : celput gswk6w
pos 500,40+cnt*40 : celput gswk7w
loop
pos 0 ,0 : celput gswk1w
pos 500,0 : celput gswk2w
pos 0 ,920 : celput gswk3w
pos 500,920 : celput gswk4w
; game_start
pos 77,24 : celput gsft1w
; back
pos gs_btx1,gs_bty1 : celput gsbt1w
pos 96,878 : celput gsft3w
; start
pos gs_btx2,gs_bty2 : celput gsbt1w
pos 335,878 : celput gsft2w
pos gs_arux,gs_aruy : celput gsar3w
pos gs_ardx,gs_ardy : celput gsar3w,2
return
#deffunc gs_key_syo
switch gsky
case 1 ; プレイヤー数
plb-
if plb<2 : plb=2
if ldb<ldba : ldb=ldba ;: ldb+=plb-(ldb\plb)
ldb-=ldb\plb
if ldb<ldba : ldb+=plb-(ldb\plb)
if plb<spln : spln=plb
swbreak
case 2
plb+
if plb>20 : plb=20
if ldb\plb=0 : swbreak
ldb+=plb-(ldb\plb)
if ldb>ldbb : ldb-=plb
swbreak
case 3 ; 操作人数
spln- : if spln<1 : spln=1
swbreak
case 4
spln+ : if spln>plb : spln=plb
swbreak
case 5 ; 国の数
ldb-
if ldb<plb : ldb=plb : swbreak ; 最小人数
if ldb<ldba : ldb=ldba ; 最小国数
ldb-=ldb\plb
if ldb<ldba : ldb+=plb-(ldb\plb)
swbreak
case 6
ldb+=plb-(ldb\plb)
if ldb>ldbb : ldb-=plb : swbreak
swbreak
case 11 ; 画面数
scf=1 : ldba=2 : ldbb=40
if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
swbreak
case 12
scf=2 : ldba=20 : ldbb=80
if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
swbreak
case 13
scf=3 : ldba=40 : ldbb=120
if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
swbreak
; CHARACTER UNIT
case 14 : cusf=0 : swbreak
case 15 : cusf=1 : swbreak
case 16 : cusf=2 : swbreak
case 17 : cusf=3 : swbreak
; GAAME LEVEL
case 19 : glv=1 : swbreak
case 20 : glv=2 : swbreak
case 21 : glv=3 : swbreak
case 22 : glv=4 : swbreak
case 23 : glv=5 : swbreak
; FULL DICE
case 24 : dcb=8 : swbreak
case 25 : dcb=12 : swbreak
case 26 : dcb=16 : swbreak
; COLOR CHANGE
case 27 : clcgf=1 : swbreak ; USE
case 28 : clcgf=0 : swbreak ; RANDOM
case 29 : cld(55)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; RED
case 30 : cld(56)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; GREEN
case 31 : cld(57)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; BLUE
case 32 ; R+
cld(55)- : if cld(55)<48 : cld(55)=48
swbreak
case 33 ; R+
cld(55)+ : if cld(55)>224 : cld(55)=224
swbreak
case 34 ; G-
cld(56)- : if cld(56)<48 : cld(56)=48
swbreak
case 35 ; G+
cld(56)+ : if cld(56)>224 : cld(56)=224
swbreak
case 36 ; B-
cld(57)- : if cld(57)<48 : cld(57)=48
swbreak
case 37 ; B+
cld(57)+ : if cld(57)>224 : cld(57)=224
swbreak
case 39 : mainf=5 : swbreak ; start
; Map display speed
case 40 : bpwt1f=1 : swbreak
case 41 : bpwt1f=2 : swbreak
case 42 : bpwt1f=3 : swbreak
case 43 : bpwt1f=4 : swbreak
case 44 : bpwt1f=5 : swbreak
; Battle display speed
case 45 : bpwt2f=1 : swbreak
case 46 : bpwt2f=2 : swbreak
case 47 : bpwt2f=3 : swbreak
case 48 : bpwt2f=4 : swbreak
case 49 : bpwt2f=5 : swbreak
; 戦闘表示
case 50 : btl_putf=0 : swbreak
case 51 : btl_putf=1 : swbreak
swend
if cusf=3 and ldb<15 : cusf=2
if cusf=2 and ldb<10 : cusf=1
if cusf=1 and ldb<5 : cusf=0
return
*game_start
if scf=1 : ldba=2 : ldbb=40
if scf=2 : ldba=20 : ldbb=80
if scf=3 : ldba=40 : ldbb=120
kwc=5 : gskyk=10 : gskyc=0
repeat
k=0 : mx=0 : my=0 ; 入力リセット
repeat 1
if kwc>0 : kwc- : break ; ウエイト
mx=mousex : my=mousey ; カーソル位置
stick k,256 ; マウスボタン、スマホクリック
loop
; キー位置
gsky=0 : my2=my+gs_ly
repeat 1
; スクロール矢印上下
if gs_arux1<mx and gs_aruy1<my and gs_arux2>mx and gs_aruy2>my and k=256 {
gs_ly-=10 : if gs_ly<0 : gs_ly=0
break
}
if gs_ardx1<mx and gs_ardy1<my and gs_ardx2>mx and gs_ardy2>my and k=256 {
gs_ly+=10 : if gs_ly>=gs_lyb : gs_ly=gs_lyb
break
}
if gs_btx1+2<mx and gs_bty1+2<my and gs_btx1+235>mx and gs_bty1+66>my : gsky=38 : break ; back
if gs_btx2+2<mx and gs_bty2+2<my and gs_btx2+235>mx and gs_bty2+66>my : gsky=39 : break ; start
if my<gs_cly1 : break ; 画面外上
if my>gs_cly2 : break ; 画面外下
; プレイヤー数
if gs_msx1-25<mx and gs_msy1-25<my2 and gs_msx1+72>mx and gs_msy1+72>my2 : gsky=11 : break
if gs_msx2-25<mx and gs_msy1-25<my2 and gs_msx2+72>mx and gs_msy1+72>my2 : gsky=12 : break
if gs_msx3-25<mx and gs_msy1-25<my2 and gs_msx3+72>mx and gs_msy1+72>my2 : gsky=13 : break
; CHARACTER UNIT
repeat 4
if gs_cux(cnt)-25<mx and gs_cuy1-25<my2 and gs_cux(cnt)+72>mx and gs_cuy1+72>my2 {
gsky=14+cnt : break
}
loop
; GAAME LEVEL
repeat 5,1
if gs_lvx(cnt)-25<mx and gs_lvy1-25<my2 and gs_lvx(cnt)+72>mx and gs_lvy1+72>my2 {
gsky=18+cnt : break
}
loop
; FULL DICE
if gs_dix1-46<mx and gs_diy1-41<my2 and gs_dix1+89 >mx and gs_diy1+92>my2 : gsky=24 : break
if gs_dix2-18<mx and gs_diy1-41<my2 and gs_dix2+117>mx and gs_diy1+92>my2 : gsky=25 : break
if gs_dix3-19<mx and gs_diy1-41<my2 and gs_dix3+116>mx and gs_diy1+92>my2 : gsky=26 : break
; COLOR CHANGE
if gs_c9x1-15<mx and gs_sy9-10<my2 and gs_c9x1+101>mx and gs_sy9+50>my2 : gsky=27 : break ; USE
if gs_c9x2-15<mx and gs_sy9-10<my2 and gs_c9x2+206>mx and gs_sy9+50>my2 : gsky=28 : break ; RANDOM
;if clcgf=1 { ; USE
if gs_ccx1+35<=mx and gs_ccy1+4<my2 and gs_ccx1+35+283>=mx and gs_ccy1+51>my2 : gsky=29 : break ; RED
if gs_ccx1+35<=mx and gs_ccy2+4<my2 and gs_ccx1+35+283>=mx and gs_ccy2+51>my2 : gsky=30 : break ; GREEN
if gs_ccx1+35<=mx and gs_ccy3+4<my2 and gs_ccx1+35+283>=mx and gs_ccy3+51>my2 : gsky=31 : break ; BLUE
if gs_ccarlx-9<mx and gs_ccy1-5<my2 and gs_ccarlx+48>mx and gs_ccy1+61>my2 : gsky=32 : break ; R-
if gs_ccarrx-7<mx and gs_ccy1-5<my2 and gs_ccarrx+50>mx and gs_ccy1+61>my2 : gsky=33 : break ; R+
if gs_ccarlx-9<mx and gs_ccy2-5<my2 and gs_ccarlx+48>mx and gs_ccy2+61>my2 : gsky=34 : break ; G-
if gs_ccarrx-7<mx and gs_ccy2-5<my2 and gs_ccarrx+50>mx and gs_ccy2+61>my2 : gsky=35 : break ; G+
if gs_ccarlx-9<mx and gs_ccy3-5<my2 and gs_ccarlx+48>mx and gs_ccy3+61>my2 : gsky=36 : break ; B-
if gs_ccarrx-7<mx and gs_ccy3-5<my2 and gs_ccarrx+50>mx and gs_ccy3+61>my2 : gsky=37 : break ; B+
;}
; Map display speed
repeat 5,1
if gs_mdx(cnt)-25<mx and gs_mdy1-25<my2 and gs_mdx(cnt)+72>mx and gs_mdy1+72>my2 {
gsky=39+cnt : break
}
loop
; Battle display speed
repeat 5,1
if gs_bdx(cnt)-25<mx and gs_bdy1-25<my2 and gs_bdx(cnt)+72>mx and gs_bdy1+72>my2 {
gsky=44+cnt : break
}
loop
; 戦闘表示
if gs_c13x1-20<mx and gs_sy13-10<my2 and gs_c13x1+130>mx and gs_sy13+50>my2 : gsky=50 : break ; 通常表示
if gs_c13x2-20<mx and gs_sy13-10<my2 and gs_c13x2+180>mx and gs_sy13+50>my2 : gsky=51 : break ; 簡易表示
; 矢印
repeat 8
if gs_kx1(cnt+1)<mx and gs_ky1(cnt+1)<gs_ly+my and gs_kx2(cnt+1)>mx and gs_ky2(cnt+1)>gs_ly+my {
gsky=cnt+1 : break
}
loop
loop
; 押してる
repeat 1
if k!256 : break
if kf=0 : kf=1 : kepy=my : keply=gs_ly : gsky=0
if kf=1 {
if kepy-my>18 or my-kepy>18 : kf=2 ; スクロールモード
gskyc+
if gskyc=gskyk { ; キーウエイト
gskyc=0 : gskyk- : if gskyk<1 : gskyk=1
gs_key_syo ; キー処理
}
}
if kf=2 { ; スクロール
gs_ly=keply+(kepy-my)*2
if gs_ly<0 : gs_ly=0
if gs_ly>=gs_lyb : gs_ly=gs_lyb
}
loop
; 押してない
repeat 1
if k=256 : break ; 放してない
gskyk=10 : gskyc=0
if kf=0 : break ; 一度も押してない
if kf=2 : kf=0 : break ; スクロールモード
kf=0
gs_key_syo ; キー処理
loop
if mainf!3 : break ; 戻る
redraw 0
gs_put
font "",30
dg_put
redraw 1
await 1000/50
loop
if scf=1 : hxb=19 ; 横のマスの数
if scf=2 : hxb=37
if scf=3 : hxb=55
mb=hxb*hyb
lsb=hxb*hyb ; land_set
cld2(55)=cld(55)+8
cld2(56)=cld(56)+8
cld2(57)=cld(57)+8
bpwt1_cul ; 10~50、攻守国表示時間
bpwt2_cul ; 10*2~50*2、ダイスロール表示時間
gosub *map_create ; マップ生成
gosub *start_data ; スタートデータセット
;save ; スタートセーブ
return
画面はスクロールするようにしてます。
値は gs_lyです、各座標の y座標に gs_lyを足す事によってスクロールさせてます。
一応画面外のものは表示をスキップするようにしてます。
画面一番上と一番下の文字はスクロールしません。
これが意外と難しくて、ノーマルの HSPだと「何画面のどこからどこまでをコピー表示」つまり gcopy 1,0,0,540,100 のようにできますけど、HSP Dishだと gcopyは使えません。
しかもバッファ画面から表示画面へコピーもできません。
バッファ画面から表示画面へコピーができると、別画面に完成表示を作ったら、後は表示画面へ都度完成画面を切り取って表示させるだけで間単にスクロールができるんですけど、Dishではできません。
そのため都度、その座標に合わせて表示画面に全部表示処理する必要があります。
そこで問題になったのが、上の文字と下の文字の表示です、背景をどうするかですね。
めんどくさいので詳細ははぶきますけど、背景画面を上と真ん中と下の 3画面に分割して表示させてます。
Aパーツ

Bパーツ

Cパーツ

まず真ん中の背景を表示して、その上にスクロールする設定の画面を書きます。
その上に画面上と下の背景を表示して、文字を書きます。
するとスクールの上の端と下の端の表示を切り取る事ができます。

キー入力の座標もすべて gs_lyを足す事によって算出してます。
後、難しかったのは画面数やプレイヤー人数に対する国数の倍数調整ですね。
画面数に対する最大数、最小数も含めて、プレイヤー人数の倍数になるように調整する式がややこしかったです。
case 1 ; プレイヤー数 plb- if plb<2 : plb=2 if ldb<ldba : ldb=ldba ldb-=ldb\plb if ldb<ldba : ldb+=plb-(ldb\plb) if plb<spln : spln=plb swbreak case 2 plb+ if plb>20 : plb=20 if ldb\plb=0 : swbreak ldb+=plb-(ldb\plb) if ldb>ldbb : ldb-=plb swbreak
こんな感じのやつですけど、これは人数が一人減る場合と一人増える場合ですね。
plbがプレイヤー数、ldbが国数、ldbaが国の最小、ldbbが国の最大数です。
人数は 2人~20人ですね。
国数を人数で割った余りを引いたり足したりして、人数の倍数になるように調整してます。
自分でも何やってるのか分かりません、適当に試行錯誤したら動いたという感じのやつです。
別に人数に対して国数が同じで無くても良いんですけどね、なんとなくフェアにしたいじゃないですか。
画面の大きさに対する国数の最小数と最大数は今の所
1画面、最小2 、最大40
2画面、最小20、最大80
3画面、最小40、最大120
となってます、これ以外だとマップを生成できなくなります。