装備のステータス計算を作った


2017年 9月30日
 
 
 その前にまずデータの扱いを整理する事にした。

 ud(ユニットデータ)、cd(キャラデータ)、id(アイテムデータ)、itd(アイテム元データ)、これらの変数の何番目が何のデータかという奴だ。

 最終的に今の所こんな感じになった。

; キャラ
;(0=フラグ、
; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、
; 7=属性、8=特殊能力、9=特殊能力値、
; 10=GRNo、11=GRx、12=GRy、13=枠、14=背景、
; 15=出現Lv、
; 16=手スロット、17=防具スロット、18=特殊スロット、19=ITEMスロット、)

; ユニット
;(0=フラグ、cn(キャラNo、種類)、
; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、
; 7=属性、8=特殊能力、9=特殊能力値、
; 10=所属PL、11=攻撃力、12=防御力、13=配属、14=、15=、
; 16=手スロット、17=防具スロット、18=特殊スロット、19=ITEMスロット、)

; 最終値(21=筋力、22=魔力、23=知性、24=魅力、25=最大HP、26=現HP)
; 属性値(31=火、32=水、33=風、34=地、35=光、36=闇)
; 40=装備)
; ステータス(51=火傷、52=フリーズ、53=マヒ、54=スタン、55=ターンアンデッド、56=毒値)

; アイテム
;(0=フラグ、所持キャラ、
; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、
; 7=属性、8=特殊能力、9=能力値、10=所属PL、
; 11=攻撃力、12=防御力、13=所持PL、
; 14=装備箇所(1=手スロット、2=防具スロット、3=特殊スロット、4=ITEMスロット)
; 15=制作Lv
; 16=アイテム種類(0=未使用、1=右手、2=右両手、3=左手、4=左両手、
; 5=盾、6=防具、7=アクセサリー、8=特殊、9=アイテム、10=魔法、回復魔法、状態魔法)
;
; 17=射程、18=攻撃範囲、19=

 
 
 なぜこんな事をするのかと言うと、例えばキャラの 攻撃値格納が 15番で、アイテムの攻撃値格納が 11番だったりすると、扱いがややこしいからだ。

 例えば統一した攻撃値の計算だと ud(ug+11)+=id(ig+11)のようになり、要するにそれぞれ 11番目の値が攻撃値なので分かりやすい。

 今回それぞれ適当に手探りでやっていたので、データの扱いがバラバラだった。
 大変だが、まだソースが少ない内にやってしまおう。
 
 
 まず仕様番号の変わったデータを改変する、データコンバーターを作る。

 と言ってもしごく簡単だ。

;/////// CHARA_data_converter ///////

*chara_data

	cb=210	; キャラ種類
	cdb=20	; データ量
	dim cd,cdb,cb	; データ元
	 bload "c_data.dat",cd

	dim cd2,cdb,cb	; 改変データ

	repeat cb
	 cd2(0,cnt)=cd(0,cnt)
	 cd2(1,cnt)=cd(3,cnt)
	 cd2(2,cnt)=cd(4,cnt)
	 cd2(3,cnt)=cd(5,cnt)
	 cd2(4,cnt)=cd(6,cnt)
	 cd2(5,cnt)=cd(1,cnt)
	 cd2(6,cnt)=cd(2,cnt)
	 cd2(7,cnt)=cd(7,cnt)
	 cd2(8,cnt)=cd(8,cnt)
	 cd2(9,cnt)=cd(9,cnt)
	 cd2(10,cnt)=cd(15,cnt)
	 cd2(11,cnt)=cd(16,cnt)
	 cd2(12,cnt)=cd(17,cnt)
	 cd2(13,cnt)=cd(18,cnt)
	 cd2(14,cnt)=cd(19,cnt)
	 cd2(15,cnt)=cd(10,cnt)
	 cd2(16,cnt)=cd(11,cnt)
	 cd2(17,cnt)=cd(12,cnt)
	 cd2(18,cnt)=cd(13,cnt)
	 cd2(19,cnt)=cd(14,cnt)
	loop


	bsave "c_data.dat",cd2

 
 
 そしてプログラム内のデータの扱いを全て変えていく。
 隅から隅まで全部間違いなく変えないといけないので、これが大変な作業となる。
 
 
 ところでこれ、たぶんプログラマー的に言うとやってはいけない事だと思う。

 たしかプログラマーのハウツーに「最適化してはいけない」というようなものがあったと思う。

 なぜかと言うと必ずバグが発生し、不慮のバグが残る可能性が増大し、最悪の場合動かなくなるからだ。
 
 
 本当はデータの扱いを数字では無く、

 d_str=1
 ud(ug+d_str)、id(ig+d_str)

 のような変数扱いでするべきなのだろう。
 次回のプログラムからは考慮しようと思う。
 
 
 さて、その作業で(バカみたいに)2日程費やし、いよいよ装備によるステータス計算を行う。

 ソースはこんな感じ。

#deffunc equ_syo int equ_syon; 装備処理

	cn=ud(ug)

; 基礎値 -------

	repeat 5 : ud(ug+21+cnt)=ud(ug+1+cnt) :	loop	; 基礎値

	repeat sbkn : cnt2=cnt	; アイテムの基礎値+
	 in=ud(ug+40+cnt2)		; アイテムNo.
	 if in<=0 : continue	; 装備してない

	 ig=in*idb				; アイテムデータ先頭
	  repeat 5				; アイテム能力値+
	   ud(ug+21+cnt)+=id(ig+1+cnt)
	  loop
	loop

	repeat 2 : ud(ug+11+cnt)=ud(ug+21) : loop		; 基礎攻防値
	repeat 6 : ud(ug+31+cnt)=0 : loop				; 属性値リセット


; 装備 -------

	f=0
	repeat sbkn : cnt2=cnt
	 in=ud(ug+40+cnt2)		; アイテムNo.
	 if in<=0 : continue	; 装備してない

	 ig=in*idb				; アイテムデータ先頭
	 itn=id(ig)				; アイテム種類

	 repeat 1	; 攻撃
	  if ud(ug+16)

 
 
 装備無しの状態。


 
 
 武器を装備。

 う~ん、気がつかなかったけど魔法防御値もいるんだよなあ。
 うわあっ、そうだ魔攻値もだ。

 データ整理したばかりなのに、どうしたもんだろう。
 
 

 
 
 今の所 2番目以降の武器の攻撃値は足さない。


 
 
 防具のデータもまだ全部作ってないなあ。


 
 
 後はアイテム枠増加の計算が残ってる。
 これは頭痛いんだよなあ。

 枠増加枠に装備しているものが、枠増加アイテムを外した時に同時に外されるという・・・。
 
 

コメントを残す

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