Finally completable

Hello everyone!

Great news! The Prince and the Coward is now completable! This means that we are able to play from beginning to the end of the game without skipping any important part of it. Here we have a screenshot from ending sequence to give you a proof:

Prince completable
Game ending

First thing that I had to change was hero drawing and movement to implement second hero displaying. I made some changes in Hero class (hero shadow drawing, zooming) and also update pathfinding functions for second hero and now it’s working fine:

Second hero implementation
Displaying and movement

I also implement drawing “power meter” and bind it with mouse and keyboard buttons, so now last mini-game – “Escape from jail” is working correctly:

“Escape from jail”
Last mini-game

Next things that I had to code were credits loading and scrolling function for them. They are displayed after game ending animations and they look like this:

End credits
Scrolling after ending animations

I also work on graphics functions to add anti-aliasing code that exist in original version of game for sprite drawing functions. Prince is using 256 colors palette and its edge smoothing is based on 256 x 256 table of colors transition. Algorithm is checking if currently drawing pixel is located next to the edge of sprite and if it makes jagged line. If it does then this pixel is set with color from transition table calculated of original background pixel color and sprite’s edge pixel color. Personally I don’t see a big difference, but I think that it is visible mostly on not moving sprites, like shovel. You can compare it on screenshots below:

Anti-aliasing comparison – first location
(from left to right) Original game, ScummVM – AA on, ScummVM – AA off
Anti-aliasing comparison – shovel sprite
(from left to right) Original game, ScummVM – AA on, ScummVM – AA off

Most of work is done now, but there are still glitches that I have to fix (e.g. correct shadow drawing, fix drawing of last frames of FLC animations) and some ScummVM’s Advanced Engine Features that I’d like to implement before merging of the engine.

Mini-games and bug fixing – part two

I spent this week fixing bugs that still had left in game code and I can’t believe that there are so many of them 😉 I’m pretty sure that you can easily find some more, but let’s talk about fixed ones now.

I reworked whole Animation class, which felt very complex at the beginning, so I skipped this task of the project at that time and work on it now.

Some frames of sprites in Prince need decompression process before drawing them. Initially, specific frame was unpacked every time the game wants to draw it, which for looped animations (like background animations) wasn’t optimal.

At first attempt I changed loading function of Animation to decompress all frames of it when it is used for the first time, so every frame was unpacked just once. It turns out that this wasn’t the best solution. Unpacking about 300 frames during the gameplay, not in location loading, can freeze the game for a while and player can see it. I decided to change this conception to find a golden mean for it. So now, each frame is decompressed just once and it’s stored for later use, but it’s done when game draw it for the first time, so it’s not loading all frames at once. I made Visual Studio performance test for this solution and it looks like everything is working well now.

Next part that I was trying to finish this week were mini-games. I was able to fix four of them: “clip-clap” with bartender, one-armed bandit, “Mr. Sun puzzle” and “Throw a rock” . I don’t want to spoiler a lot, so here are just a few screen-shoots of them:

“Clip-Clap” with bartender
One-armed bandit
“Mr. Sun puzzle”
“Throw a rock”

I still have to implement last one, which appears at the end of a game.

Rest of things that I fixed this week:

  • hero special animation drawing (position of animation and last frames)
  • hero running
  • inventory – saving, swapping, opening and new item adding animation
  • German texts drawing
  • background script interpreter during dialog-boxes
  • cursor after loading