Language…
9 users online: CookieJackC, IronFoxGaming, lolyoshi, PJHacker, Raychu2021, Sarcose, SheikNorris, SomeGuy712x, superepicmarioman - Guests: 98 - Bots: 315
Users: 66,011 (2,154 active)
Latest user: CookieJackC

Now, you can make "Noob Boss" THE Boss! [Tips and Tricks] [DOWNLOAD AVAILABLE]

Super Mario WorldSpritesToolResource ReleaseVideosMiscellaneous


DOWNLOAD IT PRE-ASSEMBLED! v2


I am currently developing what will be known as "Noob Boss King", a version that's highly customizable and is very flexable...issue is, it's not done yet. However! You're not doomed, because I have worked with it long enough so you can make the default noob boss (the "Ultimate Noob Sprite v1.3.4") open up a whole new world of possibilities.

Installing Teleport_X and Teleport_Y
This is maybe the single most used command I tend to use in the new version I'm developing, and it's actually very easy to install.

Code
;==================================================================
;Teleport_X Routine
;==================================================================
Teleport_X:
    STA !E4,x    ;> Sprite x position, low byte (where in the current screen)
    TYA : STA !14E0,x    ;> Sprite x position, high byte (how many screens forward)
    RTS
;==================================================================
;Teleport_Y Routine
;==================================================================
Teleport_Y:
    STA !D8,x    ;> Sprite y position, low byte (where in the sub-screen)
    TYA : STA !14D4,x    ;> Sprite x position, high byte (how many sub-screens downward. Should be #$01 in most cases)
    RTS


This code can be installed after the RTS in "STATE0". This command (especially Teleport_Y) isn't entirely compatible with existing commands like JSR WavyMotion or JSR Rise but this is good if you wanna teleport a boss *anywhere* in a level, including areas that are out of bounds (but maybe don't do that).

To call this command in your current state, you format it like this.
Code
STATE10:
LDY #$xx : LDA #$yy : JSR Teleport_X
RTS


"xx" is what screen in the level you want the boss to teleport to, and "yy" is where in the selected screen you want the boss to be in.

Changing JSR Move
Remember this?
Code
Tbl1R:  
	db $00,$00,$04,$30,$20,$20,$18,$18,$10,$30,$18	; 00-10
	db $18,$18,$18,$30,$30,$30,$30,$30,$30,$18,$60	; 11-21
	db $18,$60,$60,$30,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 22-32
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 33-43
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 44-54
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 55-65
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 66-76
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 77-87
	db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF	; 88-98
	db $FF						; 99

Get rid of it because we're about to reconfigure JSR Move into something way more flexible.

What we're doing is changing JSR Move into something pretty similar to JSR Teleport_X where you load a value first before using the command.

The first thing you do is find this code...
Code
JumpMain:
	JSR Move	;BlindEdit: now boss will always move/update speeds by default. Change speeds in Tbl1R to zero if you want it to be stationary.
	JMP MainPointer

and get rid of this JSR Move (or put a ; in front of it).

Next, you find this area...
Code
Move:
	LDA !ChaseAcc,x	; COMPLETELY SKIP IF ACCELERATING.
	ORA !163E,x


And you add "STA $0C" after "Move:"
Code
Move:
	STA $0C

	LDA !ChaseAcc,x	; COMPLETELY SKIP IF ACCELERATING.
	ORA !163E,x


Then just a little after you find this
Code
SkipAngrySpd:
	LDY !1528,x 	; Get sprite health into Y.
	LDA !157C,x 	; Get the sprite's direction ..
	BEQ Right
	LDA Tbl1R,y	;\
	EOR #$FF	; |
	INC A		; | Sprite left speed = $1626.
	STA !1626,x	; |
	LDA !1626,x	;/
	BRA SetSpeedC
Right:
	LDA Tbl1R,y	; Get the speeds value based on health.
SetSpeedC:
	STA !B6,x	; Store the sprite X speed.


and you replace all instances of "Tbl1R,y" to $0C
Code
SkipAngrySpd:
	LDY !1528,x 	; Get sprite health into Y.
	LDA !157C,x 	; Get the sprite's direction ..
	BEQ Right
	LDA $0C	;\
	EOR #$FF	; |
	INC A		; | Sprite left speed = $1626.
	STA !1626,x	; |
	LDA !1626,x	;/
	BRA SetSpeedC
Right:
	LDA $0C	; Get the speeds value
SetSpeedC:
	STA !B6,x	; Store the sprite X speed.


Now with this set up, the next time you want to use JSR Move you now type
Code
	LDA #$xx : JSR Move


"xx" is how fast the sprite walks, very much similar to the giant table but WAY more efficient.

With this change you can actually do a few cool things that normally are impossible. For example instead of LDA #$xx you can use a ram address like LDA $18C5 to make the speed based on a freeram (just in case you have like a hard mode version of the boss where you want to use the same sprite, but you have uberasm deciding the boss's walking speed.) Also it's way easier to manage what states have what speeds since it's stored into the state itself instead of a giant table where you have to manually count.

Spawning a Sprite
JSR GenCSpr and JSR GenNSpr are two commands that can be changed in a similar way.

Code
GenNSpr:
	TAY ; Transfer A to Y
	LDA $14
	AND #$7F
	BNE NoSpawn

	STZ $00 : STZ $01	;no XY offset
	STZ $02 : STZ $03	;no XY speed

	TYA ; Transfer Y to A
	CLC			;clear carry - spawn normal sprite
SpawnDaSpr:
	%SpawnSprite()
	CPY #$FF
	BEQ NoSpawn		;if no sprite was spawned, don't bother setting state nor playing SFX
	LDA #!SpawnSound	;SFX for sprite spawned
	STA !SpawnPort|!Base2

NoSpawn:
	RTS
;======
GenCSpr:
	TAY ; Transfer A to Y
	LDA $14
	AND #$7F
	BNE NoSpawn

	STZ $00 : STZ $01	;no XY offset
	STZ $02 : STZ $03	;no XY speed

	TYA ; Transfer Y to A
	SEC			;set carry - spawn custom sprite
	BRA SpawnDaSpr


With this tweak you can now use
Code
	LDA #$xx : JSR GenNSpr
	LDA #$xx : JSR GenCSpr


"xx" is what sprite is currently being spawned.

Make Your Boss More RANDOM
So this is maybe the one thing that separates regular noob boss from Noob Boss King, and that's it's ability to randomly select attacks as a definable option. However this won't be a tutorial on how to make it optional; this is just to set it up.

Near the top of your boss, replacing the list of STATES you need an RNG routine that's ran by a timer. This RNG routine will provide a value which the boss will use select any "STATE" instead of it being determined by boss health. This will also allow "STATE0" to be an attack instead of just 'nothing'. This is what you install to make this function.
Code
; THIS FIRST BIT IS OPTIONAL
	LDA $16 : ORA $18 ; If any input is made to controller
	BEQ +
	JSL $01ACF9 ; Change RNG
+

; THIS OTHER STUFF IS IMPORTANT (this is 'slightly' different compared to the C3 thread)
	LDA !1FE2,x ; Timer
	BNE +
	LDA !1FD6,x : STA $0C	; store "old" SAFE RNG value
	
	LDA.b #(.attackend-.attackstart-2)/2	; The amount of attacks included (automatic)
	DEC A	; decrease
	%Random()
	CMP $0C : BCC + ; if less than previous attack, skip (melloncode)
	INC A
+	STA !1FD6,x ; This is a "SAFE RNG" value which will remain consistent until the timer runs out again
	LDA #$FF
	STA !1FE2,x ; Load #$FF to bosses' attack timer (change FF to something lower if you want less time between attacks)
+

; ATTACKS START HERE
	LDA !1FD6,x ; replaces what's normally used as the boss health ram for the SAFE RNG ram
	JSL $0086DF|!BankB
.attackstart ; don't change/remove this
	dw STATE0
	dw STATE1
	dw STATE2
	dw STATE3
	dw STATE4
	dw STATE5
	dw STATE6
.attackend ; don't change/remove this


below all the attacks, you add this to the sprite's INIT:
Code
print "INIT ",pc
; ADD THIS
	LDA #$FF
	STA !1FE2,x ; Load #$FF to boss's attack timer (change FF here too for less delay between attacks)

; Stuff from default Noob Boss (no need to replace)
	LDA #!Health		; Store health.
	STA !1528,x


MISSING IMPORTANT STEP (OOPS):
And finally, find "Random:" and get rid of it. It will throw an error saying JSL Random got redefined, so just remove that label.

All attacks start with STATE0 by default. If you want to have more attacks, you add more STATES at the end and increase the value before %Random(). If you don't have that routine because you're using sprite tool 1.41/1.40, you can branch to a routine called JSL RANDOM or JSL Random instead (just replace %Random() with "JSL RANDOM").

You now have the key to bosses that use RNG to select attacks, near identical to bosses I've made using Noob Boss. It's not 100% how my own bosses work (the closest this replicates is the first half of my Bowser boss from R-ACK), but it's still far more interesting than most. What my bosses have is a kind of mix between linear and RNG where the attacks follow a list of instructions before selecting the next attack, and unfortunately it's more complex to set up than what's presented here.

Your boss has an unsymmetrical design?
So you remember these?
Code
;Frames for Animate (default):

!TopLeft =		$C6
!TopRight =		$C8
!BottomLeft =		$E6
!BottomRight =		$E8

!WalkTopLeft =		$CA
!WalkTopRight =		$CC
!WalkBottomLeft =	$EA
!WalkBottomRight =	$EC


Did you know you can just modify this directly?
Code
TILEMAP:
	db !TopLeft,!TopRight,!BottomLeft,!BottomRight,!WalkTopLeft,!WalkTopRight,!WalkBottomLeft,!WalkBottomRight
        db !TopLeft,!TopRight,!BottomLeft,!BottomRight,!WalkTopLeft,!WalkTopRight,!WalkBottomLeft,!WalkBottomRight
TILEMAP2:
	db !TopLeft2,!TopRight2,!BottomLeft2,!BottomRight2,!WalkTopLeft2,!WalkTopRight2,!WalkBottomLeft2,!WalkBottomRight2
        db !TopLeft2,!TopRight2,!BottomLeft2,!BottomRight2,!WalkTopLeft2,!WalkTopRight2,!WalkBottomLeft2,!WalkBottomRight2
TILEMAP3:
	db !TopLeft3,!TopRight3,!BottomLeft3,!BottomRight3,!WalkTopLeft3,!WalkTopRight3,!WalkBottomLeft3,!WalkBottomRight3
        db !TopLeft3,!TopRight3,!BottomLeft3,!BottomRight3,!WalkTopLeft3,!WalkTopRight3,!WalkBottomLeft3,!WalkBottomRight3


Well have you wondered why these are duplicated vertically? Well, because SECRETLY this boss is able to show a different graphic based on what direction it is currently facing...the Noob Boss just doesn't let you customize it in the defines directly! However, you can spit in the face of this sprite and replace the defines with actual numbers.
Code
TILEMAP:
	db $C6,$C8,$E6,$E8,$CA,$CC,$EA,$EC ; -> facing right
	db $C6,$C8,$E6,$E8,$CA,$CC,$EA,$EC ; <- facing left 
TILEMAP2:
	db $CC,$EC,$EC,$EE,$8A,$8C,$AA,$AC ; -> facing right
        db $CC,$EC,$EC,$EE,$8A,$8C,$AA,$AC ; <- facing left 
TILEMAP3:
	db $CA,$CC,$EA,$EC,$CA,$CC,$EA,$EC ; -> facing right
        db $CA,$CC,$EA,$EC,$CA,$CC,$EA,$EC ; <- facing left 


The top 8 bytes on each TILEMAP is when the boss faces right, while the bottom 8 bytes is it facing left. It is worth noting that in the graphics file itself, both directional graphics should face left since the sprite itself flips it. The graphics are formatted as "top left, top right, bottom left, and bottom right" on repeat. The first four bytes is the first frame, while the last four are the second frame. You can just repeat the first four bytes if you don't want the boss to 'animate'.

But I don't want my boss to have a SQUARE hitbox!
Easiest tweak, by the way! It actually revolves around using the CFG editor.


The thing we want to pay attention to is the Sprite Clipping values.


We're going to assume you want the boss to not have the 'wideness' of the hitbox. So "2A" is the one I like to use!


With this super simple tweak, you can now make your bosses have a loose 16x32 hitbox for graphics that communicate this better! Though, keep in mind that not all options will work. Since the noob boss has a custom 'damage' logic, a 16x16 hitbox wouldn't necessarily work since the boss checks for Mario's specific height to figure out damage.

"Sprite Clipping 22" (or what I call Perfect 16x16) requires you mess around with this part of the code.
Code
Effectiveness1:
	%SubVertPos()
	LDA $0E
	CMP #$E6
	BPL SprWins
	LDA $7D		;\ If Y speed negative (rising) ..
	BMI NoContact	;/ ..skip.

I haven't tested this thoroughly, but changing "CMP #$E6" to something like "CMP #$FD" should make a 16x16 hitbox possible.

That would be all, folks!
I haven't had a lot of time to refine this thread, but hopefully you got something out of this! Noob Boss is kind of the laughing stock in the community. However, with my uses of it, I realized there was a number of little tweaks that turns it from "noob" boss to "pro" boss (tho "Noob Boss King" felt more catchy to me). Hope I have enough time to finish the real version; Jamie and a couple others are testing a private build and have certainly achieved results. I may update the thread more with tips, but for now have a fun C3!
Want progress on 100 Rooms of Enemies: The Nightmare Edition? Go here to see.

(rip my other userbars momentarily)

It's quite a way to upgrade the Uitimate Noob Boss into the BOSS version of the Noob Boss. Hope those do work. Good thing.
Hey, this is really helpful. Maybe I should put noob boss in a hack.
NewPointless
A long time ago I probably would have been able to struggle through this and put this in a hack but I'm not as young as I used to be. Still impressive sounding though.




I'm very happy to see this. Many folks want bosses in their hack but it's tough to find resources that give enough control to keep them from being too same-y. Improving the Noob boss is a great step toward that. Thanks for doing this.
Really cool thread. Although it's a relatively simple boss sprite, this can help folks who aren't ASM familiar to figure out how this works. It's not as epic as any other boss but still useful otherwise. Thanks for putting in the time to explain how this works 👍
Dear Lord, a wall of code. What this tells me is a lot of work went into this. So really well done!
Maybe I'll take the time to learn how to program this little thing into a hack. Give myself a little challenge or something.
                                                                                                                  
                              
I will be keeping an eye on this one since this is very interesting. Not to mention promising too.
Originally posted by Ruberjig
Really cool thread. Although it's a relatively simple boss sprite, this can help folks who aren't ASM familiar to figure out how this works. It's not as epic as any other boss but still useful otherwise. Thanks for putting in the time to explain how this works 👍

I also support this type of sprite, you can customize practically everything without getting lost, and with the intention of adding more functions to the boss. #smrpg{y}
Sounds like quite the useful upgrade given that bosses are supposed to be more pattern based, at least that's how fun bosses are designed. I'm not much for "teleporting" because then you start to wonder "if this guy can teleport, then there's no way the protagonist can defeat him." A lot of people don't give teleportation the credit it deserves as an OP skill, but in terms of sheer function to get the boss where you want it to be, pretty useful. Still, if you had a way to force the boss to move to a certain X/Y coordinate, that would have been cool too. One of the things that's been missing with the noob boss is actual tilemapping, like a hurt frame and a jump frame. The base sprite has a lot of work that needs to be done, ultimately; and your work, especially the randomization, adds just that much more flavor to an already life saving sprite.
I'm definitely saving this thread somewhere on my pc, very useful for a lot of people whose hacks are already finished and need a final boss (or just a regular boss for every castle in general).

more rng my beloved
Kirbo was here
I remember to use Noob boss for my first boss in 2013, It was a very restricted way to do bosses, I think that a lot of people will need it and could help some of them to learn asm, i always support projects that makes people life easier.

------------------------------------------------------

Youtube
Twitter
SMWControlLibX GitHub
My Discord Server
Snestorage where you can download my resources
I really do appreciate how much effort went into this, because "boss fights" are some of the most memorable parts of hacks that have strong ones, but are also some of the hardest things to make.

Thank you for all this work, Daizo!
I'm not a doctor.

This is great for ROMhackers who want to make an easier boss for their hack. Great Job, Daizo!
This is wild. Will there be a video showcasing all of this stuff?
Check out my WIP romhack!
This seems cool, and I can't wait to use this! My hack was needing a boss anyways #w{:>}
This is certainly gonna be very helpful, i myself had a lot of trouble with the noob boss due to it being a horrible mess and these changes definitely make it more interesting and less... well noobish




Very useful post, since most of the complaints I've ever seen about n00b's boos is that it becomes kinda un-original after the many uses we've seen of it in several hacks (kinda became the motive I've taken interest in boss coding some years ago). I'd rather suggest some more things: first, I happen to recall imamelia coded a rather nifty routine to give a better "random" behavior to the boss, since SMW's internal RNG is kinda... ineffective.

Second... you could also talk a bit about the tiles' displacement; with that, you could, combined with the hitbox, make the boss interact more naturally to walls, and even make more complex stuff, like re-creating dahnamic's Giant Piranha boss. Modifying the spawn sprite states to use, for example, pixi's internal routines would be a great idea as well, since you actually could control more aspects of how the boss shoots its projectiles. Last, but not least... n00b's boss could have some nice uses from the extra bytes we have. Maybe if one wants to have, in the same hack, two different versions of the same boss, one being harder than another (I can give as example the way Final Fantasy V Advance does that with Omega and Omega mk. II), but you can actually implement them both wasting one only slot.

All in all, it's nice to see one actually finding time to show other's that the n00b's boss can be greatly enhanced without much hassle. I can see interesting stuff coming up with these tips in hand.





Dream team (feed them, please):






It is like what I said before, I like the concept of the Noob Boss, the thing is that it was not handled very well in a lot of regards, so having these tips is kinda neat. A lot of people tend to struggle with even the basics of the Noob Boss and for me, it is pretty clear why, some of the labels and options on it are not very well explained for people like me, who doesn't dig too much deep in ASM. I can't wait when you finish your Noob Boss King.

I never tweaked the original Noob Boss too much, since it have used it in my hacks as a BIG HITBOX, while using other sprites such as generators, normal enemies and etc to do all the work for the boss. Great job with this thread, it may inspire people to experiment more with new crazy ideas, or I hope so. #smrpg{:3}


Anything that adds a bit of variety to the bosses is great work, so good on you for squeezing some extra tricks out of the existing Noob Boss sprite! Eager to see your Noob Boss King really put things over the edge too, of course.


Other Submissions of mine!

Super Mario WorldSpritesToolResource ReleaseVideosMiscellaneous