Language…
12 users online:  AmperSam, Cristian Cardoso, fanfan21, Golden Yoshi, Green Jerry, JezJitzu, Josuke Yoshikage, Maw,  Nanako, Shomi, tOaO, yoshi9429 - Guests: 245 - Bots: 301
Users: 64,795 (2,377 active)
Latest user: mathew

Has anyone ever tried to hack F-Zero (SNES) with ASM or similar?

First off, I know that F-Zero has an editor (Fuzee).

I'm trying to create an F-Zero hack, mainly for fun and for learning purposes.

But all the hacks that I see for F-Zero are just custom tracks and that's about it. Just the same plain stuff, no palette editing, no sprite editing, no stats editing.
I know F-Zero isn't extensively hacked and the game is not very documented for romhackers, the only good documents I have found were these:

F-Zero notes, by smkdan. I'm using this one as a reference for this document that I'm making (I hope there's no problem in doing that);
F-Zero ROM Info by FennorVirastar

I've made a new document recently, this time it's a RAM Map.

I have also found a disassemble tool by the creator of Fuzee (Puresabe I believe), it does a complete disassemble of the rom and comments the output depending on the options file. Sadly the addresses descriptions were in japanese, and Google Translate didn't cooperate much, but I was still able to find plenty of stuff through that (for example, the AI checkpoint info).

------------------------------------------------------------------
A few patches that I've made so far:
Be sure to patch a headerless F-Zero ROM (preferably a (U) ROM)

(See http://smwc.me/1380602 for info on the last update I've made)

"CPU Health Patch", adds health to CPU cars so they actually explode. It's still a work in progress but it works pretty good.
Download
Download (with player controlled by AI)
Download (for Fuzee's fzero.smc)
Download (with player controlled by AI, for Fuzee's fzero.smc)


- All damage types work for CPUs, except for frontal/back collision (lateral collision damage works);
- CPUs cannot recover health from the pit area yet;
- CPUs will instantly explode when falling of the track.
- Explosive cars will instantly explode when hitting walls or landmines.
- When a CPU explodes, it is warped behind the player using the original game's code;
- You can disable the AI by pressing select, and re-enable it by pressing select again (test feature, will not be present when the patch is completely finished).
- Landmines are now exploded when CPUs run over them while offscreen.

--------

F-Zero 2 new ghosts. Some ghosts of me playing, added directly into the ROM through some hacky methods
Download

F-Zero 2 "follow ghosts" patch. Simply for fun, instead of copying ghost info to the rival car it copies to your car. It doesn't work smoothly because the ghost data doesn't actually have the speed and velocity direction values
Download (with the original ghosts)
Download (with the new ghosts patch)
------------------------------------------------------------------
A few Lua scripts I've done so far:

(Will make donwloads like the patches later, for now just check these replies):

http://smwc.me/1365066 (checkpoint Info)
http://smwc.me/1368886 (Track Info)
http://smwc.me/1374672 (Car Info)

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

Planned to do:
- Make each CPU use the correspondent acceleration curve of their machines (all CPUs use Blue Falcon's acceleration);
- Make CPUs actually explode when falling off the track; DONE!
- Add health to CPUs (maybe? That would be too hard to do I guess); Partially done!
- Change booster to work like in F-Zero X (maybe?);
- Add booster to CPUs with a small chance of using them per checkpoint (configurable which checkpoint can fire a booster);
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
It would also be nice if F-Zero SNES had a utility where you can create custom songs and use them in your custom tracks in the game!
Originally posted by MKDSmaster91
It would also be nice if F-Zero SNES had a utility where you can create custom songs and use them in your custom tracks in the game!


Yeah, I've also been studying a little bit on how F-Zero handles SPC stuff, it uses N-SPC which SMW also does, but SMW has a different N-SPC version (e.g F-Zero has #$E0 for the "set instrument" command, SMW has #$DA).

But I was wondering, Earthbound has a pretty nice music editor and it also uses the same N-SPC version as F-Zero, maybe that could somehow be used to create songs?
I also know that the song pointers are at $1FD6 in SPC RAM and the index to the song can be found at $04 in SPC RAM

Edit:
Here's a little preview on what I have already done by now:
- Modified the palette of the water in Big Blue to a brighter color:

- Modified the palette of the lava in Fire Field, I still need to improve it a little:

- Modified the pre-recorded race subroutine (Demo race & Master difficulty ending race) to accept inputs for R/L/X/A buttons.

- Modified the "run over barrier" subroutine to flash the barrier's palette when a CPU runs over it. I always wondered why that doesn't happen in the original game.

- Modified the "hit wall" subroutine to flash the road's palette when a CPU hits a wall. I always wondered why that doesn't happen in the original game.


Planned to do:
- Make each CPU use the correspondent acceleration curve of their machines (all CPUs use Blue Falcon's acceleration)
- Make CPUs actually explode when falling off the track. DONE!
- Change booster to work like in F-Zero X?
- Add booster to CPUs with a small chance of using them per checkpoint
- Add health to CPUs (maybe? That would be too hard to do I guess)
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
Nice palette edits, especially the CPU modifications! Keep up the good work! #smw{:TUP:}
What a coincidence I found this thread. I do a search on google for "fuzee" every couple months to see if anybody is working on anything and happened to find this awesome thread today. Thanks for the new document CatadorDeLatas! Some really useful new finds in there. I don't think smkdan will mind. Haven't seen him around in ages. As you probably know, he was making a F-Zero course editor and then stopped when Fuzee came out. His had some more advanced options like changing track names, but he never released it.

I need to check out that disassemble tool by the Fuzee guy. Can you post a link to it? When I was looking for F-Zero info months ago (like smkdan's site and FennorVirastar's document) I must have looked at every page of the Fuzee guy's website to find any more info he might have posted. When you say it comments the output, do you mean it just writes the opcodes or actually comments on what a routine does?

I'm really impressed by your new ASM! Sadly, I barely grasp the basics of ASM. I've tried to do make some MSU-1 music hacks for the SNES, unsuccessfully so far. I'm able to find music registers/song pointers in Geiger's snes9x debugger, but all of the ASM code I write doesn't work.

I just sent FennorVirastar an email today to see if he would share his recreated tracks in Fuzee he made for his Legends hack (recreated version of the original game's tracks with harder AI). I let him know about this thread so maybe he will drop by. I'd like to make fzeeclips of the curves to speed up my track making process. most of my time is spent smoothing curves instead of actually designing courses.

Anyways, mostly all of the F-Zero hacks out there are not fun to play for one reason or another. Either they are too hard, or designed only with Fire Stingray in mind, or don't bother changing settings like the speeds of the cars or their AI (most just leave them all at one of the speeds all the time at every checkpoint). I have been working on tracks in Fuzee for a few months now and want to create tracks that are well balanced for every car, have appropriate difficulty, and smart AI for the cars. I've come up with a few fun courses and hope to release a hack someday that is fun for veterans and newcomers. Maybe you would like to collaborate on something together?

I was able to find the car's sprite palettes using Digisalt's SNES Palette Tools (http://www.romhacking.net/utilities/300/).
Did these just for fun, they're not good examples of complimentary colors or anything:


I may have notes with hex addresses that list each car's palette (this includes the tiny car in the bottom right and shadowed car seen in the car selection menu). I'll see if I can find them, but it's easy enough using Digisalt's program.

You may want to take a look at Fusoya's Compress DLL Module (http://fusoya.eludevisibility.org/lc/index.html. It is a decompression and recompression for a bunch of SNES compressions. I couldn't get it to work however, but I think it's just my ignorance on how to run the program. Many of the game's graphics are unfortunately compressed. It features the LC_LZ2 compression used by SMW, which I would think F-Zero would use since they were both launch games.

That would be great if ebmused could be used to modify the game's music. If you had the source code for ebmused you could probably modify it to work with F-Zero. Not sure if another game will work out of the box with the program. Zelda's editor Hyrule Magic also has a neat music replacement tool that often goes unused. This guy Metaquarius has done some music with it: https://www.youtube.com/watch?v=upcUjwskx3A. MSU-1 is always another option for new music.

I really like the modifications your doing to the CPUs. It has always bugged me that they all share the same acceleration (I believe Fennor also wrote once that every car's top speed is 478 like the Fire Stingray) and that they don't blow up when they go over the railing.

Having the boost work like F-Zero X (I assume you mean having unlimited boost that drains life, aka "risk vs reward") would be interesting. If you haven't check out F-Zero GP Legends and Climax for the GBA. They work that way, whereas Maximum Velocity uses the SNES way of one boost per lap. Honestly though, I've always preferred the SNES method of boosts. To me it has a more strategic angle. Sometimes saving your one boost in case something goes wrong or using it at just the right spot always feels rewarding.

Lastly, you should check out this thread I posted in over at SNESdev concerning the possibility of adding in a 2-Player Mode. No progress or anything , just speculation (http://forums.nesdev.com/viewtopic.php?f=12&t=12427&sid=d70de1979b9ad0fb08ea4d2d832b8a28). Here's some hex notes that I posted in the thread that were found at the defunct FZVS blog (server based online 4-player multiplayer version of F-Zero SNES). Some neat edits like stopping the demo race at the beginning from appearing:

Quote
Now I will explain exactly what happens inside the SNES emulator when you load the ROM (only the ROM specific stuff needs to be mentioned):

1) To disable any menu selections at the title screen other than the first option, patch 03:8176 INC to NOP:
Memory.ROM[(0x8000*3)+0x0176] = 0xEA;

2) To disable the 'demo race' at title screen (as this will trigger game states we don't need), patch 03:8143 BNE $8148 to BRA $8148:
Memory.ROM[(0x8000*3)+0x0143] = 0x80;

3) Then we wait for the player to select a car. To catch car selection, check memory status at $7E:0055. When it equals 0x03 we know a car has been selected. You can determine which car was selected by reading $7E:005A at this point. The order (from 0-3) is bf (blue falcon), gf (golden fox), wg (wild goose), fs (fire stingray). This is a different representation to what is used internally in the F-Zero ROM, where it is bf, wg, gf, fs. So I change the returned value to suit that.

4) We should not proceed to the game until all players have entered their car selections. So, we wait for the game to start transitioning to the next screen, breaking when $7E:0055 == 0x05. When this condition is met, we halt the screen progression until we receive notification from the server that everyone is ready. In order to pause the game while keeping the music playing etc, we patch the ROM 03/851F: A5 55 F0 74 LDA $55 to become 5C 1F 85 03 JMP 03851F.
Memory.ROM[(0x8000*3)+0x051F] = 0x5C;
Memory.ROM[(0x8000*3)+0x0520] = 0x1F;
Memory.ROM[(0x8000*3)+0x0521] = 0x85;
Memory.ROM[(0x8000*3)+0x0522] = 0x03;

5) We only continue when we have received notification from the server that all the players have selected their cars. Furthermore the server will have sent other data such as the track to race on, player id, number of players in the race etc.

6) Then we set the car types based on the data received from the server. The player previously received from the server a player id, this is a unique value from 0 to 3. It determines the players position in the starting line from left to right.

So, let's assume we are the first player to log on to the server, making our player id == 0. This means, our car will be in the fs position on the starting line, on the far left. However, let's assume we chose bf as our car.

We need to change the viewpoint of the car to match the fs location. To do this, we patch 00:D2EF A5 52 LDA $52 to A9 0x LDA #$x where x is a value from the internal representation of the car selection (being bf, wg, gf, fs):
Memory.ROM[0xD2EF-0x8000] = 0xA9;
Memory.ROM[0xD2F0-0x8000] = x;

To set the player car palette to be based on the player id, patch 00:D72B LDA $52 to LDA #$pid where pid is the player id:
Memory.ROM[0xD72B-0x8000] = 0xA9;
Memory.ROM[0xD72C-0x8000] = pid;

Then we can set the opponent car types, based on the data we received earlier. To do this, we write to RAM:
Memory.RAM[0x1133] = x;
Memory.RAM[0x1135] = y;
Memory.RAM[0x1137] = z;

where x, y and z are the player car types from right to left on the starting line, excluding the player id's location. So in our example of having player id == 0, with the starting line order being (fs, bf, wg, gf) the code would be:
Memory.RAM[0x1133] = player who is in the gf position;
Memory.RAM[0x1135] = player who is in the wg position;
Memory.RAM[0x1137] = player who is in the bf position;

Then we can set the colours of the opponent cars. Our aim is to make sure that the first car is always pink, second is always blue, third is green and fourth is yellow - no matter what car type is selected. We write to RAM at 0x0C41, 0x0C43, 0x0C45, 0x0C47 where 0x0C41 is the player car's colour, and the 0x0C43/5/7 are the colours of the opponents based on the player id. So, if we are in player id position 0:
Memory.RAM[0x0C41] = 0x0E;
Memory.RAM[0x0C43] = 0x08;
Memory.RAM[0x0C45] = 0x0A;
Memory.RAM[0x0C47] = 0x0C;

Finally we then make a few small patches that are needed to make things run smoothly. We patch the code at 00:D486 LDX #$00 to JMP $D4A7, to skip the car loop iteration:
Memory.ROM[0xD486-0x8000] = 0x4C;
Memory.ROM[0xD487-0x8000] = 0xA7;
Memory.ROM[0xD488-0x8000] = 0xD4;

we patch the code at 00:D32B STA $1131,X to NOPs, to make sure the car types are never overwritten:
Memory.ROM[0xD32B-0x8000] = 0xEA;
Memory.ROM[0xD32C-0x8000] = 0xEA;
Memory.ROM[0xD32D-0x8000] = 0xEA;

and to stop the player car palette from defaulting back to the original when it crosses the finish line, patch 00:8DB6 JSR $C782 to NOPs:
Memory.ROM[0x8DB6 - 0x8000] = 0xEA;
Memory.ROM[0x8DB7 - 0x8000] = 0xEA;
Memory.ROM[0x8DB8 - 0x8000] = 0xEA;

8) Now I need to explain how the F-Zero game actually works.

F-Zero tracks the progress of five displayed cars. The locations of these cars are stored at: 7E:0B70-0B79 (x values) and 7E:0B90-0B99 (y values). Since each race has something like 20 cars or more, there are many cars on the track whose locations are unaccounted for at any one time. When these cars need to be displayed, the game 'places' them on the track where it thinks they should be, based on a checkpoint system, rather than actually racing them around the track properly. This was probably done due to SNES system constraints, but discovering this answered a lot of questions for me. Ever wonder why there was always a car right behind you, no matter how well you were driving? Now you know :)

What this means, is we need to make a few more modifications.

We need to get rid of the annoying opponent 'catch up' code. As I stated above, the game often decides when a car is about to over take you. It's not like the cars are always racing around the track in a linear fashion. The game may decide to make a car jump from really far away, to just behind you, simply because you are playing poorly. We can't have random 'check' warning messages in our multiplayer races either.

We also need to get rid of all the generic enemy cars, these are the ones that have the boring racing stripe and never win the races. If we don't do this, the code will just keep introducing them in to the game everytime we crash in to the wall a few times.

The good news is we can solve both problems simply. We patch 00:DDFC JSR $DED0 to EA NOP * 3:
Memory.ROM[0xDDFC - 0x8000] = 0xEA;
Memory.ROM[0xDDFD - 0x8000] = 0xEA;
Memory.ROM[0xDDFE - 0x8000] = 0xEA;

9) Next we have to stop the opponent AI from working, while still allowing the cars movement. If we don't do this, then the car will have jagged motion around the track as it is receiving contradicting movement commands from the server and the AI. So, we patch 00:DDDA JSR $DE57 to EA NOP * 3:
Memory.ROM[0xDDDA - 0x8000] = 0xEA;
Memory.ROM[0xDDDB - 0x8000] = 0xEA;
Memory.ROM[0xDDDC - 0x8000] = 0xEA;

10) Now another thing you will notice is that when the race first starts, even though you have disabled the opponents AI, they still boost off the finish line (before slowing to a halt). If we don't stop this boost, the car will have the same jagged motion described earlier at the start of the race. So we patch 00:8D3E LDA #$02 to LDA #$00:
Memory.ROM[0x8D3F - 0x8000] = 0x00;

11) The race relies on synchronization, and if a player accidentally pauses the game they will break the synchronization. So we disable pausing by patching 00:C8FF F0 06 BEQ $C907 to be 80 06 BRA $C907:
Memory.ROM[0xC8FF - 0x8000] = 0x80;

12) Now we must make sure that when the race is complete, the game does not proceed beyond the race time summary screen until it receives notification from the server that all players have finished. We patch 00:CD84 90 03 BCC $CD89 to be 80 03 BRA $CD89:
Memory.ROM[0xCD84 - 0x8000] = 0x80;

13) And finally, we can resume execution of the ROM (from point 4 above) meaning the game will progress beyond the car select screen to the league selection:
Memory.ROM[(0x8000*3)+0x051F] = 0xA5;
Memory.ROM[(0x8000*3)+0x0520] = 0x55;
Memory.ROM[(0x8000*3)+0x0521] = 0xF0;
Memory.ROM[(0x8000*3)+0x0522] = 0x74;

14) We skip the league and difficulty selection because it is already chosen for us by the server. I do this crudely by patching 03/8795: B0 35 BCS $87CC to BRA $87CC 80 35:
Memory.ROM[(0x8000*3)+0x0795] = 0x80;

and by patching 03/87E6: 6B RTL to be another INC $55 (this makes it 7, to start the race). Note this pushes the RTL into the 'class' select code but that code is not used anyway:
Memory.ROM[(0x8000*3)+0x07E6] = 0xE6;
Memory.ROM[(0x8000*3)+0x07E7] = 0x55;
Memory.ROM[(0x8000*3)+0x07E8] = 0x6B;

15) We instead set the league and the track number by patching the RAM at 7E:0053 (track number) and 7E:005A (league number).
Memory.RAM[0x53] = track_num;
Memory.RAM[0x5A] = league_num;

16) By this stage the game is preparing to start the race. All players need to send their location and orientation to the server before the race starts, otherwise the opponent cars will temporarily disappear as the server has not been told where they are. We wait for the locations to be loaded by breaking when 7E:0054 == 2, 7E:0055 == 0 and 7E:0056 == 2:
if((Memory.RAM[0x54] == 0x02) && (Memory.RAM[0x55] == 0x00) && (Memory.RAM[0x56] == 0x02))

then we read the 16 bit value at 7E:0B70 (this means also 7E:0B71) to get the x value, and similarly 7E:0B90/1 for the y value. The car's orientation is at 7E:0BD1.

17) Once the server has received all the data required, it can instruct the clients to start the race. Each emulator must now send the player's location to the server, while receiving and updating the opponents locations from the server as fast as possible. It should be obvious that the opponent x and y location values are stored in RAM at 7E:0B72/3,7E:0B74/5, 7E:0B76/7 and 7E:0B92/3,7E:0B94/5, 7E:0B96/7. Similarly the opponent orientation data is at 7E:0BD3, 7E:0BD5 and 7E:0BD7 where the order is based on the player id.

18) We want to be able to tell the server when our player has finished the race, either by crossing the finish line or destroying the car. So we watch the RAM at 7E:0054 until it equals 3:
if(Memory.RAM[0x54] == 0x03) game_state = GAMESTATE_RACEFINISHED;

19) And there is just one tiny other detail. There is a fifth car. Remember above, I said the AI controls 5 cars at any one time? Well this fifth car is a generic car and we need to remove it. I do it the laziest way possible, I just constantly reset it's location to zero every vsync.
Memory.RAM[0x0B78] = 0;
Memory.RAM[0x0B79] = 0;
Memory.RAM[0x0B98] = 0;
Memory.RAM[0x0B99] = 0;

............................................................

Car collisions will not work properly until we make a few modifications. When a collision between two cars occurs, both emulator instances involved try to control both car rebound velocities. This conflict results in jagged movement.

The solution to this is to:

a) Make sure that each emulator instance only rebounds its own player during a player-opponent collision by patching occurrences of the code 99 20 0B STA $0B20,Y to NOPs at ROM addresses 00:BDB2, 00:BDD5, 00:BDEF and 00:BDFE.

b) Make the player's rebound speed equal to his current speed instead of the opponents speed (which is what happens in the game) by patching occurrences of the code 9D 20 0B STA $0B20,X to NOPs at ROM addresses 00:BDAE, 00:BDCB and 00:BDE5.
aaaaa please don't use code tags like that, it stretches the tables wildly. try quote tags instead

this is some really nice work going on here though!
Hi,

first of all, thanks for reaching out to me. I'd love to contribute
something to this project. I am not a programmer and do not know much
about the technical stuff. Most of the rom adresses I figured out by
looking at the Rom map provided by smkdan. I simply changed Bytes
near to ones he documented and looked what happens. Since I know much
about F-Zero in general, I often already had an idea what they could change by recognizing certain patterns.

Here are a few things that may help you.

https://www.mediafire.com/?x7fwd29lckfkohf

fzeeclip includes a huge folder with different track tile sets. This
makes building tracks much more handy.

Info includes the textdocument you linked above, also some codes and
maps I used to rebuilt the original tracks. (Yes, I rebuilt them, I
didn't hack the original track data into fuzee)

Rom just includes a set of different rom hacks I downloaded. So most
of them are not made by me, I named them by the authors, whenever I
knew from who they were.

The rest are tracks made by me, I included the stuff from the working
folder. I hope those are the final versions I had (I saved them all
over the place and it was really messy). Wild Goose Master and Legend
are the only complete hacks. Rebalanced is the only one that includes
stat changes to the car. There I tried to balance it in a way that
one car has the highest top speed, another one the best grip, another
one loses the least amount of speed when going off the accelerator,
and one with the best acceleration and turning radius. The first
track was supposed to be for the high speed cup, where on master
difficulty only the cars with highest top speed and best grip could
shine. Two hacks worth mentioning are also two where I changed the 4
main cars to the F-Zero2 cars. And one where I changed the 4 main cars in F-Zero2 to the ones in F-Zero1.

I also know a lot about the fuzee editor and what most people did not
consider when building their hacks, I'll get to it when I have a
little bit more time.

A few things random stuff that just comes to my mind: I am not sure
whether it will be a good idea to give the cpu drivers different top
speeds. It will make balancing just harder. Fire Stingray may just
pull in front and increase the gap further and further. You would
also have to adjust the turning of the individual CPU cars, so that
they can play out their advantages, too.

I like the idea of having a boost like the one in F-Zero X. I don't
really like how it works in the SNES version. I would also like to
see the CPU drivers use it. My hacks always had the philosophy to
give the CPU drivers the same tools as the player. They should feel
like actual opponents, so that you have proper battles. Most hackers
don't seem to care about CPU drivers at all.

I'd love to see the top speed increased from 478kph to something
higher where you actually have to brake somtimes. I had a few
problems with that though. First of all, I didn't know how to change
the CPU cars top speed. In fuzee I can set them to 4 different
speeds. One is (on master) about 250kph, one is 320, one is 385 and
the highest 478. Also I had to use more Bytes for the acceleration,
but I think that wasn't a big deal, since before Blue Falcons
acceleration set there is another acceleration set that seemed to be
unused. Another problem was that top speed semmed to be locked at
478kph in another way than just by the 8 Bytes for the 4 vehicle top
speeds. When I changed the cars top speed to something higher and
gave them acceleration > 0 for speeds above that I could see the
speed o meter getting higher, but I did not effectively driver
faster. Only when I tried to drive diagonaly my speed increased,
which makes believe the X-speed and Y-Speed are locked at 478kph, so
when I drive diagonally I have 478kph for both, X and Y, making my
speed effectively 478 * 2^1/2. Which is wierd to me, since the boost
pads increase your speed properly.

Something that really annoys me is how collisions are handled. When
you drive 478 kph and bump into a car doing 470 kph from behind (so
just a 8kph difference) you will nearly stop, a very small touch
shouldn't do that. It would be better if it decreased your speed to
470 and increased the speed of the car infront to 478. (Btw. the
speed o meter for some reason is not proportional to actual speeds.
Half the speed of 478 acutally is 175, not 239 as expected)

Jump plates. For some reason they reduce your speed, but then for a
short amount of time you accelerate (depending on the first Byte for
acceleration of the car), making your speed go up, also giving you an
advantage over the cpu. By setting the Byte to ~20 your speed will
approximately stay the same. I made use of that in my Rebalanced
hack, I gave some cars a slightly higher value than 20, others a
slightly lower, so that I have cars that are good or bad at jumping.

I think there is a bug with boost pads and CPU drivers. Sometimes
they hit it but it still isn't working. I know that it is only
working for the player when he points in the same direction as the
boost pad. And for some reason it is also not working for the CPU
driver when the PLAYER is pointing in the wrong direction, instead of
the CPUs direction.

Something I'd also like would be more lifes and hit points in
beginner class, if that is doable. I like the feeling of having your
race end when you make just one mistake (for master mode). But the
information I have does not allow me to increase the damage done by
the track borders enough, FF damage is still low. And I don't want to
set the electric barrier to higher damage, since I want it to be
something like a curb which you are using for tight turns on purpose.

For the Legend hack I used a code to disable the brown cars. I hated
them, they are just not fun at all. An artificial way to make your
race not boring when you are in front. I would be ok with them if
they would drive as fast as you, and slow down on straights to let
you go by. But the easier way probably would be to just disable them
completely if you agree with that. What do you think about them? Are
they fun? (Should have read your post before that. You don't seem to like them either.. that's good)

A small detail: With Golden Fox it is actually the best thing to
BRAKE after hitting a boost pad to get the most speed of it. That's
because at a certain speed braking of the Golden Fox is weaker than
the deceleration when being above the top speed, while braking always
has higher priority.

Another idea: Starting further down the grid. If you decide to get
rid of brown cars, this could compensate for the lack of traffic when
removing them. And this way you will have proper battles instead of
annoying lapped cars. I believe 5 cars can be traced at a time,
before one car gets deleted to make a car behind or infront of you
spawn.
That is very nice!

Originally posted by Fennor
(Yes, I rebuilt them, I
didn't hack the original track data into fuzee)


That must have taken a long time! But I found very clever the way you made the grid on the maps to be able to build them properly. Even though only Mute City and White Land II were accurate (all the other tracks needed the grid to be 8 pixels higher to be accurate), that might explain why you didn't find all of the original tiles.
I actually have the original BGs for regions 0, 4, 7 and 8. (https://drive.google.com/file/d/0B4YJbviExFHhQTRQQUNDNTBLTlk/view?usp=sharing)

Originally posted by Fennor
I am not sure
whether it will be a good idea to give the cpu drivers different top
speeds. It will make balancing just harder. Fire Stingray may just
pull in front and increase the gap further and further. You would
also have to adjust the turning of the individual CPU cars, so that
they can play out their advantages, too.


I was also thinking about the turning speed of the CPUs, but I'm not too sure yet on how to go about that since the game seems to use a fixed value (or maybe not?) depending on the "Turn Performance" bits from the checkpoint properties.

Originally posted by Fennor
I'd love to see the top speed increased from 478kph to something
higher where you actually have to brake somtimes. I had a few
problems with that though. First of all, I didn't know how to change
the CPU cars top speed.
Another problem was that top speed semmed to be locked at
478kph in another way than just by the 8 Bytes for the 4 vehicle top
speeds. When I changed the cars top speed to something higher and
gave them acceleration > 0 for speeds above that I could see the
speed o meter getting higher, but I did not effectively driver
faster. Only when I tried to drive diagonaly my speed increased,
which makes believe the X-speed and Y-Speed are locked at 478kph, so
when I drive diagonally I have 478kph for both, X and Y, making my
speed effectively 478 * 2^1/2. Which is wierd to me, since the boost
pads increase your speed properly.


I don't know if this info is correctly because I haven't looked too much into it yet, but it looks like the game has 4 tables for all of the 4 difficulties, and each of these table I believe are divided into 3 sections: Main machines, purple machines and green machines.
And about the X-Speed and Y-Speed, I can try looking into the RAM addresses while going fast since I know where they are. When the player hits a dash plate, the game sets a flag, similarly for CPUs, but they use a different flag for some reason.

Originally posted by Fennor
Something that really annoys me is how collisions are handled. When
you drive 478 kph and bump into a car doing 470 kph from behind (so
just a 8kph difference) you will nearly stop, a very small touch
shouldn't do that. It would be better if it decreased your speed to
470 and increased the speed of the car infront to 478. (Btw. the
speed o meter for some reason is not proportional to actual speeds.
Half the speed of 478 acutally is 175, not 239 as expected)


The game actually does what you described, but it also sets an "out of control" flag for your car (the same flag that is set when slipping on ice), this flag sets the top speed to 363km/h for some reason.
Speed 478 in hex is 0900h (2304 in decimal!), I guess the game has some sort of formula to display the speed without going beyond 999.

Originally posted by Fennor
Jump plates. For some reason they reduce your speed, but then for a
short amount of time you accelerate (depending on the first Byte for
acceleration of the car), making your speed go up, also giving you an
advantage over the cpu. By setting the Byte to ~20 your speed will
approximately stay the same. I made use of that in my Rebalanced
hack, I gave some cars a slightly higher value than 20, others a
slightly lower, so that I have cars that are good or bad at jumping.


I have already looked into this, I know where the code that slows you down is, but I couldn't find the code that increases the acceleration for a short period. Knowing that it uses the acceleration table will make it a lot easier for me to find that piece of code.

Originally posted by Fennor
I think there is a bug with boost pads and CPU drivers. Sometimes
they hit it but it still isn't working. I know that it is only
working for the player when he points in the same direction as the
boost pad. And for some reason it is also not working for the CPU
driver when the PLAYER is pointing in the wrong direction, instead of
the CPUs direction.


Weird, I have never noticed that. I can try looking into it.

Originally posted by Fennor
Something I'd also like would be more lifes and hit points in
beginner class, if that is doable. I like the feeling of having your
race end when you make just one mistake (for master mode). But the
information I have does not allow me to increase the damage done by
the track borders enough, FF damage is still low. And I don't want to
set the electric barrier to higher damage, since I want it to be
something like a curb which you are using for tight turns on purpose.


That is probably possible by having multiple tables, each for a different difficulty.

Originally posted by Fennor
For the Legend hack I used a code to disable the brown cars. I hated
them, they are just not fun at all. An artificial way to make your
race not boring when you are in front. I would be ok with them if
they would drive as fast as you, and slow down on straights to let
you go by. But the easier way probably would be to just disable them
completely if you agree with that. What do you think about them? Are
they fun? (Should have read your post before that. You don't seem to like them either.. that's good)


Yes they are very annoying xD, I think creating another "checkpoint property" byte for them would be too much, they normally use a random byte from the purple/green generic cars.
I think disabling them completely, while allowing CPU warp, would be the best way.

Originally posted by Fennor
I believe 5 cars can be traced at a time,
before one car gets deleted to make a car behind or infront of you
spawn.


The game can actually keep track of 6 cars at a time (player and 5 CPUs), but the sixth car is only used when a player finishes a race (to show the CPU driving your car), if you set the "on race" flag for the sixth car while you're in a race the game will get really laggy. This sixth car also doesn't have collision with the player and it doesn't seem to have a rank.
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
Hey Fennor, thanks for dropping by.

Thanks so much for the download! The Legend maps recreated from the original game will be really helpful to me with making fzeeclips of certain turns. A lot of great tilesets in the fzeeclips folder too!

I like what you've done with the Rebalanced hack. The Fire Stingray is just too overpowered in the original game, so having better balanced cars is interesting if done right. I feel like the cars from F-Zero 2 (Ace League) are all more balanced, but it has a negative effect to me, like they all kind of drive the same it feels like sometimes. No one car really stands out (maybe the Luna Bomber with it's top speed).

You're right, there's a lot about Fuzee that most people don't take to their advantage. Like you mentioned speed is one of them. Another is the setting on the cars' tendency to slide around corners (if set at 3 they can turn really sharp turns with no problems). Also see the info about Bits under Checkpoint Properties and Machine-Sppecific Checkpoint Properties in Catador's document.

That's odd about the speed increase only occuring when driving diagonally.

I tried to hardcode your PAR code (7E10D5FF) to turn off all brown cars and warping, however it's not working for some reason. I read you can take the first 6 digits of the PAR code (it's a SNES address) and convert it to a PC address with Lunar Address and then change the last two digits to whatever's in the code. So 7E10D5 translates to 1CE8 in a hex editor. I changed the value there to FF (PAR: 7E10D5FF), but the cars still show up. I tried to use the program Classic Game Cheat Codes Game Patcher and it errors out and says the address is too long. Apparently this program has issues with high range RAM codes, so maybe that's the problem. Maybe Catador can solve it. Here's some relevant information from Catador's document:
Quote
"7E:1060: How many non-generic CPU machines are loaded. Probably used to make sure there are no more than 3 normal CPU machines on race.
7E:10D4: How many unloaded machines are in front of you, waiting to be placed on the track. Used as an index for 7E:1100 and 7E:1118 when a machine needs to be loaded again."


I never knew that the Golden Fox's brake is faster than acceleration after hitting a boost. Reminds me that the speedrunners do something called break boosting (even with Fire Stingray I believe).

What do you mean by starting furter down the grid? And you are right that the game keeps track of 5 cars. The author of F-Zero VS (which tracks positions of up to 4 players) said that he could have adden a 5th car, but that there was no room at the starting line.

Catador, I found the disassemble tool that puresabe made. For those wondering, it's at this page: http://www.geocities.jp/borokobo/neo/download.html
Put an F-Zero rom in the folder and rename it to input.smc and then run the program. It should make a output.txt file with comments. Do you know how to use the program with the opt_files?
Originally posted by CatadorDeLatas
That must have taken a long time! But I found very clever the way you made the grid on the maps to be able to build them properly. Even though only Mute City and White Land II were accurate (all the other tracks needed the grid to be 8 pixels higher to be accurate), that might explain why you didn't find all of the original tiles.


I think the maps didn't show the whole track, so I didn't know where the track would actually start. Horizontally it is clear where it has to be within one section (set of 16 tiles). Because you can only place the start/finsish checkpoint right in the middle of it. Vertically you can move it around, I just assumed that most tracks would also have the track in the middle of a section, this way it looks more "right" in the editor. I remember noticing that it could be wrong though. As far as I remember I moved one part of port town by 8 pixels to get the magnet stripes in their, I couldn't find the proper tiles without moving them.

Originally posted by CatadorDeLatas
I don't know if this info is correctly because I haven't looked too much into it yet, but it looks like the game has 4 tables for all of the 4 difficulties, and each of these table I believe are divided into 3 sections: Main machines, purple machines and green machines.


The 3 sections part seems accurate. On lower difficulties green and purple cars are slower than the main cars, and I believe the green ones slower than the purple ones. I think it also depends how far down the grid you are, the purple and green cars seem to get worse or drive a different line when you are behind.

Originally posted by suFami
I feel like the cars from F-Zero 2 (Ace League) are all more balanced, but it has a negative effect to me, like they all kind of drive the same it feels like sometimes. No one car really stands out (maybe the Luna Bomber with it's top speed).


Yes, I think overall it is a little bit better balanced. Lunar Bomber is about the same as Fire Stingray, maybe a little bit worse, but also depends on the track. Blue Thunder and Green Amazone are both better than Blue Thunder and Golden Fox. For some reason Fire Scorpion is about the same as Wild Goose, not a improved version. It is slower than the Blue Thunder, has worse acceleration, worse grip, loses more speed when not on the accelerator... Just like the Fire Stingray seems be better in everything, the Fire Scorpion is worse in everything.

Grip is probably what has the biggest effect on making cars feel unique. Fire Stingray has shitloads of it which makes it feel much different from other cars. Lunar Bomber does not have that much grip, it feels the heaviest though with its high turning radius. In the original F-Zero weight feels more similar between the different cars.

Originally posted by suFami
You're right, there's a lot about Fuzee that most people don't take to their advantage. Like you mentioned speed is one of them. Another is the setting on the cars' tendency to slide around corners (if set at 3 they can turn really sharp turns with no problems). Also see the info about Bits under Checkpoint Properties and Machine-Sppecific Checkpoint Properties in Catador's document.


I myself set the turning properties for AI cars to the best for each checkpoint. I just layed out the checkpoints in a way that they form a realistic racing line. It was much easier for me to make them follow the line I want. If you make them slide, they will just be carried to the outside of the turn, try to move shaprly towards the racing line, overshoot and having to sharply turn the other direction again. That's especially extreme in GP Legend. If there is a combination of a few very light right and left turns, they will just slightly get off the line in the first turn, by trying to get back in the middle and overshooting they get even more off the line for the second turn, and at some point they will hit the wall.

Originally posted by suFami
I never knew that the Golden Fox's brake is faster than acceleration after hitting a boost. Reminds me that the speedrunners do something called break boosting (even with Fire Stingray I believe).


Actually Golden Fox can also do that trick with the boosts you gain every lap. With Golden Fox it just works the other way around. Fire Singrays braking ist much stronger than the speed it loses naturally. The boost sets you to ~525 kph, and as soon as you dropped down to 478kph it will jump up to 525 again. So if you break at 500kph you will get to 525 faster and spend less time at the low speeds of 478 - 500kph. With the Golden Fox you can break from 525 to 500 to stay at the speed longer, then release the brake until you get to 525 again. You would have to brake much more frequently though, and the effect is much smaller than it is for Fire Stingray. With WIld Goose it works the same way as for Fire Stingray, but also not as effective. For Blue Falcon it does not work at all, since braking is just as strong as not braking.
The boost pad trick for Golden Fox works only when braking at the right speeds. The natural speed reduction is constant, while braking power depends on your current speed. At about 630kph both are the same, then you have to start braking.

Originally posted by suFami
What do you mean by starting furter down the grid?


You start in something like position 10. If you remove brown cars, it would be a good idea to give the player something that makes him busy. I understand why they implemented them into the game, they didn't want them to have an easy race as soon as you are in front, while struggling for the whole race just because you messed up in the beginning.
The wipeout games have a similar philosophy. They let you start at the back of the grid, so that you are busy overtaking for the whole race. Which is more fun than just driving ahead of the field for the most time of the race.
Rubberbanding is another way many racing games handle it. They are driving faster when they are behind and slower when they are in front, what feels more like being cheated on as a player though. The warp mechanic of the CPU cars is similar, but I think is even worse since it can instantly reset any gap you made.
Maybe you would have to stretch the grid at the start, though. Of course you can't display oll 9 cars in front of you, so you have to make the 5th car - the last one you can see - far back at the horizon, while others in front spawn as soon as you catch up.
Originally posted by CatadorDeLatas
- Make CPUs actually explode when falling off the track.


I have finally made it!
I have actually done that 2 days ago but it was VERY buggy (same car type would respawn, rank wouldn't update, etc).
The way I currently made it doesn't seem to have any apparent bugs.
Here's a little test video: https://youtu.be/9QxeZ6A14C8

In case you are wondering about the AI only moving sometimes, I also have a patch that lets me toggle the AI on-the-fly by pressing Select, which helps me a lot with testing this.

At 0:05 in the video you can notice a green car spawning right after Fire Stingray is destroyed, that green car is actually the same destroyed Fire Stingray, just modified to look like a generic car. (It can either be a purple or green, chosen "randomly" depending if value from the frame counter 7E0051 is even or odd).

To update the rank I'm just moving the destroyed car a few checkpoints behind (more precisely, 2 checkpoints), but I figured that is way too close from where the car was destroyed and I would not like people being able to actually see the cars (re)spawning.

-------

I'm still considering on whether implementing a health for CPUs or not, since the original F-Zero doesn't have any kind of offensive moves (besides knocking other cars off the track) and the CPUs barely hit walls (the only place where I see CPUs hitting walls without influence of other cars is in the last corner in Silence).


----------------------------
EDIT:
There's something else I have done now, I made a LUA script for snes9x-rr 1.51 (not sure if the script works on bizhawk or whatever) that shows (almost) all the info about the player's current checkpoint, Fuzee users will most likely identify themselves because it's the same way F-Zero stores checkpoints (SpdCfg ranges from 0-3, TurnPerf ranges from 0-3, etc.).

I have a test video (https://youtu.be/ZZ_iaYbZ_g4) and also some screenies:


Fuzee users will identify themselves with this image. The Fire Field magnet road isn't actually a branch per se, the checkpoints are actually laid out in the middle of the barrier thingy, except they have an offset configuration (ever wondered why the normal machines would never take the path on the right?)


Another example of offset. You might notice "OffsetDist" is set to 0, but it actually does a little offset. 0 = little offset, 3 = maximum offset. To make no offset at all "OffsetDir" should have been set to "none".


Ever wondered why some CPUs seem to drive into some of the Fire Field landmines on purpose? Take a good look at the green offset configuration.


An example of "explosiveSitter" set to false. This configuration controls whether stationary explosive cars should spawn on this checkpoint or not. It is only set false on some places where it would be unfair and pointless (e.g right after a jump plate).
Note that this config is ALWAYS set to false on the last checkpoint of all tracks! I have set the config to true on one track just to test out if something would change, it turned out that my rank would get screwed up when I finished a lap.
This option isn't actually available in Fuzee for some reason.

The code for the script can be found here: http://pastebin.com/G7i5dDS6 (excuse the spaghetti code please)
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
Originally posted by CatadorDeLatas
Here's a little test video: https://youtu.be/9QxeZ6A14C8


Really cool, keep up the good work.

I was laughing at the video how you're just knocking cars off left and right because of the Pause function haha. I wonder what happens if you pause all the cars with the Select function and then re-lap them or finish the remaining laps with them paused? Since the game can only remember up to 6 cars their positions must be erased and you're driving on an empty track until you unpause everyone? Or does it pause up to 5 cars in whatever their position is and if you overlap them they still show up in the same spot because they saved right there?

Fennor said that the green and purple cars drive slower than the main cars on the any difficulty below Master, so when a main car is respawned as a green/purple does that mean they also drive slower? This could make races too easy on difficulties lower than Master, but maybe not if they're not that much slower.

Originally posted by CatadorDeLatas

I'm still considering on whether implementing a health for CPUs or not, since the original F-Zero doesn't have any kind of offensive moves (besides knocking other cars off the track) and the CPUs barely hit walls (the only place where I see CPUs hitting walls without influence of other cars is in the last corner in Silence).


It's up to you. In my opinion, I don't think it's needed. I don't think I've ever hit the others cars enough or seen them him the walls enough to the point that it would kill them if they actually had health.
You can always write the ASM for it, but not use it so you have it just in case. However, if you're going to do the "Add booster to CPUs with a small chance of using them per checkpoint" edit then maybe it would make more sense for them to have health so that if every time they boosted it took away some of their health (like it does to a player when boosting in F-Zero X).

Originally posted by CatadorDeLatas
I actually have the original BGs for regions 0, 4, 7 and 8. (https://drive.google.com/file/d/0B4YJbviExFHhQTRQQUNDNTBLTlk/view?usp=sharing)

Thanks for these! I had actually told Fennor in my original email to him how I tried to remake the BG tiles for Mute City and it took hours to scroll through all of the tiles in Fuzee to match the tiles to an image of Mute City's BG. I can't imagine how long it took you to reconstruct these.

Originally posted by CatadorDeLatas

Fuzee users will identify themselves with this image. The Fire Field magnet road isn't actually a branch per se, the checkpoints are actually laid out in the middle of the barrier thingy, except they have an offset configuration (ever wondered why the normal machines would never take the path on the right?)


Yes, this is one of the functions in Fuzee that is seemingly never used by hack makers. However, it can be very useful in making races more difficult. Even a straightaway portion can be made more difficult if the main cars/green cars/and purple cars are all on different points on different checkpoints.
For anyone reading the thread new to Fuzee, a tutorial on how to do this in Fuze can be seen here (turn annotations on): https://www.youtube.com/watch?v=l6ngh30IB5A

Originally posted by CatadorDeLatas
Ever wondered why some CPUs seem to drive into some of the Fire Field landmines on purpose? Take a good look at the green offset configuration.


Yeah, I have noticed this. They almost always crash into the mines on the left side, which the LUA script confirms.

I think you should put a link to the LUA script and these image explanations in your document for anyone who might come across the document, but not this thread. Really impressive work on the script by the way.

I wonder what point the brown cars drive on: main, green, or purple? I'll check in Fuzee and report back.

Originally posted by Fennor
You start in something like position 10. If you remove brown cars, it would be a good idea to give the player something that makes him busy. I understand why they implemented them into the game, they didn't want them to have an easy race as soon as you are in front, while struggling for the whole race just because you messed up in the beginning.


Oh I see what you mean. I'm not sure this is a good idea. I know on Master difficulty I sometimes can be 1st the whole race and make one little mistake on the last lap and drop positions to lose the race. Combine that with starting further down the grid and the race's might be too difficult, especially for the average player.

Originally posted by Fennor
Lunar Bomber does not have that much grip, it feels the heaviest though with its high turning radius. In the original F-Zero weight feels more similar between the different cars.

That reminds of something I read in an interview that Isshin Shimizu, one of the designers of SNES F-Zero, said about making F-Zero Maximum Velocity for the GBA. He said,
Quote
"At the time of the SFC [SNES F-Zero] we couldn't program individual unit weights but this time each one is different with respect to weight."
I think they were already trying to give the cars from F-Zero 2 (Ace League) more of a sense of weight, but sadly this game was abandoned and work turned towards F-Zero X.
Originally posted by suFami
I wonder what happens if you pause all the cars with the Select function and then re-lap them or finish the remaining laps with them paused? Since the game can only remember up to 6 cars their positions must be erased and you're driving on an empty track until you unpause everyone? Or does it pause up to 5 cars in whatever their position is and if you overlap them they still show up in the same spot because they saved right there?


Well, the sixth car (I like to call it "CPU Slot 5") is never used while in a race (lag!), it's only used to demonstrate the CPU driving as you after finishing a race. It doesn't even have collisions with the player or a rank.

As you'd progress through the track, the game would keep warping the car in second place behind you (even though it has the No AI flag set), and the other cars would just stay there, as long as you didn't drive backwards (then the game would despawn the ones way up in front to place more on lower ranks).

Originally posted by suFami
Fennor said that the green and purple cars drive slower than the main cars on the any difficulty below Master, so when a main car is respawned as a green/purple does that mean they also drive slower? This could make races too easy on difficulties lower than Master, but maybe not if they're not that much slower.


They actually keep their top speed, I didn't find a way yet to change it..

Originally posted by suFami
However, if you're going to do the "Add booster to CPUs with a small chance of using them per checkpoint" edit then maybe it would make more sense for them to have health so that if every time they boosted it took away some of their health (like it does to a player when boosting in F-Zero X).


I was thinking about that, I think I'll add it anyways.

Originally posted by suFami
I tried to remake the BG tiles for Mute City and it took hours to scroll through all of the tiles in Fuzee to match the tiles to an image of Mute City's BG. I can't imagine how long it took you to reconstruct these.


Well, let's just say I cheated a bit. I looked up into RAM for the rows data and found all the 16 rows that makes the BGs. Then I just scrolled through the tile numbers I have found and.. done :p
I can probably easily find Silence/SandOcean/FireField's BG since they seem to consist of just one repeating row like BigBlue/DeathWind's.

Originally posted by suFami
I think you should put a link to the LUA script and these image explanations in your document for anyone who might come across the document, but not this thread. Really impressive work on the script by the way.


Done! Thanks for the suggestion.

Originally posted by suFami
I wonder what point the brown cars drive on: main, green, or purple? I'll check in Fuzee and report back.


They seem to randomly pick the green or purple paths, since there doesn't seem to be extra bytes speciffically for them.

Originally posted by suFami
Originally posted by Fennor
Lunar Bomber does not have that much grip, it feels the heaviest though with its high turning radius. In the original F-Zero weight feels more similar between the different cars.

That reminds of something I read in an interview that Isshin Shimizu, one of the designers of SNES F-Zero, said about making F-Zero Maximum Velocity for the GBA. He said,
Quote
"At the time of the SFC [SNES F-Zero] we couldn't program individual unit weights but this time each one is different with respect to weight."
I think they were already trying to give the cars from F-Zero 2 (Ace League) more of a sense of weight, but sadly this game was abandoned and work turned towards F-Zero X.
</div></div>

I can tell that the Lunar Bomber definitely feels heavier, I don't really like playing with it (despite its top speed) because it can barely turn, it's like Black Shadow's car on some of the later F-Zero games, you can barely turn.
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
I assume "SlightOffset" is the thing that lets Fire Stingray drive a little more to the left and Wild Goose more to the right? (And Blue Falcon left, middle or right depending on what car you are using)

In your video it is almost always on "true", but in Mute City II it seemed to get turned on and off all the time. Not sure what it is even good for except for branches, by having the cars that tend to drive more on the left take the left branch, while the others take the right branch. Maybe they can also overtake eachother better when they are not driving on the exact same line.

I had it always turned off for my hacks, because I wanted them to make use of the whole width of the track. Having it on true would make some cars hit the walls. It also makes cars on the inside of turns perform better, since they have a shorter way. Especially if there is one checkpoint with slower speeds. The cars at the inside will have to spend less time on the slower checkpoint, so that they won't slow down as much before they can start accelerating again.
@CatadorDeLatas: What hex editor did you use to change the tracks to the GP exclusive tracks in Practice Mode?! Great videos btw!
Originally posted by Fennor
I assume "SlightOffset" is the thing that lets Fire Stingray drive a little more to the left and Wild Goose more to the right? (And Blue Falcon left, middle or right depending on what car you are using)


That's right, although from what I've seen the option isn't "car specific" (still need to investigate this a little more to confirm!). If you unload Wild Goose, let some generic cars spawn and reload it by catching up with it again, there will be a chance that he'll be having a different "Slight Offset" direction. The actual direction seems to be tied with the "CPU Slot".

When you play as Blue Falcon, the starting "CPU Slots" from 1 to 3 will have Golden Fox, Wild Goose and Fire Stingray;
When you play as Golden Fox, the starting "CPU Slots" from 1 to 3 will have Wild Goose, Blue Falcon and Fire Stingray;
When you play as Wild Goose, the starting "CPU Slots" from 1 to 3 will have Golden Fox, Blue Falcon and Fire Stingray;
When you play as Fire Stingray, the starting "CPU Slots" from 1 to 3 will have Golden Fox, Wild Goose and Blue Falcon.
"CPU Slot 4" will always be loaded with the purple car.

From what I've noticed, when the "Slight Offset" option is enabled:
Car from "CPU Slot 1" will keep driving normally in the middle;
Car from "CPU Slot 2" will drive slightly to the right;
Car from "CPU Slot 3" will drive slightly to the left.
Car from "CPU Slot 4" will drive.. somewhere. Not too sure exactly yet, I need to make a hex edit on a track to make sure the offset values from the Purple/Green cars are the same as the main cars so I can test this.

Originally posted by Fennor
Maybe they can also overtake eachother better when they are not driving on the exact same line.


I believe this affects overtaking, since a CPU car that is directly behind another one will automatically slow down (to simulate a collision or something, not sure what the programmers were thinking) but when they are a little bit to the left or right, the game will automatically "push" (actually change the velocity direction) the car in the opposite direction of the other car instead of just slowing it down.

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

Originally posted by MKDSmaster91
What hex editor did you use to change the tracks to the GP exclusive tracks in Practice Mode?!


Just about any hex editor can do that :p
You just have to know what bytes to edit. It's a little hard for me to explain right know what exactly is the format, but I'll just say that I have edited the 7th track configurations and also the checkpoint pointer to match Fire Field (or else you'd get Port Town II checkpoints into Fire Field, which wouldn't be nice).

At ROM address 0x160F9 (headerless) there is a table of 24 pointers (16-bit) to the checkpoint information, the first 15 are for the GP tracks, the last nine are for Practice (though you can't scroll beyond track 7 in Practice). I just modified the value at address 0x16123 to 3AE0 (the same as the 15th value, which is for Fire Field).

At ROM address 0x16129 there is a table of 24 values (8-bit), each value denotes the "track configuration", the format is something like this:

High nibble (AB) = variation:
- C = I Variation (only for tracks that actually have a variation);
- D = II Variation (only for Mute City);
- E = III (if Mute City), II (If has variations e.g Port Town) or no variation (if has no variation at all e.g Silence).
Other values will read junk data and send you to a corrupted track.

Low nibble (AB) = Region (same format as Fuzee):
- 0 = Big Blue
- 1 = Silence
- 2 = Sand Ocean
- 3 = Port Town
- 4 = Death Wind
- 5 = Red Canyon
- 6 = Fire Field
- 7 = Mute City
- 8 = White Land.
Other values will freeze the game.

In this case, I set the value at 0x1613E to E6 (no variation, Fire Field region)
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
The reason we can't scroll beyond 7 is to prevent a game breaking glitch! Tracks 8 and 9 in practice mode can be buggy when you finish the race in those tracks!

If you use the 'F-Zero Tracks Unlocked' patch for Practice mode, you also have Tracks A, B, C, D, E and F with Tracks B and C also being a bit buggy when you finish the race in those tracks!

Tracks 1-7, A, D, E and F: Works Fine!

Tracks 8, 9, B, C: Buggy!
Big thanks to CatadorDeLatas, I was able to change the Track Lineup to the GP Exclusive Tracks so you can play them in Practice Mode!

Here's a set of Patches that allow to play the GP Tracks in Practice Mode! Both patches have been tested and works with no problem!
Patch to an Unheadered (U) ROM and enjoy!

Patch 1: MC2, RC1, RC2, DW2, FF, WL2 and PT1
Patch 2: MC3

Note: I left tracks 2-7 in Patch 2 as is!

Download
That's nice!


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

I've been working on the CPU Health thing.
Good news is that it works (partially), it even takes in account the CPU car type! (GFox will explode faster, WGoose will take longer to explode).
Bad news is that there was an annoying bug and I didn't seem to spot what caused it. I tried debugging for something like 30 minutes and got sick of it.
I'll try that again another day, even if it means writing the code again from scratch. ASM isn't really a friendly language :p
I'm reverse-engineering and hacking F-Zero (SNES)!

My YouTube channel, with various hacking tests
A few thoughts about the boost mechanic:

- If you make the boost work like in F-Zero X, you probably want the CPU drivers to trade health for boost power. That means you'd want them to drive on the refill areas, how would you handle that? Just making them drive there on default would create chaos at the start, since usually the refill areas are right after the start. You would need a different route in lap 1. Maybe the best way would be if you lead the ai path through the pits, but have the "goStraight" checkpoint argument on true, but set it off somehow at the end of the first lap?

- As far as I know, all cars have the same amount of health, they only differ in damage recieved and regenerated, is that right? If boost drains a set amount of health, that would make boots really strong for the Golden Fox, but weak for Wild Goose, since the Golden Fox can refill it much faster again. So the health of cars may need to be rebalanced.

- You said you wanted to make them use the boost "randomly". So even at turns like the middle section in White Land II? Or will you set some checkpoints to allow or not allow boost for CPU? I'd like them to boost at specific checkpoints, especially since - if it really works like in F-Zero X - boosting once in a while is less efficient than boosting multiple times in a row at certain spots.

-I am not sure how it exactly works in F-Zero X. But I think the acceleration bonus is added to the normal acceleration. Above the top speed, you have a slow decceleration, so that with a boost you have a slow acceleration. If you get even faster, the natural deceleration and the acceleration from the boost even out. When you are even faster through other sources, you decelerate slightly even when boosting. In F-Zero SNES you have a constant deceleration when being above top speed. Having a constant acceleration above top speed, simply limited by a top speed for accelertion - not by acceleration - could be problematic. Because in that case it would be best to boost until you reach boost top speed, then stop boosting, start boosting again when it would be just enough to reach boost top speed again, then stop boosting again and repeat. Which also sounds a little cheesy.

-boost pads in F-Zero X work the same, if you boost before one it will stop draining your energy as soons as you hit the boost pad, so that you won't lose out on health because of wrong boost timing. (In case you want to make boost pads work like in F-Zero X, too)