| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
Setting 'Globals::zp_tmp0' with it is potentially dangerous given how
volatile this temporary memory address is.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
| |
Set a more realistic value for the timer for non-dev builds.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
Collisions are based on this, so we better not forget updating these
values.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
| |
This was just fixed on nasm, so it's no longer needed.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
| |
It was never read anyways, so let's drop it.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
| |
This allows enemies to be even more varied when it comes to the color.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
Each enemy also has its own palette upon creation. This way we add more
variety as it was on the original game.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|