はじめに
レイヤー3とはステータスバーに使われたり、レイヤ2を地形として使っている時に背景として使えたり、地形として使えたりするレイヤーのこと。
プレイ中に自由に書き換えたりもできます。でもASMの知識が必要です。
間違ってる所あったら勝手に書き直しちゃってください。日本語苦手…
背景として使う
をクリックしてプルダウンボックスからタイルセットを選ぶ
これだけです。城・洞窟・水中等で試してみましょう。
「Force Layer 3 tiles with priority......」にチェックを入れると他のレイヤーより手前に表示されます。
「Enable Advanced......」にチェックを入れると「Advanced bypass settings for Layer 3」枠内にてレイヤー3の更に細かい設定ができます。
-
CGADSUB for Layer 3
チェックを入れるとレイヤー3が半透明になります。(ステータスバーの行は半透明になりません。)
-
Move Layer 3 to Subscreen
チェックを入れるとレイヤー3がステータスバーと共に他のレイヤーより後ろに表示されます。
「Force Layer 3 tiles with priority......」と共にチェックを入れているとpriorityにチェックを入れたタイルがレイヤー1とレイヤー2に挟まれます。
-
Fix Layer 3 scroll sync issue caused by status bar
チェックを入れるとスクロール時にレイヤー3がレイヤー1・2よりズレるのを修正します。
-
Vertical scroll
レイヤー3の縦スクロール方法を設定します。基本的にレイヤー2のスクロール方法 と同じです。
カスタムスプライトなしで自動スクロールもできます。
-
Horizontal scroll
レイヤー3の横スクロール方法を設定します。基本的にレイヤー2の(ry
-
Initial Y Position/Offset
レイヤー3の初期Y位置を設定します。
10増やす毎に上に2タイルずらします。
-
Initial X Position/Offset
レイヤー3の初期X位置を設定します。
10増やす毎に左に2タイルずらします。ただし000,040,080,100の4段階しかありません。
自由に書き換える
ちょっとズレますが、SNESの仕様について。(ここではBG=レイヤと考えてもらっていいです
SNESのBG面には7つの画面モードが用意されてます。以下コピペ
モード | BG数 | 色数 | パレット数 | 備考 |
0 | 4 | 4/4/4/4 | 8/8/8/8 | |
1 | 3 | 16/16/4 | 8/8/8 | |
2 | 2 | 16/16 | 8/8 | |
3 | 2 | 256/16 | 1/8 | |
4 | 2 | 256/4 | 1/8 | |
5 | 2 | 16/4 | 8/8 | インタレース |
6 | 1 | 16 | 8 | インタレース |
7 | 1 | 256 | 1 | 拡張BG(拡大縮小回転)使用可能 |
表を見れば分かりますが、smwは画面モード1を使用しているので、使用できる色は
- BG1 16色8パレット
- BG2 16色8パレット
- BG3 4色8パレット
となります。つまり、BG3が使用できる色は4色*8パレット。(実際は透明色があるのでもっと少ない)
一応、これを頭に入れておいてください。後で役に立つかもしれません。役に立たなくても責任は持ちません。それじゃあ書き換えましょう
Lunar Magicで編集
編集前に一度以上GFX・ExGFXを抽出・挿入しておきましょう。
- レイヤー3にExGFXを使用したい場合はを押す。そうでない場合は3へ
- Enable...Layer 3 GFX for this levelにチェックを入れ、変更したいGFX番号を使用したいExGFX番号に書き換える。
- Overworld Editorを開く。
- File→Layer 3 Level→Load Layer 3 of Levelを選ぶ。(またはAlt+F11を押す)
- 「はい」を選ぶ。Lunar Magicで開いている面のレイヤー3が出てくる。
- 自由に編集する。(編集方法はタイトル画面・クレジット編集時等と同じ)
- File→Layer 3 Level→Save Layer 3 of Level…を選ぶ。(またはAlt+F12を押す)
- 「はい」を選ぶ。
-
上のプルダウンボックスから80以降の好きな番号を選ぶ。
Not Insertedと書いてある番号は使われていない番号
16進数が書かれている番号はExGFXやレイヤー3タイルデータに使われている。 -
真ん中のプルダウンボックスからレイヤー3の書き込み開始場所を選ぶ
上から説明
1番目…ステータスバーの下から書き始める
2番目…画面左上から書き始める(一部ステータスバーに上書きされ(優先度は上書きされない)、ステータスバーのある行はスクロールできない)
3番目…ステータスバーの一番下の行から書き始める(ストックアイテムの枠線の一番下を上書きする。上書きした行はスクロールできない)
4番目…レイヤー3データの下半分から書き始める - 下のプルダウンボックスからファイルサイズを選ぶ(通常は2000bytesを選ぶ)
- OKを押す
- Lunar Magicに戻り、を押してExGFXを取り込む
- を押す。
- Enable......tilemap for this level.にチェックを入れ、以下の設定を7~9と同じ設定にする。
- 保存
外部から取り込む
-
CなどからDLしたレイヤー3タイルデータをExGraphicsフォルダへコピーして名前を変更(今回はExGFX500)。
ExGFXを使っている場合はそれも同様(今回はExGFX400~)。 - を押してExGFXを取り込む
- を押す。
- Enable...Layer 3 GFX for this levelにチェックを入れ、レイヤー3タイルデータに使われている場所を400~に書き換える。
- Enable......tilemap for this level.にチェックを入れ、GFX Tilemap File LT3に500を入力
- 保存
ASMでの書き換え
あまり沢山書き換えない場合はASMを使用してVRAMにデータを転送します。
VRAMは、通常のSTAなどでアクセスするRAMとは別に用意されているもので、I/OポートやDMAで操作します。
VRAMにアクセスするにはこうします。(…このASMはスプライトとして挿入するのをお勧め)
うpろだの人のを勝手に使ってます。マズかったら消しといてください…
dcb "INIT" RTL dcb "MAIN" REP #$30 PHX LDA $7F837B TAX CLC ADC #$000A ;000A - 0004 = 0006 bytes の転送 STA $7F837B LDA.w #$xxxx ;転送先アドレス STA $7F837D,x LDA #$0500 ;0006 - 0001 = 0005 STA $7F837F,x LDA #$aabb STA $7F8381,x LDA #$aabb STA $7F8383,x LDA #$aabb STA $7F8385,x SEP #$30 LDA #$FF ;終了 STA $7F8387,x REP #$30 PLX SEP #$30 STZ $24 ;BG3の位置を固定 STZ $25 RTL
(本当はI/Oポートに直接アクセスした方が早いんですが…VRAMにアクセスできるのはブランク期間中だけなので、違うRAMを用意して、そこからV-Blank期間中に転送するということです。)
「転送先アドレス」にはアクセスするVRAMのアドレスを指定します。VRAMには色々と(BG面のタイルデータとかグラフィックとか)詰まっているので…smwの場合、BG3のタイルデータは$5000から始まってます。
タイルデータとは、8x8(又は16x16)のタイルを敷き詰めたデータです…説明がむずいなぁ…一番左上のタイルが$5000、1タイル右は$5001、一番右は$501F…、2段目は$5020…という感じ。
試しに$50C0辺りを設定してみましょう。(リトルエンディアンで指定するのでASM上ではC050になります)
aabbには転送するタイルの情報を指定。
aaには(またコピペです…)
bit0 | layer 3 page 1 | タイル番号の上位ビット。文字とかも表示できる |
bit1 | layer 3 page 2 | |
bit2 | priority | 優先順位? |
bit3 | palette | パレットの下位3bit |
bit4 | palette | |
bit5 | palette | |
bit6 | flip x | 左右反転 |
bit7 | flip y | 上下反転 |
を指定。良く分からなければ38でおk。bbにはタイル番号を指定(OWエディタでタイトル画面を開いてそれの8x8エディタを見ながら指定)
これで一応ASMでの描画は終わり。お疲れ様でした
DMAで転送
沢山のタイルを転送したい場合は↑の方法でやっていたのでは非常に非効率的です。
画面いっぱいに転送したい、という時はDMAを使用します。またうpろだの人のを使わせてもらいます…
dcb "INIT" RTL dcb "MAIN" REP #$20 ;16bit A LDY #$80 ;$2118-2119にword(2バイト)書き込むごとに$2116(目的地)を1増やす設定 STY $2115 LDA #$5000 ;書き換えるVRAM = $5000(レイヤー3タイルデータ) STA $2116 LDY #$01 ;代入対象は$2118→$2119→$2118→$2119→ STY $4300 LDY #$18 ;$2118$2119に代入=指定したVRAMを代入値に書き換える。 STY $4301 LDA #$8000 ;転送元SNESアドレス STA $4302 ;SNES$21:8000はPCアドレスに直すと$108200 LDY #$21 ;バンク STY $4304 ;転送元アドレス指定 LDA #$0800 ;何バイト送るか→$400バイト STA $4305 LDY #$01 STY $420B ;01を代入するとDMAが実行される。 SEP #$20 STZ $24 ;BG3位置固定 STZ $25 RTL
PC$108200からタイルデータを転送します。バイナリエディタで弄りましょう。
ASMでは、
[属性] [タイル番号] [属性] [タイル番号]
…と設定していましたが、
バイナリエディタ上では
[タイル番号] [属性] [タイル番号] [属性]
…と設定します。間違えると酷いことになるので注意。
終わり。
専用ツール(Terra Stripe)を使う
SMWCのツールに行きTerra Stripeと検索(説明少なくてすまない)
レイヤー3背景の縦スクロールに関する注意
ステータスバーもレイヤー3背景の一部なので$23(レイヤー3x位置(ページ単位))が偶数の時にある程度縦スクロールさせるとステータスバーが複製されて出てきます。
又、縦スクロールさせるとステータスバー描画範囲の境界線によってレイヤー3背景が切れてしまいます。
ドーナツ平野の城のブロックが左右に動く部屋でどれだけ登っても窓が同じ位置に見える(縦スクロールされない)のはこのためです。
これらのパッチを当てることでレイヤー3を自由に縦スクロールできるようになります。
MessageBox in Minimalist Status Bar + Goal Customizer
画面の上端or下端or両端に約8ドットの黒帯を作り、そこでステータスをレイヤー3で表示します。
メッセージもそこで表示します。選択肢や数値変更なども可能です。
ゴール時もレイヤー3を妨害しなくなります。
Mode7でも表示されます。(クッパ戦を除く)
レイヤー3をラスタースクロールさせていても問題なく表示可能です。
DKCR Styled Sprite Status Bar
ドンキーコングリターンズ風に画面左からステータスをスプライトで出して表示します。
ボーナススター・制限時間・スコアの概念はなくなります。
Mode7ボスでは表示されなくなります。
Minimalist Status Bars
画面の上端or下端or両端に約8ドットの黒帯を作り、そこでステータスをレイヤー3で表示します。
Mode7では表示されなくなります。
モートン・ロイ・ルドウィッグを倒した後にグラフィックが化ける事も・・・
New Super Mario Bros. Wii Styled Status Bar v1.7
NewマリオWii風にスプライトでステータスを表示します。
ボーナススターの概念はなくなります。アイテムのストックもできなくなります。
Mode7ボスでバグる事があります。
Remove Status Bar
ステータスバーを完全に抹消します。
スコア・制限時間・ボーナススターの概念はなくなり、アイテムのストックもできなくなります。
!enable_coinsでコインの概念のありなしを変更できます(0であり、1でなし)。枚数の確認はできません。
SMB3 Status Bar v1.52
マリオ3スタイルでステータスをレイヤー3で表示します。
画面下に2タイル分の黒帯を作るため、コースの表示範囲が狭くなります。
levelheight.asmを当てるとステータスバーで隠されていたコース一番下の2タイルまで表示されるようになります。(タイトル画面にも影響し、一番下の余分な2タイルが表示されるようになります。)
Mode7ボスでは表示されなくなります。
8x8タイルマップの1B00~1B3F(LG1の上半分)がステータスバーのタイルで固定になります。