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
と言う訳で、まだバグてんこ盛りだが、経過報告でした。