Hextrategy 戦略アルゴリズムやっと動くようになった


2019年 7月 26日
 
 
 前回からまた 1ヶ月あっという間に過ぎてしまいました。

 デバッグにつぐデバッグで、やっとまともに動くようになりました。

 総日数 4ヶ月、恐るべし戦略プログラム。

 結局夏休み販売に間に合いませんでしたけど、これが最後の山(今度こそだと思う、あってくれ)で、あとは音要素と、オープニング、エンディング、タイトル、オプション、あー後 SAVE LOADかあ、これも大変そうだな、それとデバッグとゲームバランスの調整とか。

 そろそろ仕上げの段階に入ると思う、でもまだ何ヶ月かかかるだろうなあ。
 
 
 代わりに次週から夏休み企画として、今回の成果を元に、またゆっくり動画を 1週ずつ上げていく予定です。

 お楽しみに。
 
 

 それでは実演を。

 赤がCPU。
 
 
 攻めて行きます。

 HEX内のの 1段目の数字は、その国の配備戦力。

 2段目は、その国の隣接する国の脅威値、つまり必要防衛戦力。

 3段目は、左がその国の建設物で、右は建設要求物。

 1は城、7は砦で、攻める国の隣接する自領に建てられる。
 
 
 砦が建てられた。

 ただこのテストでは敵を弱くしてあるので、砦が立つ前に占領していってしまう。
 
 
 要らなくなった砦は取り壊され、ユニット上限の要求が無ければ、まず鍛冶屋が優先的に建てられる。

 鍛冶屋はその国のアイテム出現率とアイテムLvを上げてくれる、魔術値の一番高い国に建てられる。

 サークルは第二人材発掘予定地で、その国のマナを上げてくれる。

 画像だと、先に建てられたサークル(3)は解体要請され、別のもっとマナの高い地に建設要求されてる。
 
 
 プレイヤーと隣接した。

 隣接した国で戦力が足りない場合、外交館が建てられ、領主の魅力に応じて配備戦力値が 1.5~2.0倍くらいに評価される。

 プレイヤーには意味が無いため、プレイヤー隣接の場合は砦にする予定。

 塔は第二アイテム地で、魔術を上げる。

 市場は第二人口地で、人口を上げる。

 11国、14国は倉庫で、アイテム数が上限の時に上限を上げるために建てられる。

 しかしこれはバグで、一度に 1つだけ建てるように修正しないと。
 
 
 鍛冶屋の国の様子。

 隣接する脅威が無いため、戦力配備はしてない。

 24 / 30はユニットの現在数 / 最大数、50 / 150はアイテムの現在数 / 最大数。

 pubsnは人材府の建設数で、ユニットの上限を上げる、pibsnは倉庫の数で 2個建てられていて、元値 + 1個 50アイテムなのが分かる。
 
 
 鍛冶屋領主のユニット装備は知力装備だったはず。

 警察なら筋力装備、人材なら魅力装備と自動装備してくれる。
 
 
 デバッグ表示のため分かり難いが、ユニットが余っていたり、国の数が一定数だと政府(ガバメント)にも配備してくれる。

 左の数字はユニット種類で、右は配備している場所、1000の値が政府配備。
 
 
 画像はプレイヤーの政府だが、こんな感じ。


 
 
 余ってる土地には、最後に寺院が建てられる。

 寺院の効果はオールマイティで、かつ祈りによって災害を抑えるという効果を持つ。

 なお、このテストでは治安が始めから 100%にしてあるため、警察署が建てられないが、普段は治安が 100%になるまで、ほとんどの土地に警察署が建てられる事になる。
 
 
 ユニットが上限になった。


 
 
 どこかに人材府が建てられるはず。


 
 
 右上の 22国に人材府が建てられた。

 人材府が最優先で建てられ、鍛冶屋が 2番目。

 人材府が最初に建てられないのは、上限の他に城が第一人材地であるため、マナ値によって変わってくる。

 以下優先順位順に、各建設物が建てかえられる。
 
 
 上限が増えてる。


 
 
 全ての国を占領し、こんな感じで落ち着いた。

 プレイヤー隣接国は戦力が上回っているため、余裕の寺院配置。

 ちなみに 1国で攻める場合は、相手国戦力の 2倍無いと攻めない。

 隣接 2国で攻める場合、3国で攻める場合を作ってある。

 まあ恐らく、この状態になったら膠着状態になって千日手の可能性がある、後日の課題。
 
 
 以上、そんな感じです。
 
 
 
 それでは今回はソースをそのまま上げます。

 緑の部分はコメントアウトで、実行時には反映されませんが、格闘の跡が分かるでしょう。

 ちなみに左に寄せてあるコードは、だいたいデバッグ用です。
 
 

*hero_per ; 英雄の行動順番

	repeat 26 ; リセット
	 hmp(cnt)=0 ; ヒーローの勢力値
	 hap(cnt)=0 ; 順列
	loop

	repeat 25,1 : pn=mpl(cnt)
	 if pn=0 : continue ; ヒーローの勢力では無い
	 hmp(pn)+=wp(cnt)	; 戦力値+
	loop

	repeat 25,1 : pn1=cnt
	 if hf(pn1)=0 : continue ; 生存確認
	 repeat 25 ; 順列のソート
	  if hap(cnt)=0 : hap(cnt)=pn1 : break	; 空白なら入れて終わり
	  if hmp(pn1)>hmp(hap(cnt)) : continue ; 値比較
	  pn2=hap(cnt) : hap(cnt)=pn1 : pn1=pn2 ; 入れ替え
	 loop
	loop

;hper_put

	return


#deffunc eq_set int eq_setn ; 単un装備

	eq_setc=0
	repeat eq_setn
	 eq_setc+
	 if eq_setc\3=2 {
	  hrs_eq 2 : if un=0 : hrs_eq 1 ; 2回目
	  continue
	 }
	 hrs_eq 1 : if un=0 : hrs_eq 2 ; 1と3回目
	loop

	;hrt1c=0 : hrt2c=0 : hrt3c=0 ; 現在の列の順番をリセット

	return


#deffunc haibi int haibim,int haibin ; 戦力配備
;if fff=1 : hrs_dpt : pkey
;if fff=1 : hrs_dpt : pkey : fff=0
	haibic=0 ; どの部隊に配備するか
	 if mu(haibim*10+1)>0 : haibic=1 ; 第一部隊が既にいる
	 if mu(haibim*10+4)>0 : haibic=2 ; 第二部隊が既にいる
	 if mu(haibim*10+7)>0 : haibic=3 : return   ; 全部体いるので配備無し

	repeat haibin : cnt3=cnt ; 配備
	 if cnt3+haibic>2 : break

	 eq_set 3 ; 装備

	 knc=haibim*mdb+(cnt3+haibic)*3

	 repeat 3,1
	  if cnt=1 { ; 1列目
	   un=hrt1(hrt1c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt1c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt2(hrt2c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt2c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt3(hrt3c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt3c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	  }
	  if cnt=2 { ; 3列目
	   un=hrt3(hrt3c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt3c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt2(hrt2c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt2c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt1(hrt1c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt1c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	  }
	  if cnt=3 { ; 2列目
	   un=hrt2(hrt2c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt2c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt1(hrt1c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt1c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	   un=hrt3(hrt3c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt3c+ : /*wp(m)+=ud(un*udb+27)*/ : continue
	  }
	 loop
	 ;if hrt1(hrt1c)=0 and hrt2(hrt2c)=0 and hrt3(hrt3c)=0 : haibif=1 : break ; 全員使った
	loop

	wpck haibim

	return


#deffunc hrs_pic int hrs_picn

	un=0

	if hrs_picn=1 { ; 筋力
	 repeat hub
	  un=hrs1(cnt) : if un>0 : hrs_del un : break
	 loop
	}

	if hrs_picn=2 { ; 魔力
	 repeat hub
	  un=hrs2(cnt) : if un>0 : hrs_del un : break
	 loop
	}

	if hrs_picn=3 { ; 知力
	 repeat hub
	  n=hrs5(cnt) : if n=0 : continue
	  if un=0 : un=n : continue
	  if ud(n*udb+3)>ud(un*udb+3) : un=n
	 loop
	 if un>0 : hrs_del un : return
	}

	if hrs_picn=4 { ; 魅力
	 repeat hub
	  n=hrs5(cnt) : if n=0 : continue
	  if un=0 : un=n : continue
	  if ud(n*udb+4)>ud(un*udb+4) : un=n
	 loop
	 if un>0 : hrs_del un : return
	}

	if hrs_picn=5 { ; 総力
	 repeat hub
	  un=hrs5(cnt) : if un>0 : hrs_del un : break
	 loop
	}

	return


;------- strategy ; 英雄勢力の人材とアイテムの発見と配置、戦略 -------

#deffunc mpn234_del int mpn234_deln

	repeat 25
	 if mpn2(cnt)=mpn234_deln : mpn2(cnt)=0 : break
	loop
	
	repeat 25
	 if mpn3(cnt)=mpn234_deln : mpn3(cnt)=0 : break
	loop

	repeat 25
	 if mpn4(cnt)=mpn234_deln : mpn4(cnt)=0 : break
	loop

	return


#deffunc dependent_set ; 一時属領一覧セット

	repeat 25 : mpn(cnt)=0 : loop ; 一時属領一覧リセット

	mpnc=0
	repeat 25,1 ; 一時属領一覧
	 if map(cnt)=0 or mpl(cnt)!pn : continue
	 mpn(mpnc)=cnt : mpnc+
	loop

	return


#deffunc mana_point ; マナポイント

	repeat 25,1 : m=cnt : mdg=m*mdb
	 if map(m)=0  : continue	; マップ無い
	 if mpl(m)!pn : continue	; 勢力国では無い
	 pmp(pn)+=md(mdg+3)/100		; マナポイント+
	loop

	return


#deffunc un_it_found ; 人材とアイテムの発見

	 repeat 25,1 : m=cnt
	  if map(m)=0 : continue		; マップ無い
	  if mpl(m)!pn : continue		; 勢力国では無い

; ユニット
	  repeat 1
	   if hf(pn)=1 and pubg(pn)>=pubn(pn) : break ; 登録が満杯
	   un_fd m : if un=0 : break	; 人材発見
		 hper_set pn,un				; 順列セット
	     un_find_put				; ユニット発見表示
;if pn=2 : gosub *jyun_put : pkey
;gosub *jyun_put
	  loop


; アイテム
	  n=1 ; 出現回数

	  mdg=m+mdb
	   n+=md(m*mdb+1)/250000	; 人口

	   if md(mdg+7)=1 : n+		; 城
	   if md(mdg+7)=2 : n+		; 塔
	   if md(mdg+7)=6 : n+=2	; 鍛冶屋

	  un=mu(m*10) : if un>0 {	; 領主
	   ug=un*udb
	    if ud(ug+8)=4 : n+		; 魔術
	    if ud(ug+8)=6 : n+=2	; 製作
	  }

	  if hf(pn)=1 and pibg(pn)>=pibn(pn) : n=0 ; 登録が満杯
	  repeat n ;md(m*mdb+3)/20000+2
	   it_fd m					; アイテムの発見
	    if in>0 {
		 hiper_set pn,in		; 順列セット
	     in_find_put			; アイテム発見表示
	    }
	  loop
	 loop

	return



; 隣接国脅威値を算出
#deffunc hdn_cal ; 隣接国脅威値を算出

	repeat 26 ; 脅威値をリセット
	 hdp(cnt)=0	; 脅威国の順列
	 hdn(cnt)=0	; 脅威値
	 ;hdsn(cnt)=0	; 脅威最小値
	 ;hdsp(cnt)=0	; の国
	loop
	hdfn=0		; の部隊数

;wp
	repeat 25,1 : m=cnt					; その国の脅威値を評価
	 if mpl(m)!pn : continue			; 自領では無い

	 repeat 6,1
	  n=hmv(m,cnt) : if n=0 : continue	; 隣接する国があるか
	  ;if map(n)=0  : continue			; 地形が無い
	  if mpl(n)=pn or mpl(n)=0 : continue; 自領、NPC
if n=matp : continue ; 攻勢国

	  ;if hf(mpl(n))=1 : wp(n)+=10000	; プレイヤー国なら
	  if hdn(m)<wpb(n) : hdn(m)=wpb(n)	; 一番大きな値
	  ;if hdn(m)<wp(n) : hdn(m)=wp(n)	; 一番大きな値
	  ;if hdsn(m)=0 or hdsn(m)>wp(n) : hdsn(m)=wp(n) : hdsp(m)=n ; 一番小さな値の国
	 loop
/*
	 repeat 3 : cnt4=cnt
	  repeat 3,1
	   if mu(hdsp(m)*10+cnt4*3+cnt)>0 : hdfn(m)+ : break ; 部隊がある
	  loop
	 loop
*/
	 pn1=m
	 repeat 25 ; 脅威国順列のソート
	  if hdp(cnt)=0 : hdp(cnt)=pn1 : break	; 空白なら入れて終わり
	  if hdp(cnt)=mpc(pn) and hdn(hdp(cnt))=0 : continue ; 城
	  if hdn(pn1)<=hdn(hdp(cnt)) and mpc(pn)!pn1 : continue ; 値比較
	  ;if hdn(pn1)<=hdn(hdp(cnt)) and mpc(pn)!pn1 : continue ; 値比較、首都は一番上
	  pn2=hdp(cnt) : hdp(cnt)=pn1 : pn1=pn2 ; 入れ替え
	 loop
	loop


; 必要総防衛値

	wp4=0
	repeat 25,1
	 if mpl(cnt)!pn or map(cnt)=0 : continue
	 wp4+=hdn(cnt)
	loop

	return


#deffunc hdp_del int hdp_deln ; 脅威国の順列から1つ消去

	repeat 25
	 if hdp(cnt)=hdp_deln : hdp(cnt)=0 : break
	loop

	return


#deffunc equipment_set1 ; 仮装備、装備と列の順列のセット

	repeat hub ; 列の順列をリセット
	 hrt1(cnt)=0 : hrt2(cnt)=0 : hrt3(cnt)=0
	loop

	;hrt1c=0 : hrt2c=0 : hrt3c=0 ; 現在の列の順番をリセット

	wp1=0 ; 総戦力値リセット


	es1n=0
	repeat hub ; 装備
	 ;es1n+ : if es1n=10 : break
	 if es1n\3=2 { ; 2回目
	  hrs_eq 2 : if un=0 : hrs_eq 1
	  continue
	 }
	 hrs_eq 1 : if un=0 : hrs_eq 2 ; 1と3回目
	loop


; 最大脅威値(最強部隊)算出

	hdb(pn)=0 : n=0
	repeat 10
	 un=hrt1(cnt) : if un>0 : hdb(pn)+=ud(un*udb+27) : n+ : if n>=9 : break
	 un=hrt2(cnt) : if un>0 : hdb(pn)+=ud(un*udb+27) : n+ : if n>=9 : break
	 un=hrt3(cnt) : if un>0 : hdb(pn)+=ud(un*udb+27) : n+ : if n>=9 : break	 
	loop

	repeat 25,1 ; MAP最大脅威値
	 if mpl(cnt)!pn : continue
	 wpb(cnt)=hdb(pn)
	loop

	;hrt1c=0 : hrt2c=0 : hrt3c=0 ; 現在の列の順番をリセット

	return


#deffunc equipment_set ; 全装備、装備と列の順列のセット

	es2n=0
	repeat hub ; 装備
	 es2n+
	 if es2n\3=2 { ; 2回目
	  hrs_eq 2 : if un=0 : hrs_eq 1
	  continue
	 }
	 hrs_eq 1 : if un=0 : hrs_eq 2 ; 1と3回目
	loop

	return


#deffunc attack_point ; 攻勢点

	matp=0 : wpn=0 ; 攻勢点と戦力値
	hdkn=0 ; 攻められる国の数

	repeat 25 ; 首都調べ
	 m=mpn(cnt) : if m=0 : break

	 repeat 6,1
	  n=hmv(m,cnt) : if n=0 : continue	; 隣接する国があるか

	  repeat 25,1
	   if cnt=pn or mpc(cnt)=0 or mpc(cnt)!n : continue ; 首都では無い
	   if wpn=0 or wpn>wp(n) : wpn=wp(n) : matp=n : break ; 最弱の首都
	  loop
	 loop
	loop

	repeat 6,1 ; 攻勢点の周辺国
	 if matp=0 : break
	 n=hmv(matp,cnt) : if n=0 : continue ; マップ無い
	 if mpl(n)!pn : continue ; 自領では無い
	 if hdn(n)=hdb(matp) : wp4d+=hdn(n) ; 攻める国の脅威しか無い場合、脅威値を無視
	loop

	if wp1-(wp4-wp4d)<wpn*2 : matp=0 : wpn=0 ; 首都攻勢点無し


	if matp=0 {
	 wpn=0
	 repeat 25 ; その他の国
	  m=mpn(cnt) : if m=0 : break

	  repeat 6,1
	   n=hmv(m,cnt) : if n=0 : continue	; 隣接する国があるか
	    if map(n)=0 or mpl(n)=pn : continue ; 地形無い、自領
	    wpn2=wp(n)
	     if md(n*mdb+7)=10 {
		  n=ud(mu(n*10)*udb+24)/2	; 領主補整
		  wpn2=wpn2*(150+n)/100		; 外交館があれば1.5倍
		 }
	    if wpn=0 or wpn>wpn2 : wpn=wpn2 : matp=n : continue ; 最弱の国
	  loop
	 loop

	 repeat 6,1 ; 攻勢点の周辺国
	  if matp=0 : break
	  n=hmv(matp,cnt) : if n=0 : continue ; マップ無い
	  if mpl(n)!pn : continue ; 自領では無い
	  if hdn(n)=hdb(matp) : wp4d+=hdn(n) ; 攻める国の脅威しか無い場合、脅威値を無視
	 loop

	 if wp1-(wp4-wp4d)<wpn*2 : matp=0 : wpn=0  : return ; 攻勢点無し
	}
	if matp=0 : return ; 攻勢点無し


	repeat 6 : hdk(cnt)=0 : loop ; 攻める国の順列リセット

	repeat 6,1 ; 攻める国の順列
	 m1=hmv(matp,cnt) : if m1=0 : continue
	 if mpl(m1)!pn : continue ; 自領では無い
	 hdkn+
	 repeat 6 ; ソート
	  if hdk(cnt)=0 : hdk(cnt)=m1 : break
	  n1=hdn(hdk(cnt))	: if n1=hdb(matp) : n1=0
	  n2=hdn(m1)		: if n2=hdb(matp) : n2=0
	  if n1<n2 : continue ; 脅威値の小さい順
	  m2=hdk(cnt) : hdk(cnt)=m1 : m1=m2
	 loop
	loop

	if hdkn>3 : hdkn=3 ; 最大数

	hdfn=0
	repeat 3 : cnt2=cnt ; 部隊数
	 repeat 3,1
	  if mu(matp*10+cnt2*3+cnt)>0 : hdfn+ : break ; 部隊がある
	 loop
	loop

	return


#deffunc fort_set ; 砦

	repeat 25
	 m=mpn(cnt) : if m=0 : break
	 mdg=m*mdb

	 f=0
	 repeat 3 ; hdkn最大数
	  if matp=0 : break
	  if hdk(cnt)=0 : break
	  if m=hdk(cnt) : f=1 : break
	 loop

	 if f=0 { ; 砦必要無い
	  if md(mdg+7)=7 : md(mdg+9)=-1	; 解体
	  if md(mdg+9)=7 : md(mdg+9)=0	; 建設リセット
	  continue
	 }

; 砦建設
	 n=md(mdg+7)
	  if n=1 or n=7 or n=10 : continue
	  ; 城、砦、外交館
	 n=md(cnt*mdb+9)
	  if n=7 or n=10 : continue
	  ; 砦、外交館
	 if md(mdg+7)!0 : md(mdg+9)=-1
	 if md(mdg+7)=0 : md(mdg+9)=7
	loop

	return


/*
#deffunc not_enough ; 戦力が足りない

	repeat 25 : st_cnt=cnt ; 戦力配備
	 if hdp(cnt)=0 : break
	  haibi hdp(cnt) : if haibif=1 : break
	loop
	if haibif=0 : return ; 終わり

	repeat 25 ; 外交館建設要請
	 m=hdn(st_cnt) : if m=0 : break
	  st_cnt+
	 mdg=m*mdb
	 if md(mdg+7)>0 or md(mdg+9)!0 : continue
	 md(mdg+9)=10 ; 外交館建設要請
	 stmf(pn)=1	; 建設モード
	loop
	if stmf(pn)=1 : return ; 終わり

	stmf(pn)=2 ; タレント要請モード

	return
*/

#deffunc mpn234_per ; 魔術、マナ、治安の順列

	repeat 25
	 mpn2(cnt)=0 ; 魔術の順列リセット
	 mpn3(cnt)=0 ; マナの順列リセット
	 mpn4(cnt)=0 ; 治安の順列リセット
	loop

	repeat 25 ; 魔術の順列
	 m=mpn(cnt) : if m=0 : break
	 repeat 25 ; ソート
	  if mpn2(cnt)=0 : mpn2(cnt)=m : break
	  if md(mpn2(cnt)*mdb+2)>md(m*mdb+2) : continue ; 大きい順
	  n=mpn2(cnt) : mpn2(cnt)=m : m=n
	 loop
	loop

	repeat 25 ; マナの順列
	 m=mpn(cnt) : if m=0 : break
	 repeat 25 ; ソート
	  if mpn3(cnt)=0 : mpn3(cnt)=m : break
	  if md(mpn3(cnt)*mdb+3)>md(m*mdb+3) : continue ; 大きい順
	  n=mpn3(cnt) : mpn3(cnt)=m : m=n
	 loop
	loop

	repeat 25 ; 治安の順列
	 m=mpn(cnt) : if m=0 : break
	 repeat 25 ; ソート
	  if mpn4(cnt)=0 : mpn4(cnt)=m : break
	  if md(mpn4(cnt)*mdb+4)<md(m*mdb+4) : continue ; 小さい順
	  n=mpn4(cnt) : mpn4(cnt)=m : m=n
	 loop
	loop

	return


#deffunc bds int bdsn ; 建築処理

	if bdsn=-1 : bdsn2=12 : else : bdsn2=bdsn

	if bul_mp(bdsn2)>pmp(pn) : return ; マナが足りない

	repeat 25,1 : m=cnt
	 if map(m)=0 or mpl(m)!pn : continue
	 mdg=m*mdb
	  if md(mdg+9)!bdsn : continue
	 if bul_mp(bdsn2)>pmp(pn) : break		; マナが足りない

	 pmp(pn)-=bul_mp(bdsn2) : md(mdg+9)=0	; マナ消費、要請リセット

	 if bdsn=-1 { ; 解体
	  if md(ndg+7)=5  : pubn(pn)-=pubs : pubsn(pn)-
	  if md(ndg+7)=11 : pibn(pn)-=pibs : pibsn(pn)-
	  md(mdg+7)=0
	  continue
	 }

; 建築
	 if bdsn=5  : pubn(pn)+=pubs : pubsn(pn)+
	 if bdsn=11 : pibn(pn)+=pibs : pibsn(pn)+
	 md(mdg+7)=bdsn
	loop

/*
	 pmp(pn)-=bul_mp(bdsn) ; マナ消費
	  if bdsn=12 : md(bdsm*mdb+7)=0 : return ; 解体
	  md(bdsm*mdb+7)=bdsn
*/
	return


#deffunc build_syo ; 建設処理

	if bul_mp(12)>pmp(pn) : return ; マナが足りない
	 bds -1	; 解体

	if bul_mp(10)>pmp(pn) : return ; マナが足りない
	 bds 10	; 外交館

	if bul_mp(5)>pmp(pn)  : return ; マナが足りない
	 bds 5	; 人材府

	if bul_mp(8)>pmp(pn)  : return ; マナが足りない
	 bds 8	; 警察署

	if bul_mp(7)>pmp(pn)  : return ; マナが足りない
	 bds 7	; 砦

	if bul_mp(6)>pmp(pn)  : return ; マナが足りない
	 bds 6	; 鍛冶屋

	if bul_mp(3)>pmp(pn)  : return ; マナが足りない
	 bds 3	; サークル

	if bul_mp(2)>pmp(pn)  : return ; マナが足りない
	 bds 2	; 塔

	if bul_mp(4)>pmp(pn)  : return ; マナが足りない
	 bds 4	; 市場
	
	if bul_mp(9)>pmp(pn)  : return ; マナが足りない
	 bds 9	; 寺院

	if bul_mp(11)>pmp(pn)  : return ; マナが足りない
	 bds 11	; 倉庫

	return


#deffunc human_set ; 人材

	repeat 25 : m=mpn3(cnt) ; 第一人材地の選定
	 if m=0 : continue
	 mdg=m*mdb
	  if md(mdg+4)<pbn : m=0 : continue ; 治安が足りない
	 n=md(mdg+7)
	  if n=7 or n=8 or n=10 : m=0 : continue ; 砦、警察、外交館
	 n=md(mdg+9)
	  if n=7 or n=8 or n=10 : m=0 : continue ; 砦、警察、外交館
	 break
	loop
	if m=0 : return

	mpn234_del m ; 順列からmNo.消去

	repeat 1 ; 人材配置
	 if mu(m*10)!0 : break ; 既に配備してる
	 if stmf=1 : break ; un無い
	 hrs_pic 4 : if un=0 : stmf=1 : break	; un選択、魅力
	 rh_eq un,4	; 魅力装備
	  mu(m*10)=un : ud(un*udb+13)=m*10 ; 配備
	loop

	mdg=m*mdb
	repeat 1 ; 建築要請
	 n=md(mdg+7)
	  if n=5 or n=7 or n=8 or n=10 or n=1 : break
	  ; 人材府、砦、警察、外交府、城
	  if n>0 : md(mdg+9)=-1 : break			; 解体要請

	 n=md(mdg+9)
	  if n=5 or n=7 or n=8 or n=10 : break
	  ; 人材府、砦、警察、外交府

	 if pubsn(pn)<pubsb : md(mdg+9)=5 : break ; 人材府建築要請

	 n=0 ; 解体する国
	 repeat 25,1 : m=cnt : mdg=m*mdb	; 人材府が最大の時、解体する弱小国
	  if md(mdg+7)!5 : continue			; 外交館
	  if n=0 : n=m : continue
	  if md(mdg+3)<md(n*mdb+3) : n=m	; 再弱国
	 loop
	 md(n*mdb+9)=-1 : break				; 解体要請
	loop

;mgv_put m : pkey
	return



#deffunc blacksmith_set ; 鍛冶

	repeat 25 : m=mpn2(cnt) ; 第一鍛冶地の選定
	 if m=0 : continue
	 mdg=m*mdb
	  if md(mdg+4)<pbn : m=0 : continue		; 治安が足りない
	 n=md(mdg+7)
	  if n=5 or n=7 or n=8 or n=10 : m=0 : continue	; 人材府、砦、警察、外交館
	 n=md(mdg+9)
	  if n=5 or n=7 or n=8 or n=10 : m=0 : continue	; 人材府、砦、警察、外交館
	 break
	loop
	if m=0 : return

	mpn234_del m	; 順列からmNo.消去

	repeat 1 ; 人材配置
	 if mu(m*10)!0 : break ; 既に配備してる
	 if stmf=1 : break ; un無い
	 hrs_pic 3 : if un=0 : stmf=1 : break		; un選択、知力
	  rh_eq un,3		; 知力装備
	  mu(m*10)=un : ud(un*udb+13)=m*10 ; 配備
	loop

	mdg=m*mdb
	repeat 1 ; 建築要請
	 n=md(mdg+7)
	  if n=5 or n=6 or n=7 or n=8 or n=10 or n=1 : break
	  ; 人材府、鍛冶屋、砦、警察、外交府、城
	  if n>0 : md(mdg+9)=-1 : break	; 解体要請

	 n=md(mdg+9)
	  if n=5 or n=6 or n=7 or n=8 or n=10 : break
	  ; 人材府、鍛冶屋、砦、警察、外交府

	 md(mdg+9)=6 ; 鍛冶建築要請
	loop

; 1箇所以外は解体
	repeat 25,1 : m2=cnt
	 if map(m2)=0 or mpl(m2)!pn or m2=m : continue
	 mdg2=m2*mdb
	  if md(mdg2+7)=6 : md(mdg2+9)=-1
	  if md(mdg2+9)=6 : md(mdg2+9)=0
	loop

;mgv_put m : pkey
	return


#deffunc castle_set ; 城配備

	m=mpc(pn) : mdg=m*mdb

	mpn234_del m ; 順列からmNo.消去

	if mu(m*10)>0 or stmf=1 : return ; 配備済み

	chaibif=0
	repeat 1
	 if md(mdg+4)<=pbn : chaibif=1 : break ; 筋力

	 repeat 25 ; 第二人材地
	  if mpn2(cnt)=0 : continue
	  m2=mpn2(cnt) : break
	 loop
	 if m=m2 : chaibif=4 : break ; 魅力

	 repeat 25 ; 第二鍛冶地
	  if mpn3(cnt)=0 : continue
	  m2=mpn3(cnt) : break
	 loop
	 if m=m2 : chaibif=3 : break ; 知力

	 chaibif=4 ; 魅力
	loop

	if mu(m*10)!0 : return ; 既に配備してる

	hrs_pic chaibif	: if un=0 : stmf=1 : return	; un選択
	 rh_eq un,chaibif ; 装備
	mu(m*10)=un : ud(un*udb+13)=m*10 ; 配備

;mgv_put m : pkey
	return


#deffunc force_set ; 部隊配備

	haibif=0
	repeat 3 : cnt3=cnt ; 配備
	 if haibif=1 : break ; 残戦力無し
	 repeat 25 : m=hdp(cnt)
	  if m=0 : break ; 終わり
	  
	  if wp(m)>=hdn(m) or hdn(m)=0 /*and hdfn(m)<cnt3+1*/ : continue ; 必要戦力有り部隊数が揃ってる

	  haibi m,1 ; 配備
	   if haibif=1 : break ; 残戦力無し
	 loop
	loop
/*
	repeat 25,1 ; 戦力値評価
	 if mpl(cnt)=pn : wpck(cnt)
	loop
*/
	;repeat 25 : wp(cnt)=wp(cnt)\10000 : loop ; プレイヤー脅威値をリセット

;mu_dpt
;hrt_put 1
; 戦力評価

	wp2=0 ; 総配備戦力
	repeat 25,1 : m=cnt
	 if mpl(m)!pn : continue ; 勢力国では無い
	 wp2+=wp(cnt) ; 戦力値計測
	loop

	wp3=wp1-wp2 ; 残戦力値

	return


#deffunc police_set ; 警察要請
;mgv_put m
; 政府の警察
	n=0
	repeat 25
	 m=mpn(cnt) : if m=0 : continue
	 if md(m*mdb+4)<pbn : n+
	loop
	if n>=3 : hrs_pic 1 : if un>0 {	; 治安が悪い国3つ以上の時、警察長官任命
	 mgv(pn*mgvb+5)=un
	 ud(un*udb+13)=1000+pn*mgvb+5	; 配属場所登録
	}

; 警察の解体処理
	repeat 25,1 : m=cnt
	 if map(m)=0 or mpl(m)!pn : continue ; 自領では無い
	 mdg=m*mdb
	  if md(mdg+4)>=100000 and md(mdg+7)=8 : md(mdg+9)=-1 : mpn234_del m ; 解体要請
	loop

;mgv_put m
	repeat 25
	 m=mpn4(cnt) : if m=0 : continue
	 mdg=m*mdb
	 n=md(mdg+7)
	  if n=1 or n=7 or n=8 or n=10 : continue
	  ; 城、砦、警察、外交府
	 n=md(mdg+9)
	  if n=7 or n=8 or n=10 or md(mdg+9)=-1 : continue
	  ; 砦、警察、外交府

	 if md(mdg+7)=8 or md(mdg+4)>=pbn : continue ; 順列からmNo.消去

	 mpn234_del m ; 順列からmNo.消去

	 if md(mdg+7)>0 : md(mdg+9)=-1 : continue ; 解体要請
	 md(mdg+9)=8 ; 建築要請
	loop

; 領主配備
	if stmf=1 : return ; un無い

	repeat 25
	 m=mpn(cnt) : if m=0 : continue
	 if mu(m*10)!0 : continue ; 既に配備してる
	 mdg=m*mdb
	 if md(mdg+4)>pbn and md(mdg+7)!8 : continue
	  hrs_pic 1 : if un=0 : stmf=1 : continue ; un選択
	   ;if un=0 : talent_set pn : break ; いない
	  rh_eq un,1	; 装備
	   mu(m*10)=un : ud(un*udb+13)=m*10 ; 配備
	loop

	return


#deffunc diplomacy_set ; 外交要請

	repeat 25
	 m=hdp(cnt) : if m=0 : break
	 mdg=m*mdb
	 if md(mdg+7)=1 : continue ; 城
	 if wp(m)>=hdn(m) { ; 戦力が足りてる
	  if md(mdg+7)=10 : md(mdg+9)=-1 ; 解体要請
	  if md(mdg+9)=10 : md(mdg+9)=0
	  continue
	 }
	 if md(mdg+7)=0 : md(mdg+9)=10
	 if md(mdg+7)!0 and md(mdg+7)!10 : md(mdg+9)=-1 ; 建築要請
	 mpn234_del m ; 順列からmNo.消去

; 領主配備
	 if mu(m*10)!0 : continue ; 既に配備してる
	 if stmf=1 : continue ; un無い

	 hrs_pic 4 : if un=0 : stmf=1 : continue ; un選択
	  rh_eq un,4 ; 装備
	   mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	loop

	return


#deffunc government_set int gv_setf ; 政府
; gv_setf(0=領土数を考慮しない、1=領土数を考慮)

; 首領
	if gv_setf=0 or mpnc>=5 { ; 領有国が5国以上
	 hrs_pic 5 ; 総力
	  if un=0 : stmf=1 : return
	   rh_eq un,4		; 装備
	   mgv(pn*mgvb+1)=un ; 首領
	    ud(un*udb+13)=1000+pn*mgvb+1	; 配属場所登録
	}


	if gv_setf=0 or mpnc>=3 { ; 領有国が3国以上

; 警察
	 if mgv(pn*mgvb+5)=0 {
	  hrs_pic 1 ; 筋力
	   if un=0 : stmf=1 : return
	    rh_eq un,1		; 装備
	    mgv(pn*mgvb+5)=un ; 宗教
	     ud(un*udb+13)=1000+pn*mgvb+5	; 配属場所登録
	 }

; 政務
	 hrs_pic 4 ; 魅力
	  if un=0 : stmf=1 : return
	   rh_eq un,4		; 装備
	   mgv(pn*mgvb+2)=un ; 政務
	    ud(un*udb+13)=1000+pn*mgvb+2	; 配属場所登録

; 魔術
	 hrs_pic 3 ; 知力
	  if un=0 : stmf=1 : return
	   rh_eq un,3		; 装備
	   mgv(pn*mgvb+3)=un ; 魔術
	    ud(un*udb+13)=1000+pn*mgvb+3	; 配属場所登録

; 宗教
	 hrs_pic 2 ; 魔力
	  if un=0 : stmf=1 : return
	   rh_eq un,2		; 装備
	   mgv(pn*mgvb+4)=un ; 宗教
	    ud(un*udb+13)=1000+pn*mgvb+4	; 配属場所登録

; 軍務
	 hrs_pic 5 ; 総力
	  if un=0 : stmf=1 : return
	   rh_eq un,1		; 装備
	   mgv(pn*mgvb+6)=un ; 軍務
	    ud(un*udb+13)=1000+pn*mgvb+6	; 配属場所登録

	}

	return


#deffunc mana2_set ; 第二マナ地

	repeat 25 : m=mpn3(cnt) ; 人材地の選定
	 if m=0 or m=matp2 : continue
	 mdg=m*mdb

	 n=md(mdg+7) ; 建築物
	  if n=1 or n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 城、人材府、鍛冶屋、砦、警察、外交館、倉庫

	 n=md(mdg+9) ; 建築要請
	  if n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 人材府、鍛冶屋、砦、警察、外交館、倉庫

	 mpn234_del m	; 順列からmNo.消去

; 満員では無い

	 if pubn(pn)>pubg(pn) { ; 満員では無い場合はサークル
	  repeat 1
	   if md(mdg+7)=3 or md(mdg+9)=3 : break ; 既にサークルがある
	   if md(mdg+7)>0 : md(mdg+9)=-1 : break ; 解体要請
	   md(mdg+9)=3 ; サークル建築要請
	  loop

	  if stmf=0 and mu(m*10)=0 {
	   hrs_pic 2 : if un=0 : stmf=1 ; un選択、魔力
	    if un>0 {
	     rh_eq un,2		; 魔力装備
	      mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	    }
	  }
	  break
	 }


; 満員の場合
 
	 if pubsn(pn)<pubsb { ; 人材府がまだ建てられる
	  if md(mdg+7)=0 : md(mdg+9)=5 : else : md(mdg+9)=-1 ; 建設要請
	  break
	 }

	 if pubsn(pn)>=pubsb { ; 人材府の数が最大
	  m1=m
	  repeat 25,1 : m2=cnt : mdg=m2*mdb
	   if map(m2)=0 or mpl(m2)!pn : continue
	   if md(mdg+7)!5 : continue

	   if md(m1*mdb+3)>md(m2*mdb+3) : m1=m2 ; 再弱国
	  loop

	  if m1=m { ; 現国が再弱国ならサークル
	   repeat 1
	    if md(mdg+7)=3 or md(mdg+9)=3 : break ; 既にサークルがある
	    if md(mdg+7)>0 : md(mdg+9)=-1 : break ; 解体要請
	    md(mdg+9)=3 ; サークル建築要請
	   loop

	   if stmf=0 and mu(m*10)=0 {
	    hrs_pic 2 : if un=0 : stmf=1 ; un選択、魔力
	     if un>0 {
	      rh_eq un,2		; 魔力装備
	       mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	     }
	   }
	   break
	  }

	  md(m2*mdb+9)=-1 ; 再弱国解体要請
	  break
	 }

	loop


; 領主配備

	repeat 25,1 : m=cnt
	 if map(m)=0 or mpl(m)!pn : continue
	 mdg=m*mdb
	 if md(mdg+7)!5 : continue

	 if stmf=0 and mu(m*10)=0 { ; 配備
	  hrs_pic 4 : if un=0 : stmf=1 : break ; un選択、魅力
	   if un>0 {
	    rh_eq un,4		; 魅力装備
	     mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	   }
	 }
	loop

	return

/*
#deffunc mana2_set ; 第二マナ地

	m2sf=0 ; 満員フラグ
	 if pubn(pn)<=pubg(pn) : m2sf=1 ; 満員

	m2sc=0 ; 配備カウンター
	repeat 25,1 : m=cnt
	 if map(m)=0 or mpl(m)!pn : continue
	 if md(m*mdb+7)!5 or md(m*mdb+9)=0 : continue
	 m2sc+ ; 配備してる
	loop

	m2sbf=0 ; 建設フラグ
	repeat 25,1 : m=cnt
	 if map(m)=0 or mpl(m)!pn : continue
	 if md(m*mdb+9)=5 : md(m*mdb+9)=0 ; 建設要請リセット
	loop


	repeat 25 : m=mpn3(cnt) ; 人材地の選定
	 if m=0 or m=matp2 : continue
	 mdg=m*mdb

	 n=md(mdg+7) ; 建築物
	  if n=1 or n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 城、人材府、鍛冶屋、砦、警察、外交館、倉庫

	 n=md(mdg+9) ; 建築要請
	  if n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 人材府、鍛冶屋、砦、警察、外交館、倉庫


	 if m2sc<pubsn(pn) { ; 現人材府数の配備を終えてない
	  mpn234_del m	; 順列からmNo.消去

	  if md(mdg+7)!5 : md(mdg+9)=-1 : break ; 解体要請
	  if md(mdg+7)=0 {
	   if pubsn(pn)<pubsb and m2sbf=0 : md(mdg+9)=5 : m2sbf=1 ; 建設要請
	   break
	  }

	  if stmf=0 and mu(m*10)=0 { ; 配備
	   hrs_pic 4 : if un=0 : stmf=1 ; un選択、魅力
	    if un>0 {
	     rh_eq un,4		; 魅力装備
	      mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	    }
	  }
 	  m2sc+
	  break
	 }


; 現人材府数の配備を終えてる

; 満員では無い

	 if m2sf=0 { ; 満員では無い場合はサークル
	  mpn234_del m	; 順列からmNo.消去

	  repeat 1
	   if md(mdg+7)=3 or md(mdg+9)=3 : break ; 既にサークルがある
	   if md(mdg+7)>0 : md(mdg+9)=-1 : break ; 解体要請
	   md(mdg+9)=3 ; サークル建築要請
	  loop

	  if stmf=0 and mu(m*10)=0 {
	   hrs_pic 2 : if un=0 : stmf=1 ; un選択、魔力
	    if un>0 {
	     rh_eq un,2		; 魔力装備
	      mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	    }
	  }
	  break
	 }


 ; 満員の場合
 
	 if pubsn(pn)>=pubsb { ; 人材府の数が最大
	  n=0 : f=0
	  repeat 25,1 : m2=cnt : mdg=m2*mdb
	   if map(m2)=0 or mpl(cnt)!pn : continue
	   if md(mdg+7)!5 : continue
	   if md(mdg+9)=-1 : f=1 : break ; 既に解体要請がある

	   if n=0 : n=m2 : continue
	   if md(n*mdb+3)>md(m2*mdb+3) : n=m2 ; 再弱国
	  loop

	  if f=0 : if md(m*mdb+3)>md(m2*mdb+3) : md(m2*mdb+9)=-1 : break ; 解体要請
	 }


	 if md(mdg+7)!5 : md(mdg+9)=-1 : break ; 解体要請
	 if md(mdg+7)=0 {
	  if pubsn(pn)<pubsb : if m2sbf=0 : md(mdg+9)=5 : m2sbf=1 ; 建設要請
	  mpn234_del m	; 順列からmNo.消去
	 }

	loop

	return
*/
	
#deffunc magic2_set ; 第二魔術地

	repeat 25 : m=mpn2(cnt) ; 人材地の選定
	 if m=0 or m=matp2 : continue
	 mdg=m*mdb

	 n=md(mdg+7) ; 建築物
	  if n=1 or n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 城、人材府、鍛冶屋、砦、警察、外交館、倉庫

	 n=md(mdg+9) ; 建築要請
	  if n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : m=0 : continue
	  ; 人材府、鍛冶屋、砦、警察、外交館、倉庫
	 break
	loop

	if m=0 : return ; 用地無し

	mpn234_del m ; 順列からmNo.消去


; 人材配置
	if stmf=0 and mu(m*10)=0 {
	 hrs_pic 3 : if un=0 : stmf=1 ; un選択、知力
	  if un>0 {
	   rh_eq un,3		; 知力装備
	    mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	  }
	}

; 建築要請
	mdg=m*mdb
	n=md(mdg+7) ; 建築物
	 if n=0 : md(mdg+9)=2	; 塔
	 if n!2 and n!0 : md(mdg+9)=-1	; 解体要請

; 1箇所以外は解体
	repeat 25,1 : m2=cnt
	 if map(m2)=0 or mpl(m2)!pn or m2=m : continue
	 mdg2=m2*mdb
	  if md(mdg2+7)=2 : md(mdg2+9)=-1
	  if md(mdg2+9)=2 : md(mdg2+9)=0
	loop

	return


#deffunc market_set ; 市場

	m=0
	repeat 25,1
	 if matp2=cnt : continue ; 今占領した国

	 if map(cnt)=0 or mpl(cnt)!pn : continue
	 n=md(cnt*mdb+7)
	  if n=1 or n=2 or n=3 or n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : continue
	  ; 城、塔、サークル、人材府、鍛冶、砦、警察、外交館、倉庫
	 n=md(cnt*mdb+9)
	  if n=2 or n=3 or n=5 or n=6 or n=7 or n=8 or n=10 or n=11 : continue
	  ; 塔、サークル、人材府、鍛冶、砦、警察、外交館、倉庫
	 if m=0 : m=cnt : continue
	 if md(cnt*mdb+1)>md(m*mdb+1) : m=cnt ; 一番人口が多い
	loop
	if m=0 : return ; 用地無し

	mpn234_del m	; 順列からmNo.消去

 ; 人材配置
	if stmf=0 and mu(m*10)=0 {
	 hrs_pic 4 : if un=0 : stmf=1 ; un選択、魅力
	 if m>0 {
	  rh_eq un,4		; 魅力装備
	   mu(m*10)=un : ud(un*udb+13)=mdg ; 配備
	 }
	}

	mdg=m*mdb
	n=md(mdg+7) ; 建築物
	 if n=0 : md(mdg+9)=4	; 市場
	 if n!4 and n!0 : md(mdg+9)=-1	; 解体要請

; 1箇所以外は解体
	repeat 25,1 : m2=cnt
	 if map(m2)=0 or mpl(m2)!pn or m2=m : continue
	 mdg2=m2*mdb
	  if md(mdg2+7)=4 : md(mdg2+9)=-1
	  if md(mdg2+9)=4 : md(mdg2+9)=0
	loop

	return


#deffunc talent_set int talent_setn ; 人材登用

	if pubg(pn)>=pubn(pn) : return ; 登録がいっぱい

	c=100
	repeat 100 ; マナがあるか
	 if tal_mp(c)<=pmp(pn) : break
	 c-
	loop
	if c=0 : return ; マナが無い

	m=mpn3(0)		; 出現地、マナ基準
	 r=un_fd_rlv(m)	; 出現Lv
	  if r>c : r=c	; Lv分のマナポイントがあるか


	;tal_fd m ; ユニット発掘

	zn=map(m)					; 地形
	cs=cha_syu(zn)				; その地形のキャラ種類総数
	cz=cha_zoks(zn)				; その地形のキャラスタートNo.

	n=cz+cs-1
	repeat cs
	 cn=n-cnt
	  if r<cd(15,cn) : continue	; 出現Lvに満たない
	 r2=rnd(4) : if r2=0 : break; 4分の1でそのキャラを選択
	loop

	if cn>0 {
	 if pmp(pn)<tal_mp(cd(15,cn)) : return ; MPあるか
	 unt 1,cn 					; ユニット登録
	  if un=0 : return ; 登録できなかった
	 hper_set pn,un				; 順列セット
	}

	pmp(pn)-=tal_mp(cd(15,cn))	; マナポイント減少

	return


*strategy ; 英雄勢力の人材とアイテムの発見と配置、戦略

	repeat plb : pn=hap(cnt)
	 if pn=0 : continue ; 順列に無い
	 if hf(pn)=0 : continue ; 勢力が滅んでる

	 repeat 25 : hde(cnt)=0 : loop ; 既に攻め込むのに使ったかリセット

	 str_map_put	; マップ表示

	 dependent_set	; 一時属領一覧セット
	 mana_point		; マナポイント
	 un_it_found	; ユニットとアイテムの発見

	 build_syo ; 建設処理

	 ;wpb_cal		; 最大脅威値算出


; プレイヤー

	 if hf(pn)=1 {
	  gosub *map_main

	  hdb(pn)=0 ; 最大戦力値の算出
	  repeat 9 : hdb_un(cnt)=0 : loop

	  repeat pubn(pn),udsh(pn) : un1=cnt
	   if ud(un1*udb)=0 : continue ; ユニットNo.
	   repeat 9 ; 大きいのに入れ替え
	    if hdb_un(cnt)=0 : hdb_un(cnt)=un1 : break
	    if ud(hdb_un(cnt)*udb+27)>ud(un1*udb+27) : continue
	    un2=hdb_un(cnt) : hdb_un(cnt)=un1 : un1=un2
	   loop
	  loop
	  repeat 9
	   hdb(pn)+=ud(hdb_un(cnt)*udb+27)
	  loop
;hdb_put
	  continue
	 }


; CPU

	 stmf=0			; 人材全使用フラグ
	 haibif=0		; un全使用フラグ

	 ;eq_setn=0		; 装備種別カウント

	 pmu_rst pn		; ユニット配置解除
;hp_dpt pn
	 peq_rst pn 	; 装備解除
;hp_dpt pn
	 hrs_copy		; 英雄のユニット操作順列コピー
	 his_copy		; 英雄のアイテム操作順列コピー

	 mpn234_per		; 魔術、マナ、治安の順列

; 仮配備
	 hrt1c=0  : hrt2c=0  : hrt3c=0	; 列の順番カウントをリセット
	 hrt1qc=0 : hrt2qc=0 : hrt3qc=0	; 装備列の順番カウントをリセット

	 human_set		; 人材
	 blacksmith_set	; 鍛冶
	 castle_set		; 城配備

	 equipment_set1	; 装備と列の順列のセット

	 matp=0			; 攻勢点の国
	 matp2=0		; 今攻略した国

	 hdn_cal		; 隣接国脅威値を算出
	 attack_point	; 攻勢点
if debugf=1 : map_dpt
/*
redraw 0
 color 1,1,1 : boxf : color 255,255,255
 map_put
redraw 1
pkey
hdn_put : pkey
*/

	 repeat 25 ; wpリセット
	  m=mpn(cnt) : if m=0 : break
	  wp(m)=0
	 loop

	 haibif=0		; un全使用フラグ

	 pmu_rst pn		; ユニット配置解除
	 peq_rst pn 	; 装備解除

	 hrs_copy		; 英雄のユニット操作順列コピー
	 his_copy		; 英雄のアイテム操作順列コピー
;info_dpt2
	 hrt1c=0  : hrt2c=0  : hrt3c=0	; 列の順番カウントをリセット
	 hrt1qc=0 : hrt2qc=0 : hrt3qc=0	; 装備列の順番カウントをリセット

	 repeat hub ; 列の順列をリセット
	  hrt1(cnt)=0 : hrt2(cnt)=0 : hrt3(cnt)=0
	 loop

	 mpn234_per		; 魔術、マナ、治安の順列

	 human_set		; 人材
if debugf=1 : bil_dpt 1
;map_dpt 1
;info_dpt2 1
	 blacksmith_set	; 鍛冶
if debugf=1 : bil_dpt 2
;map_dpt 2
;info_dpt2 2
	 castle_set		; 城配備
if debugf=1 : bil_dpt 3
;map_dpt 3

	 fort_set		; 砦
if debugf=1 : bil_dpt 4
;map_dpt 4

;info_dpt2 3
/*
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/

; 戦力が足りない
	  if matp=0 {;: not_enough : break

	   repeat 25 ;: st_cnt=cnt ; 戦力配備
	    if hdp(cnt)=0 : break
	    if hdn(hdp(cnt))=0 : continue ; 脅威が無い

	     haibi hdp(cnt),3 : if haibif=1 : break
	   loop
	   ;if haibif=0 : break ; 終わり
/*
redraw 0
 color 1,1,1 : boxf : color 255,255,255
map_put
redraw 1
pkey
hdn_put
pkey
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
	   ;stnf=0
	   repeat 25 ; 外交館建設要請
	    m=hdp(cnt) : if m=0 : break
	    mdg=m*mdb
	    if hdn(m)<=wp(m) { ; 戦力が足りてる
	     if md(mdg+7)=10 : md(mdg+9)=-1
	     if md(mdg+9)=10 : md(mdg+9)=0
		 continue
		}
	     if md(mdg+7)=1 or md(mdg+7)=10 : continue
	     if md(mdg+7)>0  : md(mdg+9)=-1 : continue
	     if md(mdg+9)=10 : continue
	     md(mdg+9)=10
	    /*
	    if bul_mp(10)<pmp(pn) /*: stmf=1*/ ;: break ; マナが足りない
	    ; md(mdg+7)=10 : pmp(pn)-=bul_mp(10) ; 外交館建設
	   loop
	   ;if stmf=1 : return ; 終わり

	   talent_set pn ; タレント発掘
	   ;build_syo ; 建設処理
	   ;continue
;map_dpt 5
;info_dpt2 4
	  }


; 戦力が足りてる

	 if matp>0 {
;map_dpt -1
	 switch hdkn ; 攻める国数

	  case 1 ; 1国
	   m=hdk(0)
	    haibi m,3;hdfn :; hdp_del m ; 第一攻勢国、配備
/*
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
;map_dpt 5
;info_dpt2 5
	   if wp(m)<wp(matp)*2 : swbreak ; 必要戦力が無い
	   war m,matp ; 攻める
	  ;  win_syorif!2 : swbreak ; 負けた
	  ; wp_ck matp : if wp_ckf=0  : swbreak ; 脅威無し
	  ;  haibi matp,hdfn ; 再配備
	  swbreak

	  case 2 ; 2国
	   m1=hdk(0) : haibi m1,3;hdfn : ;hdp_del m1 ; 第一攻勢国、配備
	    if wp(m1)*10<wp(matp)*12 : swbreak ; 必要戦力が無い
	   m2=hdk(1) : haibi m2,3;hdfn : ;hdp_del m2 ; 第二攻勢国、配備
	    if wp(m2)*10<wp(matp)*8  : swbreak ; 必要戦力が無い
;map_dpt -1
;info_dpt2 6
	   war m1,matp ; 攻める
	   	if win_syorif=2 : swbreak ; 勝った
	   ;  wp_ck m1 : if wp_ckf=0  : swbreak ; 脅威無し
	    ;  haibi m1,hdfn ; 再配備
;mgv_put m2 : pkey
map_dpt 2
	   war m2,matp ; 攻める
	   ;	win_syorif!2 : swbreak ; 負けた
	    ; wp_ck m2 : if wp_ckf=0  : swbreak ; 脅威無し
	     ; haibi m2,hdfn ; 再配備
	  swbreak

	  case 3 ; 3国
	   m1=hdk(0) : haibi m1,3;hdfn : ;hdp_del m1 ; 第一攻勢国、配備
	    if wp(m1)*10<wp(matp)*10 : swbreak ; 必要戦力が無い
	   m2=hdk(1) : haibi m2,3;hdfn :; hdp_del m2 ; 第二攻勢国、配備
	    if wp(m2)*10<wp(matp)*8  : swbreak ; 必要戦力が無い
	   m3=hdk(2) : haibi m3,3;hdfn : ;hdp_del m3 ; 第三攻勢国、配備
	    if wp(m3)*10<wp(matp)*6  : swbreak ; 必要戦力が無い
;map_dpt -1
;info_dpt2 7
	   war m1,matp ; 攻める
	   	if win_syorif=2 : swbreak ; 勝った
	    ; wp_ck m1 : if wp_ckf=0 : swbreak ; 脅威無し
	     ; haibi m1.hdfn ; 再配備

;mgv_put m2 : pkey
map_dpt 2
	   war m2,matp ; 攻める
	   	if win_syorif=2 : swbreak ; 勝った
	    ; wp_ck m2 : if wp_ckf=0 : swbreak ; 脅威無し
	     ; haibi m2,hdfn ; 再配備

;mgv_put m3 : pkey
map_dpt 3
	   war m3,matp ; 攻める
	   	;win_syorif!2 : break ; 負けた
	     ;wp_ck m3 : if wp_ckf=0 : swbreak ; 脅威無し
	      ;haibi m3,hdfn ; 再配備
	  swbreak

	 swend

	 repeat 25,1 ; wp再計算
	  if map(cnt)=0 or mpl(cnt)!pn : continue
	  wpck cnt,1
	 loop

	 matp2=matp		; データ退避
	 matp=0			; 攻勢国リセット

	 dependent_set	; 一時属領一覧セット
	 mpn234_per		; 魔術、マナ、治安の順列

	 hdn_cal		; 隣接国脅威値を算出
;hdn_put : pkey

	 ;equipment_set	; 装備と列の順列のセット
;hrs_dpt : pkey
;hrt_dpt : pkey
;fff=1

	 force_set		; 部隊配備

;hrs_dpt : pkey
/*
hrt_dpt : pkey
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
	  if haibif=1 : talent_set pn ;: continue ; ユニット足りない

	 }
if debugf=1 : map_dpt
	 stmf=0 ; 人材全使用フラグ

	 diplomacy_set	; 外交要請
if debugf=1 : bil_dpt 8
;map_dpt 8
;info_dpt2 8
	 police_set		; 警察要請
if debugf=1 : bil_dpt 9
;map_dpt 10
;info_dpt2
;hrs_dpt : pkey
/*
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
	 government_set	1	; 政府

;hrs_dpt : pkey
/*
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
	 mana2_set	; 第二マナ地
if debugf=1 : bil_dpt 11
;map_dpt 11
;info_dpt2 11
	 magic2_set	; 第二魔術地
if debugf=1 : bil_dpt 12
;map_dpt 12
;info_dpt2 12
	 market_set	; 市場
if debugf=1 : bil_dpt 13
;map_dpt 13
;info_dpt2 13
	 ;build_syo	; 建設処理
;map_dpt

	 repeat 25,1 : m=cnt ; 領主配備
	  if stmf=1 : break
	  if map(m)=0 or mpl(m)!pn : continue
	  if mu(m*10)!0 : continue ; 配備してる

	  if md(m*mdb+4)<pbn {
	   hrs_pic 1 : if un=0 : stmf=1 : break
	   rh_eq un,1 ; 装備
	  }
	  else {
	   hrs_pic 5 : if un=0 : stmf=1 : break
	   rh_eq un,4 ; 装備
	  }

	  mu(m*10)=un : ud(un*udb+13)=m*10 ; 配備
	 loop
if debugf=1 : bil_dpt 14
;map_dpt 14
;hrs_dpt : pkey
	 government_set	0	; 政府
;hrs_dpt : pkey
;info_dpt2 100
;map_dpt 15
	 repeat 25 ; 寺院建設
	  m=mpn(cnt) : if m=0 : break
	  if m=matp2 : continue ; 今占領した国
	  mdg=m*mdb
	   if md(mdg+7)!0 or md(mdg+9)!0 : continue
	  if pibg(pn)<pibn(pn) : md(mdg+9)=9 : continue ; アイテム登録がいっぱいで無いなら寺院建設
	  if pibsn(pn)<pibsb : md(mdg+9)=11
	 loop
if debugf=1 : bil_dpt 15
if debugf=1 : map_dpt 16
;map_dpt 16
/*
repeat 25,1
 if map(cnt)=0 or mpl(cnt)!pn : continue

mgv_put cnt
pkey
loop
*/
; 攻め込む




/*
	 repeat 25,1 ; 戦力値計算
	  if mpl(cnt)=pn : wpck cnt
	 loop
*/
	 if mainf!5 : break
	loop

	trn+ ; ターン+

	return

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です