/////// 地形生成プログラム ///////
#include "hsp3dish.as"
gosub *main : end
#deffunc map_check ; 6回同じ処理なので一つにまとめ
if map(m)=0 : return ; 地形無し
f=0
repeat 25 : cn=cnt
if mf(cn)=0 : break ; 登録はもう無いよ
if mf(cn)=m : f=1 : break ; 登録済み
loop
if f=1 : return ; 登録済み
mf(cn)=m ; チェック済みに登録
return
*main
screen 0,640,360
celload "hex_104_90_map.png",1
celdiv 1,104,96
dim hxyd,2,26 ; HEX座標変数(0=x、1=y)
bload "hxyd.dat",hxyd ; HEX座標データ読み込み
dim txyd,4,26 ; タップ座標変数(0=tx1、1=ty1、2=tx2、3=ty2)
bload "txyd.dat",txyd ; タップ座標データ読み込み
randomize
repeat ;------- マップ生成 -------
dim map,26
; マップ(0=無し、1=火山、2=水辺、3=草原、4=山、5=森、6沼)
dim mf,26 ; 生成チェックフラグ
mapg=0 ; いくつ地形を作ったか
mfn=0 ; 次に処理する MAP No.
repeat 25,1 ; MAPを地形で埋める
r=rnd(6)+1 : map(cnt)=r
loop
repeat 5 ; ランダムに5つ地形を消す
r=rnd(25)+1
map(r)=0
loop
bn=0 ; 地形無しのマス数
repeat 25,1
if map(cnt)=0 : bn+
loop
mapg=25-bn ; 地形有りのマス数
repeat 25,1 ; 始めるマップの位置
if map(cnt)>0 : mapn=cnt : mf(mfn)=mapn : mfn+ : break
loop
f=0
repeat 25 ; 隣接マップ順に順次確認処理-------------------------------
repeat 1 ; 上はあるか -------------------------
if mapn\7=1 or mapn\7=5 : break ; 上が無い地形なら終わり
m=mapn-1 ; 上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 右上はあるか -----------------------
if mapn\7=1 or mapn>=22 : break ; 右上が無い地形なら終わり
m=mapn+3 ; 右上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 右下はあるか -----------------------
if mapn\7=4 or mapn>=22 : break ; 右下が無い地形なら終わり
m=mapn+4 ; 右下のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 下はあるか -------------------------
if mapn\7=0 or mapn\7=4 : break ; 下が無い地形なら終わり
m=mapn+1 ; 下のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 左上はあるか -----------------------
if mapn\7=1 or mapn<=4 : break ; 左上が無い地形なら終わり
m=mapn-4 ; 左上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 左下はあるか -----------------------
if mapn\7=4 or mapn<=4 : break ; 左下が無い地形なら終わり
m=mapn-3 ; 左下のマップ座標
map_check ; マップチェックと書き込み処理
loop
mapn=mf(mfn) : mfn+ ; 次にチェックする地形
if mapn=0 : break ; が無いなら終わり
if mapg=mfn : f=2 : break ; チェック数とマス最大数が同じなら全部繋がってるとみなして完成
loop
if f=2 : break
loop
redraw 0;------- 表示 -------
color 0,0,0 : boxf : color 255,255,255
gmode 2
repeat 25,1
x=hxyd(0,cnt) : y=hxyd(1,cnt)
pos x,y : celput 1,map(cnt)+5 ; HEX描画
n=map(cnt)
pos x+86,y+38 : mes n ;map(cnt) ; マス番号表示
pos 10,10 : mes bn
loop
redraw 1
repeat
stick k,,0 : if k=128 : break
await 1000/20
loop
return