It's been slow going on this project lately. My real job's been busy and I've had the irresistible urge to play Ys VIII again.
Despite this, I have made some progress, although a lot of it has been weeding out bugs in existing code. There are a few interesting new things in this screenshot:
This first new bit is that the wisps now shoot at the player. You can see a few of those shots in this image, including one that's wandered to the bottom of the screen because I haven't yet clamped the shots to the playfield boundaries.
There was a really nasty bug here that took me quite a while to fix, but I think I finally nailed it. As long as you left the wisps alone, everything went smoothly. As soon you started shooting the buggers, really weird things started happening with the wisps and their bullets. It turned out my wisp-spawning logic had some flaws in it which now have hopefully been remedied.
Also in this image are a pair of suspicious black lines on the left side of the screen. This isn't the dreaded "2600 comb," those are markers that I stuck in to test my first attempt at vertical scrolling.
I've been trying to figure out exactly how I'm going to have other things flying around on the screen. The player objects are all used up in the player itself, and the four missiles are used for the wisp shots and the player shots. That means I have to resort to the playfield if I'm going to have anything else on the screen.
The problem with this is that the playfield is dreadfully slow. The solution to this is to make creative use of ANTIC's scrolling capabilities to simulate motion. This is a common trick in 5200 games, I'm pretty sure that the invaders in Space Invaders are just a static background that's being scrolled about. I learned how to do horizontal scrolling in RealSports Curling but vertical scrolling is a rather different beast.
There's a easy way and a hard way to do it. The easy way is to simply do a memory scan reset on every line of the display list, and update the addresses as necessary. The problem with this is that it's very slow. In my case I would have to update as many as 276 bytes on a single frame to achieve this, and that's way too much time.
Instead, I pulled off a sort of dynamic scroll which migrates a single wrap point through an in-memory display list. This pattern is used both on the top and bottom of the screen, the top scrolls up and the bottom scrolls down. Now that this is in place, I can have pretty much anything I want "raining down" on the players.
I'm still trying to figure out what exactly will be placed on the background. In the meantime I might do some busywork like clamping those wisp shots.