(opens in same window)
(opens in new window)
(likely 404 error)
October-December 2002 (oldest-to-newest)
Now that the auctions for my comics have finished I have
more time to program. There's still the matter of boxing
up the comics and shipping them off, but that doesn't take
too much time.
I finally sunk my teeth into Jet Set
Radio Future and am liking it a lot. The levels are
just immense and the draw distance is amazing. The music
is great too. Not as good as the first one, but I haven't
heard all the tracks yet so I'll reserve judgement. (I have
one of the songs stuck in my head at the moment.)
I added in some sprites I had removed from the star field
screen. That jacked the frame rate back down to 20 fps.
Oh well, I'll do another round of optimization later. For
now I want to get actual sprite images displayed. The stars
have actually been "incorrect" as I've been just clearing
all sprites to a constant color rather than using their
proper images. Of course that's hard to tell on a sprite
that's 2 pixels wide :).
One interesting thing I noticed is that the sprites I
added back are rotated slightly despite having
"rotate=0". I'll post a screenshot later to show what I
mean. Debugging that would likely involve delving into the
sprite assembly. So I'll just leave it alone for now.
As for what I've been working on, I'm writing the
routines to convert a Playstation TIM file to the format
the sprite library wants. For 4-bit CLUT-based sprites this
will involve reading in the CLUT and doing a look-up for
every pixel. Luckily I only need to do this once for each
sprite as long as the source image doesn't change.
I inserted a screenshot in the news from last time (below)
showing how the sprites are slightly rotated. Click to blow
it up to full size. I swear I set the "rotate" field to
As you can see. I have had some success getting the actual
sprite images working. The text reads "If you wish, you
may insert an audio CD for background music. Press START
The slight rotation mentioned before is causing the
sprites to look a little weird. Also, the lower case
letters "s" & "r" and the capital "T" don't work properly -
why just those three letters I have no idea. The s's come
out as y's and the r's & T's are just weird. There are
various other graphical glitches too, but I hope those are
a result of the same problem as the letters. BTW, the "D"
in "CD" is correct - the font I use displays it like
The text is supposed to be tinted green. However,
tinting is not officially supported by the sprite library.
The "tint" field exists and should work with one of the
sprite types, but I may need to add support for other types
if that's not good enough.
Way before Decaying Orbit there was Mega-Gun. I've had
a mostly-finished page sitting on my hard drive for a
couple months and finally decided to finish it off. It's
not a NUON game. We made it for the Commodore 64 using
Gary Kitchen's Game Maker.
Read all about it on the
download the disk image and play it on your favorite C64 emulator.
It won't knock your socks off, but it will kill a few
minutes if you happen to have someone to play against.
I should put a readme file in zip describing the
controls, but for now you can figure them mostly out
yourself. The joystick only had four directions and a
button for crying out loud. Ah the simpler days. Just
remember to detonate your missiles before they fly off
Update: README file added to zip. It will be fleshed
out more in the future, but has the basics for now.
I've been spending some time trying to get sprite tinting
going. Tinting is done differently on the Yaroze and NUON.
On the PSX you give a value indicating how much to tint the
red, green and blue components of every pixel in the
sprite. On NUON you give a base color and a blend factor
and the sprite pixel gets combined in accordingly.
I'm not sure if it's even possible to make tinting 100%
identical between the two methods. I'll need to work out
the equations to prove it (or disprove it) to myself.
I need to write my own pixel inner loop to accomodate
the PSX transparency modes so in the process I'll probably
change the tinting to be done in a more PSX-like
I finally finished Jet Set Radio
Future last week. I'm still playing it though as
it's a lot of fun and there's plenty of extra stuff left
to do. Probably next for me will be
Shenmue - yes the first one. I
left off somewhere in the 3rd disc so I'm pretty near the
end. I need to finish it off before the sequel comes out.
Also, I booted my Dreamcast version of
Spider-man for the first time
this weekend since I bought it months and months ago.
I'm trying to get to the bottom of the graphical anomalies
I'm seeing in DO. I've made much progress in the past
couple days as I've started narrowing in on the source of
the problem. I thought it would be in the code that
translates the Yaroze image to a format the NUON sprite lib
wants. Now it seems to be further up the pipeline - the
Yaroze image is actually getting corrupted before the
Hats off to the Angels for playing some great ball the
past two games. I thought the Giants had it sealed in
Game 6, but alas they choked. I really enjoyed following
the Giants through the playoffs and feel bad that they
couldn't win the big one. Ah well.
And what the heck is that ugly thing in the middle of
the Angel's center field? Jeez, they could have sold a
couple thousand more seats if they got rid of that silly
I'm still trying to isolate the bug mentioned before. I
ended up writing a couple functions that create a checksum
value based on memory contents (both bilinear and linear).
I'll use these to find out where the corruption is getting
I can't remember the last time a bug eluded me for so long.
These graphical glitches weren't serious, but still
extremely annoying. And the solution was so simple. I
don't even recall how it happened, but last night while
lying in bed it came to me. It seems so obvious now. Basically I just needed to add a couple _DCacheSync()
calls and all was fixed!
The fact that the glitches weren't deterministic should
have given me a clue. The problem was that one part of my
code converts the little endian image file to big endian to
make it more NUON-friendly. This is done in cached C-code
(admittedly not very efficient). Later I have a routine
that reads the image and converts it from 4-bit pixels to
32-bit using the CLUT. This uses the DMA functions, DMALinear & DMABilinear. The problem was that the DMA
functions were reading in stale data because part of the
image from endian conversion was still in the cache and
hadn't been written to memory yet.
zip with the latest NUON.CD. There's still not much
to show, but at least it gets to the title screen (press
START from there and it will crash). There are some
strange green lines that show up in the "D" and "O" of
the title. It's probably related to the fact that they
are scaled up, but I don't know if it's my problem or the
sprite library's. It's definitely not the same problem
that I just fixed above.
Finally I can move on to the next part of the game. I
still need to add tinting to the sprite library so the
text doesn't always come out gray, but that's for later.
I want to get the game playable first.
I am finally complete. My Gamecube arrived yesterday
to take its place next to the XBox and PS2. Now begins
the (expensive) process of catching up on all the games
I've missed since the system's debut. All I have now is
Star Fox Adventures, but
Mario Sunshine is on the way.
Lots of games past and future are just calling to me.
The holiday season brings out the best in gaming! Just
don't ask me to call it GCN - that's about the stupidest
acronym I've seen. Gamecube Nintendo? Makes no sense.
I'm heading out to see Episode II in IMAX tonight. I
only saw the movie once in its original release, in a
non-digital theater, so I'm looking forward to it.
Were it not for Star Fox
Adventures I would have done more work on the game.
But alas, a gamer's life is perpetually torn amongst what
to do & play next. I put in 8-9 hours on the game this
weekend and am about 40% done. It's definitely a great
game, although some of the tasks seem rather arbitrary.
Most of the game has been blindingly obvious as to what to
do next. Also there's a bazillion things to collect. I
can now fully appreciate what
Gabe & Tycho
were talking about.
As for IMAX Episode II, the fates conspired against
us as the projector was broken. Blast it, I'll have to
catch it some other time.
Depsite that I did a bit of programming. I fixed a bug
that happens when you try to SPRDraw() an empty display
list. That was causing the hang at the main menu. Also,
I finally added the Yaroze function StoreImage(). It's
the reverse of LoadImage() in that it copies a bilinear
region from the Yaroze VRAM to a linear region in main
Even with all this I still can't get that blasted main
menu to appear. And the program is hanging again. If I
can get past this I'm sure I'll be close to the game being
I know the location of two bugs that are each preventing
the main menu from showing up properly. It's just a matter
of fixing them.
It's a rather complicated task to convert a Yaroze
sprite image to a NUON one. The Yaroze sprites are 4-bit
and four are packed together to occupy a 16-bit location in
Playstation VRAM. Sprite images can start at any arbitrary
pixel. So when I read in a 16-bit word I may need to skip
over one to three of the nibbles to get to the starting
pixel. Add to this the fact that NUON likes to do things
in 32-bit chunks and I sometimes need to bring in an extra
16-bit word to fill the other bits. This means I have to
skip from one to seven nibbles in the first 32-bit dword.
That applies to the start of every row in the image. Of
course the same goes for the end of the row as well.
So bug #1 in dealing with that. Bug #2 has to do with
dynamic CLUT modification. Most of the time the color
lookup tables are static. They are included in the input
image file and never change. Decaying Orbit plays some
tricks, however, by generating some CLUTs on the fly. For
example, for the planet images, I take the original colors
(RGB in Yaroze-space), shuffle them around and create more
color combinations (RBG, GRB, GBR, BGR, BRG). This allows
me to have a large variety of planet sprites by only using
a few images. Anyway, the bug is in the routine that
loads & stores the CLUTs to memory.
We finally saw Episode II in IMAX last weekend. What a
disappointment. I'm sure it varies from theater to theater,
but at the one we went to the image was so large that you
had to actually move your head during most scenes to see
all the faces. Often I'd be watching an alien speaking
it's alien language and remember there are subtitles at the
bottom of the screen. They were so much out of my view
that I couldn't see them at the same time.
The seats in the theater were positioned so you are
looking at the center of the image. Great for normal IMAX
films since you want the scene to fill your entire view.
For feature films, however, character's faces usually
appear in the top part of the screen, meaning we had to
crane our necks a lot of the time.
However, I did appreciate the cuts they made to the
mushy scenes between Anakin & Padme. And hearing Jango
Fett's seismic charges in a theater with 20-something
speakers was just awesome.
Not much to say on the game front. I fixed the two
problems mentioned before, but the main menu still doesn't
appear. I think the sprite is there, but all the
pixels are being drawn as black. I just need to get the
colors right for it to show up.
At least that's what I think is causing the garbled text
in the main menu. As you can see I did finally get it to
show up. I changed the sprite type and it worked fine. I
must have something set wrong for the other sprite type.
So I'm guessing I need to do a magic _DCacheSync()
somewhere to clear up this problem. Also, those vertical
lines in the menu are not supposed to be there. Yet
another bug to find and squash.
The text in the menu is supposed to read:
- Single Player
- Level Editor
That reminds me of something Chomp-related I need to
I'm sitting around 60% in Star
Fox. It's an enjoyable game, but not one I'll be
keeping after I'm done. I have filled out my GameCube
library a bit with Mario Sunshine,
Resident Evil, and
Luigi's Mansion. I've heard
great things about ED so I can't wait diving into that
We watched the extended version of Fellowship of the
Ring and absolutely loved it. Lots more pieces added to
fill out the events and flesh out the characters. Plus
the DVD comes with a free pass to Two Towers. Since you
can find the set for $25 it's like getting the discs for
$15. You are going to see Two Towers right?
We also saw the new Harry Potter and loved it too. It
takes what is probably the weakest of the books so far
and makes a great movie (admittedly I haven't read the
fourth one yet - I'm going on my wife's opinion). I was
amazed that they fit pretty much the whole book into the
movie. They toned down characters that were annoying
(Colin and Gilderoy) and didn't waste time explaining
Quidditch again. Good stuff. Now I really can't
wait for the third one.
The solution to the garbled menu text was to use
_DCacheFlush() rather than _DCacheSync(). I'm still trying
to wrap my head around why that might be. Regardless, you
can now navigate the main menu. Start a new game, however,
and it crashes. More work to do I guess.
Before starting the game there is a bit of text that
scrolls up the screen. It gives some background and sets up
the story. The first couple sentences show up just fine,
but eventually the text stops appearing. Then when the
initial words scroll off the top of the screen some new text
pops in. I must be hitting the library's limit on the
maximum number of active sprites. It's set at 256 now so
I'll try upping it.
Through all of this the game runs extremely slowly.
Less than 20fps usually. This is just unacceptable for
an action game and will need addressing at some point.
We had a shindig at work last night when they replayed
the GeForce FX launch presentation for the employees. It's
times like this that I wonder why I'm bothering to make
silly little 2D sprite-based low resolution games when there
is power out there to do "cinematic computing".
Oh well. Harnessing that power would take a team of
people and likely take a year or two. I guess my advantage
is that I can make the game I want at my own pace. As long
as it's fun who cares?
Woo! Planets! The game is progressing nicely. However,
there are a number of things wrong with this shot. First,
the CLUTs for three of the planets are messed up. Only the
top-left one is correct. Second, the star background
obviously repeats. It should not. Third, the shadow
sprites that overlay the planets are showing up as strange
vertical gray stripes. Getting these working will require
writing a custom sprite renderer. Fourth, the player sprite
is not working. When I try to add it the game crashes.
Fifth, the triangle indicators around the home (top-left)
and target (bottom-right) planets should be green and red
respectively, not gray. Again, this will require a custom
sprite renderer. Sixth, none of the HUD is present. I
haven't investigated that yet.
But still, woo planets!
Saw the new Bond movie Friday. I was pleasantly
surprised to find it it quite enjoyable. I never saw
The World Is Not Enough, but this definitely ranks
up there with the other Brosnan Bond films.
I finished Star Fox Adventures
Saturday. I put it up on eBay Sunday, sold it with Buy It
Now, and have already mailed it off to the winner. Gotta
love PayPal. Unless you're on the bad end of a dispute
Short week! I'll be leaving Wendesday night for
Thanksgiving with the inlaws so probably won't update again
until next week. A little golf on Thursday will be oh so
Back to the game. Each tile in the background star field
gets a random initial rotation (a multiple of 90 degrees).
This, combined with other things, eliminates any visible
repeating pattern. However, it seems when you pass a seed
of zero to the srand() function every random number comes
out zero as well (it didn't on the Yaroze). So none of the
tiles were being rotated at all. That's why the background
was repeating so obviously.
Fixing that uncovered another problem with the star
field. On the Yaroze, if your sprite image starts
somewhere in the middle of the source image and extends
beyond the edge it will automatically wrap around. So I
had to add some code to allow this wrapping.
Finally, the rotation angles on the Yaroze are expressed
in degrees while on NUON they are in "rotations". Fixing
that little problem cleaned up a few other things too.
One of the problems I'm tracking down now involves the
heads-up display. Honestly I think there is a bug in the
original source code. But if that were the case then the
Yaroze version should not have worked either. I'll probably
break out my Yaroze and see if I can figure out why it
I haven't been able to program as much as I'd like due
to work. Monday evening was planned to be a full-on coding
session, but I ended up staying at work until 9pm. Guh.
Funny thing is some people do this every night!
I started Luigi's Mansion last
night. I love it! Nintendo sure knows how to make
I have almost all the issues fixed from my
update on the 19th. All the planets look fine now - the CLUTs are
fixed. As noted before, the backgrounds don't repeat any
more. The shadow sprites are no longer weird vertical gray
bars (they still don't work as shadows though). The player
sprite is working. And I got the HUD somewhat working.
There are still some problems. The sprites appear to be
drawn in reverse order; the star background overlaps the
planets and the shadow sprites show up behind the planets
rather than in front. I'm investigating a problem that's
causing graphical corruption for some background tiles.
The HUD sprites don't line up properly. And the player
message and time remaining sprites don't work (those are
sprites where the image is text that is generated
Here's a shot showing what I was saying. The most obvious
errors are with the HUD. The bars are not aligned properly.
This stems from the fact that on the Yaroze you can place
the point of rotation anywhere in the sprite, where as on
NUON it's always in the center. I tried compensating for
this, but I guess my math is a bit off.
You can see the shadows behind the planets as the gray
outline on the left side of each one. I don't know how I'll
get those working eventually. The color-space difference
is causing all sorts of problems with this port.
We had a little VM Labs reunion Sunday. Unfortunatley I
could only attend for an hour, but it was still nice to see
familiar faces again. I wish I could have stayed longer.
Hopefully it's the first of many since I couldn't chat with
very many people.
Not much game progress to report. I did get the HUD
items to line up correctly. Mostly, I'm neck-deep in work
these days. Weekend? What weekend? I hope this lets up
I haven't been programming lately. Mostly because work
is busy, but also we've had lots of things to do at home.
We're considering getting our kitchen remodeled and are
talking to contractors and stuff.
I finished Luigi's Mansion this
weekend. Of course this opened up the Hidden Mansion, but
I'll save that until I get through my other games. BTW,
maybe it's just me, but I found that final boss tough! I had
to cheat and look
up how to beat him. Vacuum the spiky thing? Goes
against most video game conventions. Even when I knew what
to do it still took me a few tries.
With that done I just started Eternal
Darkness. It's a lot more Resident Evil-ish than I
thought it would be. You know the drill - find the item,
put it in the slot. Still, the atmosphere is great and I
love the idea of making the back story sequences
a little present for you all before I head off on vacation.
It's painfully slow so I don't imagine people will spend a
ton of time with it. Still, a lot of it works. Much to my
surprise I just tried the in-game level editor and it seemed
The buttons are mapped thusly:
Remember that on the PSX, canceling things and backing
out of menus is done with the triangle button (C-left).
Selecting menu items is done with X (A). When starting a
single player game you can skip the opening text crawl
with the START button.
FYI, lasers don't seem to work, the player engine
thrust doesn't show up, and a bunch of other stuff is
broken. Don't press START since it's supposed to bring
up a pause menu, but all it does now is crash the game.
I guess you could say that's a kind of pause.
I really need to figure out why all my sprites
are rotated slightly.
See y'all in a week. Think cheery NUONy thoughts :)
This web page and all other pages on this site are
© 1999-2007 Scott Cartier