Log In  

Cart #23196 | 2016-06-19 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
6

A demake of the DOS intro for Ultima V, one of my favourite games of all time. You can watch the original intro here: https://www.youtube.com/watch?v=3XN1mdyvZvM

Holding down Button 1 (Z) will speed up the animation, pressing Button 2 (X) will skip to the next scene; otherwise this is non-interactive.

Turns out that 16x16 sprites blow out the spritesheet pretty quickly, so I had to pack extra sprites into map data and didn't have enough leftover space for fancy logo lettering; but I quite like how the demade titling turned out anyway. Otherwise I've tried to be as faithful to the original as possible, including reverse engineering the in-memory tile animations they used, which was a learning experience. I scored it using Stones rather than the original intro music though, because Stones is kind of the signature tune of the Ultima series.

The music only lasts for about 2/3rds of the intro and then lapses into silence until the sequence restarts; I could update it to segue into a second track, and I could also try some cart compression techniques to squeeze in larger title art. But I'm posting this now because I suspect it's as done as it'll get.

P#23197 2016-06-19 07:05 ( Edited 2016-06-20 21:25)

Really cool demo, I like the result of the artwork - looks close enough to the apple :)

P#23198 2016-06-19 08:30 ( Edited 2016-06-19 12:30)

Really very cool!

Care to give us some insight into how you went about scripting it? It seems as close to the original as possible. Does this method still hold up today for more modern games?

(I'm yet to look at the code)

P#23237 2016-06-19 15:32 ( Edited 2016-06-19 19:32)

The code is liberally commented if you want to peek behind the curtain. For scripting, each 'actor' (animated thing in the scene) has a stack (a long one-dimensional table) of actions and their parameters. Once an actor finishes its current action, it pops the next action off the stack along with a variable number of parameters depending on the action. e.g: a "change sprite" action pops one extra parameter containing the sprite index to change to, a "wait" action pops one extra parameter for the number of tics to wait, etc.

I figure this is close to how the original intro would have been scripted: they'd have likely used a stack and encoded sequences of bytes that represented action codes and single-byte parameters. I let actors trigger other actors to start their own sets of actions, which made the timing much easier to tweak; the original probably had fixed timings for each actor and no cross-referencing between actors.

For a more modern game intro I might still use a stack, but I would make each action be a closure, or a table containing the action and the parameters it needs. The extra structure would cost tokens but would be safer and easier to debug. As it was, I ran into many bugs where I accidentally left out a parameter and it plucked the next action code off the stack instead, causing it to get out of sync. Such errors are hard to debug because the program won't crash immediately, and it's hard to spot where the missing parameter should have been.

P#23249 2016-06-19 17:23 ( Edited 2016-06-19 21:26)

Nice! Thanks.

Food for thought

P#23256 2016-06-19 20:31 ( Edited 2016-06-20 00:31)

I prefer the original intro song, but that's personal preferences :D

But nice rendering concidering that the original soundtrack is made for more channel than what Pico-8 is able to do (6 channel with only one mockingboard, 12 if you have two, and most of the songs support two of them!)

P#23291 2016-06-20 12:41 ( Edited 2016-06-20 16:41)

A closer comparison is probably the C64 version, which still manages much nicer strings than what I could pull off. I've never heard the Apple II version; my first experience of Stones was Ultima VI on an MT-32.

P#23316 2016-06-20 17:25 ( Edited 2016-06-20 21:25)

[Please log in to post a comment]

Follow Lexaloffle:          
Generated 2024-03-29 09:38:49 | 0.013s | Q:24