| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
| |
In preparation to having multiple kinds of shuttles as in the original
game, introduce the 'Globals::zp_shuttle_kind' variable, which is just a
helper value by masking out the 'Globals::zp_level' variable. This in
turn will be the index for selecting which tile IDs for each shuttle
part.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
| |
The shuttle should be reassembled every 4 stages, not 8. I did not
remember well how this worked and I jumped ahead with the conveniency of
the 'Globals::zp_level_kind' variable.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The add_to_player() function relied on parameters to be passed on the
'Globals::zp_tmpX' variables, but that's just plain stupid. First,
because these memory addresses are not meant for arguments; but most
importantly, because callers actually needed some of these values before
calling this function. Hence, everything went into chaos and sprites
began to act wrongly in all sorts of random ways.
Moreover, some of the callers also needed a guarantee on either the 'x'
or the 'y' registers. Since this wasn't always feasible, we needed to
store/load these registers' values case by case.
All in all, now add_to_player() accepts only one argument via the 'y'
register (which callers already knew it was going to be messed
with). The value on 'y' has to be set via some helper constants.
As a cherry on top, this not only fixes a nasty bug, but it also makes
things more performant and with less code.
Fixes: 63ef73de3bdd ("Update scores on screen")
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 the animation that is done after clearing a stage. Moreover, and
for the first time since I started development, now we can move into the
next level as intended from the game's design.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
That is, our PRNG algorithm is so stupid that sometimes it cycles into
the same value multiple times. While play testing, sometimes we were so
unlucky that we got all enemies on the same Y screen coordinate.
As funny as these situations can be, this shouldn't happen, so I have
introduced an (awesomely named) function that makes a harder effort at
finding a unique random number.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
| |
I believe this case was broken since the very beginning when I
implemented it in commit b891997ab597 ("Add a blinking animation on
player selection").
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
| |
Moreover, add a "!" character at the end.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
Some of the functions being called from within will in fact tamper with
this value. Hence, use the free 'Globals::zp_arg3' variable.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
| |
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 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 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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
| |
This is still missing the support for player 2, but I've left traces
about it.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
The whole handling of player 2 will come whenever I set to implement
multi-player for this game.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
This allows for explosions to run after making the player to disappear,
and it re-runs the entering scene timer.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
| |
For now this only applies to enemies, but it's general enough so it can
target any given coordinate, and hence any given object.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
| |
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
| |
This will be useful whenever we implement the re-appearance of enemies.
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
|
| |
|
|
|
|
|
|
|
|
| |
If we don't do this, then it's possible to incur into a buffer overflow
as the last allocated index is set to the next (out of buffer)
position. Whenever we start over on this function, then it will compare
for a good bullet on this position, and if it's not exactly $FF, then it
will allocate it without problems.
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>
|
| |
|
|
|
|
|
|
|
|
| |
There were still some gaps where the check was failing, and trying to be
smart about it was going the "it's too complex for what I need here"
route. Hence, just go to the good old dumb algorithm of "check all
corners". For now the performance has not dropped, so let's hope that we
don't have to re-visit this one.
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>
|