TITLE:ライブ・ア・ライブ(SFC)解析
#br
スーパーファミコン板「ライブ・ア・ライブ」のデータと解析です。内容の正確性は保証できません。
リメイク版のデータではありません。
ある程度プログラミングの知識がある人向けです。
#br
#contents
* ライブ・ア・ライブ [#h4c0ae6b]
ROM容量は16メガビット(2048キロバイト)
メモリ割り当てはHiROM
SRAM 64キロビット(8キロバイト)+バッテリーバックアップ
メモリアドレスは基本的に、$00:0000のように、
「バンク1バイト:アドレス2バイト」
の形式で記載する。
スーパーファミコンの仕様は、
https://github.com/akatsuki105/snes-docs-ja
https://donkeyhacks.zouri.jp/html/Ja-jp/snes/index.html
など参照のこと。
#br
** 参考ウェブサイト様 [#ecbcadb8]
https://rodgersia.ninpou.jp/livealive/
http://zsnsk.sakura.ne.jp/livealive/battle_system.html
https://livealive.client.jp/sfc/analysis/index.html
http://www.codefrontier.com/kaizou_code/sfc_livealive/code.htm
https://wikiwiki.jp/snes007/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%96
https://donkeyhacks.zouri.jp/html/Ja-jp/index.html
https://github.com/akatsuki105/snes-docs-ja
https://w.atwiki.jp/snesspec/
https://wiki.superfamicom.org/
https://sneslab.net/wiki/Main_Page
https://georgjz.github.io/snesaa01/
他
リメイク版関係の解説と解析は以下が詳しい。
https://livealive.client.jp/battle00.html
https://livealive.client.jp/etc/index.html
#br
* 演算子記号 [#b51f8307]
四則演算記号は基本的に+, -, *, /で表す。
その他演算子は以下。
|max()|引数として与えられた数値のうち最大値を返す|
|min()|引数として与えられた数値のうち最小値を返す|
|trunc()|引数として与えた数値の小数点以下切り捨て|
|mod|剰余演算子(割り算の余り)|
|&|ビット論理積演算子 AND|
|||ビット論理和演算子 OR|
モトローラ系アセンブラ基準で16進数は頭に$、2進数は頭に%
1バイト(8ビット)のデータで、ビット毎に分けて説明する時は、右(一番下の桁)からBit0~とナンバリングする。
|Bit7|Bit6|Bit5|Bit4|Bit3|Bit2|Bit1|Bit0|
|2^7|2^6|2^5|2^4|2^3|2^2|2^1|2^0|
例:
16進数で$B6は、2進数で%&color(red){1};011 011&color(green){0};
Bit7は一番左の桁で&color(red){1};、Bit0は一番右の桁で&color(green){0};
アセンブリ言語のビット演算の都合で、計算に割り算を含む場合は割り算の都度、必ず小数点以下切り捨てで計算すること(論理シフトの右シフト相当)。
つまりtrunc()だが、計算式が見づらくなりそうな場合はtrunc()を省く。
-[[アセンブリ言語 - Wikipedia>https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E8%A8%80%E8%AA%9E]]
-[[ビット演算 - Wikipedia>https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97]]
-[[剰余演算 - Wikipedia>https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97]]
#br
* 計算一覧 [#k545f568]
詳細は各ページにて。
#br
** [[ダメージ量計算]] [#vb6a800b]
*** 単発ダメージ量(基礎値) [#h3a8516c]
trunc((trunc(min(max((8+技LV+自LV-敵LV),1),24)*LV差係数/8)+trunc(自身依存ステータス*自身依存係数))*trunc((255-敵依存ステータス)/2)/256)*2+攻撃力
自LV:バフ・デバフ込の現在値
敵LV:バフ・デバフ込、向き補正込の現在値
技LV, LV差係数, 自身依存ステータス, 自身依存係数, 敵依存ステータスは[[技データ]]参照
敵の攻撃力は0
攻撃力の加算は、攻撃力依存の技のみ
*** 単発ダメージ量([[戦闘乱数]]込み) [#v62a06cf]
単発ダメージ量(基礎値) + 単発ダメージ量(基礎値)/4 * 乱数(0~255) / 256
=単発ダメージ量(基礎値) + 単発ダメージ量(基礎値) * (0~63)/256
乱数により、単発ダメージ量(基礎値)に1~1.25倍のブレが生じることになる。
*** 総合ダメージ量 [#dafe0610]
単発ダメージ量*[[ヒット数]]-防御力*防御依存係数
敵の防御力は0
*** [[回避属性]]でのダメージ軽減 [#x74e26d0]
trunc(総合ダメージ量/2)+1
#br
** [[命中判定]] [#f931f491]
技LV+自LV ≧ trunc(乱数(0~255)* 敵LV / 256)
なら命中
※自LV,敵LVはバフ・デバフ・向き補正込み
※回復技は必中
※技の「必中状態異常」と敵の状態異常が一致していたら必中
※敵が「眠り」または「マヒ」なら必中
敵の攻撃時、技の射程範囲内に複数の味方キャラがいる場合、戦闘乱数で初期判定位置マスを決めて、そこから右→下と味方キャラを検索し(右下まで移動したら左上に移動)、最初に当たった味方キャラをターゲットにする。[[命中判定>敵のターゲット選択>命中判定#baf434c5]]参照
#br
** 攻撃技の[[ヒット数]] [#g1fb6986]
基本は技に設定されたヒット数。
ヒット数パターンにより、設定されたヒット数より低い場合がある。
レベルで決まるパターンだと
-trunc(ヒット数 * min(LV現在値, 15) / 16) + 1
ランダムで決まるパターンだと
-trunc(ヒット数 * (0~255の乱数) / 256) + 1
技の効果範囲内に複数の攻撃対象がいて、範囲攻撃かつ、多段ヒットする場合、ターゲットは範囲内から等確率で決まる。
範囲内の敵に0番から順に番号をふって、
trunc(乱数(0~255) * 範囲内の敵の総数 / 256)
でターゲットを決める。
#br
** [[回復技]] [#a7beac06]
味方と敵で回復量計算式が異なる。
また、どの回復技にも命中時に眠り状態を回復させる効果がある。
(攻撃技を当てると当てた相手の眠り状態が回復するのと同じ)
向き補正などはなし、回避属性影響なし、必中
#br
*** 味方に回復技を使用した時の単発回復量 [#h03b1ee5]
trunc(LV差係数*4*(256~319)/256)
#br
*** 敵に回復技を使用した時の単発回復量 [#ua214597]
trunc(LV差係数*(256~319)/256)
※(256~319)/256は1以上1.25未満の乱数
#br
*** 総合回復量 [#o792fdb3]
単発回復量*ヒット数
#br
** [[向き補正]] [#je3ba5a4]
戦闘中、敵味方すべてに、右上・右下・左上・左下の4方向の向きが設定されている(ほとんどは見た目でわかる)。
また、向いている方向3方向が正面、横が側面、後方3方向が背面になる。
側面や背面から攻撃された場合、敵味方すべてに設定された側面補正または背面補正の値をレベルから引いてダメージ量などを計算する。
引き算の結果、レベルが負の値になる場合は0に補正。
#br
** [[吹き飛ばし・後退・向き変え(回転)]] [#b4fbab61]
使用者に対しての吹き飛ばし・後退・向き変え(回転)は確実に発動。
攻撃相手に対しては、確率3/4で成功。
敵タイプがOBJECT(しょく台など倒さなくてもよい障害物の敵)、オディオモール、ピュアオディオは向き変え・吹き飛ばし無効。
#br
** [[状態異常]] [#r324c24d]
技の追加効果か武器による追加効果で発生。
既に該当の状態異常が発生している場合でも、状態異常が起きるかどうか判定し、該当の状態異常発生時間を上書きする(加算はされない)。
眠り状態の相手を攻撃または回復すると、眠り状態から回復。
眠りと麻痺の敵には攻撃が必中。
LVに向き補正はかからない。
*** 技による状態異常の発生条件 [#xbd6c301]
敵が該当の状態異常を無効化せず、かつ、該当の状態異常に既にかかっていない時に、以下のように判定。
多段ヒット技の場合でも、判定は各状態異常につき1回。
状態異常の判定値
= (自能力値 + 乱数(0~255)*自能力値/256)/2 - 敵能力値
状態異常の判定値が正の値の時、続けて状態異常継続時間を計算。
状態異常継続時間
= min(状態異常の判定値*状態異常時間係数/8 + 自能力値/敵LV, 255)
状態異常継続時間が17以上の時、該当の状態異常が発生。
*** 武器による状態異常の発生条件 [#b763f83a]
該当する武器は「ムラサメ」(眠り)、「ヨシユキ」(マヒ)のみ。
敵が該当の状態異常を無効化せず、使用技に状態異常の効果がない、かつ、武器の攻撃力依存の時に、
乱数(0~255) mod 256 - 敵LV(現在値)
= 乱数(0~15) - 敵LV(現在値)
が0以上なら、状態異常が発生
(敵LVはバフ・デバフ反映)
状態異常継続時間 = 自LV(現在値)*8 mod 256
※自LV(現在値)*8の計算結果の繰り上がりを考慮していないため、レベル32以上で状態異常発生時間のオーバーフローが起きてしまう。
*** 毒状態のダメージ量 [#h84abc45]
毒状態のダメージ量は
max(trunc(現在HP/16), 1)
[[行動ポイント]]が255以上から255未満に減って味方ターンが回ってきた直後、すべての敵味方の状態異常をチェックし、毒状態のキャラは毒のダメージをくらう。
#br
** [[ステータス変動(バフ・デバフ)]] [#sd5ee058]
LV/力/速/体/知の変動
*** 技によるステータス変動の成功判定 [#ee621895]
複数のステータスを変動させる場合はステータス毎に乱数判定。
敵と味方で判定式が異なる。
レベルはバフ・デバフ反映。
敵:
(0~63)の乱数 > 敵LV + 16
の時成功
味方:
(0~63)の乱数 > max(味方LV - 背面補正, 0) + 16
の時成功
味方キャラは背面補正分、バフやデバフにかかりにくいことになる。
*** ステータス変動値 [#jbd61df4]
度合いが4種類ある。
|下降・大|元の値 * 0|
|下降・中|元の値 * 1/2|
|下降・小|元の値 * 3/4|
|上昇|元の値 * 5/4 + 1|
上昇(バフ)の場合、上限値は255($FF)。
*** 復元処理 [#ccbfa2db]
割合での回復ではなく固定値で回復していく。
|~行動|~レベル復元|~力速体知復元|
|技発動時|1|16|
|1マス移動|0|4|
|Yボタン足踏み|0|4|
|LR向き変え|0|2|
|敵味方行動不能※|0|1|
※味方全員がタメ技をタメていて敵も攻撃できる状況ではない時など。
1フレームにつき1復元。
(同時にタメ時間も1フレームにつき1減る)
画面表示されないが戦闘中にYボタンを押すと1マス移動分と同じだけ時間経過する。
** [[戦闘乱数]] [#u04c0e7b]
直前の4個の乱数を'''A&size(10){n-4};''', '''A&size(10){n-3};''', '''A&size(10){n-2};''', '''A&size(10){n-1};'''として、新たな乱数Anを計算する漸化式は
'''A&size(10){n};''' = trunc( ('''A&size(10){n-3};''' * 256 + '''A&size(10){n-4};''' ) / 13) mod 256
#br
** [[マップ乱数]] [#vdeef7cb]
直前の乱数を'''C&size(10){n-1};'''として、新たな乱数'''C&size(10){n};'''を計算する漸化式は
マップ乱数
乱数(8bit) = ('''X''' * ( ($3D09 × ('''C&size(10){n-1};''' + 1)) & $FFFF) & $00FF0000) / $10000
'''C&size(10){n};''' = ($3D09 × ('''C&size(10){n-1};''' + 1)) & $FFFF
※すべて16進数
※'''C&size(10){n};'''は16bit
※'''X'''は「生成したい乱数の最大値+1」(16進数)
ゲーム内では
-Xに$63を入れて0~98の乱数生成
-Xに$100を入れて0~255の乱数生成
の2パターンが使われている。
※マップ乱数のイベント
-テレポート
-アイテム改造
-たい焼き屋の手伝い時の客
-チビッコハウスの教室のオルガンの曲
-チビッコハウスの物干し竿下のアイテムの取得順序
-西部編・デロスに罠アイテムを依頼した時の行動
#br
** [[取得経験値>取得経験値・レベルアップ処理]] [#o6b16c52]
敵パーティ自体にレベルが設定されており(敵PtLVとする)、戦闘終了時にフィールドに残っていた味方キャラ1人ずつ以下の計算で決まる。
ただし心山拳老師、キューブ、タロイモは経験値が得られない。
敵PtLV = 0の時
-取得経験値 = 0
敵PtLV>味方キャラレベル、かつ経験値が増える行動を取った場合
-取得経験値 = ( 敵PtLV - 味方キャラレベル ) * 16 + 8
敵PtLV≦味方キャラレベル、または経験値が増えない行動を取った場合
-取得経験値 = trunc(敵PtLV / 2) + trunc(16 / 味方キャラレベル)
※ただし計算結果が0の時は、取得経験値 = 1にする
上計算式における、「経験値が増える行動」とは、以下を指す。
-技を出す。反撃技や攻撃をミスした場合、敵のいないマスに出して空振りになった時も含む。
-タメ時間のある技は、待機中のまま戦闘が終わったり、敵に阻止されて中断されると無効。
-アイテムを使う。
以上で計算された経験値を、キャラの現在の経験値を足して、100を越えたらレベルが1上がる。レベルの最大値は99。
レベルアップ時に余剰の経験値が出ても繰り越されない。
#br
**[[戦闘の特殊処理]] [#e7d56ac9]
*** 現代編のワタナベイベント [#hd15d44b]
グレート・エイジャが左上向きの状態で、高原 日勝が「カミツキ(青)」をくらった時に10/256(約4%)の確率で発生。
#br
*** 命中しなかった場合、使用者がダメージ [#j1c384c0]
「ズドゲラデイン」「Fシュタイナー」「トルネードプレス」で外した場合、使用者がくらうダメージは、その技を背面からくらった時で計算される。
#br
*** ラブヒーリング [#o601f60c]
回復量は回復技計算(マザーテイル使用時と味方が「マジカルウッド」で発動時とで回復量計算式が変わる)。
「ラブヒーリング」使用者のダメージ量 = 範囲内のキャラの「回復後のHP-回復前のHP」を合計した値。
ただし回避属性でダメージ量を軽減可能。
#br
*** オディオモール [#v98b9501]
攻撃・回復ともに1ヒットあたり1ダメージに固定(オディオモールのみの専用処理)。
「ほいこーろー」はダメージ量が
「ほいこーろー」のSTEP数 + 1
になる。
#br
*** ハルマゲドン [#i836ab4b]
最終編オルステッド主人公時の戦闘のみ、
操作キャラ最大HP/4 - 操作キャラ現在HP ≧ 0
の時、つまり現在HPが最大HPの1/4以下で「逃げる」コマンドが「ハルマゲドン」コマンドに変化。
ただし「ハルマゲドン」コマンド出現後にHPが最大HPの1/4以上に回復すると、表示だけ「逃げる」に戻り、選択すると「ハルマゲドン」発動。
#br
----
//- [[WIKIWIKI利用規約>https://wikiwiki.jp/pp/policies]]
//- [[WIKIWIKIの特徴>https://wikiwikijp/pp/characteristic]]
//- [[プラグインマニュアル>https://wikiwiki.jp/sample/?PukiWiki/1.4/Manual/Plugin]]
//- [[よくある質問(FAQ)>https://wikiwiki.jp/pp/faq]]
//- [[助け合い掲示板>https://z.wikiwiki.jp/wikiwiki-help/]]
//- [[サンプルサイト>https://wikiwiki.jp/sample/]] (投稿テスト可能/プラグイン動作例有)
//
//----
//
//- [[ヘルプ]] -- PukiWikiで編集するには?
//- [[テキスト整形のルール>整形ルール]]
//- [[SandBox]] -- 練習ページ
//
//----
//RIGHT:このFrontPageの内容は https://wikiwiki.jp/sample/ からいつでも確認出来ます。
//----
//
//#br
//
//* ''Tips'' [#r4966e35]
//
//- MenuBarを編集する → [[編集:MenuBar]]
//- ヘッドエリア・フットエリアを編集する → [[サンプルサイトへ>wikiwikijpsample:ヘッドエリア・フットエリアを編集する]]
//- ページ名に「/」を入れることで階層分けができます。(例)hogehoge/page1、hogehoge/page2/no1
//- 見出しの &attachref(FrontPage/paraedit.png,nolink,12x12,エンピツ); をクリックして部分編集ができます。
//- 見出しの上で左クリックすると、ポップアップメニューが表示されます。(※レベル1見出し(*)のみ)
//- 編集画面の編集フォーム下にあるチェックボックスにチェックし、管理パスワードを入れて「ページの更新」するとタイムスタンプを更新しません。
//- 全てのページがバックアップされています。バックアップを確認したいページへ行き、上部にある「バックアップ」をクリックすると一覧が確認できます。削除されたページも復旧可能です。
//(例)FrontPageのバックアップ:[[バックアップ:FrontPage]]
//* ''編集時の注意点'' [#j1561be3]
//- サイトを更新すると[[WIKIWIKI>https://wikiwiki.jp/]]トップの「最近更新されたWIKI」に表示されます。
//(閉鎖的なコミュニティの使用には向いておりません。)
*コメント [#pc122b5e]
#pcomment(,30,true)