wtorek, 24 czerwca 2014

Dialog frame and rest of mouse handling

Hello everyone!

This is very difficult week for me - final exams at university and midterm evaluation of GSoC at the same time. I'm doing my best to combine these two and I hope you'll like my weekly progress.
So, here we go:

At the beginning of a week I was working on implementing dialog box frames. I manage to finish it and it's drawing everything in right position now (long sentences are cut properly). Mouse handling and highlighting is working fine too. On the video and on first screenshot you can see temporary texts. It's not loading actual texts from game data yet - it needs more work at script part to be finished.

I was also fixing some of existing functions, like showTexts(). I had to change calculations of texts position to adjust it for heroTalk() function and other texts that will be shown above heads of characters. It's now using width of longest line to find a center and it's also drawing correctly at the edge of screen and in wider locations.

I also mange to do cursor changing function (screenshot no. 3) and rest of left and right mouse button handling to finish choosing from option frame (Give, Use, Open/Push, Close/Pull) in inventory.
Most of mouse button handling outside of inventory is working too.

At the end of a week I also asked wjp for help with my git repository. I had a job to recover history of malik's commits in my branch instead of initial commit that I create at the beginning of GSoC from existing Prince codes. Everything is working excellent now, so again - many thanks to wjp ;)

You can see my progress on screenshots below or watch it here: https://www.youtube.com/watch?v=V44Dbpdbxm8


Dialog box drawing
Highlighting one of options


Hero talking - working animation
Texts from dialog box in correct position

Cursor changing
Use / Give - working inventory options

This week I'll try to take a look at script part to check if I can connect existing mouse events (and their op codes) with simple actions, like drawing texts for mobs examining outside of inventory. I'm also looking at pathfinding part right now, but it still looks very complex. I'll also try to check and fix some memory problems and do some clean up in existing code.

wtorek, 17 czerwca 2014

Options menu and item examining

Hello everyone!

I would like to show you my weekly progress. I was working on left and right mouse button events and I finished drawing options menu and displaying short descriptions of items in inventory.

I had to check position of cursor to find which mob (item / object) is selected. Then if LMB is pressed I play voice sample and load proper text for calculated amount of time. If LMB is pressed again (during the voice sample) it cancel playing the sample and turn off text instantly. During this event mouse cursor is invisible and you can't leave the inventory.

RMB allows to display options menu for selected item. Selected option is highlighted properly. We have to check if cursor stays inside of rect of menu, otherwise we turn it off.
 "Examine" - first option in inventory menu starts same event as LMB click on item. I have to implement events for rest of options now.

You can check all of these on screenshots below or on video here, first time with sound ;)
https://www.youtube.com/watch?v=yPc_FXlAHyE



Drawing exam texts of items in inventory
Options menu outside of inventory
Options menu in inventory

I was also working on fixing letters from German version of game in intro animation, options menu and exam texts and it seems to be fine now:

German letters drawing in intro, options menu and exam texts

Next thing that I will implement will be probably cursor changing for "Use" and "Give" menu options. I also start working on dialog windows part.

wtorek, 10 czerwca 2014

Inventory implementation

Hello everyone!

I would like to show you my new progress. Like i wrote in my last post I'm working on inventory part right now. I have already implemented drawing the suitcase and loading sprites and texts for items. I managed to recreate animation of adding a new item with sound effect. Position of items in inventory is based on amount of them. I also handle proper opening and closing it by mouse and drawing names of item selected by a cursor.

 There were also two additional parts of code that had to be done - drawing animation of candle (it's the only one animated inventory item) and also gravedigger's curse animation for four items (immortality elixir, amulet, gem and dagger) for first location. Animation of adding new item and gravedigger's curse use other algorithm of calculating frame colors (which creates blinking effect). You can see that on screenshots below or on short video right here: https://www.youtube.com/watch?v=TsaZnmblBgM

Inventory - dagger
Name drawing, mouse handling

Inventory - Gravedigger's curse
Items animation - blinking

Next things that I want to implement are left and right mouse button events for inventory (drawing short description of item and item options window). Some functions from inventory will be very useful for dialog windows part later.


wtorek, 3 czerwca 2014

Parallax sprites, masks and Z axis

Hello everyone!
There will be more pictures to show my progress this time. ;)

I was working harder at the weekend and was able to implement loading and displaying sprites that use parallax effect.
In simple words, in Prince these are bitmaps displaying as last, on top of everything else and scrolls faster then other animations while hero is moving in wider locations. It gives a feeling that this kind of objects are closest to the screen.
You can see them by finding differences in pictures below:


Parallax sprites - loc no. 2
Before (left) / After (right)


Parallax sprites - loc no. 2
Before (left) / After (right)

Parallax sprites - loc no. 4
Before (left) / After (right)

Parallax sprites - loc no. 4
Before (left) / After (right)

Next part I manage to code was masking sprites by parts of background.
Information about masking is loading for each location. Mask doesn't contain graphics data, just info about position and which pixels of background should be redrawn on top.
I recorded short video with mask debugging - https://www.youtube.com/watch?v=6bhaI_PDOdI.
It shows working algorithm of turning on and off proper masks. It depends on position of hero, background animations and objects, etc.

Masking - loc no. 3
Before (left) / After (right)

Masking - loc no. 5
Before (left) / After (right)

Last part that I code required some thinking before actual doing it. It was a problem of drawing everything I already had (sprites of hero, background animations, masks, parallax sprites, objects) on background in proper sequence of Z axis coordinate.
I decided to create structure similar to this one from original asm code - DrawNode. It contains all information about drawing element (e.g. position, width and height of sprite, pointer to sprite) and also pointer to function that will draw it later.
Each function of drawing add new DrawNode to an array. After creating whole array I'm sorting all of them by Z coordinate and then draw them. You can see working algorithm on pictures below and also on short video here: https://www.youtube.com/watch?v=jdwqNOwqG1s

Z axis - loc no. 1
Before (left) / After (right)

Z axis - loc no. 2
Before (left) / After (right)

Next things I'll try to implement will be probably inventory drawing functions or dialog / choice frames. I'm trying to get familiar with these parts of code now.

See you next time!

piątek, 30 maja 2014

Background animations #2

Hello everyone in new weekly update.
There are four types of background animations in the game:
  • Type 0 - loop of just one sub-animation (e.g. gravedigger in loc. 1 - graveyard)
  • Type 1 - loop with randomized sub-animation (e.g. owl in loc. 1 - graveyard)
  • Type 2 - loop with base animation and after constant delay - change to one of another sub-animation (e.g. beggar in loc. 4 - city)
  • Type 3 - loop of one sub-animation that is turning off for randomized amount of time (only in loc. 14 - treasury)
I finally manage to draw background animations of all types and also to draw shadows for them:
https://www.youtube.com/watch?v=rq7yIA5Fp-c



I also allow to cut them properly on edges of the screen while scrolling the location.  I still have memory leak problems that I have to fix. Application is not crashing, but there have to be mistake somewhere. I'm using VS 2010 on Windows 7 and I don't have ScummVM compiled with gcc on Linux, so I'm using similar tool to Valgrind for memory checking - Dr. Memory. It gives me some errors in type 1 and 3 but it looks like it is not related with randomizing of sub-animations.

I also start working on part of code that allow drawing masks / overlays of background on top of other sprites (which allow to create Z axis in 2D world) and I have to say that it's going pretty good.


sobota, 24 maja 2014

Background animations and objects displaying



I had a lot of school work this week, so my progress is smaller then I hope. I’m not proud of it but I’m going to work harder in upcoming week.

I was working on background animations displaying. I manage to load and display proper first frames of animations for each location. At the beginning I thought that I will be able to use same way of loading that is used for objects loading (like for shovel in first location). Sadly, there are more complications with them.

I was trying to understand how animations for Prince are stored. For each location we have anim.lst file that contains information about all animations of loaded room: special animations of hero (like hero with shovel for first room), background animations (like owl or bats in loc no. 1) and normal animations (like wizard Arivald). I had to implement InstallBackAnimations and InstallSingleBackAnim functions to find and load only background animations. These functions allow to find their proper numbers in anim.lst and load data for them.

But there are some background animations that has more then one type / sub-animation (like owl in first location – there are animations of her blinking eyes, waving her wings, etc). I decided to store main info (BAS structure) and array of all sub-animations (Anim) for one background animation in one structure (BackgroundAnim) and then create array of these structures (backAnimList) that contains all of them, but I’m not 100% sure if it’s the best idea. Some of background animations can change into normal animations (like gravedigger in first location) and that will be important too.
 
I’m still working on finding which sub-animation should be loaded in specific moment - it’s calculated in ShowBackAnims function.

Background animations - location no. 1

Background animations - location no. 3

Background animations - location no. 10

piątek, 16 maja 2014

Hero’s shadow drawing #2



I finally updated showHeroShadow function and I think that it’s working as in original game now.
 
With help of Eugene I manage to fix shadow colors. I had thought that there was a problem with algorithm or with finding right values in memory, but there was small mistake in getting location palette for makeShadowTable function - I was using palette from previous location after loading a new one. It was easy to fix but very hard to find out, so thanks again to him.
 
I also extend shadow function by adding proper drawing on walls and masking on objects and you can see it on screenshots below:

 
Location no. 1 - shadow masking and correct palette
ScummVM (left) / Original game (right)

Location no. 2 - shadow masking and correct palette
ScummVM (left) / Original game (right)

Location no. 2 - shadow after hero scrolling
ScummVM (left) / Original game (right)


Location no. 3 - shadow drawing on walls
ScummVM (left) / Original game (right)