aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Add support for the SUSE coinMiquel Sabaté Solà2026-03-208-36/+152
| | | | | | | | This is a coin that appears after going through a first cycle of levels and that allows the player to get a different game over screen than usual. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Remove stale commentMiquel Sabaté Solà2026-03-191-1/+1
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Let fuel tanks be delivered separatelyMiquel Sabaté Solà2026-03-183-4/+32
| | | | | | | | | Fuel tanks follow a different logic than regular items, in which they should be delivered almost instantaniously whenever they are needed. Hence, a new (much shorter/snappier) timer is provided for fuel tanks alone. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Increase the item's timer for non-dev buildsMiquel Sabaté Solà2026-03-181-1/+5
| | | | | | Set a more realistic value for the timer for non-dev builds. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Fix the high byte for the timer initializationMiquel Sabaté Solà2026-03-181-1/+1
| | | | | | | | | | | | | | | | In my infinite wisdom, in order to compute the high byte of the 16-bit timer I masked away the most significant byte, but then shifted right only for a nibble instead of a full byte. This went mostly unnoticed as the value I'm setting for the timer actually falls below of what a byte can represent and, thus, the high byte was always zero. But this was noticeable when I was testing larger numbers which, unsurprisingly, turned out to be _huge_. Fix this by shifting right a full byte instead of a mere nibble. Fixes: cf3a0c963225 ("Implement falling items") Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Expand documentation on items.sMiquel Sabaté Solà2026-03-181-10/+29
| | | | | | | The format of buffers are somewhat stable now, so we can expand the documentation to write down what I've finally settled on. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Use specific variables for cached player's tile coordinatesMiquel Sabaté Solà2026-03-183-9/+16
| | | | | | | | | Before this commit we were using the zp_argX variables, but this can go wrong, and more so considering other functions like background collision checking also use these variables. All in all, since we have plenty of RAM to spare, let's just allocate a new set of bytes just for that. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Add missing 'Items::zp_current_tiles' updatesMiquel Sabaté Solà2026-03-182-3/+16
| | | | | | | Collisions are based on this, so we better not forget updating these values. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Avoid a jmp by moving update_sprites()Miquel Sabaté Solà2026-03-162-19/+19
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Improve the accuracy of the dropping zoneMiquel Sabaté Solà2026-03-162-10/+8
| | | | | | | | | | We were abusing on tile collision for this, and it wasn't exact. Not only that, but if the player was fast enough, sometimes the item wouldn't drop as the accelaration would pass through that zone. Avoid that by simply using regular screen coordinates, which aren't too hard to check in this case. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Wait for items to fall before changing screenMiquel Sabaté Solà2026-03-165-106/+138
| | | | | | | | | | | More specifically, whenever the player dies and we need to reset the screen, wait for items to fall in the same way as we do for explosions to disappear. This also brought with it some other changes like removing sprite reset on screen initialization. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Account for items switching to following the player in mid-airMiquel Sabaté Solà2026-03-152-5/+16
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Update the shuttle as fuel is getting inMiquel Sabaté Solà2026-03-152-10/+80
| | | | | | | | | | Just like in the original, the shuttle turns purple for each fuel tank. That being said, due to the restriction from the NES/Famicom on updating background tile attributes, a "half-filled" strategy is being used here to convey the same idea for a total of 6 fuel tanks to be delivered. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Implement falling itemsMiquel Sabaté Solà2026-03-137-96/+403
| | | | | | | | | Every now and then an item will fall and, as in the original game, a fuel tank will be delivered whenever needed. There are still some things left out for later changes, like picking up items mid-air, or background effects for the rocket being filled with fuel. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* debug: Add another value for debugging purposesMiquel Sabaté Solà2026-03-131-0/+3
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Add missing items from the assetsMiquel Sabaté Solà2026-03-122-30/+30
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Join 'zp_moved_out' and 'zp_pause_toggle'Miquel Sabaté Solà2026-03-123-24/+32
| | | | | | | It was wasteful, and it was there just because of my lazyness. Let's be a bit less careless. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Initial implementation for itemsMiquel Sabaté Solà2026-03-1112-46/+720
| | | | | | | | | | This now only supports the appearance of shuttle parts and the fact that the player can collect them at a very specific order and drop them so to stack up the final shuttle. This is of course just the skeleton and there's a bunch of TODO's left. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Don't skip the title page on a DEV buildMiquel Sabaté Solà2026-03-112-16/+7
| | | | | | | Just bumping up timers is enough, and we don't get weird "this does not load _exactly_ as the final game" situations. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Rename init_x() to init_enemy_x()Miquel Sabaté Solà2026-03-111-4/+4
| | | | | | | This is just a minor fix for an overstep from commit 270d60d58d3e ("Rename scoped variables without being redundant"). Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Fix a slight misalignment when spreading out bulletsMiquel Sabaté Solà2026-03-111-0/+1
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Add a mock cover imageMiquel Sabaté Solà2026-03-112-1/+3
| | | | | | This image can later be used for cartridge labels and such. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Apply a correction on enemy movement for PALMiquel Sabaté Solà2026-03-113-43/+93
| | | | | | | | | | We cannot just "inc"/"dec" for enemy movement, but we have to apply an overstep on PAL every 5 frames in order to be equivalent to the NTSC version. This has been abstracted away on a macro that just does "inc"/"dec" on NTSC, but does this proper "adc"/"sbc" instructions with a helper memory region which is updated every 5 frames. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Remove outdated asan:ignore commentsMiquel Sabaté Solà2026-03-101-2/+2
| | | | | | This was just fixed on nasm, so it's no longer needed. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Add a blinking animation on player selectionMiquel Sabaté Solà2026-03-087-35/+151
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Support reading from the second controllerMiquel Sabaté Solà2026-03-088-41/+41
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Skip initialization of first nametable after game overMiquel Sabaté Solà2026-03-081-1/+12
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* State game over only when all players are deadMiquel Sabaté Solà2026-03-086-34/+81
| | | | | | | This is a bit contrary to the original game, where each player would get its own "Game over" event. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Show lifes for player 2 if availableMiquel Sabaté Solà2026-03-084-35/+68
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Define the bitmap for multiplayer supportMiquel Sabaté Solà2026-03-085-3/+23
| | | | | | | Also give it a dummy value on start and initialize it properly after the player's selection on the title screen. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Initialize 'zp_pause_toggle' before NMI enablementMiquel Sabaté Solà2026-03-073-3/+16
| | | | | | | | | Otherwise we might randomly get weird scenarios like the title screen not showing up properly. Fixes: bc99212539f6 ("Toggle a "Paused" message on top of the screen") Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Move some variables into another memory regionMiquel Sabaté Solà2026-03-072-10/+10
| | | | | | | | The zp_player_tile_* variables fit perfectly with the space that is left in the $0x memory region. This allows for a more contiguous space (e.g. on $Cx) for other elements to come (e.g. items). Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Switch the palette for bullets into something more colorfulMiquel Sabaté Solà2026-03-071-1/+1
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Make bullet transitions in relation to HZMiquel Sabaté Solà2026-03-071-6/+6
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Ramp up the revive counter for enemiesMiquel Sabaté Solà2026-03-071-1/+1
| | | | | | | This way it feels more like a swarm of enemies and you don't have any resting time. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Fix documentation error on the 'chase' algorithmMiquel Sabaté Solà2026-03-071-1/+1
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Update the explosions' pool capacityMiquel Sabaté Solà2026-03-072-5/+5
| | | | | | | More enemies means more possible explosions. Hence, increase the pool's capacity by one to match the recent change in enemies per screen. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Bump up to 4 enemies per screenMiquel Sabaté Solà2026-03-062-14/+14
| | | | | | | | This is more similar to the original game, and it's a bit more fun. In order to do so some variables had to move into another memory page, but that's fine as we have plenty. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Make more things operate on SIZEOF_POOL_ITEMMiquel Sabaté Solà2026-03-061-8/+8
| | | | | | | Out of consistency, let's use it, and this way experimenting with the amount of enemies per screen won't be as painful. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Convert enemy vs bullet collision into a loopMiquel Sabaté Solà2026-03-063-24/+26
| | | | | | | | The fact that unrolling the loop was easier or faster was a plain lie from my lazyness. Convert it into a proper loop just so we can experiment with adding more enemies in one screen. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Fix bounce up for cross enemiesMiquel Sabaté Solà2026-03-062-12/+2
| | | | | | | | | Some old code was checking on the kind of level and skipping the bottom check if it was a half-sized enemy. However, the 'bounce' algorithm is not used by any half-sized enemy. Thus, the check can be removed entirely. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Make bullets thickerMiquel Sabaté Solà2026-03-062-27/+27
| | | | | | | On real hardware I've noticed that individual bullets are barely noticeable. Make them a bit thicker. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Rename scoped variables without being redundantMiquel Sabaté Solà2026-03-064-186/+186
| | | | | | | Some variables had the same name of the scope in their names as well. Remove this redundancy everywhere. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Check for enemy death after its movementMiquel Sabaté Solà2026-03-062-1/+10
| | | | | | | | | Some enemies might die right after moving (e.g. asteroids exploding into the ground). In these cases, there's no point on checking for player collision. Moreover, this also avoids the corner case of having two explosions on a single death. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Toggle a "Paused" message on top of the screenMiquel Sabaté Solà2026-03-065-35/+97
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Don't toggle pause from a holded buttonMiquel Sabaté Solà2026-03-063-2/+13
| | | | | | | | | | | If you just holded the Select or Start buttons, it would be forever toggling pause/unpause, which is an unexpected behavior. Fix this by saving which value from the joypad was previously read. With this, whenever the pause timer reaches zero, we can check whether either button is still pressed, and avoid toggling if that is the case. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Small savings on re-using untouched registersMiquel Sabaté Solà2026-03-061-8/+2
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Improve documentation on Enemies::zp_current_tilesMiquel Sabaté Solà2026-03-061-10/+17
| | | | Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Add the 'each' and 'release' make targetsMiquel Sabaté Solà2026-03-062-1/+32
| | | | | | | | | | The 'each' target is used to dump all the different combinations into my Everdrive so to test on real hardware. The 'release' target is used so the "DEV" version of the ROM does not make it into the releases page from Github. Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
* Fix a cycling bug when shooting carelesslyMiquel Sabaté Solà2026-03-062-1/+14
| | | | | | | | | | | | | | | | When shooting like crazy and killing random enemies, after a while a cycling bug would appear which would make enemies to turn in weird directions, die unexpectedly, and other weird shenanigans. This comes back to commit 7c493ba3f338 ("Improve a bit the performance on enemy death"), which removed the saving/restoring of the value on the 'y' register. That being said, this register was actually being needed at least by Bullets::update(), so in certain situations this register might have a bad value (e.g. via the Explosions::create() call). Fixes: 7c493ba3f338 ("Improve a bit the performance on enemy death") Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>