Anyone Interested in Doing "SMB Special" for NES?

Started by SMB2J-2Q, February 06, 2008, 11:26:50 AM

Previous topic - Next topic

frantik

like you guys aren't just gonna load a save state anyways

really what should be adjusted is the game clock to better match the speed of SMBS' clock.. then the wait wouldn't be as long

Karatorian

With the amount of engine hacking already in this game, I'd not really be in favor of adding invisible kill mario blocks, pipes of doom or other such nonsense. Furthermore, such concepts "break the rules" of the Mario universe and fly in the face of player expectations.

Nothing is more frustrating to a player than dying for "no reason". Of course, there's always a reason of some sort (even if it's just a bug), but players don't see it that way. A properly designed game has a set of rules that become understood and expected by the player.

Mario dies if he falls in a hole, gets touched by an enemy's side or bottom, or stomps on the un-stomp-able. He doesn't die when he encounters invisible blocks of doom or goes down pipes of doom. While the physical laws of the Mario universe aren't accurately based on our own, they're just as real and violating them elicits a negative player response.

Of course, one can argue that these sorts of traps violate the rules as well. True, traditionally, Mario level design is done in such a manner that getting stuck isn't possible. However, I would argue that this is more of a convention than a rule. A convention Hudson has decided to alter and one we've carried over into the port.

The traps in the game abide by the rules of the Mario universe. Mario can only jump so high, so if he ends up in a hole taller than that, he's stuck. There are pipes one can come out of, but can't go into. Etc. These all follow the "laws of physics" as it where. The proposed "solution" violates them.

That said, the issue of having to wait for Time Up if you end up in such a situation is unfortunate. Perhasp a "start select" mechanism loosly based on the one in SMW would be in order. This solves the issue of "euthenizing" the player without breaking the rules or usurping player control. A similar mechanism is the "kill" console command in Quake.

If you get stuck or otherwise feel that respawning would be handy, Quake provides a convient method of doing so. (While you do not normally get stuck in Quake, it is possible, especially as the game supports user designed levels that may not provide a way out of every area. (Especially as some areas can be reached that where never intend to be reachable. This is by means of glitches that exist in the physics engine and have since been embraced as features of Quake physics.)

Of course, unlike SMW, the mechanism would work on all levels, not just those you've already beaten (as such isn't really relevant in SMB). In addition, it would cost you a life. If I do impliment it, chances are it will be considered dying due to time up.

In regards to the time thing, it can easily be added. We just need to figure out the proper speed.
Current ProjectsFinal Fantasy EngineSMB Special for NESStudio Karatorian
@loop: lda (src),y — sta (dst),y — iny — bne @loop — inc src+1 — inc dst+1 — dex — bne @loop

MathUser2929

Oh man, I would play the mario games so differently if I knew there were pipes that kill you instantly when you go down them.

frantik

#383
QuotePerhasp a "start select" mechanism loosly based on the one in SMW would be in order.

I have something like that implemented in SMU... lemme find the code

edit: here you go just modify the pause code starting at clr pause timer.  you will probably want to change the action to jump to the lose life routine or something too.  I just have it jump to the reset vector so i don't have to worry about the stack or anything like that.  I have the buttons as Up + Select to avoid accidentally resetting the game but you might want just select to activate the loss of life?

ClrPauseTimer:  lda SavedJoypadBits   ; load Joypad state
                cmp #$28              ; 0x28 = Up + Select pressed
                beq StartSelect       ; if Up + Select pressed, go to StartSelect
                lda GamePauseStatus   ; clear timer flag if timer is at zero and start button
                and #%01111111        ; is not pressed
SetPause:       sta GamePauseStatus
ExitPause:      rts
StartSelect:    JMP $8000             ; Jump to reset vector

Karatorian

Awesome. I'll have to get that integrated prior to the next release.
Current ProjectsFinal Fantasy EngineSMB Special for NESStudio Karatorian
@loop: lda (src),y — sta (dst),y — iny — bne @loop — inc src+1 — inc dst+1 — dex — bne @loop

MathUser2929

SMB2 also had a instant kill code. I think you needed to push some buttons on controller 2 or something. Apparently it must of been possible to get impossibly stuck in that game.

SMB2J-2Q

Quote from: deespence2929 on May 06, 2008, 11:30:28 PM
SMB2 also had a instant kill code. I think you needed to push some buttons on controller 2 or something. Apparently it must of been possible to get impossibly stuck in that game.
In that case, you paused the game with Controller #1 (main) and then on Controller #2 you pressed Up, B and A. That was called the "suicide" code in codebooks. It also did other weird effects, such as:
*Watching your character fall down the ground for each life you have (if the code was done soon as you entered a door).
*Taking a bit off the Rocket (if you also performed the Illusion Item glitch and pulled up the Rocket as the Illusion Item).
*Having an empty Life Meter without dying, when you performed the code after you pulled up a Rocket.

KingMike

There was also this platformer called Hi no Tori (a platformer game). There were several one-tile wide pits you could fall in, that were too deep to jump out of. (your character had the ability to magically make blocks appear, so he could build his way out of a pit that was at least two tiles wide.
There was also an invisiblity power-up. You could run through enemies, and walls. Guess what happens if the power-up runs out while you're in a wall?
There is also this river stage with fish or something that constantly flies out at you. They're supposed to stop when you reach the boss. But I remember taking a different route across the screen, to get a life-refill powerup, and the flying things didn't stop coming during the boss fight. That a glitch, or is that a penalty for getting the powerup?
Well, at least they made Select a suicide key.
(Still, though. How could Konami make such a crap game? Did they decide to get only the staff with bad ideas together? :P )
"My watch says 30 chickens" Google, 2018

nomit

Quote from: KingMike on May 07, 2008, 12:28:24 PM
There was also this platformer called Hi no Tori (a platformer game). There were several one-tile wide pits you could fall in, that were too deep to jump out of. (your character had the ability to magically make blocks appear, so he could build his way out of a pit that was at least two tiles wide.
There was also an invisiblity power-up. You could run through enemies, and walls. Guess what happens if the power-up runs out while you're in a wall?
There is also this river stage with fish or something that constantly flies out at you. They're supposed to stop when you reach the boss. But I remember taking a different route across the screen, to get a life-refill powerup, and the flying things didn't stop coming during the boss fight. That a glitch, or is that a penalty for getting the powerup?
Well, at least they made Select a suicide key.
(Still, though. How could Konami make such a crap game? Did they decide to get only the staff with bad ideas together? :P )
If it's based on the manga created by Osamu Tezuka ("The father of manga") they might not have have given it much effort thinking it would be a hit just because of the manga.

SMB2J-2Q

#389
Could we please get back on the topic of trying to finish this SMB1 hack?

EDIT: But please do find some way to incorporate the SMB2USA suicide code into this SMB1 hack...

Thank you,



Ben

Darkdata

Quote from: SMB2J-2Q on May 10, 2008, 08:13:37 AM
Could we please get back on the topic of trying to finish this SMB1 hack?

Thank you,



Ben


This is all quite on topic, it has not gone off on a multi-paragraphed essay, it is just comparing the types of kill codes from games, This may be important to Karatorian, and frantik in the creation of this game. Or it may not.

Anyway, I would like to say good job you two on all your work so far. It is nice to see a game get broken, rebuilt, and made better, faster, stronger... ^^;
Jul

MathUser2929

It's not like what we talk about in this thread is gonna keep them from working on the hack anyway.

Karatorian

#392
Quote from: Darkdata on May 10, 2008, 09:52:00 AMAnyway, I would like to say good job you two on all your work so far. It is nice to see a game get broken, rebuilt, and made better, faster, stronger... ^^;

Better? Yes and no. Stronger? Maby. Faster? Naw. Heck, if anything, with the stuff we've added, every loop of the main game engine takes a handful more cycles that it once did. Not that it matters as I don't think we've run out of vertical refresh yet ... Oh, you meant figuratively? Well, thanks, we do what we can =_=

Quote from: deespence2929 on May 10, 2008, 10:29:40 AMIt's not like what we talk about in this thread is gonna keep them from working on the hack anyway.

Actually, it's the activity on this thread that keeps me motivated. Even when it's only tangentally related to the hack itself.

In regards to the current progress, I haven't really gotten anything done lately. I've been distracted by a bunch of RL stuff (fixing my truck) and a new utility project (Mototile). But now I've gotten back into it and I've started working on the credits sequence.

SMBS has a long credits sequence, of which we'd like to add the content of to the end of our hack. Additionally, SMB didn't have any credits, so I decided to add the hard working folks at Big N as well. Finally, of course, we have to credit ourselves and (more important to me anyway) give special thanks to all the playtesters, tool authors, etc. that helped make this project possible.

So I started looking into the victory messages code and stuff. Quite frankly, I don't quite know the NES and SMB's engine internals quite well enough to figure it out exactly.

Anyway, the text data is fairly straight forward. It consists of a three byte header, the text, and $00 as a terminator. I've managed to figure out two of the three header bytes. The second is the screen position to draw the text to. The third is the length of the string. (Why it has both a string length and null termination is beyond me.) The first one is the one that I haven't figured out.

In all of the text strings in the game, it's either $25 or $26. I thought I could figure it out from the text drawing routine, but, like so many other bits of SMB, it's hard to follow. Rather than do any actual work itself, it just sets some variables and lets some other part of the engine (that I haven't located yet) handle the real work.

So, does anyone here know what that first byte means?

Hey, Frantik, any ETA on getting the last of the bugs resulting from the new block code fixed? To test out my changes to the end code, I fixed the flagpole in 8-3, but as a result it's location ended up being $FD, the end of object data marker, so YY-ME simply moved it to $ED instead so it's not in the right spot. (I also messed up the hole before it somehow.) Anyway, if you find the time, a fix would be nice.

Edit: Never mind, I figured it out. The first byte is part of the screen location as well. Actually, the first two byte are a pointer to the location to write the string to. (Oddly, it's in big endian format, hmm.)

As the engine gets changed more and more, most Game Genie code don't work anymore. For anyone that's interested, I've developed a few cheat codes that only modify RAM locations and so are stable from build to build. The downside is that they can't be used with a GG or PAR or similar ROM modding device.

Here's the list (straight from FCEU):

1) *   $07fc:001     - World Menu
2) *   $079f:010     - Invincible
3) *   $0704:001     - Flight
4) *   $075f:007     - World Eight
5) *   $0760:104     - Castle


The "World Menu" code just activates hard mode, so you'll have to turn it off if you want to play in easy mode once you select a world. The "Invincible" code is an infinite starman. The "Flight" code lets you swim on all levels.

The final two are a little obscure. The "World Eight" code is an alternate method of selecting which world to load. You can modify the value to select other worlds. The so-called "Castle" code is used to select a specific level. Unfortunately, it uses the internal map numbers, so it's kinda difficult to use. I've yet to find an easy way of selecting a level.
Current ProjectsFinal Fantasy EngineSMB Special for NESStudio Karatorian
@loop: lda (src),y — sta (dst),y — iny — bne @loop — inc src+1 — inc dst+1 — dex — bne @loop

KingMike

My guess is that it's $25 or $26 because that is hundreds digit the VRAM address of the tilemap offset where the text is stored.

$2400-$27FF is the right side of the screen.
$2500 would be 8 tiles down from the top (that count includes the top tile that is generally considered "invisible" on NTSC TVs) as the screen is 32 ($20) tiles wide, thus each line occupies $20 bytes of the table.

It is probably big endian because to set the VRAM address to write to requires writing the high byte, followed by the low byte, both to $2006.
"My watch says 30 chickens" Google, 2018

hybrid

I could take care of any GG codes once the hack is finished or if you need any done for the most recent build.


Karatorian

Quote from: hybrid on May 10, 2008, 03:53:22 PMI could take care of any GG codes once the hack is finished or if you need any done for the most recent build.

Once the hack is finished, it would be kinda cool to include a list of handy GG codes, seeing as most SMB codes will no longer work. In the mean time, it's not really neccessary as I can do almost everything I need with FCEU cheats, which are actually easier to make and use.

Quote from: frantik on May 10, 2008, 05:40:45 PMfixed various bugs.. should be all good now

In light of these new patches, you can get the latest expanded patch here. The changes in this release are relatively minor. It, obviously, includes all the fixes Frantik just made. Also included is the original (anticlimatic, but complementary) end game victory message and slightly changed hack credits to accomodate it.

I'm currently working on a few things. One is a full credits sequence. The other is a few minor bug fixes and engine tweaks. We've decided to back off of the major engine changes with the new enemies and power ups for now. This is to focus on getting some of the samller issues out of the way first and to provide a stable codebase for extensive play testing. (Thanks, once again, to everyone who's helped with that.)
Current ProjectsFinal Fantasy EngineSMB Special for NESStudio Karatorian
@loop: lda (src),y — sta (dst),y — iny — bne @loop — inc src+1 — inc dst+1 — dex — bne @loop

Googie

I'll play with the three patches in a bit. You guys put alotta work into this, if I find anything I'l lgive a holler. See ya's. ^_~

SMB2J-2Q

Quote from: Googie on May 11, 2008, 07:22:44 PM
I'll play with the three patches in a bit. You guys put alotta work into this, if I find anything I'l lgive a holler. See ya's. ^_~

I'll holler back at you: Those L-pipes still where they shouldn't be.

Googie

Can you put up some pics? I haven't played the patches yet, still in Mother's Day celebration over here...