マップ要素の途中経過報告


2018年 3月22日
 
 
 今回はまだ途中ではあるけど、MAP戦略要素をレポートする。



 
 
 まずスマホゲームらしく、戦略画面を リアルタイムにしようかとも考えたけど、要素の時間増減とか、敵の行動のリアルタイム化とか、意外と RTS(リアルタイムストラテジー)はプログラム的に難しい感じがしたので、とりあえずオーソドックスなターン制にする事にした。
 
 
 次にどういう処理をするか、プレイヤーの順番はどうするか等まだ決まってないものが沢山あるが、とりあえず次の所までは作ってる。

1、MAP全体の処理をする。
 1、災害(地震、火災、嵐、暴動)の処理。
 2、人口、魔術Lv、マナLv、治安の処理。

2、プレイヤー事の処理をする。
 1、人材の発見
 2、アイテムの発見

 それ以外にも、外交の要素、戦争をしかけるアルゴリズムなど、まだ作ってない要素が多い。
 
 
 
 まず MAP全体の処理で災害のソースは次のようになってる。

;---------- 災害 ------------------------------------------------

	saif=(saif+1)\3 ; 災害フラグ
	switch saif
	 case 0 ; 地震
	  repeat 25,1
	   m=map(cnt) : dism(cnt)=0
	    if m=0 or m=2 : continue		; 地形無い or 水
	    if m=1 : r2=1600				; 火
	    if m>=3 and m<=6 : r2=800		; 草 山 森 沼

	   un=mu(cnt*10) : ug=un*udb		; 領主
	    if un=0 : n1=0 : else : n1=ud(ug+1)+ud(ug+2)+ud(ug+3)+ud(ug+4) ; 能力補整

	   pn=mpl(cnt)						; プレイヤーno.
	    if pn>0 {
	     un=mu(mpc(pn)*10) : ug=un*udb	; 首領
	      if un=0 : n2=0 : else : n2=ud(ug+1)/2+ud(ug+2)/2+ud(ug+3)/2+ud(ug+4)/2 ; 能力補整
	    }

	   mdg=cnt*mdb
	    n3=(md(mdg+4)-5000)/1000		; 治安補整

	   r1=rnd(10000)+n1+n2+n3			; 乱数

	   if r1>=r2 : continue				; 発生判定

	   md(mdg+1)-=md(mdg+1)*5/100		; 人口の減少
	   md(mdg+2)-=md(mdg+2)*5/100		; 魔術の減少
	   md(mdg+3)-=md(mdg+3)*5/100		; マナの減少
	   md(mdg+4)-=md(mdg+4)*5/100		; 治安の減少
	  loop
	 swbreak
	 case 1 ; 火災
	  repeat 25,1
	   m=map(cnt) : dism(cnt)=0
	    if m=0 or m=2 or m=6 : continue	; 地形無い or 水 or 沼
	    if m=1 or m=5	: r2=1600		; 火 or 森
	    if m=3			: r2=1200		; 草
	    if m=4			: r2=800		; 山

	   un=mu(cnt*10) : ug=un*udb		; 領主
	    if un=0 : n1=0 : else : n1=ud(ug+1)+ud(ug+2)+ud(ug+3)+ud(ug+4) ; 能力補整

	   pn=mpl(cnt)						; プレイヤーno.
	    if pn>0 {
	     un=mu(mpc(pn)*10) : ug=un*udb	; 首領
	      if un=0 : n2=0 : else : n2=ud(ug+1)/2+ud(ug+2)/2+ud(ug+3)/2+ud(ug+4)/2 ; 能力補整
	    }

	   mdg=cnt*mdb
	    n3=(md(mdg+4)-5000)/1000		; 治安補整

	   r1=rnd(10000)+n1+n2+n3			; 乱数

	   if r1>=r2 : continue				; 発生判定

	   md(mdg+1)-=md(mdg+1)*7/100		; 人口の減少
	   md(mdg+2)-=md(mdg+2)*3/100		; 魔術の減少
	   md(mdg+3)-=md(mdg+3)*2/100		; マナの減少
	   md(mdg+4)-=md(mdg+4)*4/100		; 治安の減少
	  loop
	 swbreak
	 case 2 ; 嵐
	  repeat 25,1
	   m=map(cnt) : dism(cnt)=0
	    if m=0 or m=5 : continue		; 地形無い or 森
	    if m=2				 : r2=1600	; 水
	    if m=1 or m=4 or m=6 : r2=1200	; 火 山 沼
	    if m=3				 : r2=800	; 草

	   un=mu(cnt*10) : ug=un*udb		; 領主
	    if un=0 : n1=0 : else : n1=ud(ug+1)+ud(ug+2)+ud(ug+3)+ud(ug+4) ; 能力補整

	   pn=mpl(cnt)						; プレイヤーno.
	    if pn>0 {
	     un=mu(mpc(pn)*10) : ug=un*udb	; 首領
	      if un=0 : n2=0 : else : n2=ud(ug+1)/2+ud(ug+2)/2+ud(ug+3)/2+ud(ug+4)/2 ; 能力補整
	    }

	   mdg=cnt*mdb
	    n3=(md(mdg+4)-5000)/1000		; 治安補整

	   r1=rnd(10000)+n1+n2+n3			; 乱数

	   if r1>=r2 : continue				; 発生判定

	   md(mdg+3)-=md(mdg+3)*6/100		; マナの減少
	   md(mdg+4)-=md(mdg+4)*2/100		; 治安の減少
	  loop
	 swbreak
	swend

	repeat 25,1 ; 暴動
	 m=map(cnt) : dism(cnt)=0
	  if m=0 : continue					; 地形無い

	 un=mu(cnt*10) : ug=un*udb			; 領主
	  if un=0 : n1=0 : else : n1=ud(ug+1)*2+ud(ug+2)+ud(ug+3)+ud(ug+4) ; 能力補整

	 pn=mpl(cnt)						; プレイヤーno.
	  if pn>0 {
	   un=mu(mpc(pn)*10) : ug=un*udb	; 首領
	    if un=0 : n2=0 : else : n2=ud(ug+1)+ud(ug+2)/2+ud(ug+3)/2+ud(ug+4)/2 ; 能力補整
	  }

	 mdg=cnt*mdb
	  if m=6 : n=50 : else : n=100		; 沼の場合は倍
	   r2=(100000-md(mdg+4))/n			; 治安補整

	 r1=rnd(10000)+n1+n2				; 乱数

	 if r1>=r2 : continue			; 発生判定

	 md(mdg+1)-=md(mdg+1)*3/100		; 人口の減少
	 md(mdg+2)-=md(mdg+2)*2/100		; 魔術の減少
	 md(mdg+3)-=md(mdg+3)*3/100		; マナの減少
	 md(mdg+4)-=md(mdg+4)*7/100		; 治安の減少
	loop


(画像の左上の緑の数字が元の値、その下が災害後の値)
 
 
 md=マップデータ

 地震と火災と嵐は今の所 1ターン事に順番にしてる。

 暴動は治安Lv.に連動して毎ターン起こる可能性がある。

 基本的には地形事に各災害の発生率が違う。

 例えば水地形には地震と火災は無いが嵐の起こる確率が高い。

 後は今の所、各 MAPに配置されている領主の総合能力値と、そのプレイヤーの首領の総合能力の半値が、災害を抑える要素として参照される。

 治安度も災害の発生率に影響を与える。

 災害が発生すると、その MAPの各要素(人口、魔術、マナ、治安)が少し下がる。
 
 
 
 次は MAP事の人口、魔術、マナ、治安の増減だ。

;---------- 国別 ------------------------------------------------

	repeat 25,1 ; 人口増加
	 if map(cnt)=0 : continue		; 地形無い
	  mdg=cnt*mdb

	  pn=mpl(cnt)					; プレイヤーno.
	  kn=mpc(pn)					; 首都
	  un=mu(kn*10)					; 領主

	 n=20							; 基礎増加値%
	  if map(cnt)=3 : n+=20			; 草原なら人口増加+2%
	  if map(cnt)=5 : n+=10			; 森
	   n+=md(mdg+2)/100				; 魔術Lvによる増加
	   n+=md(mdg+4)/1000-50			; 治安
;城、砦、市場、						; 建築物、その他

	  if un>0 : n+=(ud(un*udb+4)*20000)/md(mdg+1)	; 人材補整、魅力

	 md(mdg+1)+=md(mdg+1)*n/1000	; 人口の増加
	  if md(mdg+1)<0 : md(mdg+1)=0
	loop


	repeat 25,1 ; 魔術増加 -------------------------------
	 if map(cnt)=0 : continue
	  mdg=cnt*mdb

	  pn=mpl(cnt)					; プレイヤーno.
	  kn=mpc(pn)					; 首都
	  un=mu(kn*10)					; 領主

	 n=20							; 基礎増加値%
	  if map(cnt)=2 : n+=20			; 水辺なら魔術増加+2%
	  if map(cnt)=5 : n+=10			; 森

; 城、魔学院 								; 建築物、その他

	  if un>0 : n+=(ud(un*udb+3)*20000)/md(mdg+2)	; 人材補整、知力

	 md(mdg+2)+=md(mdg+2)*n/1000	;魔術の増加
	loop


	repeat 25,1 ; マナ増加 --------------------------------------
	 if map(cnt)=0 : continue
	  mdg=cnt*mdb

	  pn=mpl(cnt)					; プレイヤーno.
	  kn=mpc(pn)					; 首都
	  un=mu(kn*10)					; 領主

	 n=20							; 基礎増加値%
	  if map(cnt)=4 : n+=20			; 山ならマナ増加+2%
	  if map(cnt)=5 : n+=10			; 森
	   n+=md(mdg+2)/100				; 魔術Lvによる増加

; 城、ストーンサークル				; 建築物、その他

	  if un>0 : n+=(ud(un*udb+2)*20000)/md(mdg+3)	; 人材補整、魔力

	 md(mdg+3)+=md(mdg+3)*n/1000	; マナの増加
	loop


	repeat 25,1 ; 治安 ----------------------------------
	 if map(cnt)=0 : continue
	  mdg=cnt*mdb

	  pn=mpl(cnt)					; プレイヤーno.
	  kn=mpc(pn)					; 首都
	  un=mu(kn*10)					; 領主

	 n=20							; 基礎増加値%
	 if un>0 : n+=ud(un*udb+1)		; 人材補整、筋力
	   								; 建築物、その他

	 md(mdg+4)+=50000*n/1000		; 治安の増加
	  if md(mdg+4)>100000 : md(mdg+4)=100000 ; 上限
	loop


(左真ん中の緑の数字は MAP右下の 25番の国の値。元は5000、1000、2000というきりのいい初期値なので、少し増えてるのが分かる)
 
 
 各要素の基本増加率は 0.2%かな?

 値は 0~1000を想定してるけど、使う値は 100000で、100の分は細かな増減計算に使う。

 つまり増加率 0.2%(ソース内での増加値 20)という事は、例えば人口値が 50人だったとして、値は 5000になってるので、5020のケタだから、50*20で 1人増えるのかな?
 (/1000になってるので 0.2%では無く2%でした)

 それと地形事に増えるボーナスが違う。

 後は災害と同じで、その MAPの領主と、そのプレイヤーの首領の半分の値でボーナスが付く。

 ソースにはまだ首領の要素は付けてない。

 人材ボーナスはその MAPの実数に対して、大きければ大きく作用し、超えると縮小して最小で今の所 2%だったかな?になるようにしている。

 つまり少ない人口の所に、能力の高い領主を配すれば、それだけ上昇率が上がると言う事。

 人口だけ治安による増減率の補整があるんだったかな。

 後は特別建設物による補整はまだ作ってない。

 特別建設物と言うのは、各 MAPに一つだけ作れる建物で、例えば首都には初めから城が建っていて、様々なボーナスが付くが、空白地には砦や外交館、魔術学院やストーンサークル等の建物が建てられ、それぞれ違う影響ボーナスを持つ。


 
 
 
 ここから各プレイヤーの処理の予定、つまりターンエンドするまでそのプレイヤー、と言っても今の所プレイヤー以外は全部コンピューターだけど、プレイヤーが操作する個別部分になる予定。

 と言っても今の所、ターン始めの人材発見を途中まで作っただけ。

;------- 人材 ----------------------------

	 repeat 25,1 : m=cnt		; mapNo.
	  if mpl(m)!pn : continue	; プレイヤーでは無い

	  mdg=m*mdb
	   n0=md(mdg+1)				; 人口

	  un1=mu(m*10)				; 領主
	   n1=ud(un1*udb+4)*100		; 魅力補整

; 建物補整
; 城+50、役所+100

	  r1=n0+n1+n2				; 確率
	  r2=rnd(100000+(n0*20))	; 乱数

	   if r1<r2 : continue		; 出現しなかった

	  n0=md(mdg+2)				; 魔術

; 建物補整
; 城+50、役所+100

	  r=rnd(n0+n1+n2)/100		; 出現乱数

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

	  n=cz+cs-1					; 大きい順
	  repeat cs
	   cn=n-cnt : cdg=cn*cdb
	   if r<cd(cdg+15) and cnt<cs-1 : continue
	  loop

	 f=unc(cn) : if f=0 : break ; キャラ登録
	 loop
	loop

 
 
 作りかけだけど、今の所人材の発見は各ターンに各 MAP事に 1人出現する可能性があって、発見率は人口に比例し、人材の質は魔術Lvに比例する。

 後はその MAPの領主とプレイヤーの首領の能力値。

 後たぶん建築物の人材府だか学校だか兵舎だかを作ると有利になる予定。
 
 
 と言うわけで、作ってあるのはまだそのくらいで、全然テストプレイもできない段階だ。

コメントを残す

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