2018年 6月12日
いやああったあああああああああ!
ついに突破したぞおおおおお!
まだ中立の一部の装備だけだけど、3月の半ばからだからここまで 3ヶ月か~長かった。
改めて3ヶ月か(ゴクリ)いままで何やってたんだろ・・・・・
できた内容の割りに費やした月日の長さに呆然とする。
↓ これだけの自動装備に3ヶ月かかった(笑)

いったい・・・何が・・・そんなに・・・・
整理しながら説明する事にするけど、自分でも何やってるのかよく把握してない。
さしあたって、前回は生成されたユニットとアイテムの順列を作る所までやった。
次はコレ、装備して配置するプログラム。
; 中立の人材配置 ----------------------------
repeat 25,1 : kn=cnt ; 中立国
f=0
repeat plb
if kn=mpc(cnt) : f=1 : break ; HEX
loop
if f=1 : continue ; ヒーローの土地
if map(kn)=0 : continue ; 空白地
nrs_copy ; 中立のユニット操作順列コピー
nis_copy ; 中立のアイテム操作順列コピー
un=nrs5(0) : if un>0 : mu(kn*10)=un : nrs_del un ; 領主配置
repeat 10 ; 列の順列をリセット
nrt1(cnt)=0 : nrt2(cnt)=0 : nrt3(cnt)=0
loop
nrt1c=0 : nrt2c=0 : nrt3c=0 ; 現在の列の順番をリセット
repeat 9,1 ; 装備
if cnt\2=2 : nrs_eq 2 : if un=0 : nrs_eq 1 : if un=0 : break ; 2回目
nrs_eq 1 : if un=0 : nrs_eq 2 : if un=0 : break ; 1と3回目
loop
nrt1c=0 : nrt2c=0 : nrt3c=0 ; 現在の列の順番をリセット
repeat 3 : knc=kn*10+cnt*3 ; 配備
repeat 3,1
if cnt=1 { ; 1列目
un=nrt1(nrt1c) : if un>0 : mu(knc+1)=un : nrt1c+ : continue
un=nrt2(nrt2c) : if un>0 : mu(knc+1)=un : nrt2c+ : continue
un=nrt3(nrt3c) : if un>0 : mu(knc+1)=un : nrt3c+ : continue
}
if cnt=2 { ; 2列目
un=nrt2(nrt2c) : if un>0 : mu(knc+2)=un : nrt2c+ : continue
un=nrt1(nrt1c) : if un>0 : mu(knc+2)=un : nrt1c+ : continue
un=nrt3(nrt3c) : if un>0 : mu(knc+2)=un : nrt3c+ : continue
}
if cnt=3 { ; 3列目
un=nrt3(nrt3c) : if un>0 : mu(knc+3)=un : nrt3c+ : continue
un=nrt2(nrt2c) : if un>0 : mu(knc+3)=un : nrt2c+ : continue
un=nrt1(nrt1c) : if un>0 : mu(knc+3)=un : nrt1c+ : continue
}
loop
if nrt1(nrt1c)=0 and nrt2(nrt2c)=0 and nrt3(nrt3c) : break ; 全員使った
loop
loop
まず
nrs_copy ; 中立のユニット操作順列コピー
nis_copy ; 中立のアイテム操作順列コピー
これはユニットとアイテムの順列を「操作用の順列にコピー」する。
選択した No.を消去したりするので、一時データにコピーしてから使う。
合わせてこうすると、どの国 No.でも同じソースで処理できるので便利。
次は
un=nrs5(0) : if un>0 : mu(kn*10)=un : nrs_del un ; 領主配置
領主は戦闘しないので基本装備はしない、するとしても後回し。
nrs5 は総力の順列、nrs_del unは nrs1(筋力)、nrs2(魔力)、nrs5(総力)の一時順列からユニットNo. unを消去するソースルーチン。
repeat 10 ; 列の順列をリセット
nrt1(cnt)=0 : nrt2(cnt)=0 : nrt3(cnt)=0
loop
nrt1c=0 : nrt2c=0 : nrt3c=0 ; 現在の列の順番をリセット
この列と言うのは隊列の 1列目 2列目 3列目の事で、装備したユニット No.を装備した武器種類事にこの 1~ 3列目の順列に順番に放り込む。
国の部隊配置の際に、この順列からユニット No.を拾って順番に配備する。
その順列のリセット。
repeat 9,1 ; 装備
if cnt\2=2 : nrs_eq 2 : if un=0 : nrs_eq 1 : if un=0 : break ; 2回目
nrs_eq 1 : if un=0 : nrs_eq 2 : if un=0 : break ; 1と3回目
loop
中立なので部隊最大配置でも 9人、装備する人材の順番を 筋力 → 魔力 → 筋力、の繰り返しでその順列から拾う事にしてる。
これはなぜかと言うと、筋力も魔力も高いユニットをどう優先的に振り分けるか考えた結果。
ここから装備のソースの nrs_eqに飛ぶ
#deffunc nrs_eq int nrs_eqf ; 中立の順列の装備(1=筋力、2=魔力) repeat nub if nrs_eqf=1 : un=nrs1(cnt) ; 筋力 if nrs_eqf=2 : un=nrs2(cnt) ; 魔力 if un>0 : nrs_del un : break loop if un=0 : return ; いない neq un ; 中立の装備 if neqf=1 : nrt1(nrt1c)=un : nrt1c+ ; 1列目の順列に放り込む if neqf=2 : nrt2(nrt2c)=un : nrt2c+ ; 2列目の順列に放り込む if neqf=3 : nrt3(nrt3c)=un : nrt3c+ ; 3列目の順列に放り込む return
これは筋力と魔力の順列からユニットを選び出して装備の neqに飛ばし、戻ってきたら装備の種類に従って各列の順列にそのユニットNo.を振り分けるソース。
そしてこれが肝の装備プログラムの neq
#deffunc neq int neqn ; 中立の装備
; 10=装備タイプ
; (0=無、1=筋力素アタック、2=盾+片手、3=2刀流、4=両手持ち、5=棍棒、
; 6=投擲、7=槍、8=弓、9=魔力素アタック、10=魔術師、11=魔女、12=僧侶)
un=neqn : ug=un*udb : cn=ud(ug)
neqf=1 ; 1列目
sbk_syo ; 装備枠処理
n=7-(ud(ug+16)+ud(ug+17)+ud(ug+18)+ud(ug+19)+(ud(ug+3)/20)) ; 空きスロット数
repeat 1 ; 特殊アイテム装備
if n<=0 : break ; 空きスロット無い
toku12f=0 : nis12_syo n : if f=0 : break ; 特殊アイテムが有るか
repeat sbkn
if equsi(cnt)=5 : ud(ug+40+cnt)=in : equ_syo un,in : break ; 特殊欄に装備
loop
loop
; 筋力素アタック
if cd(10,cn)=1 {
nis9_syo : ud(ug+40)=in ; 防具
nis10_syo ; アイテム
}
; 盾+片手
if cd(10,cn)=2 {
repeat 1
nis8_syo : if f=1 { ; 盾が有るか
ud(ug+41)=in ; 左手装備
nis1_syo : if f=1 : ud(ug+40)=in : break ; 片手武器有るか
nis6_syo 1 : if f=1 : ud(ug+40)=in : break ; 片手銃有るか
nis7_syo : if f=1 : ud(ug+40)=in : break ; 投擲武器有るか
break
}
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍装備
nis1_syo : if f=1 { ; 片手武器(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis6_syo 1 : if f=1 { ; 片手銃有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis7_syo : if f=1 { ; 投擲武器有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
break
}
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=3 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : neqf=3 : break ; 左両手
ud(ug+40)=in : neqf=2 ; 右手
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 左手
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
break
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 2刀流
if cd(10,cn)=3 {
repeat 1
nis1_syo : if f=1 { ; 片手武器有るか
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis6_syo 1 : if f=1 { ; 片手銃有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis7_syo : if f=1 { ; 投擲武器有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍装備
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb : neqf=3
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : break ; 左両手
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 両手
if cd(10,cn)=4 {
repeat 1
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
nis8_syo : if f=1 { ; 盾が有るか
ud(ug+41)=in ; 左手装備
nis1_syo : if f=1 : ud(ug+40)=in : break ; 片手武器
nis6_syo 1 : if f=1 : ud(ug+40)=in : break ; 片手銃
nis7_syo : if f=1 : ud(ug+40)=in : break ; 投擲武器
break
}
nis1_syo : if f=1 { ; 片手武器(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis7_syo : if f=1 { ; 投擲武器有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis6_syo 1 : if f=1 { ; 片手銃有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb : neqf=3
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : break ; 左両手
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 棍棒
if cd(10,cn)=5 {
repeat 1
nis4_syo : if f=1 { ; 棍棒
if ud(ug+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
ud(ug+40)=in ; 片手
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=3 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : neqf=3 : break ; 左両手
ud(ug+40)=in : neqf=2 ; 右手
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
break
}
nis1_syo : if f=1 { ; 片手武器(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis7_syo : if f=1 { ; 投擲武器有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 投擲
if cd(10,cn)=6 {
repeat 1
nis7_syo : if f=1 { ; 投擲武器
ud(ug+40)=in : neqf=2 ; 右手
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis6_syo 1 : if f=1 { ; 片手銃
ud(ug+40)=in : neqf=2 ; 右手
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb : neqf=3
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : break ; 左両手
break
}
nis1_syo : if f=1 { ; 片手武器有るか(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
break
}
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 槍
if cd(10,cn)=7 {
repeat 1
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=3 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : neqf=3 : break ; 左両手
ud(ug+40)=in : neqf=2 ; 右手
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
break
}
nis7_syo : if f=1 { ; 投擲武器有るか
ud(ug+40)=in : neqf=2 ; 右手装備
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
break
}
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
nis8_syo : if f=1 { ; 盾が有るか
ud(ug+41)=in ; 左手装備
nis1_syo : if f=1 : ud(ug+40)=in : break ; 片手武器
break
}
nis1_syo : if f=1 { ; 片手武器有るか(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
break
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
; 弓銃
if cd(10,cn)=8 {
repeat 1
nis6_syo 0 : if f=1 { ; 弓銃
ig=in+idb
if id(ig+16)=2 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=3 : break ; 右両手
if id(ig+16)=4 : ud(ug+40)=-2 : ud(ug+41)=in : neqf=3 : break ; 左両手
ud(ug+40)=in : neqf=2 ; 右手
nis6_syo 1 : if f=1 : ud(ug+41)=in : break ; 片手銃
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
}
nis7_syo : if f=1 { ; 投擲武器
ud(ug+40)=in : neqf=2 ; 右手
nis7_syo : if f=1 : ud(ug+41)=in : break ; 投擲武器
nis8_syo : if f=1 : ud(ug+41)=in : break ; 盾
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
}
nis3_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : neqf=2 : break ; 槍
nis8_syo : if f=1 { ; 盾が有るか
ud(ug+41)=in ; 左手装備
nis1_syo : if f=1 : ud(ug+40)=in ; 片手武器有るか
break
}
nis2_syo : if f=1 : ud(ug+40)=in : ud(ug+41)=-1 : break ; 両手装備
nis1_syo : if f=1 { ; 片手武器有るか(2刀流)
ud(ug+40)=in ; 右手装備
nis1_syo : if f=1 : ud(ug+41)=in : break ; 片手武器
break
}
loop
nis9_syo : ud(ug+42)=in ; 防具
nis10_syo ; アイテム
}
return
まだ物理攻撃職しか作ってなくて、魔法やアイテムのプログラムは出来て無い。
まず、たぶん全キャラ共通の、アイテム枠拡張の特殊装備からしている。
キャラの装備種類データ cd(10,cn)の装備タイプを元に(前回の記事に出てる)各アルゴリズムで存在するものから武器を装備していく。
装備した武器によって neqf(列フラグ)を設定して配置する列を指定する。
実際の部隊配置プログラムは元のソースに戻って
repeat 3 : knc=kn*10+cnt*3 ; 配備
repeat 3,1
if cnt=1 { ; 1列目
un=nrt1(nrt1c) : if un>0 : mu(knc+1)=un : nrt1c+ : continue
un=nrt2(nrt2c) : if un>0 : mu(knc+1)=un : nrt2c+ : continue
un=nrt3(nrt3c) : if un>0 : mu(knc+1)=un : nrt3c+ : continue
}
if cnt=2 { ; 2列目
un=nrt2(nrt2c) : if un>0 : mu(knc+2)=un : nrt2c+ : continue
un=nrt1(nrt1c) : if un>0 : mu(knc+2)=un : nrt1c+ : continue
un=nrt3(nrt3c) : if un>0 : mu(knc+2)=un : nrt3c+ : continue
}
if cnt=3 { ; 3列目
un=nrt3(nrt3c) : if un>0 : mu(knc+3)=un : nrt3c+ : continue
un=nrt2(nrt2c) : if un>0 : mu(knc+3)=un : nrt2c+ : continue
un=nrt1(nrt1c) : if un>0 : mu(knc+3)=un : nrt1c+ : continue
}
loop
if nrt1(nrt1c)=0 and nrt2(nrt2c)=0 and nrt3(nrt3c) : break ; 全員使った
loop
loop
(そうだコレ、2列目の前に3列目を先に処理するんだった、そうすれば遠距離を優先的に後列に配備できるはず)
これになる。
1列目の優先順位は 1、2、3列の順、2列目の優先順位は 2、1、3の順、3列目は 3、2、1の順に参照する。
これは放り込まれるユニットがどれかの順列に偏るし、その列の順列に無い場合の優先順位。
もちろん全部無くなったら配置されない。
テスト、中立の 20国

1列目

まだバグってる、両手持ちなのに・・・

う~ん遠距離タイプを 3番目に置かなければいけないんだけど、まだ調整がいるなあ。

とまあそんな感じで、まだアイテムや魔法の装備のアルゴリズムと、この後まだプレイヤー勢力の場合には複数国配置なので国の強さのデータとそれを元にどの自国領に何部隊配備するかを作らないといけないんだけど、とりあえずこれで突破したというか後は改良と調整をすれば良いだけだと思うので、一応「やっとできた~」とは言えると思う。
今まででこのプログラムが一番難しかった、それはやっぱりやった事の無いプログラムだったから。
机に座ってソースに向かう日々というより、ほとんど散歩して考える日々だった。
参考までに。