装備によるアイテム枠増減のプログラムできた(T_T)


2017年 10月4日
 
 
 いやあ、ややこしかった。

 おっと前々々回と入りが同じだ。

 どう処理したらできるのか分からなくて、もうダメかと思ったけど、何も考えずにブロック積み上げるように地味にベタベタと組んだらなぜかできた。

 まあ、難しい時はとりあえず紙に書くと良い。
 
 
 ソースはこちら。

 装備によるステータス計算の前半にぶち込む事にした。

 後半の 2ブロックはとりあえず前にも出た部分で、今回は関係無い。

 追加したのは増加枠の部分ね。

#deffunc equ_syo int equ_syon1,int equ_syon2; 装備処理

	eun=equ_syon1	; キャラNo.
	qin=equ_syon2	; アイテムNo.
	qig=qin*idb		; アイテムデータ位置


; 増加枠 -------

	repeat
	 n1=ud(ug+19) ; 元のアイテム枠数

	 n=0
	 repeat 7
	  qin2=ud(ug+40+cnt)
	  if qin2<=0 : continue
	  n+=id(qin2*idb+3) ; 知力を加算
	 loop
	 n2=(ud(ug+3)+n)/20-ud(ug+18)+1	; 枠元値

	 repeat 7
	  if equsi(cnt)!5 : continue	; 特殊枠
	  n=ud(ug+40+cnt)	; アイテムNo.
	  if n<=0 : break	; 装備してない
	  if id(n*idb+8)=19 : n2+=id(n*idb+9) ; 特殊の枠増加
	  break
	 loop

	 ud(ug+19)=n2 ; アイテム枠数

	 if n1<=n2 : break	; 枠が同数か増えてるなら終わり

	 n3=ud(ug+16)+ud(ug+17)+ud(ug+18)
	  if n3+n2>=7 : break	; 7枠以上なら終わり

	 n4=n3+n2
	 repeat 7 ; 減った枠のアイテムを外す
	  if n4+cnt>=7 : break
	  if ud(ug+40+n4+cnt)<=0 : continue
	  qin2=ud(ug+40+n4+cnt) : id(qin2*idb+13)=0 ; アイテムを外す
	  ud(ug+40+n4+cnt)=0
	 loop

	loop

	sbk_syo	; 装備枠再計算


; 基礎値 -------

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

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

	 qig=qin*idb			; アイテムデータ先頭
	  repeat 5				; アイテム能力値+
	   ud(ug+21+cnt)+=id(qig+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
	 qin=ud(ug+40+cnt2)		; アイテムNo.
	 if qin<=0 : continue	; 装備してない

	 qig=qin*idb			; アイテムデータ先頭

	 repeat 1	; 攻撃
	  if ud(ug+16)<cnt2 : ud(ug+11)+=id(qig+11) : break
	  if f=1 : break
	  ud(ug+11)+=id(qig+11) : f=1
	 loop

	 ud(ug+12)+=id(qig+12)	; 防御

	 repeat 6 : ud(ug+31+cnt)+=id(qig+31+cnt) : loop	; 属性値
	loop


	return

 
 
 どういう事をしてるかというと、まず変更前のアイテム枠の数をひかえ、アイテム枠の数に関係する知力の全装備アイテムの値を仮に計算して、現在の元枠数を出す。

 次に特殊装備枠に枠数増加のアイテムが装備されていたら、その値をアイテム枠数に足す。

 枠数が装備変更前の枠数と同じか増えてる分には変更無し。

 枠数が 7枠以上なら装備を外す必要が無いので変更無し。

 減った枠の分だけ装備をはずす。

 そしたら始めに戻って再計算。
 
 
 とまあそんな感じだ。

 字ヅラだけ追っても何の事か分からないだろう。
 大丈夫、自分にはさっぱり分からない。

 これによって枠増加のアイテムは元より、知力の増加するアイテムを付けたり外した場合にも対処できる・・・・ハズ・・・。

 まあ、後は追々バグを処理していこう。
 
 
 装備前


 
 
 アイテム枠増加アイテムを装備。
 サックは +3。


 
 
 とりあえず、能力値増加のアイテムを装備してみる。
 ガントレットは力が、サークレットはその他が少し上がる。
 ステータスが少し上がってると思う。


 
 
 サックをはずすと、減った枠のアイテムが自動で外れる。


 
 
 以上(T_T)
 
 
 
 さて、やっと基本的な枠組みが出来上がった様なので、これでいよいよ「戦闘」をプログラムできると思う。

 やっとメインかなあ、戦闘の要素は全プログラムの 2~3割くらいかな。

 という訳でまた次回。
 
 

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


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番目以降の武器の攻撃値は足さない。


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


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

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

アイテムの選択画面を整理した


2017年 9月23日
 
 
 アイテムの選択画面を整理する。
 
 
 まずタップ座標を作って

; アイテム選択画面--------------------------------

	iselx1=10 : iselxk=60
	isely1=11 : isely2=51 : iselyk=38
	iselx2=305
	iselx3=iselx2+iselxk
	iselx4=iselx3+iselxk
	iselx5=iselx4+iselxk
	iselx6=iselx5+iselxk

	dim iselkx1,20 ; タップ座標
	dim iselkx2,20
	dim iselky1,20
	dim iselky2,20

	repeat 9,1
	 iselkx1(cnt)=0 : iselkx2(cnt)=wx
	 iselky1(cnt)=isely2+iselyk*(cnt-1)-6
	 iselky2(cnt)=isely2+iselyk*(cnt)-6
	 iselky1(cnt+10)=0
	 iselky2(cnt+10)=isely2-6
	loop
	iselky1(9)=iselky1(8) : iselky2(8)=wy : selky2(9)=wy

	k=4
	iselkx1(8)=0			: iselkx2(8)=wx/2
	iselkx1(9)=wx/2			: iselkx2(9)=wx
	iselkx1(11)=0			: iselkx2(11)=iselx2-k
	iselkx1(12)=iselx2-k	: iselkx2(12)=iselx3-k
	iselkx1(13)=iselx3-k	: iselkx2(13)=iselx4-k
	iselkx1(14)=iselx4-k	: iselkx2(14)=iselx5-k
	iselkx1(15)=iselx5-k	: iselkx2(15)=iselx6-k
	iselkx1(16)=iselx6-k	: iselkx2(16)=wx

 これは表示の座標も含まれていて、それを元にタップ座標を作っている。
 
 
 表示してタップエリアを確認して調整。


 
 
 それを元にキー座標を返す関数を作る。

#defcfunc isel_key ; 選択画面入力

	x=mousex : y=mousey : isel_keyn=0

	repeat 9,1 : n1=cnt : n2=cnt+10
	 if iselkx1(n1)<x and iselky1(n1)<y and iselkx2(n1)>x and iselky2(n1)>=y : isel_keyn=n1 : break
	 if iselkx1(n2)<x and iselky1(n2)<y and iselkx2(n2)>x and iselky2(n2)>=y : isel_keyn=n2 : break
	loop

	return isel_keyn

 アイテム選択は 1~7、外すボタンは 8、戻るボタンは 9、ソート座標は11~16の値が返る。
 
 
 表示も整えて、こんな感じ。

 キャラ選択のをコピペして改造してあるので、押してすべらせればスクロールもする。

 8枠の 1つを潰して「外す」のと「戻る」のを加えた、これは後でキャラ選択にもつける予定。
 
 
 選択画面のソース。

/////// アイテム選択画面 //////////////////////

*iselect

	dim isel,ib+1	; 一時選択キャラNo.一覧

	repeat ib ; クリア
	 isel(cnt)=0
	loop

	sbn=equsi(kyg) ; 装備場所
	pn=mpl(kn) ; プレイヤー
	n=0 ; 自勢力のアイテムをピックアップ
	repeat ib,1
	 ig=idb*cnt ; ItemNo.
	 if id(ig)=0 : continue
	 if id(ig+10)!pn : continue ; 自勢力で無い

	 if id(ig+19)=un : continue	; そのキャラが持ってる

	 if sbn=1 : if id(ig+9)!1 and id(ig+9)!2 : continue ; 右手
	 if sbn=2 : if id(ig+9)!1 and id(ig+9)!3 and id(ig+9)!4 and id(ig+9)!5 : continue ; 左手
	 if sbn=3 {
				if id(ig+9)>5 : continue ; 複数手
				if kyg=0 and id(ig+9)=4 : continue ; 左端で左両手装備
				if kyg=ud(ug+11)-1 and id(ig+9)=2 : continue ; 右端で右両手装備
	 }
	 if sbn=4 : if id(ig+9)!6 : continue ; 防具
	 if sbn=5 : if id(ig+9)<7 : continue ; 特殊
	 if sbn=6 : if id(ig+9)!7 and id(ig+9)!9 and id(ig+9)!10 : continue ; アイテム

	 isel(n)=cnt : n+	; アイテムNo.登録
	loop
	iselb=n ; 総数


	iself=0 : iseln=0 : sel_yg=0 : ky=0 : kb=0
	repeat ;------- メイン ----------------

;------- 入力 -------

	 repeat 1
	  if kc>0 : kc- : break
	  ky=isel_key()	; タップ座標
	  stick kb,256	; ボタン
	 loop

	 if ky=8 and kb=256 : remove_syo : break  ; 外す
	 if ky=9 and kb=256 : break ; 戻る


;------- スクロール処理 -------

	 repeat 1 ; スクロール
	  if kb=256 {
				if isel_kn=0 : isel_kn=1 : isel_ky=mousey
				break
				}
	  if isel_kn=0 : break : else : isel_kn=0

	  isel_dy=-(mousey-isel_ky)/20 ; 移動量

	  if isel_dy=0 : if 1<=ky and ky<=7 : iseln=isel(sel_yg+ky-1) : iself=1 ; 選択
	 loop
	 if iself=1 : break ; 選択して戻る


	 if sel_yg>0 and isel_dy<0 : sel_yg- : isel_dy+
	 if sel_yg+7<iselb and isel_dy>0 : sel_yg+ : isel_dy-


;------- その他 ----------------


	 repeat 1 ; ソート
	  if kb!256 : break ; タップしてない
	  if ky<11 or 16<ky : break
	  if iselb<2 : break ; 少ない
	  isel_kn=0

	  if ky=11 : dn=0	; 照合データ
	  if ky=12 : dn=12	; 攻撃
	  if ky=13 : dn=13	; 防御
	  if ky=14 : dn=7	; 射程
	  if ky=15 : dn=30	; 属性
	  if ky=16 : dn=14	; 特殊

	  repeat iselb-1 : cnt2=iselb-cnt ; バブルソート
	   repeat cnt2

	    n1=isel(iselb-cnt)	: nd1=id(n1*idb+dn)
	    n2=isel(iselb-cnt-1): nd2=id(n2*idb+dn)

	    if nd1<=nd2 : continue
	    isel(iselb-cnt)=n2 : isel(iselb-cnt-1)=n1 ; 入れ替え
	   loop
	  loop

	 loop


;------- 表示 -------

	 redraw 0
	  color 0,0,0 : boxf : color 255,255,255

	  isel_put				; 表示
	 dg_put
	 redraw 1


	 await 1000/20

	loop ;---------------------------------

	kc=3

	return

 
 
 これで大体装備装置はできたと思うので、次は装備したものをステータス計算するプログラムを作る。
 
 

装備画面を作った


2017年 9月20日
 
 
 いやあ、ややこしかった。

 基本的に右手左手、片手持ち両手持ちがある上に、キャラによって装備スロットが違うと言う。
 これをつけたりはずしたりする、フラグの管理も大変だ。

 よく RPGでアイテム増殖バグがあったりするけど、これはその程度には複雑だからだと思う。
 
 
 とういう訳で装備画面。

 上 80ドットで選択装備、下 50ドットではずす事にした。
 この画面ではまだ装備してないので 130ドット全部選択装備だ。
 
 
 装備画面のプログラム、まだ全部できてない。
 バグも残ってる。

/////// 装備 /////////////////////////

#deffunc equ_syo int equ_syon; 装備処理

	;ud(ug+40+ky)=in

	return


#deffunc isel_syo ; 選択処理

	gosub *iselect ; 選択

	 un2=id(iseln*idb+19)
	  if un2!0 { ; 誰かが装備していたらはずす
			repeat 7
			 n=un2*udb+40+cnt : n2=ud(n)
			 if n2=iseln : ud(n)=0 : break
			loop
			if id(iseln*idb+9)=2 : ud(n+1)=0 ; 右両手
			if id(iseln*idb+9)=4 : ud(n-1)=0 ; 左両手
	  }

	 in=ud(ug+40+kyg) : ig=in*idb
	  if in>0 : id(ig+19)=0	; はずす
	  if in=-1 : id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=0 ; 右両手はずす
	  if in=-2 : id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=0 ; 左両手はずす

	 in2=iseln : ig2=in2*idb
	  id(ig2+19)=un : ud(ug+40+kyg)=in2	; 装備
	   equ_syo un	; 装備処理

	if sbn=1 or sbn=3 : if id(ig2+9)=2 { ; 右両手		
		if ud(ug+40+kyg+1)=-2 : id(ud(ug+40+kyg+2)*idb+19)=0 : ud(ug+40+kyg+2)=0 ; 右の欄が左手の左の欄に重なる
		id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=-1
	}
	if sbn=2 or sbn=3 : if id(ig2+9)=4 { ; 左両手
		if ud(ug+40+kyg-1)=-1 : id(ud(ug+40+kyg-2)*idb+19)=0 : ud(ug+40+kyg-2)=0 ; 左の欄が右手の右の欄に重なる
		id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=-2
	}


	return


#deffunc remove_syo ; 外す

	in=ud(ug+40+kyg) : ig=in*idb
	 ud(ug+40+kyg)=0
	  if in>0 {
				id(ig+19)=0 ; はずす
				if id(ig+9)=2 : ud(ug+40+kyg+1)=0 ; 右両手
				if id(ig+9)=4 : ud(ug+40+kyg-1)=0 ; 左両手
	  }
	  if in=-1 : id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=0 ; 右両手はずす 
	  if in=-2 : id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=0 ; 左両手はずす

	equ_syo un ; 装備処理

	return


*equipment ; 装備

	dim equsi,8 ; 一時装備スロット状況

	c=0 ; 装備箇所判定 ---------------
	if ud(ug+11)=2 : equsi(0)=1 : equsi(1)=2 : c=2	; 手
	if ud(ug+11)>2 {	; 複数手
		repeat ud(ug+11)
		 equsi(cnt)=3 : c+
		loop
	}
	if ud(ug+12)=1 : equsi(c)=4 : c+	; 防具
	if ud(ug+13)=1 : equsi(c)=5 : c+	; 特殊
	if ud(ug+14)>0 {	; アイテム
		repeat ud(ug+14)
		 equsi(c)=6 : c+
		loop
	}


	equif=0
	repeat ;------- メイン ----------------

;------- 入力 -------

	 ky=equ_key()	; タップ座標
	 kyg=ky\10		; 欄のNo.
/*
dgs "ky  ",ky,0
dgs "ky2 ",ky2,1
dgs "kyg ",kyg,2
dgs "equif ",equif,3
*/
	 stick kb,256,0	; ボタン
	  if kb=128 : break ; ESC 戻る
	 if kc>0 : kc- : kb=0 ; 入力ウイエト

	 switch equif
	  case 0 ; 待機
	   if kb!256 : swbreak
	   kc=5
	   if ky=-1 : equif=2 : swbreak	; 戻る
	   if equsi(kyg)=0 : equif=2 : swbreak ; アイテム欄無い
	   if ud(ug+40+kyg)=0 : isel_syo : swbreak ; 装備してない
	   ;if ky<10 {	; 情報表示
		equif=1 : ky2=ky ; 情報表示
		if ud(ug+40+kyg)=-1 : ky2=ky2-1
		if ud(ug+40+kyg)=-2 : ky2=ky2+1
		swbreak
	   ;}
	   ;remove_syo ; はずす
	  swbreak
	  case 1 ; インフォ表示
	   if kb!256 : swbreak
	   kc=5
	   if ky=-1 : equif=0 : swbreak
	   if equsi(kyg)=0 : equif=0 : swbreak ; アイテム欄無い
	   if ky!ky2 { ; 選択しているアイテム欄ではない
			if ud(ug+40+kyg)=0 : isel_syo : equif=0 : swbreak ; アイテムを装備してない
			if ud(ug+40+kyg)>0 : ky2=ky : swbreak
	   }
	   if ky<10 : isel_syo : equif=0 : ky2=ky : swbreak	; 装備

	   if ud(ug+40+kyg)=-1 : ky2=(ky-1)\10
	   if ud(ug+40+kyg)=-2 : ky2=(ky+1)\10
	   remove_syo ; はずす
	  swbreak
	 swend
/*
repeat 20
 dg id(cnt*idb),cnt
loop
*/
	
	 if equif=2 : break ; 戻る

;------- 表示 -------

	 redraw 0
	  color 0,0,0 : boxf : color 255,255,255

	  equ_put				; 表示
	 dg_put
/*
font "",20
repeat 15
 pos 440,cnt*20+10 : mes ""+cnt+" "+id((cnt+pl*30)*idb)
 pos 540,cnt*20+10 : mes ""+(cnt+15)+" "+id(((cnt+15)+pl*30)*idb)
loop
*/
	 redraw 1

	 await 1000/20

	loop ;---------------------------------


	return

 見てもらえればいかに複雑怪奇か分かってもらえるだろう。
 単にスキルが無くて単純化できないだけかもしれないが。

 装備フラグはユニットデータの 40~46番という事に今の所なってる。
 ud(un*udb+40)の場所、これは元々2次元配列を強引に1次元配列にしているので、ややこしくなってる。
 udb=1ユニットのデータ量、un=ユニットNo.

 2次元配列なら単に ud(40,un)で済むのになあ。

 なぜ1次元配列を使っているのかと言うと、スマホ実機だとなぜか大きな2次元配列データを書き換えようとすると 7エラー(オーバーフロー?)になるから。

 両手持ちの場合、右手武器の左手には-1、左手武器の右手には-2を入れる事にした。
 ただこのデータをうっかり読み込みとエラーになる。
 きっともっと良い方法があるんだろうなあ。

 sbnは装備スロットの種類。

 dgとか dgsとかいうのは、オリジナルのデバッグ用変数表示。
 
 
 アイテム選択画面。
 キャラ選択画面ソースをコピペして改造してある。
 まだ未完成。


 
 
 選択すると装備できる。

 右手には武器、左手には武器と盾が装備できる。
 左手以降の複数武器は威力減衰をする予定。
 
 
 両手持ち。


 
 
 弓は左手の量手持ちになる。


 
 
 装備している状態でタップすると情報表示。
 これもまだできてない。


 
 
 今の所このキャラだけだが、変則装備種。

 ゲームバランス的にボツになる可能性もある。
 
 

 防具欄には体装備のみ、アイテム欄にその他防具をアクセサリーという形で装備するようにした。


 
 
 武器や防具を装備できないキャラもいる。

 黄色いのは特殊アイテム欄で、特殊アイテムは 1つしか装備できない。
 今の所特殊アイテムのアイデアは、アイテム枠増加しか思いついてない。
 
 
 アクセサリーなら装備できる。

 どこに装備してるんだろうね。

 アイテム欄には回復アイテムとか魔法とか装備する予定なので、アクセサリーは飾り程度にしかならないだろう。
 
 
 装備画面の表示プログラム。

 これもまだ未完成、後半情報表示がコピペしたキャラ表示のままになってる。
 equx2のような座標定義は別の場所で行っている。

#deffunc equ_put ; 装備画面表示


	card_put equx1,equy1,un

	gmode 2

	color 255,255,255 : pos equx2,equy2 : mes cs2(cn) ; 名前

	pos equx2+12,equy2+32 : celput mojiw,0 ; HP
	 n=ud(ug+22) : nx=fpk(n) : fp n,equx2+39+nx,equy2+33,0
	 pos equx2+89,equy2+33 : celput 7,207 ; /
	 n=ud(ug+21) : fp n,equx2+106,equy2+33,0

	pos equx2+12,equy2+60 : celput mojiw,1 : s="STR" : bfp s,equx2+57,equy2+63,0
	 n=ud(ug+23) : nx=fpk(n) : fp n,equx2+90+nx,equy2+63,0

	pos equx2+12,equy2+82 : celput mojiw,2 : s="MAG" : bfp s,equx2+57,equy2+85,0
	 n=ud(ug+24) : nx=fpk(n) : fp n,equx2+90+nx,equy2+85,0

	pos equx2+12,equy2+104 : celput mojiw,3 : s="INT" : bfp s,equx2+57,equy2+107,0
	 n=ud(ug+25) : nx=fpk(n) : fp n,equx2+90+nx,equy2+107,0

	pos equx2+12,equy2+126 : celput mojiw,4 : s="CHA" : bfp s,equx2+57,equy2+129,0
	 n=ud(ug+26) : nx=fpk(n) : fp n,equx2+90+nx,equy2+129,0

	pos equx2+162,equy2+32 : celput mojiw,5 : s="ATK" : bfp s,equx2+207,equy2+35,0
	 n=ud(ug+15) : nx=fpk(n) : fp n,equx2+240+nx,equy2+35,0

	pos equx2+162,equy2+54 : celput mojiw,6 : s="DEF" : bfp s,equx2+207,equy2+57,0
	 n=ud(ug+16) : nx=fpk(n) : fp n,equx2+240+nx,equy2+57,0

	pos equx2+162,equy2+82 : celput mojiw,7 : s="ability" : bfp s,equx2+207,equy2+85,0

	pos equx2+162,equy2+106 : mes utks(ud(ug+8))
/*
repeat 7
 dg ud(ug+40+cnt),cnt+10
loop
*/
	f=0 : cntn=0 : color 240,240,240
	repeat  ; アイテム装備表示
	 pos equx4+equxk*cntn,equy4

	 switch f
	  case 0 ; 右手
	   if ud(ug+11)=0 : f=3 : swbreak	; 無し
	   if ud(ug+11)>2 : f=2 : swbreak	; 複数手
	   pos equx4+equxk*cntn,equy4+140 : mes equs(0) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40)=0 : celput wkhw : cntn+ : f=1 : swbreak ; 装備してない
	   if ud(ug+40)=-2 : gmode 3,,,128 : celput iw,id(ud(ug+41)*idb)-1 : gmode 2 : cntn+ : f=1 : swbreak ; 左両手装備
	   celput iw,id(ud(ug+40)*idb)-1 : cntn+ : f=1 ; 表示
	  swbreak
	  case 1 ; 左手
	   pos equx4+equxk*cntn,equy4+140 : mes equs(1) : pos equx4+equxk*cntn,equy4 : pos equx4+equxk*cntn,equy4
	   if ud(ug+41)=0 : celput wkhw : cntn+ : f=3 : swbreak ; 装備してない
	   if ud(ug+41)=-1 : gmode 3,,,128 : celput iw,id(ud(ug+40)*idb)-1 : gmode 2 : cntn+ : f=3 : swbreak ; 右両手装備
	   celput iw,id(ud(ug+41)*idb)-1 : cntn+ : f=3 ; 表示
	  swbreak
	  case 2 ; 複数手
	   if ud(ug+11)<=cntn : f=3 : swbreak ; 終わり
	   pos equx4+equxk*cntn,equy4+140 : mes ""+equs(4)+" "+(cntn+1) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wkhw : cntn+ : swbreak ; 装備してない
	   if ud(ug+40+cntn)=-1 : gmode 3,,,128 : celput iw,id(ud(ug+40+cntn-1)*idb)-1 : gmode 2 : cntn+ : swbreak ; 右両手装備
	   if ud(ug+40+cntn)=-2 : gmode 3,,,128 : celput iw,id(ud(ug+40+cntn+1)*idb)-1 : gmode 2 : cntn+ : swbreak ; 左両手装備
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ ; 表示	   
	  swbreak
	  case 3 ; 防具
	   if ud(ug+12)=0 : f=4 : swbreak	; 無し
	   pos equx4+equxk*cntn,equy4+140 : mes equs(2) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wkaw : cntn+ : f=4 : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ : f=4 ; 表示
	  swbreak
	  case 4 ; 特殊アイテム
	   if ud(ug+13)=0 : f=5 : swbreak		; 無し
	   pos equx4+equxk*cntn,equy4+140 : mes equs(3) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wksw : cntn+ : f=5 : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ : f=5 ; 表示
	  swbreak
	  case 5 ; アイテム
	   if cntn>=ud(ug+11)+ud(ug+12)+ud(ug+13)+ud(ug+14) : f=6 : swbreak ; 終わり
	   if ud(ug+14)=0 : f=6 : swbreak	; 無し
	   if ud(ug+40+cntn)=0 : celput wkiw : cntn+ : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ ; 表示
	  swbreak
	 swend

	 if f=6 : break
	loop


	if equif=1 and ud(ug+40+(ky2\10))>0 { ; アイテム情報表示

	 pos equx4+equxk*(ky2\10)-4,equy4-4 : celput 9,0 ; 選択カーソル

	 in=ud(ug+40+(ky2\10)) : ig=in*idb : itn=id(ig)
	 iwdx=iwdx1 : iwdy=iwdy1

	 color 255,255,255
	  boxf iwdx,iwdy,iwdx+iwdxk,iwdy+iwdyk
	 color 8,8,8
	  boxf iwdx+2,iwdy+2,iwdx+iwdxk-2,iwdy+iwdyk-2

	 color 255,255,255 : pos iwdx+6,iwdy+6 : mes cs2(cn) ; 名前

	 pos iwdx+12,iwdy+32 : celput mojiw,0 ; HP
	  n=id(ig+22) : nx=fpk(n) : fp n,iwdx+39+nx,iwdy+33,0
	  pos iwdx+89,iwdy+33 : celput 7,207 ; /
	  n=id(ig+21) : fp n,iwdx+106,iwdy+33,0

	 pos iwdx+12,iwdy+60 : celput mojiw,1 : s="STR" : bfp s,iwdx+57,iwdy+63,0
	  n=id(ig+23) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+63,0

	 pos iwdx+12,iwdy+82 : celput mojiw,2 : s="MAG" : bfp s,iwdx+57,iwdy+85,0
	  n=id(ig+24) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+85,0

	 pos iwdx+12,iwdy+104 : celput mojiw,3 : s="INT" : bfp s,iwdx+57,iwdy+107,0
	  n=id(ig+25) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+107,0

	 pos iwdx+12,iwdy+126 : celput mojiw,4 : s="CHA" : bfp s,iwdx+57,iwdy+129,0
	  n=id(ig+26) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+129,0

	 pos iwdx+162,iwdy+32 : celput mojiw,5 : s="ATK" : bfp s,iwdx+207,iwdy+35,0
	  n=id(ig+15) : nx=fpk(n) : fp n,iwdx+240+nx,iwdy+35,0

	 pos iwdx+162,iwdy+54 : celput mojiw,6 : s="DEF" : bfp s,iwdx+207,iwdy+57,0
	  n=id(ig+16) : nx=fpk(n) : fp n,iwdx+240+nx,iwdy+57,0

	 pos iwdx+162,iwdy+82 : celput mojiw,7 : s="ability" : bfp s,iwdx+207,iwdy+85,0

	 pos iwdx+162,iwdy+106 : mes utks(id(ig+8))
	}

	return

 
 
 と言う訳で、まだバグてんこ盛りだが、経過報告でした。
 
 

キャラ選択画面を作成中


2017年 9月10日
 
 
 前回から 10日程経ったので中途半端ではありますが、経過報告です。

 というのもアクセス解析を入れた所、一日2~3人程の人に見てもらってるようで、思ったより見てくれているようです。

 実は 9月に入ってから涼しくなったので作業自体は割と順調でした。
 
 
 では前回から、まず作成したデータを本体に取り込んで表示。

/////// UNIT DATA ///////

; キャラデータ

*chara_data

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

	sdim cs,30,cb
	 notesel cs	; 名前
	  noteload "c_name.txt"
	   sdim cs2,30,cb
	   repeat cb
	    noteget s,cnt : cs2(cnt)=s
	   loop

	cha_syu=0,16,22,27,25,18,25 ; 属性各種類
	cha_zoks=0,1,31,71,111,151,181

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


	utksb=73
	dim utks,20,utksb
utks(0)="無","攻勢","守備","行政","魔術","祭司","制作","宝の番人"
utks(10)="火傷","コールド","麻痺","スタン","ターンアンデッド","毒","テンプテーション"
utks(20)="バーサーク","ディフェンサー","速攻","盗む","スナイピング","剛弓","貫通"
utks(30)="アンデッド","ネクロマンサー","吸血","再生","絶叫","ナイトメア"
utks(40)="2回攻撃","3回攻撃","兜割り"
utks(50)="ファイアーブレス","コールドブレス","サンダーブレス","咆哮","ホーリーブレス","ポイズンブレス","津波"
utks(60)="火の息","ファイアーボール","ファイアーストーム","コールドストーム","ダークスファイア","ウインドストーム"
utks(70)="ヒール","ヒールオール","ヒールソング",""
utks(99)=""

	zks="","火","水","風","地","光","闇"




	return


; ユニットデータ

*unit_syoki

	ub=200	; ユニットの最大数
	udb=60	; 1ユニットのデータ量
	dim ud,udb*(ub+1) ; 200ユニット分

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

;(0=フラグ、cn(キャラNo、種類)、
; 1=最大HP、2=現HP、3=筋力、4=魔力、5=知性、6=魅力、
; 7=属性、8=特殊能力、9=配属、
; 10=所属PL、
; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、
; 15=攻撃力、16=防御力、17=特殊能力値、18=、19=、
; 
; 最終値(21=最大HP、22=HP、23=筋力、24=魔力、25=知性、26=魅力)
; ステータス(31=火傷、32=フリーズ、33=マヒ、34=スタン、35=ターンアンデッド、36=毒値)
; 40=装備)
;
; 火傷値、フリーズ%、マヒ%、スタン%、ターンアンデッド%、毒値%
; 火傷人数、フリーズ人数、マヒ人数、スタン人数、ターンアンデッド人数、毒人数


	return

 とは言っても、すり合わせがややこしく、これだけの事で 2日くらいは使ってます。

 データの扱いを整理したりしますので。

 そう言えば、おそらくプロの現場ではデータの扱いを始めからキチッと決めてから作り始めるんだと思いますが、ゲームプログラムですので、ゲーム内容を考えながら実装するため、永遠の思考錯誤スパゲティ増築工法となっております(笑)
 
 
 とりあえずテスト用にスタート時にユニットデータとアイテムデータを適当に作ります。

; UNIT 初期配置-------------------------------------------

	repeat 7,1 : pn=cnt ; プレイヤー
	 kn=mpc(pn)	; HEX

	 n=map(kn);n=rnd(6)+1 ; 属性
	 repeat 16 : cnt2=cnt

	  cn=rnd(cha_syu(n))+cha_zoks(n)

	  repeat ub,1
	   un=cnt : ug=un*udb ; ユニットNo.
	   if ud(ug)=0 : break
	  loop

	  ud(ug)=cn	; cnキャラ種類
	  repeat 9,1
	   ud(ug+cnt+20)=cd(cnt,cn) ; データ
	  loop
	  ud(ug+8)=cd(8,cn) ; 特殊能力
	  ud(ug+10)=pn ; 所属
	  repeat 3,11 ; 装備
	   ud(ug+cnt)=cd(cnt,cn)
	  loop
	  ud(ug+14)=cd(5,cn)/20-ud(ug+13)+1 ; アイテム装備数
	  ud(ug+22)=ud(ug+21) ; HP


	  if cnt2>9 : continue
	  mu(kn*10+cnt2)=un		; 領主、部隊配置
	  ud(ug+9)=kn*10+cnt2	; 配属
	 loop

	loop


; ITEM初期配置 ----------------------------------------

	n=1
	repeat 7,1 : pn=cnt ; プレイヤー
	 repeat 15
	  repeat
	   r=rnd(itb) : if itd(0,r)>0 : itn=r : break ; アイテム種類
	  loop

	  in=n : n+	; アイテムNo.
	  ig=in*idb	; データ位置
	   repeat idb
	    id(ig+cnt)=itd(cnt,itn) ; データ
	   loop
	   id(ig)=itn
	   id(ig+10)=pn ; 所属PL
	 loop
	loop

 変数について、ほんとは文字にして何のデータか分かるようにしないといけないんだと思います。

 でも自分はめんどくさいし、変数ごときにそんなに長々と文字打ってられないし、プログラムが長くなって何やってんだか分からなくなるしで、短く udとか unとか udbとか使ってます。

 短い変数だと別の所で使う可能性もあるので、あんまり良くは無いとは思いますが、思考錯誤しながらプログラムしてるのに長文なんて打ってらんないです。

 これ uならユニット、dはデータ、bは最大数と言う風に決まりはあります。

 iならアイテム、jなら自機、evならイベント、eなら敵、と言う風に自分なりに決めていつも使ってます。

 n=値、f=フラグ、c=カウンター、k=間隔、a=最小値、g=現在値、o=大きさ、r=乱数、s=文字列、t=時間、xyz=座標、pならputで表示、inならアイテムNo、cnならキャラNo、unならユニットNoとかそんな感じです。

 例えば自機座標なら jx,jy、HPなら jhpとかですね、これだけだと割りと普通だけど(笑)

 アマチュア仕様ですのでオススメはしません。

 たぶんプロのだと Jiki_xとか Item_Dataだとか文になってると思うのね。
 
 
 国表示画面で表示するようにします。

 この時点でこの画面では原則 mes表示はしてません。

 bmpフォントで数字を表示し、文字は作成してます。

 最終的に mes表示は全部使いません。
 
 
 スマホ用の操作にするため、ワンクリックで情報表示。

 選択カーソルも表示するようにします。

 この状態の選択キャラ上で、縦 130ドットの内、上 80ドットでキャラ選択、下50 ドットで装備変更になってます。

 キャラの無い状態だと 130ドット全部キャラ選択になってます。
 
 
 インフォ画面のプログラム

*info ; 国インフォ画面

	infof=0
	repeat ;------- メインルーチン -------

;------- 入力 -------

	 ky=inf_key()

	 stick kb,256,0
	  if kb=128 : break ; ESC END
	 if kc>0 : kc- : kb=0 ; 入力ウイエト

	 switch infof
	  case 0 ; 待機
	   if kb!256 : swbreak
	   if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : swbreak ; キャラがいない
	   kc=5 : infof=1 : ky2=ky : if ky=-1 : hextf=0
	  swbreak
	  case 1 ; インフォ表示
	   if kb!256 : swbreak
	   kc=5 : if ky=-1 : infof=0 : swbreak
	   if (ky\10)!(ky2\10) { ; 選択しているキャラではない
			if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : /*infof=0*/ : swbreak ; キャラがいない
			ky2=ky : swbreak
	   }
	   if 10<=ky and ky<=19 { ; 装備
			un=mu(kn*10+ky-10) : ug=un*udb : cn=ud(ug)
			if cn>0 : gosub *equipment : swbreak
	   }
	   sel_syo
	  swbreak
	 swend

	 if hextf!1 : break ; 戻る

;------- 表示 -------

	 redraw 0
	  color 0,0,0 : boxf : color 255,255,255

	  map_put	; マップ表示
	  inf_put	; HEX情報表示
	  dg_put	; デバッグ表示
	 redraw 1


	 await 1000/20

	loop ;---------------------------------

	return

 まだ途中なのでバグが残ってるけど、これだけでも相当にややこしい。

 inf_key()は別の場所で #deffuncによりキー入力のプログラムを作ってあって、カード座標の上 80ドットは 0~9、下 50ドットは 10~19の値を返すようになってます。

 sel_syoは、前に作ったセレクト画面です。
 
 
 とりあえず報告ここまで、現在装備画面を作ってます。

 これがまた恐ろしくややこしい。
 
 

キャラのデータを作ってた


2017年 8月23日~8月31日
 
 
 なんと、あれから 10日ばかりもかかってキャラのデータを一通り作ってた。

 どんどん変更されていくデータだからザッとでいいはずなんだけど、もう疲れでヘバってた。

 暑い時期は終わるから、そろそろスピードアップできるといいなあ。
 
 
 前回と変わり映えはしないけど、中身は作ってある。


 
 
 火と水

 
 
 風と地

 
 
 光と闇

 
 

キャラエディッターができた


2017年 8月10日~8月22日
 
 
 キャラエディッター(以降元のデータをキャラ、ゲーム中作成されるデータをユニットと呼ぶ事にする)ができた。

 アイテムエディッターを流用改造したのでグダってる割りに 2週間くらいでできた。

 ほんとはこれくらいのプログラムなら、せめて 1週間くらいで作りたいところだ。
 
 

 
 
 データもこれから沢山改変されていくと思う。


 
 
 作成されたキャラクターデータ。


 
 
 風と地。


 
 
 光と闇(作成途中)


 
 
 参考までにエディッタープログラムをダウンロードできるようにする。
 (「一般的にはダウンロードされる事の無い」って出るけど、別にウイルスとか入ってないので大丈夫です、というかそもそもそんな技術持って無いと言う(笑))

 注意して欲しいんだけど、これはエディッターを公開してる訳では無いと言う事。

 ソースがグチャグチャで本人以外に分からないと思うし、流用してるので使ってないコードもあるし、画像は 2次配布に当たるので含まれない。

 このままでは使えないし、そもそも人によってデータの構造も違うだろう。

 これはあくまで「プログラムの参考」程度に眺めたい人にはどうぞ、という事です。

 CCの時のや、アイテムエディッターの残照が無意味に残ってるし、解析しようとか思わないほうが吉(笑)
 
 
 
 次は戻って装備画面をいじる予定。
 
 

アイテムエディッターが大体完成した


2017年 8月9日
 
 
 なんと 10日も経ってまだアイテムエディッターをいじってる。

 ほんと冷房あるのになんでこんなにバテるんだろう?

 結局 3週間くらいかかってるけど、装備ってプログラム制作の 2、3割りは占める作業だと思うね。
 装備とかアイテム要素とかって意外と手間だと思う。

 ただちょっと時間かかり過ぎだとは思うし、プロとして考えると仕事にはなってないと思うよ(笑)
 
 
 今の所、上限 250個でやってる。


 
 
 ステータス(データ)も増えてる。

 これもまだどんどん変更されていく。

 ゲームプロフラムは「やってみないと面白いかどうか分からない」というのもあって、仕様をどんどん変更しながら作っていくので、始めに仕様を全部決めてという事はあんまり無いと思う。

 どういうプログラムを組んで実装していくかも思考錯誤だしね。
 
 
 文字データは note命令を使った。
 ただしこれも一時的なデータで、最終的には bmpに名前を書き出して使う事になると思う。

 i_name.txt


 
 
 次はこのエディッターを改造してキャラエディッター、つまりユニットデータを作らないと、

 それが出来たら装備画面に戻って装備プログラムを作る。

 いずれにせよ、この辺はゲームの核の部分に近いと思うから時間はかかると思うね。
 
 

アイテムエディッターを作ってる


2017年 7月20日~7月28日
 
 
 という訳でアイテムエディッターを作ってる。

 相変わらず不調。
 なぜ不調なのかと言うと、早くも夏バテ(笑)

 2週間ほどバテバテしながら少しずつ作った。
 ほんとは 3日くらいでできなければどうしようもない、という感じもする。

 左側の空白ウインドウはデバッグモニターだが、完成したし別にいらない。

 左下のは作業用なんたらとか言うやつです(笑)
 合成音声実況を流してますが、ほとんど見ても無いし聞いてもません。
 でも楽しい気分で集中できるし、今の所必須になってます。

 ちなみに自分は耳栓してヘッドホンしてます。

 外の音を遮断するのに長い事随分悩んだんですけど、以降10年くらいはずっとこの仕様です。
 耳栓してるので、自分は耳が悪くなる事はありませんでしたが、親が呼んでも聞こえないのでよく怒られます(笑)

 必ず耳が悪くならないという保障は無いので、マネるなら自己責任でお願いします。
 
 
 制作しながら仕様がどんどん変わるので、このアイテムエディッターもどんどん変えて使っていく。

 アイテムのグラは Whitecatさんのを使う。
 
 
 エディッターの工夫としては、Whitecatさんのグラは pngだが、HSPだと pngの背景色抜きができない。

 HSPDishはできるが、HSPだと等倍の gcopyでしか抜けない。

 今回は 3倍表示にしたので、gzoomだと背景を抜いてくれない。

 そこで bufferに一度 gzoomで3倍表示させてから、bufferからメイン画面に gcopyする事にした。
 
 
操作はパッドでできるようにしている。

 まだ属性もつけなきゃいけないし、全然これから。
 
 
 saveすると、
 i_data.dat
 i_name.dat
 item.bmp
 というファイルが出力される。

 これらのファイルを本体で読み込んで使う。

 ただし文字変数の i_name.datについては、フォントを bmpで作るようかもしれないので使わないかもしれない。
 (忘れてた、HSP3以降だと文字型変数はbsaveでセーブ出来ないんだった。
  note命令を使わないと。
  さてどうしたものか)

 item.bmp

 HSPDishの celputで使うので、左上からアイテム No.1~で 10個ずつになってる。
 
 

bmpフォント表示を整理した


2017年 7月15日~7月16日
 
 
 絶不調。
 
 
 という訳で、とりあえずbmpフォントの表示をまとめる事にした。

 フォントをまとめて(セルの大きさは 16*16)

 
 
 プログラムを改定して

#include "hsp3dish.as"


bfp_cn=1 ; セルNo.

celload "bmp_font.png",bfp_cn
celdiv bfp_cn,16,16

gosub *main : end


;----------- bmpフォント表示 --------------------------------
#module

#deffunc bfp str s,int x,int y,int t ; 英数字スモール、文字列
; s=文字列、x=x座標、y=y座標、t=文字色

	bfp_cn=1 ; #module内なので定義し直す

	ss=s			; たしか一度受け渡さないとエラーが
	sg=strlen(s)	; 文字長さ、個数
	t2=t*26			; 文字色

	gmode 2

	repeat sg			; 文字の数だけ繰り返し
	 n=peek(ss,cnt)		; 1文字読み出し、n=アスキーコード
	 if n=32 : continue ; " " スペース

	  pos x+cnt*11,y

	   if n>=65 and n<=90	: n2=n-65 : celput bfp_cn,n2+t2 : continue	; 小文字も大文字で表示
	   if n>=97 and n<=122	: n2=n-97 : celput bfp_cn,n2+t2 : continue	; アルファベット
	   if n>=48 and n<=57	: n2=n-48	; 数字
	   if n=43 : n2=10	; +
	   if n=45 : n2=11	; -
	   if n=42 : n2=12	; *
	   if n=47 : n2=13	; /
	   if n=61 : n2=14	; =
	   if n=37 : n2=15	; %
	   if n=46 : n2=16	; .
	   if n=44 : n2=17	; ,
	   if n=58 : n2=18	; :
	   if n=59 : n2=19	; ;
	   if n=40 : n2=20	; (
	   if n=41 : n2=21	; )
	   if n=33 : n2=22	; !
	   if n=63 : n2=23	; ?
	   if n=126 : n2=24	; ~

	   celput bfp_cn,182+n2+t2	; 表示
	loop

	return
#global


*main

	redraw 0
	 color 1,1,1 : boxf : color 255,255,255

	 s="1234567890"
	  bfp s,10,10,0

	 s="abcdefghijklmnopqrstuvwxyz"
	  bfp s,10,30,1

	 s="+-*/=%.,:;()!?~"
	  bfp s,10,50,2

	redraw 1

	stop

	return

 
 

 
 
 コピペすれば使えると思うから、使いたい人はどうぞ。
 物足りない人は改造してね(単色なのでグラデするとか、色がきにくわないとか)
 グラは ALFARで描いてるので、それで開けばパレットが使えるはず。

 色はノーマル、火、水、風、土、光、闇を表す。
 ノーマルは灰色なので、白(255)がよければ光(5)でどうぞ。

 一番最後の「/」はプログラムでは扱えてません。