99sg**未整理

●ダメージ計算
c28f22(技)
$da = 基礎ダメージ
$dc = 成長
$dd = 腕力 もしくは 器用さ
$e0 = 防御力
$f6 = 1(何かしらの条件で変化する?)
$e2 = C(レベル補修)
$eb = MAX(アイテムの威力 - $e0 / 2,0) * ($e2 + ($dd - 0x13) / 2 + $dc)/2 +
($dd * 8 + 0x32 - $e2) * $e2 / 16 * $dc + $da * 4 * $f6 + 乱数
※乱数 = 1 ~ 255の範囲内の値をとる
C29007(体術系統)
$da = 技の基礎ダメージ
$dc = 技の成長
$dd = 攻撃側の腕力
$de = 攻撃側の素早さ
$e1 = 武器レベル
$e2 = 使用した武器に対応する「LVによるダメージ補修」テーブルの値
$eb = MAX(($dd - 0x13) / 2,0) * ($e2 + $dc) +
sqrt($dd * $de) * $e2 * $dc + $da * 4 * $f6
※sqrt(a) aの平方根を求める
※[7e0921] & 0x80 == 1なら$eb に 0x01 ~ MIN($e1 * 2 + $e1,0xFF)の範囲をとる乱数を足す
C291C3(地震攻撃)
$da = 技の基礎威力
$dc = 技の成長
$dd = 腕力
$e1 = 攻撃側の武器レベル
$e2 = 使用した武器に対応する「LVによるダメージ補修」テーブルの値
$92 = 攻撃側の武器威力
$94 = 攻撃側の武器の重さ
$eb = max($dd - $94 * 2,0x0) * $94 * $e2 * $dc / 8 + ($92 + $dd) * $e2 / 4
+ $da * 4 + rnd(0x01,$e1 * 4 + $e1) & 0xFF
※RND(A,B) A~Bの範囲内で乱数を返す
C293E7(術)
$da = 術の威力
$dc = 術の成長
$dd = 術者の魔力
$e0 = 防御側の魔法防御
$e1 = 術者のレベル
$e2 = 使用した術に対応する「LVによるダメージ補修」テーブルの値
$eb = ($dd + 0x04) * ($e2 + MAX(($dd - 0x13) /2,0)  + 1) * $dc * 2 + $da * 4 + 乱数
※乱数 = 1 ~ $e1 * 3の範囲内の値をとる
c299d5
$e9 = func($eb * (0x80 - (防御側の体力 / 2 + $e0))) - ($e0 * [FE3174の値])
※[FE3174の値] = 2
※防御側が石化・気絶状態の時は常に$e9 = 0
※[7e091c] & 0x10 == 1の場合、何もしない
※func(a)の処理内容:aに対し右ローテート(あふれたビットは常に1)をを7回繰り返す
c29bc5
対象のHP -= $e9
c278d6(分身技の時に呼ばれる)
$e1 = 攻撃側の武器レベル
$bf = 技の追加効果
$c4 = $e1
$c6 = $c4 / $bf
※その後、c28f22とc299d5を$c6の回数分繰り返す

●その他データ

戦闘中キャラID【04】の装備が曲刀だと、アイテム【FF】の名称が使用される
数値は完全にプログラム領域で指定してあり、曲刀判定は「種類と重さ」から計算される
【04】・【FF】・曲刀を変更するだけなら簡単だが、追加する場合プログラム改造になる

●イベント解析その他

☆ 存在  X Y 向 絵 会話  性質
7F 60 00 3D 1A C0 7C F3 07 00 02 ↓ゴドウィンに利用
7F 42 00 29 2B 40 12 BE 08 40 1F タチアナ【384E2B】
7C 39 00 1E 1A C0 08 8F 00 ■ ■ 少年【384EA9】
7E 3D 00 1A 1A 40 73 2A 06 00 03 ライム【384EB9】
7F 99 0C 14 23 00 95 52 06 00 02 ボルカノ【3868D0】
7F 85 02 10 0F 00 91 AE 05 00 02 教授【3898DE】
60 85 5F ■ ■ ■ ■ ■ ■ ■ ■ 教授(存在フラグ2)
5C ■ ■ 17 0B 00 FF AD 05 ■ ■ 教授ドア封鎖(ドアの上)
1F ■ ■ 29 17 80 71 84 09 00 02 アンナ【38396E】
7F 8C 04 1B 19 40 6D 94 09 00 02 ヨハンネス【3839AE】
72 8C 5F 21 1F C0 ■ ■ ■ 00 03 ヨハンネス歩行
1F ■ ■ 1F 15 60 6E 00 20 00 02 ツヴァイク公【3846A3】
19 ■ ■ 1B 1B 40 46 ■ ■ ■ ■ 城内兵士
10 ■ ■ 23 1B 40 ■ ■ ■ ■ ■ 城内兵士2
1F ■ ■ 10 0C 40 46 CC 05 00 02 ツヴァイク門番【38445D】
10 ■ ■ 12 0C 40 ■ ■ ■ ■ ■ ツヴァイク門番2
1F ■ ■ 2F 12 40 46 34 05 00 02 ピドナ門番【380C9F】
1F ■ ■ 15 15 00 9F 00 20 08 39 夢魔【38147F】
5C ■ ■ 07 0F C0 31 57 05 ■ ■ ゴン【3811C8】
7F B2 22 27 0D 00 FF 05 04 C0 02 衣装棚【382CC9】

☆は設定する値や継承するデータを決定するフラグ
+0x40:存在フラグの判定を行ってキャラの設置可否を確認
+0x20:存在フラグと値を設定
+0x10:座標と向きを設定
+0x08:グラフィック番号を設定
+0x04:会話(発生イベント)を設定
+0x02:性質(歩行と会話パターン)を設定
+0x01:以降、このキャラの設定を継承

●地方マップデータ
データの例:4B 3F 0C 6F 44 B0 58 28 00 00 10 5C (アケ)

  • 1byte目:表示フラグ
フラグIDではなく、フラグID0x00から数えて何ビット目かを表す。例えば、0x00ならフラグID0x00の0x8。上のデータ例なら0x4B=75なのでフラグID0x12の0x1となります。

  • 2byte目:地名

  • 3〜4byte目:イベントID

  • 5byte目:フォーカす範囲
配置したオブジェクトに対して、カーソルのフォーカすを受け付けて地名表示&選択でイベント発生する範囲を指定します。前半4ビットyで方向、後半4ビットでx方向の大きさを指定します。例えば、0xF2と設定すると縦長のエリアがフォーカすを受け付けます。町などの通常オブジェクトは、だいたい0x44が指定されているようです。

  • 6byte目:パレット指定
配置するオブジェクトのカラーパレットを指定します。0x80を立ててないと機能しない模様。村・洞窟は0xB0、城は0x80。

  • 7〜8byte目:配置座標
7byte目がx座標、y座標になります。地方マップの左上隅が座標(0、0)になります。x座標は0x00〜0xCF、y座標は0x00〜0xBFであればマップ内に納まります。地方マップは若干横長なので、x座標の方が有効範囲が広いです。

  • 9byte目:不明
0x01の場合、ポイントが表示される。(西の森で使われている。)

  • 10〜11byte目:オブジェクト配置位置補正
10byte目がx方向の補正で、11byte目がy方向の補正。オブジェクトと地名の表示位置が被るのを防ぐ為に使う。通常のオブジェクトであれば、y方向補正を0x10にしとくと良い感じ。

  • 12byte目:配置オブジェクト
地方マップ上に表示させるオブジェクトの種類。対応は以下に示す通り。
この番号は起点を示しているものなので、これ以外の値を選ぶと画像がずれてしまって酷い光景を見られる。注意。

0x10=城
0x14=マップカーソル
0x18=大きな町
0x1C=洞窟
0x50=塔
0x54=オーロラ
0x58=雪の町
0x5C=村
0x90=不明
0x94=東方の城
0x98=未使用
0x9C=未使用

●イベント関係メモリ

7EF46A〜 フラグ

7EF49A ゴドウィン利用 10/00
7EF49A ヨハンネス利用 01/00
7EF49B アンナ利用 10/00

7EF482 ユリアンフラグ A0/00
7EF483 サラフラグ A0/00
7EF486 少年フラグ 0A/00
7EF488 ライムフラグ 0A/00
7EF489 トラックスフラグ A0/00
7EF489 ミューズフラグ 0A/00 01,03で孤児達
7EF48B タチアナフラグ A0/00
7EF4AD ニーナフラグ 03/00
7EF4B0 ヨハンネスフラグ 50以上で歩行
7EF4B0 0Fでトーナメント終了
7EF4B6 ボルカノフラグ 0D/0C
7EF4D1 マクシムスフラグ 20/00

7EF4A3 30/02 野盗巣窟関係
7EF4B4 ED/EE

7EF4A2 10で戦闘突入音なし&01で退却不能、0B 42でリセット
7EF4A4 戦闘BGM番号、0B 42でリセット

7EF4C6 がめつさ
7EF4D9 +10中間キャンプ +20〜巣 00ファルスとスタンレ-交戦+1or+2
7ef4dd-7ef4e2 開発フラグ
7EF4E5 +80ピドナの工房職人が家からいなくなる

7EF319 パーティー人数

7EF560 控え数? 最後のキャラID?
7EF561 控えキャラID 次+30h
7EF562 控えキャラグラ番号 次+30h

7E1C01 BGM番号代入

●戦闘関係メモリ

7E0D65 計算用一時レジスタ?
7E0F42〜 初期化処理中に使用

7E2280 戦闘中キャラID 次+80h
7E22B7 戦闘中技 次+80h
7E22C7 戦闘中装備 次+80h

7E093B 技消費
7E0942 使用技番号
7E098A 技種類(処理の途中のみ)
7E09B0 技オフセット
7E09B8 行動キャラステータスオフセット

7E0928 コマンド選択中キャラ 終了で05h
7E093C ターゲット 書き換え効果なし
7E095F 行動キャラ番号?
7E0F01 行動キャラ番号
7E1542 先頭キャラのターゲット

7ECB00 先頭キャラのパレット 次+20h

●波形関連
流れるままに放置しておくのはもったいない情報だったので、スレよりそのままコピペ。
まったく整理してません。

51 :名無しさん@お腹いっぱい。:2006/09/23(土) 18:06:34 ID:QiDQWnLU
◆SLOWgTTrWo氏が前スレで言ってた
2. 使いたい音源があるSFCROMから、
SPC抽出ツール(機能としてついてるエミュもありますよね)を用いて
SPCファイルを抜き出し、その中から波形を探して抜き出す。(私のはコレ

これってどうやって、どこからどこまでが波形かっていうのを求めるんだ?
適当にバイナリエディタ弄くってて、
そのゲームでの音階記述法からシーケンスデータがどの辺にあるのかっていう事までは特定出来たけど、
抽出SPCデータを見てみても波形がどれかという所までは特定できん。


59 :◇S(:2006/09/23(土) 21:19:47 ID:bAfzwTVB
51
0x800byte程度ずつ「00」で書き換えたファイルを
SPC700Playerで再生して格納位置のアタリをつけて
波形先頭の1byte下にある「00 00 00 00 00 00 00 00」を目印に
抜き出してた気がします。

覗いてみた10タイトルほどは全て頭の1byte下に
8byteに渡って00が続いておりましたが、
全てのタイトルに共通することかどうかは知りません。


61 :名無しさん@お腹いっぱい。:2006/09/24(日) 01:12:55 ID:NWiXxygW
59
レスどうもです。SPCを00 00 00 00 00 00 00 00でサーチし
それを基にロマサガ波形(6DA9Cからのハープ)をコピーしたものを試し貼りして、
とやってみたら全部ちゃんとハープの音色に変わってくれました。
おかげ様でなんだか少し波形について掴めてきました。
これで、別ゲー波形をロマサガ3に持っていけそうな兆しも見えてきましたよ。

00 00 00 00 00 00 00 00が続くというのは
自分もロマサガ3波形データを眺めてた時になんとなーく実感してたんですが、
やっぱりどの波形でもそうなっているようですね。
波形用の雛形か何かでしょう。
02 00 00 00 00 00 00 00 00という風に、00 8個の前に02が付くものも非常に
多いです。


62 :名無しさん@お腹いっぱい。:2006/09/24(日) 01:31:24 ID:NWiXxygW

今続けてロマサガ3波形で調べてみたんですが
「00」8個の前に「02」が付くものが管楽器、弦楽器等の有音楽器(←なんていうの?)で、
打楽器は波形データ頭に「00」が9個入っているように思われました。
検証の絶対数が足りてないので、
全てのゲーム全ての波形で当てはまるものかはわかりませんが
やはり波形雛形っぽい感じであります。

とりあえずSPCデータを02 00 00 00 00 00 00 00 00で検索して該当したものは
波形とにらんでよさそうな気がしますです。


72 :名無しさん@お腹いっぱい。:2006/09/24(日) 04:21:27 ID:NWiXxygW
62の
とりあえずSPCデータを02 00 00 00 00 00 00 00 00で検索して該当したものは
波形とにらんでよさそうな気がしますです。
自己レスですがこれだけではまだ波形探しするのに
特定するまでに至りませんでしたね。
なぜならデータのあまりないような00が多く使われている箇所に
1バイト分の02が1つでも混じっていると波形でもなんでもないような箇所が
検出されてしまうからです。やってみればわかりますが。

波形探しにこれでサーチするのは便利だけど
自分の目でちゃんと波形データっぽいものがあるかどうか、
ある程度吟味はしないと駄目ですね。


76 :2-658:2006/09/24(日) 11:23:36 ID:QZEGk7By
72
spcファイルから波形を探す方法はこんな感じです。全ソフト共通のはずです。
1.目的の波形の(その曲での)波形番号を調べる
 波形番号を表示できるspcプレイヤーを使えば簡単です。
 俺はSNES SPC700 Playerというのを使ってます。
2.spcファイルの先頭0x100を削る
 先頭0x100はID666ヘッダなのでいりません。
3.波形データのオフセットのオフセットを調べる
 ヘッダを削った状態の0x1005D[1byte]がオフセットのオフセットです。
 ここの値がたとえば0x12なら0x1200からオフセットが格納されています。
 下位1byteは必ず00です。
4.波形データのオフセットを調べる
 3.で調べたアドレスに以下のフォーマットで格納されています。
 数値はリトルエンディアンです。
 波形00開始アドレス[2byte],波形00ループアドレス[2byte],波形01開始アドレス[2byte],波形01ループアドレス[2byte],…
5.波形をコピペ
 終了位置を正確に特定する方法は極めて面倒なので、次の波形の1byte前までをコピペします。
 大抵はこれで問題ないです。
 ループ開始位置は、波形のループアドレス-波形の開始アドレスです。必ず9の倍数になります。
 ADSRと音程補正は自分の耳で何とかしてください。

上記レスなどを基に編集中
今はとりあえずここに置いときます
何かおかしな点があれば修正してください

1・spc上での波形
spcでの波形形式はbrrである。
0x100のヘッダを取り除いたものの0x1005Dからが、
波形オフセットのオフセットであり、
下位2byteは必ず00である。

例)0x12の場合、0x1200が波形オフセットである。

この得た値より以下のように並んでいる。
数値はリトルエンディアン

波形00開始アドレス[2byte]
波形00ループアドレス[2byte]
波形01開始アドレス[2byte]
波形01ループアドレス[2byte]

ロマサガ等のPCM音源のアドレスは+80した値から始まるようである。
順番は上と同様。

波形の先端が
02 00 00 00 00 00 00 00 00
となっているものがループする波形で、
00 00 00 00 00 00 00 00 00
となっているものがループしない波形である様子。

基本的に次の波形-1までが波形データのはずだが、
ループ設定確認以外はsplit700というツールでbrrとして吸い出せるし、
そのほうが確実だろう。
(00から順にオフセット値の波形、20から順にオフセット値+80から(PCM音源)の波形)
どの数字がどの音色なのかはSNES SPC700 Playerなどの波形番号が表示されるSPCプレーヤーを使えば分かりやすい

2・実際の波形の形式
ロマサガ1〜3のROM内で扱われるPCM音源の波形は、
brr形式のデータの先端にbrrそのものの容量を2byteずつ、
オフセットと同様に降順に追加したものである。
他のゲームでもそうなのかは不明。

例)バイナリでの終端が「1CDD」 -> 先端に「DD 1C」を挿入

3・SPCから波形を追加
基本的に2のように編集し、空き容量に張り付けでよい。
ループ位置はSPCのオフセット値より、
波形のループアドレス-波形の開始アドレス
で出すことができ、必ず9の倍数となる。
音程ズレ、ADSRは今のところ自分で調整するしかない。
現在この2点について調査中

4・他機種のゲームや自分で作成した波形から追加
現在でも手に入るツールにsnesbrrというのがある。
InternetArchiveを使えばWAV2BRRというものも入手可能。
いずれもDOS窓で使うツールであるので各自で調べて下さい。
ちなみにループはwavで16の倍数、
ADSRは特にこだわりが無ければ構造体でE0FFにしておけばよい
音程ズレは自分で実際にエミュを使いながら調べなければならない。
かつては2-658氏のツールWaveCompというものがあったが、
今はおそらく入手不可。
最終更新:2012年06月18日 13:23