2018年 6月25日
前回は武器や鎧の装備までだったけど、今回はアイテムや魔法の自動装備の一部を作った。
これもややこしくて一山だった。
装備のルーチン
↓
タイブ別分岐
↓
各タイプ別の魔法、アイテム装備選択
↓
各魔法、アイテム別の装備
という事になったが、やはりいくつかのアイデアを考え出すようだった。
装備のルーチンから
; 筋力素アタック if cd(10,cn)=1 { nieq_syo 1 ; 近接のアイテム、魔法装備 }
nieq_syo 1がアイテム装備処理へ
筋力素アタックタイプは武器装備はしない、鎧は共通なので始めに行ってる。
アイテム装備処理
#deffunc nieq_syo int nieq_syon ; アイテム装備処理 f=0 repeat sbkn : eqn=cnt ; 装備箇所 if equsi(eqn)!5 and equsi(eqn)!6 : continue ; 特殊かアイテム枠以外 if ud(ug+40+eqn)!0 : continue ; 装備してる f=1 : break loop if f=0 : return ; 枠無かった repeat 25 : ieqr(cnt)=0 : loop ; テーブルリセット if nieq_syon=1 : nieq1 ; 近接のアイテム装備 ; 以下、弓タイプとか魔術師タイプとか作る予定 return
まだタイプ 1の近接タイプしか作ってない。
ここから各タイプへ分岐ジャンプする。
近接の魔法、アイテム装備選択ルーチン
#deffunc nieq1 ; アイテム装備、近接 ; 1=回復、2=状態回復、3=矢筒、4=矢、5=弾、6=砲弾、7=爆弾、8=アクセ、9=護符、 ; 10=本、11=単魔法、12=全体魔法、 ; 13=強化、14=全体強化、15=バリア、 ; 16=エンチャント、17=グラビティ、レイブレイド、 ; 18=回復、19=状態異常回復、20=リザ、21=ターンアンデッド、 ; 23=状態異常、24=召還、25=押し出し ieqr(0)=1,2,7,8,11,13,16,17 ; 近接のアイテム選択テーブル ieqrn=8 ; テーブルの数 repeat sbkn ; 装備枠最大数 repeat ieqrn r=ieqr(rnd(ieqrn)) ; 何を装備するか if r=1 : nieq_1 : if f=2 : break ; 回復 if r=2 : nieq_2 : if f=2 : break ; 状態異常回復 if r=7 : nieq_7 : if f=2 : break ; 爆弾 if r=8 : nieq_8 : if f=2 : break ; アクセサリー if r=11 : nieq_11 : if f=2 : break ; 単体魔法 if r=13 : nieq_13 : if f=2 : break ; 強化魔法 if r=16 : nieq_16 : if f=2 : break ; エンチャント if r=17 : nieq_17 : if f=2 : break ; グラビティ、レイブレイド loop if f=2 : break loop return
始めの方のコメントアウトを見てもらえれば分かると思うが、各タイプ事に装備するであろう種類の要素事に装備分岐する事にし、どの装備をするかは ieqr(0)=1,2,7,8,11,13,16,17のテーブルからランダムで選び、装備しても無くても一度選んだ数字はテーブルから消す事によって、2回以上選ばないようにした。
テーブル消去のソース
#deffunc ieqr_del int ieqr_deln ; アイテム選択テーブル消去 repeat ieqrn : cnt2=cnt ; アイテム選択テーブル if ieqr(cnt2)!ieqr_deln : continue repeat ieqrn-cnt2 ieqr(cnt2+cnt)=ieqr(cnt2+cnt+1) loop loop ieqrn- ; テーブル数- return
こうする事によって、例えば回復アイテムを 3つ装備したいなら、ieqr(0)=1,1,1のように設定すれば良く、タイプ別に違いを出せる。
実際のアイテム装備
#deffunc nieq_1 ; 回復アイテム ieqr_del 1 ; アイテム選択テーブルを消去 f=0 repeat nib10 : in=nis10(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!9 or id(ig+8)!29 : continue ; 回復で無い ud(ug+40+eqn)=in : nis_del in,10 : f=1 ; 装備 eqn+ : if equsi(eqn)!6 : f=2 ; アイテム枠無し break loop if f>0 : return ; 装備した return #deffunc nieq_2 ; 状態異常回復アイテム ieqr_del 2 ; アイテム選択テーブルを消去 f=0 repeat nib10 : in=nis10(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!9 : continue ; アイテムで無い if id(ig+8)<40 or 47<id(ig+8) : continue ; 状態異常回復で無い ud(ug+40+eqn)=in : nis_del in,10 : f=1 ; 装備 eqn+ : if equsi(eqn)!6 : f=2 ; アイテム枠無し break loop if f>0 : return ; 装備した return #deffunc nieq_7 ; 爆弾 ieqr_del 7 ; アイテム選択テーブルを消去 f=0 repeat nib10 : in=nis10(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!9 or id(ig+8)!14 : continue ; 爆弾で無い ud(ug+40+eqn)=in : nis_del in,10 : f=1 ; 装備 eqn+ : if equsi(eqn)!6 : f=2 ; アイテム枠無し break loop if f>0 : return ; 装備した return #deffunc nieq_8 ; アクセサリー ieqr_del 8 ; アイテム選択テーブルを消去 f=0 repeat nib10 : in=nis10(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!7 : continue ; アクセサリーで無い ud(ug+40+eqn)=in : nis_del in,10 : f=1 ; 装備 eqn+ : if equsi(eqn)!6 : f=2 ; アイテム枠無し break loop if f>0 : return ; 装備した return #deffunc nieq_11 ; 単体魔法 ieqr_del 11 ; アイテム選択テーブルを消去 f=0 repeat nib11 : in=nis11(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!10 or id(ig+8)!11 : continue ; 前列魔法で無い if neq_int<id(ig+37) : continue ; 必要知性が足りない neq_int-=id(ig+37) ; 必要知性消費 ud(ug+40+eqn)=in : nis_del in,11 : f=1 ; 装備 eqn+ : if equsi(eqn)!6 : f=2 ; アイテム枠無し break loop if f>0 : return ; 装備した return #deffunc nieq_13 ; 強化魔法 ieqr_del 13 ; アイテム選択テーブルを消去 f=0 repeat nib11 : in=nis11(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig)!253 and id(ig)!282 and id(ig)!292 and id(ig)!303 : continue ; 強化魔法で無い if neq_int0 : return ; 装備した return #deffunc nieq_16 ; 付与魔法 ieqr_del 16 ; アイテム選択テーブルを消去 f=0 repeat nib11 : in=nis11(cnt) if in=0 : continue ; 無し ig=in*idb if id(ig+16)!10 or id(ig+8)!28 : continue ; 付与魔法で無い if neq_int 0 : return ; 装備した return #deffunc nieq_17 ; グラビティ、レイブレイド ieqr_del 17 ; アイテム選択テーブルを消去 n1=0 : n2=0 repeat nib11 : in=nis11(cnt) if in=0 : continue ; 無し ig=in*idb : if id(ig)!294 : continue ; グラビティマグネットで無い n1=in : break loop repeat nib11 : in=nis11(cnt) if in=0 : continue ; 無し ig=in*idb : if id(ig)!311 : continue ; レイブレイドで無い n2=in : break loop f=0 repeat 1 ; 2つの場合 if n1=0 or n2=0 : break ; 両方揃って無い if equsi(eqn+1)!6 : break ; 枠2つ無い n=itd(37,294)+itd(37,311) ; 必要知性 if neq_int 0 : return ; 装備した repeat 1 ; レイブレイド if n2!311 : break ; 無かった if neq_int 0 : return ; 装備した repeat 1 ; グラビティマグネット if n1!294 : break ; 無かった if neq_int 0 : return ; 装備した return
これもまだ近接で選ばれるものしか作ってないが、後は応用なので。
例えば強化魔法だと、魔法アイテムの順列 nis11から、
253=バーサーク
282=ウインドムーブ
292=ハードコーティング
303=フォースセンス
の魔法を探して装備する。
以上サラッと書いてるが、ここまで考えるのは大変。
装備テスト
中立の 4国
1列目、素アタックタイプ
サックはアイテム装備欄を増やすアイテム、増えた 3枠にアクセサリーと状態異常回復と回復薬を装備している。
2列目、素アタック
この本もアイテム枠を増やすアイテム(たぶん「サバイバルブック荷造編」とかなんとか)、以下状態異常回復、アクセサリー。
3列目、素アタック
アクセサリーのみ。
3体とも知性(INT)が低いので、魔法装備は出来なかったみたい。
中立の 1国、今の所先頭の盾タイプのみ
爆弾(着弾範囲攻撃)とアクセサリーを装備している。
その他
う~ん単体攻撃魔法が見つからない、バグかなあ。
これはファイアエンチャント。
そんな感じです、今回は出来てちょっと嬉しい。