snake block |
Posted on 08-29-16, 09:41 pm (rev. 1 by snake block on 08-29-16, 09:44 pm)
|
a
Karma: 1589 Posts: 1222/1290 Since: 02-12-13 |
I see what's going on... Well, KingYoshi found this anyway. Arrow Signboards are available only if sprite set 16 is set to 1. And Lift Generators are only available if sprite set 16 is set to 9.
Mero adds something very specific to the level that wasn't originally in 5-C, which is Arrow Signboards. And 5-C also originally had Lift Generators, so... That would mean they're compatible now. So it's something with sprite sets. Thanks KingYoshi for this, mainly. |
MeroMero |
Posted on 08-29-16, 09:52 pm
|
Death by cuteness
Karma: 6589 Posts: 566/598 Since: 05-01-13 |
Indeed, this is what this hack is about.
More specifically, Arrow Signboard code was moved to offset 0x19C0 in the arm9 so that it would no longer be dependent on Overlay 12 (Sprite set 16-1). This allows the Signboards to be used anywhere now. But that's only the icing on the cake! The cake itself is going to prove even tastier! Remember about the hint I gave, you can easily picture it. |
skawo |
Posted on 08-29-16, 09:53 pm
|
Karma: 19807 Posts: 618/1100 Since: 04-02-13 |
So I guess you're entirely removing the sprite set restrictions?
|
MeroMero |
Posted on 08-29-16, 09:55 pm
|
Death by cuteness
Karma: 6589 Posts: 567/598 Since: 05-01-13 |
Only for Sprite 93 (Actor 77).
|
Hiccup |
Posted on 08-30-16, 10:24 am (rev. 1 by Hiccup on 08-30-16, 04:08 pm)
|
Birdo
Karma: 2789 Posts: 1797/2091 Since: 06-26-11 |
I'm not entirely sure what this is, but being able to use the signboards anywhere is pretty neat. I wonder if this has something to do with custom models for the signboard? Maybe with a layer nybble? That'd let you spare up some tileset space and have "go behind tiles".
|
MeroMero |
Posted on 08-30-16, 03:37 pm
|
Death by cuteness
Karma: 6589 Posts: 568/598 Since: 05-01-13 |
Choose which Actors to spare on Level completion:
repl_0209DF5C_ov_00:
STMFD SP!, {R0-R1, R5, LR}
STRB R3, [R4, #0x3E7]
MOV R0, R7, LSR #3
MOV R1, R0, LSL #3
SUB R1, R7, R1
MOV R5, #1
.Division:
CMP R1, #0
BEQ .ResultDivision
MOV R5, R5, LSL #1
SUB R1, R1, #1
B .Division
.ResultDivision:
LDR R1, =ActorSpare
LDRB R1, [R1, R0]
TST R1, R5
BEQ .Return
MOV R2, #1
.Return:
LDMFD SP!, {R0-R1, R5, PC}
.data
.balign 1
ActorSpare:
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00100000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000 This ASM hack is read before the special cases, so Actors that weren't destroyed to begin with won't get destroyed regardless of their bit value. Apart from that, you can choose which Actor you want to spare. If you copy the ASM Hack on Notepad++, you'll see that the first .byte will be located on line 26. To know which bit matches which Actor, you'll have to use a simple Euclidean division: Actor Number / 8, which will net you the quotient and the remainder. To get the line where will be located the bit you want to change, simply add 26 to the quotient. Now if you look at the data, you'll see that they are in binary format, thus you only have to take into account the part after 0b. To get the bit you want to set (bit=1), you have to count (beginning from 0) from right to left until you find the bit number that matches the remainder (which should be a number between 0 and 7 inclusive). For example let's say Actor 77 (Signboards) mustn't be destroyed upon level completion. Calculation: 77 / 8 = 9 with a remainder of 5. Then 26 + 9 = 35, so go to line 35. Since the remainder is 5, change bit 5 of line 35 to 1. so 0b00000000 becomes 0b00100000 on line 35. Notice that Actor 77 is already set to 1 in this ASM Hack, this is because it will be needed for the next ASM Hack of mine, which is already done, thus I only need to post the thread. |
MarioKart7z |
Posted on 08-30-16, 05:00 pm
|
Panser
I AM DERP INCARNATE Karma: 518 Posts: 53/328 Since: 08-20-16 |
Posted by MeroMero Choose which Actors to spare on Level completion: repl_0209DF5C_ov_00:
STMFD SP!, {R0-R1, R5, LR}
STRB R3, [R4, #0x3E7]
MOV R0, R7, LSR #3
MOV R1, R0, LSL #3
SUB R1, R7, R1
MOV R5, #1
.Division:
CMP R1, #0
BEQ .ResultDivision
MOV R5, R5, LSL #1
SUB R1, R1, #1
B .Division
.ResultDivision:
LDR R1, =ActorSpare
LDRB R1, [R1, R0]
TST R1, R5
BEQ .Return
MOV R2, #1
.Return:
LDMFD SP!, {R0-R1, R5, PC}
.data
.balign 1
ActorSpare:
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00100000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000
.byte 0b00000000 This ASM hack is read before the special cases, so Actors that weren't destroyed to begin with won't get destroyed regardless of their bit value. Apart from that, you can choose which Actor you want to spare. If you copy the ASM Hack on Notepad++, you'll see that the first .byte will be located on line 26. To know which bit matches which Actor, you'll have to use a simple Euclidean division: Actor Number / 8, which will net you the quotient and the remainder. To get the line where will be located the bit you want to change, simply add 26 to the quotient. Now if you look at the data, you'll see that they are in binary format, thus you only have to take into account the part after 0b. To get the bit you want to set (bit=1), you have to count (beginning from 0) from right to left until you find the bit number that matches the remainder (which should be a number between 0 and 7 inclusive). For example let's say Actor 77 (Signboards) mustn't be destroyed upon level completion. Calculation: 77 / 8 = 9 with a remainder of 5. Then 26 + 9 = 35, so go to line 35. Since the remainder is 5, change bit 5 of line 35 to 1. so 0b00000000 becomes 0b00100000 on line 35. Notice that Actor 77 is already set to 1 in this ASM Hack, this is because it will be needed for the next ASM Hack of mine, which is already done, thus I only need to post the thread. YES!!!! Thank you! With this i can make the Zoom sprite not glitch out when you complete a level
rip signature
|
skawo |
Posted on 08-30-16, 05:02 pm
|
Karma: 19807 Posts: 619/1100 Since: 04-02-13 |
No, that would still occur.
|
Hiccup |
Posted on 08-30-16, 06:10 pm
|
Birdo
Karma: 2789 Posts: 1798/2091 Since: 06-26-11 |
But that can be prevented by zooming it back to normal with a zoom sprite.
|
MarioKart7z |
Posted on 08-31-16, 11:11 am
|
Panser
I AM DERP INCARNATE Karma: 518 Posts: 55/328 Since: 08-20-16 |
Posted by Hiccup But that can be prevented by zooming it back to normal with a zoom sprite. Speaking of which, it's kinda hard to have precise areas with zoom instead of the entire level. Maybe someone could make a patch which makes it use zones? There's still a fair amount of nybbles left
rip signature
|
Hiccup |
Posted on 08-31-16, 11:26 am
|
Birdo
Karma: 2789 Posts: 1799/2091 Since: 06-26-11 |
there is a visualization tool by MeroMero its pretty easy with that. Also, if you need zone activated zoom, you could use the actor spawner with the IF sprite
|
skawo |
Posted on 08-31-16, 01:53 pm (rev. 9 by skawo on 09-11-16, 04:03 pm)
|
Karma: 19807 Posts: 623/1100 Since: 04-02-13 |
Always load the correct boss particles if necessary:
nsub_02022D98_main:
LDR R0, =0x208B19C @ Pointer to block 14
LDR R0, [R0]
LDR R0, [R0, #0xF]
CMP R0, #9
MOVEQ R0, #0x0
BXEQ LR
CMP R0, #2 @ If Bowser
MOVLT R0, #0x0
BXLT LR
BEQ .Bowser
LDR R1, =0x2026C88 @ Particle files array
CMP R0, #3 @ If Giga Goomba
ADDEQ R0, R1, #0x10
BXEQ LR
CMP R0, #4 @ If Petey
ADDEQ R0, R1, #0x18
BXEQ LR
CMP R0, #5 @ If Mummipokey
MOVEQ R0, R1
BXEQ LR
CMP R0, #6 @ If Lakithunder
ADDEQ R0, R1, #0x28
BXEQ LR
CMP R0, #7 @ If Cheep Skipper
ADDEQ R0, R1, #0x8
BXEQ LR
ADD R0, R1, #0x20 @ Else, Monty Tank
BX LR
.Bowser:
LDR R0, =0x208B180 @ Pointer to block 7
LDR R1, =0x208B184 @ Pointer to block 8
LDR R0, [R0]
LDR R1, [R1]
ADD R1, #4 @ Remove padding
STMFD SP!, {R0,LR}
SUB R0, R1, R0 @ Get size of block 7
LDR R1, =0xC
BL FX_Div @ Get amount of sprites in level
LDMFD SP!, {R0,LR}
MOV R12, R1
LDR R3, =0x2026C80
.CheckWhichBowser: @ Determine which Bowser sprite is present
MOV R1, R12
MOV R2, #0xC
MUL R1, R2, R1
LDRH R2, [R0,R1]
CMP R2, #0x3A @If Bowser
MOVEQ R0, R3
BXEQ LR
CMP R2, #0x3F @If Dry Bowser
ADDEQ R0, R3,#0x38
BXEQ LR
CMP R12, #0
SUBGT R12, #1
BGT .CheckWhichBowser
ADD R0, R3,#0x40 @Else, Giant Bowser
BX LR In the original sub_02022D98, in a bout of awesomeness, Nintendo decided that the boss .spa files should be loaded by comparing the current Area number with a giant table and returning the pointer to the .spa File ID. This is, of course, incredibly dumb. What this code will do instead, is check if you have one of the boss overlays loaded in sprite sets. If they are, the function will return the proper particle file ID pointer. Since Bowsers are all in the same overlay, the code will also check just which Bowser sprite is used in the level. This means you can put bosses /anywhere/ now. |
Asprok |
Posted on 08-31-16, 02:23 pm
|
Passed away in 2017
Karma: 999 Posts: 196/380 Since: 03-04-14 |
Thank you so much, skawo! This is very useful.
|
MarioKart7z |
Posted on 08-31-16, 04:02 pm
|
Panser
I AM DERP INCARNATE Karma: 518 Posts: 58/328 Since: 08-20-16 |
Wow, NSMB had so many hard-coded crap in it that it almost hurts
Well i'm gonna slap this on my ROM despite the fact i'm not willing to move the bosses at all 'cuz why not, right?
rip signature
|
skawo |
Posted on 08-31-16, 05:02 pm (rev. 2 by skawo on 08-31-16, 05:55 pm)
|
Karma: 19807 Posts: 625/1100 Since: 04-02-13 |
Choose which levels load the boss music:
nsub_020AD01C_ov_00:
LDR R0, =0x208B184
LDR R0, [R0]
LDRB R0, [R0, #0xC]
CMP R0, #0 @This is technically
MOVNE R0, #1 @unnecessary, but just to be safe
BX LR Improvement over Mero's code, which makes the boss music load all the time, possibly cutting into your sound effects. The original sub_020AD01C checks if the first area's bottom background is set to one that's present in a certain array. If so, it returns true, which makes whatever function calls it load the boss music. This is incredibly dumb. What this does instead, is check if View 0 of the first area has its' Unknown 2(A) set, and if it does, it returns true. That particular unknown seems to do nothing, so it's a nice way to give it some function. And it's fifty times more efficient, to boot! ....Or, if you're scared that Unknown 2 does do something, then... Boss music always loads in boss stages: nsub_020AD01C_ov_00:
LDR R0, =0x02085A9C
LDR R0, [R0]
CMP R0, #0xD
BEQ .true
CMP R0, #0xE
BEQ .true
CMP R0, #0x15
BEQ .true
CMP R0, #0x16
BEQ .true
MOV R0, #0
BX LR
.true:
MOV R0, #1
BX LR This will instead simply check if the level is a Castle, Final Castle, Tower or a Tower-2 and load the music if it is. EDIT: In other news, all patches are added to the topic now. |
Hiccup |
Posted on 09-01-16, 03:14 pm
|
Birdo
Karma: 2789 Posts: 1804/2091 Since: 06-26-11 |
Posted by skawo If an overlay isn't listed, you have to decompress all overlays and search the entire ROM. Does this mean literally clicking "decompress overlay" on every single overlay, individually and then opening the NDS up in a hex editor? |
skawo |
Posted on 09-01-16, 03:34 pm (rev. 1 by skawo on 09-01-16, 03:35 pm)
|
Karma: 19807 Posts: 627/1100 Since: 04-02-13 |
Sadly, yes. Try searching the base rom first, though.
|
Ndymario |
Posted on 09-03-16, 05:15 am
|
Super Koopa
That MvL Hacker Karma: 1701 Posts: 66/833 Since: 04-11-15 |
Skawo I have a "suggestion". Could you make yoshi in nsmbds (if you really did that that would be awesome but I understand if that's too complicated)
_________________________ Here's my MvL Hacking thread Consider joining the NSMB DS Hacking Discord Server! Also, be sure to check out the new wiki! #HakingNoMore |
Asprok |
Posted on 09-03-16, 05:42 am (rev. 1 by Asprok on 09-03-16, 06:05 am)
|
Passed away in 2017
Karma: 999 Posts: 213/380 Since: 03-04-14 |
Also, swako, could you implement six more players, the Koopalings, the Falcon punch and a three-layer tileset mode?
|
MarioKart7z |
Posted on 09-03-16, 08:19 am (rev. 1 by MarioKart7z on 09-03-16, 08:20 am)
|
Panser
I AM DERP INCARNATE Karma: 518 Posts: 71/328 Since: 08-20-16 |
Posted by Asproek Also, swako, could you implement six more players, the Koopalings, the Falcon punch and a three-layer tileset mode? And also a super tilegod sprite which destroys every single tile and sprite in the level when activated
rip signature
|