Points of Required Attention™
Friendly reminder: Please don't respond to spammers! Their posts inevitably get memory-holed when staff get around to, leaving behind an inexplicable tableau of you shouting at nothing and (if they otherwise would have been alone in a thread) dangling posts and wrong postcounts.
Views: 47,654,599
Main | FAQ | Uploader | IRC chat | Radio | Memberlist | Active users | Latest posts | Calendar | Stats | Online users | Search 06-19-18 02:04 PM
Guest: Register | Login

1 user currently in ROM Hacking: kuja killer | 3 guests | 2 bots

Main - ROM Hacking - General SMB3 Hacking Thread New thread | New reply

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Mari42
Posted on 06-26-17 06:25 AM Link | Quote | ID: 165739


Red Paragoomba
Level: 14

Posts: 49/54
EXP: 12019
Next: 1052

Since: 12-15-15

Last post: 49 days
Last view: 22 hours
Posted by Skirdus
Posted by Mari42
Posted by Skirdus
Posted by Mari42
Posted by Skirdus
I'm currently editing the "Dungeon Spike Room" level of World 1. The "Goto next area pointed from level" icon is greyed out even though I have a pointer item properly set up, and when I go through the door, it gives me a black screen (music keeps playing though.) Any idea why this is happening and/or how to fix this?


You suppose to add the 3-byte object bank 7 which is the pointer, and note that you suppose to put the range where you put the pipe/door for the X position. For example, if the pipe is "8C" then the range will be "80-8F"




Yeah, I did all that, like I did for other levels that used pipes/doors, but it still doesn't show this one as being connected to another area for some reason. I don't know why that is. The dungeon rooms for other worlds seem to work fine, but I don't see any difference between the way they're set up and the way this one is...




Did you refresh? If not, then give me your level so I can address that.


Yeah. I've tried a bunch of stuff, and nothing seems to be working. The level is World 1's "Dungeon Spike Room". The door back to the main level works just fine in the original, so I'm not certain as to what the problem is here.


Give me your level. I'll address that.

Skirdus
Posted on 06-26-17 06:37 AM Link | Quote | ID: 165740


Micro-Goomba
Level: 6

Posts: 8/10
EXP: 603
Next: 304

Since: 06-20-17

Last post: 356 days
Last view: 356 days
Posted by Mari42
Posted by Skirdus

Yeah. I've tried a bunch of stuff, and nothing seems to be working. The level is World 1's "Dungeon Spike Room". The door back to the main level works just fine in the original, so I'm not certain as to what the problem is here.


Give me your level. I'll address that.

Oh, yeah, here's the ROM:
http://wikisend.com/download/174808/Super_Mario_Bros._3.nes

Mari42
Posted on 06-26-17 06:39 AM (rev. 3 of 06-26-17 06:45 AM) Link | Quote | ID: 165741


Red Paragoomba
Level: 14

Posts: 50/54
EXP: 12019
Next: 1052

Since: 12-15-15

Last post: 49 days
Last view: 22 hours
Posted by Skirdus
Posted by Mari42
Posted by Skirdus

Yeah. I've tried a bunch of stuff, and nothing seems to be working. The level is World 1's "Dungeon Spike Room". The door back to the main level works just fine in the original, so I'm not certain as to what the problem is here.


Give me your level. I'll address that.

Oh, yeah, here's the ROM:
http://wikisend.com/download/174808/Super_Mario_Bros._3.nes


Ok, be sure you take the link out because we don't allow to post ROM's in here for any illegal percussion.

Skirdus
Posted on 06-26-17 06:51 AM Link | Quote | ID: 165742


Micro-Goomba
Level: 6

Posts: 9/10
EXP: 603
Next: 304

Since: 06-20-17

Last post: 356 days
Last view: 356 days
Posted by Mari42
Posted by Skirdus
Posted by Mari42
Posted by Skirdus

Yeah. I've tried a bunch of stuff, and nothing seems to be working. The level is World 1's "Dungeon Spike Room". The door back to the main level works just fine in the original, so I'm not certain as to what the problem is here.


Give me your level. I'll address that.

Oh, yeah, here's the ROM:
http://wikisend.com/download/174808/Super_Mario_Bros._3.nes


Ok, be sure you take the link out because we don't allow to post ROM's in here for any illegal percussion.

Mhm. The host site takes down the file automatically after a given time, so it's all good.

Mari42
Posted on 06-26-17 06:54 AM (rev. 2 of 06-26-17 06:55 AM) Link | Quote | ID: 165743


Red Paragoomba
Level: 14

Posts: 51/54
EXP: 12019
Next: 1052

Since: 12-15-15

Last post: 49 days
Last view: 22 hours
Posted by Skirdus
Posted by Mari42
Posted by Skirdus
Posted by Mari42
Posted by Skirdus

Yeah. I've tried a bunch of stuff, and nothing seems to be working. The level is World 1's "Dungeon Spike Room". The door back to the main level works just fine in the original, so I'm not certain as to what the problem is here.


Give me your level. I'll address that.

Oh, yeah, here's the ROM:
http://wikisend.com/download/174808/Super_Mario_Bros._3.nes


Ok, be sure you take the link out because we don't allow to post ROM's in here for any illegal percussion.

Mhm. The host site takes down the file automatically after a given time, so it's all good.


I know why now! You forgot to change the address for the next pointer. For somehow you didn't change the pointer for next level for the objects and enemies.

Skirdus
Posted on 06-28-17 04:23 AM Link | Quote | ID: 165745


Micro-Goomba
Level: 6

Posts: 10/10
EXP: 603
Next: 304

Since: 06-20-17

Last post: 356 days
Last view: 356 days
Posted by Mari42
I know why now! You forgot to change the address for the next pointer. For somehow you didn't change the pointer for next level for the objects and enemies.

Ah, that did it! Thank you kindly

Mari42
Posted on 06-28-17 04:46 AM Link | Quote | ID: 165746


Red Paragoomba
Level: 14

Posts: 52/54
EXP: 12019
Next: 1052

Since: 12-15-15

Last post: 49 days
Last view: 22 hours
Posted by Skirdus
Posted by Mari42
I know why now! You forgot to change the address for the next pointer. For somehow you didn't change the pointer for next level for the objects and enemies.

Ah, that did it! Thank you kindly


You need help with custom autoscroll or do you want the address of it?

SpookyMulder
Posted on 11-04-17 10:07 PM Link | Quote | ID: 165969

Newcomer
Level: 2

Posts: 1/1
EXP: 15
Next: 31

Since: 11-04-17

Last post: 226 days
Last view: 219 days
Greetings, I'm new to NES hacking and I'm trying to edit mario's sprite. I've managed to change the actual tile data using tile layer pro, but now I want to change his palette. As far as I can tell SMB3 workshop doesn't edit sprite palettes? I've messed with memory values before but never palettes/colors, I don't really know what format colors are stored in on the NES. Forgive me for not reading this whole thread but can anyone help me out?

ahakomi
Posted on 12-28-17 05:20 AM Link | Quote | ID: 166074


Micro-Goomba
Level: 8

Posts: 14/15
EXP: 1660
Next: 527

Since: 03-24-16

Last post: 172 days
Last view: 92 days
I have a solid question! However i just wanna say hi everyone! I have missed you all so much this year. I've been staying away to work on a relatively easier minihack that im tryng to get out before the end of february. I'm trying to implement a new idea i didnt have in torva or fae earrings.

anyways! SO MY QUESTION IS:

I've decided to use a different graphic set for my overworld map pipes. (my first set im making is a plains set) I assume this is possible considering how Sky tower is done in and of itself. I have the SMB3 map utility so if anyone is using that and could explain at least how the pipes work lol. ive already made custom levels for the pipe but when i go into the pipe It starts the level like regular level (I have the header set so that it does nothing when you enter the level) I would imagine i need to set the enemy used for the warp pipes at a certain place but im honesly not that savvy lol. thank you for anyone out there listening. I appreciate it! Happy Holidays you guys!

Quick Curly
Posted on 12-28-17 05:21 PM Link | Quote | ID: 166075


Giant Red Paratroopa
Level: 72

Posts: 1409/1423
EXP: 3245683
Next: 78079

Since: 06-15-08
From: Earth

Last post: 4 hours
Last view: 4 hours
Hi! It's been a while! Great to hear from you!

I apologize in advance if I'm not fully understanding your explanation. So what you want to know is the correct enemy sprite to insert into your area to make it a level that you can use as an alternative entrance and/or exit like the pipes on the maps in the original game? If yes, that 'enemy' is, "Changes exit location on map (works on warp pipe levels)" (Type 37, 25 in hex).

It's visually easier if you refer to some of the "Pipe [x] End [x]" levels in the original game in SMB3 Workshop. Place the sprite at X: 002, Y: [y], where [y] = the Set # for the specific set of pipes that you're using (in hex), as seen in the SMB3 Map Editor while viewing in Pipes Mode.

For example, World 3 - Pipe 1 End 1 and World 3 - Pipe 1 End 2 are both parts of the same pipe set. Viewing either area in SMB3 Workshop, the sprite is placed at X: 002, Y: 018 (12 in hex). Viewing that specific system through the SMB3 Map Editor while in Pipes Mode, it's Set #12.

Generally, you'll have to make the level using a single pipe system twice; once for the entrance, and again for the exit, with the "Level start" data in the level header accounting for each specific entry point between the two otherwise matching areas. However, depending on what exactly you're planning, you might only require either the extra entrance or exit. Hopefully more information won't be necessary so that you can keep it a surprise!

Note that to view the different pipe systems in Pipes Mode in the SMB3 Map Editor, use the Page Up and Page Down keys. You can select one of the pipe pointers by left-clicking on it, and then move it by right-clicking on a different tile/spot.

I would provide visuals to paint a better picture, but I'm in a bit of a rush right now, though I don't believe they should be necessary for this subject. However, again, if I'm misunderstanding, then please provide me with a little more specific information, and hopefully I'll be able to help you out.

For a little more insight into how the map pipe systems work in SMB3, please refer to this post (June 17, 2015), which includes an image with multiple visuals that help illustrate how the game drops you off at a spot on the map depending on which side of the screen you're on when you exit the area through a pipe. (Or, alternatively, when you run out of time, which can result in the discovery of a potential, previously undiscovered "oversight" within the original game!)

For a tutorial providing step-by-step instructions on how to add a pipe system to the World 1 Map, please refer to this post (July 8, 2009). Note that the images aren't available because Photobucket hasn't proven to be reliable after all this time, but hopefully the instructions provided through the text will be enough to follow.

Happy Holidays to you too!

ahakomi
Posted on 12-28-17 08:01 PM Link | Quote | ID: 166076


Micro-Goomba
Level: 8

Posts: 15/15
EXP: 1660
Next: 527

Since: 03-24-16

Last post: 172 days
Last view: 92 days
No. You nailed it! Thank you so much! I actually was wondering how I needed to use the pipe enemy! and your information is useful as always! Should I have anymore problems Ill let you know!

Quick Curly
Posted on 04-11-18 09:57 PM Link | Quote | ID: 166302


Giant Red Paratroopa
Level: 72

Posts: 1417/1423
EXP: 3245683
Next: 78079

Since: 06-15-08
From: Earth

Last post: 4 hours
Last view: 4 hours
So... over 2 years ago, I said that I was working on a tutorial to modify the ending screens; however, I never went back to finish it because I suck.

I still have the tutorial in its unfinished state from 2 years ago, and because I stopped hacking, I'm never going to finish it. I don't know where to resume with the hacking process and direction for it to see it through to the end, but hey, why not post what I already did and confuse the crap out of anybody who looks at the mess that it is?

So, here it goes. Personal criticism and pessimism aside, I hope that what's there can at least help somebody get started with the early edits, and perhaps provide enough direction to figure the rest out themselves. Obviously, I've done this before with multiple SMB3 hacks, although probably not effectively or professionally, and it's been too long for me to go back to figure it out again from scratch in my current mindset.

If somebody else wants to use any useful information that might be here to create their own tutorial and/or complete this one, please feel free to, if you so choose. It looks like one of the main and critical things that the tutorial is missing is the specific data for the sprites that are displayed on each screen. However, again, I just can't bring myself to finish it myself. I'm sorry.


NOTE: The information in the following post is specifically for the "Super Mario Bros. 3 (U) (PRG1) [!].nes" ROM with the following checksums:

CRC-16: CF5C
CRC-32: 0B742B33
MD-5: 86D1982FEA7342C0AF9679DDF3869D8D
SHA-1: 6BD518E85EB46A4252AF07910F61036E84B020D1
SHA-256: 4377A7F5E6EB50BDD2AC6F249BF1A7085500ACA8EB41F38545C3A2731C51A579

Editing Warp Zone



You can modify the visual appearance of the Warp Zone in the SMB3 Map Editor. However, a few bits of data will need to be modified directly within a hex editor if you want to change them, and after reading this tutorial, you'll know how!

The following offsets account for the spot in the Warp Zone that you are dropped off after using a Warp Whistle, depending on which world you used it in.

$A2FA (0x1630A)

0x1630A-0x16312 (0x9) - Y-Position Per World

0x1630A - World 1: 50
0x1630B - World 2: 70
0x1630C - World 3: 70
0x1630D - World 4: 70
0x1630E - World 5: 70
0x1630F - World 6: 70
0x16310 - World 7: 90
0x16311 - World 8: 90
0x16312 - World 9: 90

0x1631C-0x16324 (0x9) - X-Position Per World

0x1631C - World 1: 40
0x1631D - World 2: 40
0x1631E - World 3: 40
0x1631F - World 4: 40
0x16320 - World 5: 40
0x16321 - World 6: 40
0x16322 - World 7: 80
0x16323 - World 8: 80
0x16324 - World 9: 80

Want to move the sprites that display the numbers in case you move the pipes around, or you want to use the sprites to display something else (or nothing at all)? No problem!

0x15194-0x151AF (0x1C) - World Number Sprites in Warp Zone

                            Y   Tile  Palette/Attributes  X
0x15194-0x15197 (0x4) - 2: 3F 91 01 64
0x15198-0x1519B (0x4) - 3: 3F 93 01 84
0x1519C-0x1519F (0x4) - 4: 3F 95 01 A4
0x151A0-0x151A3 (0x4) - 5: 5F 97 01 64
0x151A4-0x151A7 (0x4) - 6: 5F 99 01 84
0x151A8-0x151AB (0x4) - 7: 5F 9B 01 A4
0x151AC-0x151AF (0x4) - 8: 7F 9D 01 A4

If you want to change how many bytes are used for the sprites, the code is immediately after the string of bytes for the sprites, starting at 0x151B0 ($D1A0 in RAM):

$D1A0:A0 1B     LDY #$1B
$D1A2:B9 84 D1 LDA $D184,Y @ $D184 = #$3F
$D1A5:99 98 02 STA $0298,Y @ $0298 = #$F8
$D1A8:88 DEY
$D1A9:10 F7 BPL $D1A2
$D1AB:60 RTS

Change the 1B at 0x151B1 to one less than the number of bytes you want loaded. For example, changing it to 17 will load the sprites to display the numbers for worlds 2 to 7, but not 8 (0x15194-0x151AB (0x18)).

If you want to use more bytes for displaying sprites, you'll have to point to a different offset within that ROM bank. There is free space within the range of 0x15554-0x1580F (0x2BC). What you want to change is the $D1A2 part of the code.
At 0x151B3-0x151B4 (0x2), change "84 D1" to "44 D5" ($D544 or 0x15554). Now, put your sprites to load here starting at 0x15554 instead, and change the 1B at 0x151B1 accordingly for the number of bytes you want to load.
Do remember, however, that only so many sprites can be displayed on the screen at once, so don't try to load too many.

The following data is for the world map pointers as they are visible through the SMB3 Map Editor. If you want to switch them around, just keep the data the same, and then that pointer will lead to the correct world in your hack.

#1: ObjData:  e40f, EnemData: 1565, Set: World Map (0)
#2: ObjData: 23010, EnemData: 5705, Set: Plains (1) (W2)
#3: ObjData: 2040f, EnemData: d435, Set: Fortress (2) (W3)
#4: ObjData: 25f90, EnemData: 802, Set: Hills (3) (W4)

#5: ObjData: 1e172, EnemData: e396, Set: Hills (3)
#6: ObjData: 1a30f, EnemData: f03b, Set: Sky (4) (W5)
#7: ObjData: 27d88, EnemData: 400f, Set: Pirhana Plant (5) (W6)
#8: ObjData: 1a934, EnemData: 8010, Set: Water (6) (W7)

#9: ObjData: 27dcd, EnemData: 800f, Set: Water (6)
#a: ObjData: 1a85a, EnemData: c010, Set: Toad House (7) (W8)

Editing End Screens

First, let's take a look at the actual endings for the original SMB3, Luigi's Chronicles 2, and Quick Bros. 2 (2008).

Original Super Mario Bros. 3 Ending:



Luigi's Chronicles 2 Ending:



Quick Bros. 2 (2008) Ending:



Princess' Ending Message:

0x31AD9-0x31B33 (0x5B)

0x31AD9-0x31AE7 (0xF)
Thank you. But
0x31AE8-0x31AF6 (0xF)
our Princess is
0x31AF7-0x31B05 (0xF)
in another
0x31B06-0x31B14 (0xF)
castle!...Just
0x31B15-0x31B23 (0xF)
kidding! Ha ha
0x31B24-0x31B32 (0xF)
ha! Bye bye.

By using the PPU Viewer and Name Table Viewer in FCEUX/FCEUXD, you can find the tile ID values to display the appropriate letter graphics you need. The last byte to end the message is 00.

First off, RAM address $007F is how the game knows which screen the ending sequence is currently on/displaying. Want to change the number of screens to display at the end of the game? The code you need is at 0x31C48 ($BC38 in RAM):

$BC38:A5 7F     LDA $7F = #$00
$BC3A:C9 08 CMP #$08
$BC3C:D0 F4 BNE $BC32

Change the 08 at 0x31C4B accordingly. Decreasing the number of screens like in Luigi's Chronicles 2 is simple enough. However, if you want to increase the number of screens, that means expanding every single one of the tables for variables considered, which more than likely means that you'll also have to change the locations and starting offsets for all of them in order to account for the necessary free space to expand all of them (so that you don't cut into any other code or data).
For example, if you change 0x31C4B to 01, the ending will display the World 1 screen, and then proceed to the final "The End" curtain scene. Therefore, the ending will have only one screen. The original value of 08 provides 8 screens. However, the "tables" as they are set by default only account for a maximum of 8 screens. If you want/need more, then the pointers that lead to those tables will have to be changed accordingly.

GAME ENDING STUFF

$A000 - $DFFF
0x30010 - 0x3400F (0x4000)

The following tables of offsets tell the game which graphics to use for sprites on each screen. By changing which CHR-ROM bank is loaded in each case, you can have access to whichever sprites you want to display for each screen.

However, you have to know the ID of each CHR-ROM bank in order to load the correct, intended graphics.

0x40010-0x4040F (0x400): 00
0x40410-0x4080F (0x400): 01
0x40810-0x40C0F (0x400): 02
0x40C10-0x4100F (0x400): 03
0x41010-0x4140F (0x400): 04
0x41410-0x4180F (0x400): 05
0x41810-0x41C0F (0x400): 06
0x41C10-0x4200F (0x400): 07
0x42010-0x4240F (0x400): 08
0x42410-0x4280F (0x400): 09
0x42810-0x42C0F (0x400): 0A
0x42C10-0x4300F (0x400): 0B
0x43010-0x4340F (0x400): 0C
0x43410-0x4380F (0x400): 0D
0x43810-0x43C0F (0x400): 0E
0x43C10-0x4400F (0x400): 0F

0x44010-0x4440F (0x400): 10
0x44410-0x4480F (0x400): 11
0x44810-0x44C0F (0x400): 12
0x44C10-0x4500F (0x400): 13
0x45010-0x4540F (0x400): 14
0x45410-0x4580F (0x400): 15
0x45810-0x45C0F (0x400): 16
0x45C10-0x4600F (0x400): 17
0x46010-0x4640F (0x400): 18
0x46410-0x4680F (0x400): 19
0x46810-0x46C0F (0x400): 1A
0x46C10-0x4700F (0x400): 1B
0x47010-0x4740F (0x400): 1C
0x47410-0x4780F (0x400): 1D
0x47810-0x47C0F (0x400): 1E
0x47C10-0x4800F (0x400): 1F

0x48010-0x4840F (0x400): 20
0x48410-0x4880F (0x400): 21
0x48810-0x48C0F (0x400): 22
0x48C10-0x4900F (0x400): 23
0x49010-0x4940F (0x400): 24
0x49410-0x4980F (0x400): 25
0x49810-0x49C0F (0x400): 26
0x49C10-0x4A00F (0x400): 27
0x4A010-0x4A40F (0x400): 28
0x4A410-0x4A80F (0x400): 29
0x4A810-0x4AC0F (0x400): 2A
0x4AC10-0x4B00F (0x400): 2B
0x4B010-0x4B40F (0x400): 2C
0x4B410-0x4B80F (0x400): 2D
0x4B810-0x4BC0F (0x400): 2E
0x4BC10-0x4C00F (0x400): 2F

0x4C010-0x4C40F (0x400): 30
0x4C410-0x4C80F (0x400): 31
0x4C810-0x4CC0F (0x400): 32
0x4CC10-0x4D00F (0x400): 33
0x4D010-0x4D40F (0x400): 34
0x4D410-0x4D80F (0x400): 35
0x4D810-0x4DC0F (0x400): 36
0x4DC10-0x4E00F (0x400): 37
0x4E010-0x4E40F (0x400): 38
0x4E410-0x4E80F (0x400): 39
0x4E810-0x4EC0F (0x400): 3A
0x4EC10-0x4F00F (0x400): 3B
0x4F010-0x4F40F (0x400): 3C
0x4F410-0x4F80F (0x400): 3D
0x4F810-0x4FC0F (0x400): 3E
0x4FC10-0x5000F (0x400): 3F

0x50010-0x5040F (0x400): 40
0x50410-0x5080F (0x400): 41
0x50810-0x50C0F (0x400): 42
0x50C10-0x5100F (0x400): 43
0x51010-0x5140F (0x400): 44
0x51410-0x5180F (0x400): 45
0x51810-0x51C0F (0x400): 46
0x51C10-0x5200F (0x400): 47
0x52010-0x5240F (0x400): 48
0x52410-0x5280F (0x400): 49
0x52810-0x52C0F (0x400): 4A
0x52C10-0x5300F (0x400): 4B
0x53010-0x5340F (0x400): 4C
0x53410-0x5380F (0x400): 4D
0x53810-0x53C0F (0x400): 4E
0x53C10-0x5400F (0x400): 4F

0x54010-0x5440F (0x400): 50
0x54410-0x5480F (0x400): 51
0x54810-0x54C0F (0x400): 52
0x54C10-0x5500F (0x400): 53
0x55010-0x5540F (0x400): 54
0x55410-0x5580F (0x400): 55
0x55810-0x55C0F (0x400): 56
0x55C10-0x5600F (0x400): 57
0x56010-0x5640F (0x400): 58
0x56410-0x5680F (0x400): 59
0x56810-0x56C0F (0x400): 5A
0x56C10-0x5700F (0x400): 5B
0x57010-0x5740F (0x400): 5C
0x57410-0x5780F (0x400): 5D
0x57810-0x57C0F (0x400): 5E
0x57C10-0x5800F (0x400): 5F

0x58010-0x5840F (0x400): 60
0x58410-0x5880F (0x400): 61
0x58810-0x58C0F (0x400): 62
0x58C10-0x5900F (0x400): 63
0x59010-0x5940F (0x400): 64
0x59410-0x5980F (0x400): 65
0x59810-0x59C0F (0x400): 66
0x59C10-0x5A00F (0x400): 67
0x5A010-0x5A40F (0x400): 68
0x5A410-0x5A80F (0x400): 69
0x5A810-0x5AC0F (0x400): 6A
0x5AC10-0x5B00F (0x400): 6B
0x5B010-0x5B40F (0x400): 6C
0x5B410-0x5B80F (0x400): 6D
0x5B810-0x5BC0F (0x400): 6E
0x5BC10-0x5C00F (0x400): 6F

0x5C010-0x5C40F (0x400): 70
0x5C410-0x5C80F (0x400): 71
0x5C810-0x5CC0F (0x400): 72
0x5CC10-0x5D00F (0x400): 73
0x5D010-0x5D40F (0x400): 74
0x5D410-0x5D80F (0x400): 75
0x5D810-0x5DC0F (0x400): 76
0x5DC10-0x5E00F (0x400): 77
0x5E010-0x5E40F (0x400): 78
0x5E410-0x5E80F (0x400): 79
0x5E810-0x5EC0F (0x400): 7A
0x5EC10-0x5F00F (0x400): 7B
0x5F010-0x5F40F (0x400): 7C
0x5F410-0x5F80F (0x400): 7D
0x5F810-0x5FC0F (0x400): 7E
0x5FC10-0x6000F (0x400): 7F

0x31F6E-0x31F75 (0x8) - $071B Sprite 1/4 CHR-ROM Bank Per Screen

0x31F6E - World 1: 57
0x31F6F - World 2: 53
0x31F70 - World 3: 51
0x31F71 - World 4: 00
0x31F72 - World 5: 43
0x31F73 - World 6: 02
0x31F74 - World 7: 44
0x31F75 - World 8: 54

0x31F76-0x31F7D (0x8) - $071C Sprite 2/4 CHR-ROM Bank Per Screen

0x31F76 - World 1: 00
0x31F77 - World 2: 04
0x31F78 - World 3: 00
0x31F79 - World 4: 76
0x31F7A - World 5: 76
0x31F7B - World 6: 76
0x31F7C - World 7: 04
0x31F7D - World 8: 76

0x31F7E-0x31F85 (0x8) - $071D Sprite 3/4 CHR-ROM Bank Per Screen

0x31F7E - World 1: 57
0x31F7F - World 2: 4E
0x31F80 - World 3: 1A
0x31F81 - World 4: 1A
0x31F82 - World 5: 00
0x31F83 - World 6: 0B
0x31F84 - World 7: 00
0x31F85 - World 8: 00

0x31F86-0x31F8D (0x8) - $071E Sprite 4/4 CHR-ROM Bank Per Screen

0x31F86 - World 1: 4F
0x31F87 - World 2: 4F
0x31F88 - World 3: 00
0x31F89 - World 4: 00
0x31F8A - World 5: 4F
0x31F8B - World 6: 4F
0x31F8C - World 7: 4F
0x31F8D - World 8: 00

0x31F8E-0x31F95 (0x8) - High Byte For Pointer to Load Sprites to Display

0x31F8E - World 1: BF
0x31F8F - World 2: BF
0x31F90 - World 3: BF
0x31F91 - World 4: C0
0x31F92 - World 5: C0
0x31F93 - World 6: C0
0x31F94 - World 7: C0
0x31F95 - World 8: C0

0x31F96-0x31F9D (0x8) - Low Byte For Pointer to Load Sprites to Display

0x31F96 - World 1: 96
0x31F97 - World 2: BE
0x31F98 - World 3: F6
0x31F99 - World 4: 1A
0x31F9A - World 5: 4A
0x31F9B - World 6: 7E
0x31F9C - World 7: AA
0x31F9D - World 8: CE

0x31F9E-0x31FA5 (0x8) - Number of Bytes (Minus 1) For Sprites Per Screen

0x31F9E - World 1: 27
0x31F9F - World 2: 37
0x31FA0 - World 3: 23
0x31FA1 - World 4: 2F
0x31FA2 - World 5: 33
0x31FA3 - World 6: 2B
0x31FA4 - World 7: 23
0x31FA5 - World 8: 47

Sprite Displays For End Screens:

World 1: BF + 96 = $BF96 - 0x31FA6-0x31FCD (0x28)
World 2: BF + BE = $BFBE - 0x31FCE-0x32005 (0x38)
World 3: BF + F6 = $BFF6 - 0x32006-0x32029 (0x24)
World 4: C0 + 1A = $C01A - 0x3202A-0x32059 (0x30)
World 5: C0 + 4A = $C04A - 0x3205A-0x3208D (0x34)
World 6: C0 + 7E = $C07E - 0x3208E-0x320B9 (0x2C)
World 7: C0 + AA = $C0AA - 0x320BA-0x320DD (0x24)
World 8: C0 + CE = $C0CE - 0x320DE-0x32125 (0x48)

Applicable code at 0x31EA6 ($BE96 in RAM):

$BE96:A4 7F     LDY $7F = #$00               ; Which screen is being displayed?
$BE98:B9 5E BF LDA $BF5E,Y @ $BF5E = #$57 ; $071B Sprite 1/4 (can change table location here).
$BE9B:8D 1B 07 STA $071B = #$54
$BE9E:B9 66 BF LDA $BF66,Y @ $BF66 = #$00 ; $071C Sprite 2/4 (can change table location here).
$BEA1:8D 1C 07 STA $071C = #$13
$BEA4:B9 6E BF LDA $BF6E,Y @ $BF6E = #$57 ; $071D Sprite 3/4 (can change table location here).
$BEA7:8D 1D 07 STA $071D = #$3E
$BEAA:B9 76 BF LDA $BF76,Y @ $BF76 = #$4F ; $071E Sprite 4/4 (can change table location here).
$BEAD:8D 1E 07 STA $071E = #$3B
$BEB0:B9 7E BF LDA $BF7E,Y @ $BF7E = #$BF ; Sprite pointer (high byte; can change table location here).
$BEB3:85 01 STA $01 = #$BD
$BEB5:B9 86 BF LDA $BF86,Y @ $BF86 = #$96 ; Sprite pointer (low byte; can change table location here).
$BEB8:85 00 STA $00 = #$4B
$BEBA:B9 8E BF LDA $BF8E,Y @ $BF8E = #$27 ; Sprite bytes counter (can change table location here).

0x32126-0x3212D (0x8) - High Byte For Pointer to Load World Map Tiles to Display

0x32126 - World 1: C1
0x32127 - World 2: C1
0x32128 - World 3: C2
0x32129 - World 4: C2
0x3212A - World 5: C3
0x3212B - World 6: C4
0x3212C - World 7: C4
0x3212D - World 8: C5

0x3212E-0x32135 (0x8) - Low Byte For Pointer to Load World Map Tiles to Display

0x3212E - World 1: 26
0x3212F - World 2: BA
0x32130 - World 3: 59
0x32131 - World 4: E4
0x32132 - World 5: 80
0x32133 - World 6: 11
0x32134 - World 7: A8
0x32135 - World 8: 48

World Map Displays For End Screens:

World 1: C1 + 26 = $C126 - 0x32136-0x321C9 (0x94)
World 2: C1 + BA = $C1BA - 0x321CA-0x32268 (0x9F)
World 3: C2 + 59 = $C259 - 0x32269-0x322F3 (0x8B)
World 4: C2 + E4 = $C2E4 - 0x322F4-0x3238F (0x9C)
World 5: C3 + 80 = $C380 - 0x32390-0x32420 (0x91)
World 6: C4 + 11 = $C411 - 0x32421-0x324B7 (0x97)
World 7: C4 + A8 = $C4A8 - 0x324B8-0x32557 (0xA0)
World 8: C5 + 48 = $C548 - 0x32558-0x325D9 (0x82)

Applicable code at 0x31DF0 ($BDE0 in RAM):

$BDE0:A4 7F     LDY $7F = #$00               ; Which screen is being displayed?
$BDE2:B9 16 C1 LDA $C116,Y @ $C116 = #$C1 ; Map pointer (high byte; can change table location here).
$BDE5:85 01 STA $01 = #$BD
$BDE7:B9 1E C1 LDA $C11E,Y @ $C11E = #$26 ; Map pointer (low byte; can change table location here).
$BDEA:85 00 STA $00 = #$4B

0x325DA-0x325E1 (0x8) - High Byte For PPU Address of Top-Left Corner of World Map Display Per Screen

0x325DA - World 1: 28
0x325DB - World 2: 28
0x325DC - World 3: 28
0x325DD - World 4: 29
0x325DE - World 5: 29
0x325DF - World 6: 28
0x325E0 - World 7: 28
0x325E1 - World 8: 28

0x325E2-0x325E9 (0x8) - Low Byte For PPU Address of Top-Left Corner of World Map Display Per Screen

0x325E2 - World 1: E3
0x325E3 - World 2: AD
0x325E4 - World 3: E9
0x325E5 - World 4: 67
0x325E6 - World 5: 23
0x325E7 - World 6: AD
0x325E8 - World 7: A3
0x325E9 - World 8: A9

Starting PPU Addresses For World Map Displays For End Screens:

World 1: 28 + E3 = $28E3
World 2: 28 + AD = $28AD
World 3: 28 + E9 = $28E9
World 4: 29 + 67 = $2967
World 5: 29 + 23 = $2923
World 6: 28 + AD = $28AD
World 7: 28 + A3 = $28A3
World 8: 28 + A9 = $28A9

Applicable code at 0x31E1D ($BE0D in RAM):

$BE0D:A4 7F     LDY $7F = #$00               ; Which screen is being displayed?
$BE0F:B9 CA C5 LDA $C5CA,Y @ $C5CA = #$28 ; Map PPU Address (high byte; can change table location here).
$BE12:85 78 STA $78 = #$2B
$BE14:B9 D2 C5 LDA $C5D2,Y @ $C5D2 = #$E3 ; Map PPU Address (low byte; can change table location here).
$BE17:85 79 STA $79 = #$F0

If you possibly want the screens for your ending to NOT display the world maps, just NOP out the following bit of code at 0x31E5A ($BE4A in RAM):

$BE4A:B9 00 06  LDA $0600,Y @ $06C0 = #$70
$BE4D:8D 07 20 STA $2007 = #$04

More specifically, replace "B9 00 06 8D 07 20" with "EA EA EA EA EA EA".
While this might not be the most practical way to accomplish it, it works.
However, do note that there will still be a large, visible white box where the map was displayed on each screen during fade-ins and fade-outs due to the palette attributes for each screen. You'll have to modify them accordingly on your own to account for your new screens.

Now, for the image graphics for each screen. First off, the game determines which screen to display, and then which pointer from multiple pointers to use at any given time from the following "counters" of sorts, in order to display the appropriate graphics/tile IDs.

0x31E39-0x31E40 (0x8) - Starting Counter

0x31E39 - World 1: 2A
0x31E3A - World 2: 2E
0x31E3B - World 3: 32
0x31E3C - World 4: 36
0x31E3D - World 5: 3A
0x31E3E - World 6: 3E
0x31E3F - World 7: 44
0x31E40 - World 8: 49

0x31E41-0x31E48 (0x8) - Ending Counter

0x31E41 - World 1: 2D
0x31E42 - World 2: 31
0x31E43 - World 3: 35
0x31E44 - World 4: 39
0x31E45 - World 5: 3D
0x31E46 - World 6: 43
0x31E47 - World 7: 48
0x31E48 - World 8: 4C

The applicable code, at 0x31E6F ($BE5F in RAM):

$BE5F:A6 7F     LDX $7F = #$00               ; Which screen is being displayed?
$BE61:BD 29 BE LDA $BE29,X @ $BE29 = #$2A ; Starting "counter".
$BE64:85 7C STA $7C = #$00
$BE66:BD 31 BE LDA $BE31,X @ $BE31 = #$2D ; Ending "counter".
$BE69:85 7A STA $7A = #$C0

Now, each screen has multiple pointers used for locating the unique tile graphics for the text and images besides the map display, curtains and checkered floor.

These "counters", if you will, tell the game where the pointers begin and end, effectively determining how many multiple pointers apply to each screen. The related code is at 0x30816 ($A806 in RAM).

$A806:A5 5E     LDA $5E = #$2A               ; Next "counter" check.
$A808:0A ASL ; Double (to account for 2 bytes per pointer).
$A809:A8 TAY ; Transfer A to Y (to find the desired pointer).
$A80A:B9 DA C5 LDA $C5DA,Y @ $C62E = #$82 ; Pointer for unique graphics (low byte).
$A80D:85 69 STA $69 = #$01
$A80F:B9 DB C5 LDA $C5DB,Y @ $C62F = #$CD ; Pointer for unique graphics (high byte).
$A812:85 6A STA $6A = #$03

Screen 1:

0x3263E-0x32645 (0x8)
82 CD A6 CD BB CD D1 CD
$CD82 = 0x32D92
$CDA6 = 0x32DB6
$CDBB = 0x32DCB
$CDD1 = 0x32DE1

Screen 2:

0x32646-0x3264D (0x8)
E7 CD 02 CE 19 CE 2D CE
$CDE7 = 0x32DF7
$CE02 = 0x32E12
$CE19 = 0x32E29
$CE2D = 0x32E3D

Screen 3:

0x3264E-0x32655 (0x8)
43 CE 57 CE 6D CE 7B CE
$CE43 = 0x32E53
$CE57 = 0x32E67
$CE6D = 0x32E7D
$CE7B = 0x32E8B

Screen 4:

0x32656-0x3265D (0x8)
91 CE 9E CE AE CE B6 CE
$CE91 = 0x32EA1
$CE9E = 0x32EAE
$CEAE = 0x32EBE
$CEB6 = 0x32EC6

Screen 5:

0x3265E-0x32665 (0x8)
C5 CE E2 CE FF CE 0A CF
$CEC5 = 0x32ED5
$CEE2 = 0x32EF2
$CEFF = 0x32F0F
$CF0A = 0x32F1A

Screen 6:

0x32666-0x32671 (0xC)
20 CF 43 CF 6B CF 8A CF 9E CF B2 CF
$CF20 = 0x32F30
$CF43 = 0x32F53
$CF6B = 0x32F7B
$CF8A = 0x32F9A
$CF9E = 0x32FAE
$CFB2 = 0x32FC2

Screen 7:

0x32672-0x3267B (0xA)
C8 CF ED CF F6 CF 09 D0 1F D0
$CFC8 = 0x32FD8
$CFED = 0x32FFD
$CFF6 = 0x33006
$D009 = 0x33019
$D01F = 0x3302F

Screen 8:

0x3267C-0x32683 (0x8)
35 D0 44 D0 51 D0 59 D0
$D035 = 0x33045
$D044 = 0x33054
$D051 = 0x33061
$D059 = 0x33069

Immediately following the graphic pointers are pointers related to palettes.

0x32684-0x32685 (0x2): 68 D0: $D068 = 0x33078-0x3309B (0x24)
0x32686-0x32687 (0x2): 8C D0: $D08C = 0x3309C-0x330BF (0x24)
0x32688-0x32689 (0x2): B0 D0: $D0B0 = 0x330C0-0x330E3 (0x24)
0x3268A-0x3268B (0x2): D4 D0: $D0D4 = 0x330E4-0x33107 (0x24)
0x3268C-0x3268D (0x2): F8 D0: $D0F8 = 0x33108-0x3312B (0x24)
0x3268E-0x3268F (0x2): 1C D1: $D11C = 0x3312C-0x3314F (0x24)
0x32690-0x32691 (0x2): 40 D1: $D140 = 0x33150-0x33173 (0x24)
0x32692-0x32693 (0x2): 64 D1: $D164 = 0x33174-0x33197 (0x24)
0x32694-0x32695 (0x2): 88 D1: $D188 = 0x33198-0x33410 (0x279)
0x32696-0x32697 (0x2): 01 D4: $D401 = 0x33411-0x33434 (0x24)
0x32698-0x32699 (0x2): 25 D4: $D425 = 0x33435-0x33458 (0x24)
0x3269A-0x3269B (0x2): 49 D4: $D449 = 0x33459-0x3347C (0x24)
0x3269C-0x3269D (0x2): 6D D4: $D46D = 0x3347D-0x334A0 (0x24)
0x3269E-0x3269F (0x2): 91 D4: $D491 = 0x334A1-0x334C4 (0x24)
0x326A0-0x326A1 (0x2): B5 D4: $D4B5 = 0x334C5-0x334D8 (0x14)
0x326A2-0x326A3 (0x2): C9 D4: $D4C9 = 0x334D9-0x334EC (0x14)
0x326A4-0x326A5 (0x2): DD D4: $D4DD = 0x334ED-0x33500 (0x14)
0x326A6-0x326A7 (0x2): F1 D4: $D4F1 = 0x33501-0x33514 (0x14)
0x326A8-0x326A9 (0x2): 05 D5: $D505 = 0x33515-0x33528 (0x14)

There is free space in the rest of the ROM bank starting at 0x33529 ($D519 in RAM), from 0x33529-0x3400F (0xAE7). You can change the addresses to load tables from in applicable code and place your groups of data within this region to expand them to your will and not worry about cutting into other data sections.
However, please be aware that if you use the SMB3TE utility to modify the title screen, the program actually uses this free space to build your modified title screen. Therefore, if you plan to ever use that utility for your SMB3 hack, be sure that you design your title screen first before you design your custom ending! That way, you can make use of the free space starting from the next offset following the end of the data for your new title screen.

AlanJacobs
Posted on 04-12-18 03:30 AM Link | Quote | ID: 166303


Goomba
Level: 11

Posts: 22/24
EXP: 4964
Next: 1021

Since: 08-01-13

Last post: 66 days
Last view: 15 days
Wow!! Some great info, Quick Curly. Thank you for sharing!

Mari42
Posted on 04-12-18 05:34 AM (rev. 17 of 06-13-18 02:31 PM) Link | Quote | ID: 166305


Red Paragoomba
Level: 14

Posts: 53/54
EXP: 12019
Next: 1052

Since: 12-15-15

Last post: 49 days
Last view: 22 hours
Wow, Quickquirly that looks amazing, and thanks for the ending and warp zone info! I have the new information I would like to add but its pretty decent!

New info for World 5 map function and Custom Auto-Scrolling!

x144E0 World 5 cloud decoration for sprites. (Use 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 to erase the cloud in the OW)

x143EF (Uses for the 2nd screen that defaults Clouds/sky music)


Autoscroll Move End Loop Select

x13944 - World 3-6 / 1-4 (00)

x13945 - World 3 Airship (04)

x13946 - World 6-2 (00)

x13947 - World 5 Airship (04)

x13948 - World 2 Airship (04)

x13949 - world 4 Airship (04)

x1394A - World 6 Airship (04)

x1394B - World 5-6 (00)

x1394C - Unknown??? (00)

x1394D - Unknown??? (00)

x1394E - World 6-7 (00)

x1394F - World 1 Airship (04)

x13950 - World 7 Airship (04)

x13951 - World 8 Airship (Crappy ship) (04)

x13952 - World 8 Battelship (03)

x13953 - World 7-4 (00)

x13954 - World 1 Clouds (Bonus from 1-3) (00)

x13955 - World Coin ship (04)

x13956 - Unknown??? (00)

x13957 - World 8 Tank 1 (00)

x13958 - World 8 Tank 2 (00)


Autoscroll Movement

x13959-1395B - World 3-6 / 1-4

x1395C-1396C - World 3 Airship

x1396D - World 6-2

x1396E-1397F - World 5 Airship

x13980-1398B - Unknown???

x1398C-139A6 - World 4 Airship

x139A7-139B9 - World 6 Airship

x139BA-139BB - World 5-6

x139BC-139CB - Unknown???

x139CB-139DE - Unknown???

x139DF-139E9 - World 6-7

x139EA-139FE - World 1 Airship

x139FF-13A1F - World 7 Airship

x13A20-13A22 - World 8 Airship (Crappy ship)

x13A23-13A28 - World 8 Battelship

x13A29-13A3D - World 7-4

x13A3E - World 1 Clouds (Bonus from 1-3)

x13A3F - World Coin ship

x13A40-13A41 - Unknown???

x13A42-13A44 - World 8 Tank 1

x13A45-13A46 - World 8 Tank 2


Autoscroll Repeat Movements

x13A47-13A49 - World 3-6 / 1-4

x13A4A-13A5A - World 3 Airship

x13A5B - World 6-2

x13A5C-13A6D - World 5 Airship

x13A6E-13A79 - World 2 Airship

x13A7A-13A94 - World 4 Airship

x13A95-13AA6 - World 6 Airship

x13AA7-13AA8 - World 5-6

x13AA9-13AB7 - Unknown???

x13AB8-13ACB - Unknown???

x13ACC-13AD6 - World 6-7

x13AD7-13AEB - World 1 Airship

x13AEC-13B0C - World 7 Airship

x13B0D-13B0F - World 8 Airship (Crappy ship)

x13B10-13B15 - World 8 Battelship

x13B16-13B2A - World 7-4

x13B2B - World 1 Clouds (Bonus from 1-3)

x13B2C - World Coin ship

x13B2D-13B2E - Unknown???

x13B2F-13B31 - World 8 Tank 1

x13B32-13B33 - World 8 Tank 2


An "Autoscroll movement" is what it moves the screen to scroll within different paths, and "Autoscroll Repeat Movement" means thats it contains coding for you set the the timer and speed for the movements of the scroll. Note: This maybe confusing! As you know, I have a bit of experience of how it works when the scroll is functionally possible as much as the game reads the execution of the binary format depending of how its accumulated the action of scroll to change. You might need a notepad in order to follow where you want the scroll to go, but ALWAYS increase you level length before you add any enemies. Otherwise if you have the autoscroll goes further the screen and the enemies are not in the current screen in any position as you added further to any screen, then it is ABSOULTE REASON WHY YOU NEED TO INCREASE YOUR LEVEL LENGTH! As I meant to say its "confusing" as is depending what movements you want to change is what you will see that the numbers were the opposites! On the Autoscroll Repeat Movement part, you could see that:

Biggest number is on the left, and lowest numbers on the right meaning:

Repeatable movement is on the left, and the speed of the movement is on the right!


If the lowest numbers on the left, and the biggest number on the right then it means that:

Repeatable movement is on the right, and the speed of the movement is on the left!


Spoiler:
Autoscroll Repeatable movement is known as the autoscroll timer!


Tips: Always make sure you know what you're doing when you going to make a new scroll in terms of what you know how to make it work as you're reading this tutorial.

Example:
So, lets say you want to edit the autoscroll from lost level 9 to use for world 1 airship (unknown):

04 00 01 00 02 00 00 02 00 01 00 01 00 02 00
Movement (original)

03 08 EE 10 67 10 FF 48 10 67 10 34 10 67 10
Timer/Speed (original) (as I said this can confuse you! So as you can see this. Now the timer is on the left, and the speed is on the right.)

I've edited the autoscroll myself to make it more consumable:

04 00 01 00 02 00 01 00 02 00 01 00 04 00 00
Movement (edited)

00 08 AA 0E 30 10 DF 08 30 0E 9A 08 70 01 30
Movement (edited)

You can try this code to test this out, but also do your levels before doing so! The autoscroll loop means that once the autoscroll stops at the end, then it loops the movement as it count of the scroll as ENDING scroll! For instance "00" disables the autoscroll loop. "03", or "04" goes up and down as it goes on within ending movements.

Example:

x13945 - World 3 Airship (04)

World 3 Airship was defaulted for an autoscroll to loop at the end. So, if I edited this by putting "00" in HxD then that means the autoscroll won't loop as the game functions its coding.

Thats all I can give you for now!
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22


Main - ROM Hacking - General SMB3 Hacking Thread New thread | New reply

Acmlmboard 2.1+3δ (2016-01-08)
© 2005-2016 Acmlm, blackhole89, Xkeeper et al.

Page rendered in 0.146 seconds. (373KB of memory used)
MySQL - queries: 103, rows: 139/0, time: 0.104 seconds.