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