基礎知識
戦闘関係
装備品の中には、複数の箇所に装備可能だが、装備位置を変えるとステータス変動値が変わるものがある。
例えば「ガツングローブ」は、右と左、どちらにも装備可能であるが、左だと防御+5, 力+16の効果なのに、右だと力+8になる。
世界の合言葉は森部様のアイテムデータページによれば、アイテム(装備品)には「主装備位置」「性能」「主能力変動」「副能力変動」といった、ステータス変動に関わる設定がある。
性能値は右の場合攻撃力・頭左体足の場合防御力・装飾は意味なし?
複数個所に装備可能な場合、主装備位置が自由となっている場合は、どこに装備しても同じ性能が得られます。
主装備位置が指定されている場合、主装備位置以外では副能力変動の値が使われます。また、性能値は0となります。回避属性も得られないようです。
「ガツングローブ」だと、主装備位置が「左」であり、左に装備した時だけ、「性能」の値の+5が防御の値に加わり、「主能力変動」の力+16も得られる。
だが、「右」は装備可能ではあるが主装備位置ではないため、「性能」の値は反映されず、「副能力変動」の力+8だけが得られるようになっている。
「副能力変動」の値は「主能力変動」の1/2(小数点以下切り捨て)であることが多いのだが、例外もある。
例えば「グラブ」は、主装備位置が「右」で、左装備も可能。
右に装備すると、「性能」の値の+4が武器の攻撃力になる。「主能力変動」の値は設定されていない。
なのだが、左に装備すると、「副能力変動」の速-5が働くのである。
「主能力変動」には何も設定されていないのに、「副能力変動」の値があったり、「副能力変動」が「主能力変動」の1/2(小数点以下切り捨て)でない場合などもある。
これらの「副能力変動」の数値は、どこで決まっているのだろうか?
まず、アイテムデータを確認してみよう。
アイテムデータは、1アイテムにつき00~15の16バイト分のデータが格納されている。
| No. | 内容 |
|---|---|
| 00 | 上4ビット:1~7は主装備位置、8以上なら罠アイテム/下4ビット:装備品なら装備種類、装備品以外ならアイテム種別 |
| 01 | 上6ビット:装備部位/下1ビット:材料アイテム |
| 02 | 無効状態異常(8ビット) |
| 03 | 上4ビット:装備タイプ/下4ビット:フィールド吸収 |
| 04 | 回避属性1(8ビット) |
| 05 | 回避属性2(8ビット) |
| 06 | 力 主能力変動値(符号付き8ビット整数値、一番上のビットが正負、下7ビットが数値になる。以下09まで同じ) |
| 07 | 速 主能力変動値 |
| 08 | 体 主能力変動値 |
| 09 | 知 主能力変動値 |
| 10 | 使用時に技が発動する場合、味方技IDの値 |
| 11 | 副能力変動値計算用の値 |
| 12 | メカがアクセサリ装備で技追加($08~$0F) |
| 13 | 上4ビット:戦闘開始時行動異常を起こす敵種族/下4ビット:戦闘開始時行動異常 |
| 14 | 下6ビット:攻撃または防御の値 |
| 15 | 状態異常追加効果(8ビット) |
「主能力変動」の値は、アイテムデータ06~09に入っている。
「性能」の値は、アイテムデータ14の下6ビットに入っている。
だが、「副能力変動」の値はない。
その代わりに、アイテムデータ11に、副能力変動値計算用の値が入っている。
この値を使って「副能力変動」が計算されている。
アイテムデータ11に格納されているのは、上2ビットが「変動する能力値」、下6ビットが「マイナスする値」なのだが、16進数の正負の表現方法と、10進数の正負の表現方法がまったく異なっているため、単純に足し引きしただけでは変動値が算出されず、少し面倒に見える計算を行っている。
サブルーチンの説明は次ページにして、計算方法を先に記す。
「副能力変動」の計算方法は、以下のようになっている。
主能力変動値を符号付き8ビット整数値(2進数にして一番上の値が1なら負の値であり、下7ビット分が整数値)として計算することに注意。
まず、「副能力用計算値」を以下のように計算する。
次に、アイテムデータ11(副能力変動値計算用の値)に$00が入っているかどうかで分岐する。
| 上2ビット | 能力値 |
|---|---|
| 00 | 力 |
| 01 | 速 |
| 10 | 体 |
| 11 | 知 |
とてもややこしそうだが、ステータス変動がマイナスの時に符号付き8ビット整数値を使っていることと、アイテムデータ11に$00以外が入っているかどうかの分岐があるため、ややこしく見えているようなものである。
アイテムデータ11の例外を考えない場合、基本的に、副能力変動値は主能力変動値の1/2(小数点以下切り捨て)である。
要するに、副能力変動値は主能力変動値の絶対値の半分しか変動しないようにする意図での計算である。+10なら半分の+5にしたい、-10なら半分の-5にしたい、ということである。
ただ、主能力変動値がマイナスの値の時の計算がややこしい。
例えば主能力変動値が10進数で-10の時、16進数(符号付き8ビット)だと$F6である。
$F6を単純に1/2すると、$7Bである。
符号付き8ビット整数値とみなすと、10進数+123という扱いになってしまう。
符号付き8ビット整数は、上1ビットに正負、下7ビットに数値(絶対値)が入っているが、上1ビットはそのままで、下7ビット部分だけを1/2したい、という場合、単純に÷2だけでは上1ビットも巻き込んで計算してしまうため、うまくいかないのである。
そこでどうするかというと、上の計算方法のように、$F6の上にFFをつけて、符号付き16ビット整数の$FFF6としてから1/2する。
(プログラム上の処理は後で紹介するが、$FF00との論理和を取っている)
こうすると、trunc($FFF6/2) = $7FFB、下の2桁のみ取り出し符号付き8ビット整数値$FBとすれば、10進数-5になる。
ということで、符号付き8ビット整数値だからややこしくなっているが、絶対値を半分にすることができている。
ただし、余りが出る時の切り捨てには注意。
主能力変動値が$F5(10進数-11)の時は、
trunc($FFF5/2) = $7FFA
なので、$FA(10進数-6)が副能力変動値になる。
10進数の計算trunc(-11/2) = -5とは異なる値が返ってくるので、計算自体はあくまでも符号付き8ビット整数値で行う必要がある。
アイテムデータ11に$00が入っている場合は、以上で計算終了で、副能力変動値が算出できた。
アイテムデータ11に$00以外の値が入っている場合は、副能力変動値は主能力変動値の半減だけではなく、別に計算をしなければならない、という意味になる。
アイテムデータ11の上2ビットと下6ビットに分けて、上2ビットから変動する能力値がどれなのかを判断する。
下6ビットの値だが、上の計算式はややこしく見えるものの、実際には、「副能力変動値 = 主能力変動値/2 - 下6ビットの値」である。ただしこちらも、符号付き8ビット整数値なのでややこしい計算式になっているだけである。
実際の例を示す。
「野性バッグ」は右と左に装備可能で、主装備位置は右である。
主能力変動値は力$14(10進数20)、知$08(10進数8)。他の値は0である。
アイテムデータ11は$14である。
このため、左に装備した場合は、副能力変動値でステータスが変動することになる。
左装備時の変動値を計算してみよう。
まず、アイテムデータ11($14)の上2ビットと下6ビットを取り出してみる。
$14 = %0001 0100
アイテムデータ11の上2ビット:$00
アイテムデータ11の下6ビット:%0001 0100 = $14
上2ビットの値は変動する能力値を示しており、$00だと「力」である。
| 上2ビット | 能力値 |
|---|---|
| 00 | 力 |
| 01 | 速 |
| 10 | 体 |
| 11 | 知 |
「力」だけ、アイテムデータ11の下6ビットの値も使って変動値を計算しなければならない。
逆にいえば、他の「速」「体」「知」の計算は、アイテムデータ11の値に影響されず、単純に主能力変動値を1/2すれば良いということである。
アイテムデータ11が影響するのは、1種類のアイテムにつき1つのステータスのみということがわかる。
次に、副能力用計算値 = trunc(主能力変動値/2)を計算する。
「野性バッグ」の主能力変動値の中に負の値はないので、この計算式で計算して構わない。
「速」「体」「知」は、この計算結果がそのまま、副能力変動値になる。
速:
副能力用計算値 = trunc(主能力変動値/2)
= trunc($00/2)
= $00
体:
副能力用計算値 = trunc(主能力変動値/2)
= trunc($00/2)
= $00
知:
副能力用計算値 = trunc(主能力変動値/2)
= trunc($08/2)
= $04
「速」「体」は元の変動値がゼロなのでそのまま0が副能力変動値だが、「知」は元の変動値が$08なので、半分の$04が副能力変動値ということになる。
では、「力」について計算してみる。
力:
副能力用計算値 = trunc($14/2)
= $0A
副能力変動値 = (副能力用計算値 + (アイテムデータ11の下6ビットと$FFの排他的論理和 + 1)) & $FF
= ($0A + ($14 XOR $FF + $01)) & $FF
= ($0A + $EC) & $FF
= $F6
「野性バッグ」の「力」の副能力変動値は「$F6」と計算された。
$100-$F6 = $0A、10進数10なので、「野性バッグ」の「力」の副能力変動値は10進数で-10となる。
これで計算は終わりなのだが、以上を10進数でもう一度見てみよう。
アイテムデータ11の下6ビットは、%0001 0100 = $14だったから、10進数だと「20」である。
そして、副能力用計算値を10進数で計算すると、
副能力用計算値 = trunc(20/2)
= 10
この値から、アイテムデータ11の下6ビットを10進数で引き算すれば、それが「野性バッグ」の「力」の副能力変動値なのである。
つまり、
10 - 20 = -10
これで計算終了である。
先に記した通り、主能力変動値が負の値の時は、truncでの小数点以下切り捨ての方法が16進数と10進数で変わるので気をつけなければならないが、それを除けば、10進数で見た方がわかりやすい。
もうひとつの例として、主能力変動値が負の値の「ワタナベのパンツ」の計算方法を見てみよう。
「ワタナベのパンツ」は、頭と体に装備可能で、主装備位置は体である。
主能力変動値は知$E7。他の値は0である。
$E7は符号付き8ビット整数値として見ると負の値で、10進数の「-25」である。
アイテムデータ11は$E0である。
このため、頭に装備した場合は、副能力変動値でステータスが変動することになる。
まず、アイテムデータ11($E0)の上2ビットと下6ビットを取り出してみる。
$E0 = %1110 0000
アイテムデータ11の上2ビット:$11
アイテムデータ11の下6ビット:%0010 0000 = $20
上2ビットから、変動する能力値は「知」である。
下6ビットは$20、10進数だと「32」である。
以下、「知」の副能力変動値だけ計算する。
副能力用計算値 = trunc($FFE7/2) & $00FF
= $F3
主能力変動値/2の計算になるが、答えは$F3、符号付き8ビット整数値として見ると負の値で、10進数の「-13」である。
主能力変動値$E7は10進数の「-25」だが、trunc(-25/2)を計算すると、「-12」になってしまう。
このズレが生じてしまうため、符号付き8ビット整数値で計算を行っていかなければならない。
副能力変動値 = (副能力用計算値 + (アイテムデータ11の下6ビットと$FFの排他的論理和 + 1)) & $FF
= ($F3 + ($20 XOR $FF + $01)) & $FF
= ($F3 + ($DF + $01)) & $FF
= ($F3 + $E0) & $FF
= $1D3 & $FF
= $D3
$D3を符号付き8ビット整数値として見ると負の値で、10進数の「-45」である。
よって、「ワタナベのパンツ」の「知」の副能力変動値は-45である。
下6ビットは10進数「32」だったので、主能力変動値/2の「-13」から32を引いた、
-13-32 = -45
こちらの方が計算としては手っ取り早い。
以上のようにして、副能力変動値が計算されている。
アイテムデータ11に格納されている値自体は、上2ビットが「変動する能力値」、下6ビットが「マイナスする値」とシンプルなのだが、16進数のため計算方法がくどくなっているように見えてしまう。
では、このなかなか面倒な計算が、プログラムでは実際にどういう風に処理されているのか、次ページで解説する。