2017年 9月20日
いやあ、ややこしかった。
基本的に右手左手、片手持ち両手持ちがある上に、キャラによって装備スロットが違うと言う。
これをつけたりはずしたりする、フラグの管理も大変だ。
よく RPGでアイテム増殖バグがあったりするけど、これはその程度には複雑だからだと思う。
とういう訳で装備画面。
上 80ドットで選択装備、下 50ドットではずす事にした。
この画面ではまだ装備してないので 130ドット全部選択装備だ。
装備画面のプログラム、まだ全部できてない。
バグも残ってる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
/////// 装備 ///////////////////////// #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のような座標定義は別の場所で行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
#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 |
と言う訳で、まだバグてんこ盛りだが、経過報告でした。