装備画面を作った


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

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

コメントを残す

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