October 28, 2016 08:00 AM All times are UTC.
Welcome to the ScummVM planet - This aggregates the personal blogs of developers, teams members and active participants from all around the ScummVM community. If you wish to subscribe to updates to the planet or individual blogs please use the links on the right hand side. To add your blog to the planet contact DJWillis.
Our one month testing period is over. Thanks to a lot of help from you, our fellow
users and testers, we are now ready to ship our next release.
As always, we have been busy adding more games and enhancing old ones. Now,
after many years in production, we are proud to announce
support for Myst and Myst: Masterpiece Edition.
Besides that, we now support U.F.O.s and the early Sierra
Hi-Res adventures, namely Hi-Res Adventure #0: Mission Asteroid,
Hi-Res Adventure #1: Mystery House and Hi-Res Adventure #2:
The Wizard and the Princess, for a total of six newly supported games.
With this release we are switching to SDL 2, so please,
report any bugs you encounter. Last time
we introduced Sparkle-based updates for Mac, and now we're trying to launch it
also for Windows. Hopefully, you will see it in action once we release our
next version. Once again, we would like to mention that auto-updating is selected as an
opt-in during your first start up. By default, if you enable it, it will check
weekly for new releases. Screenshots of this in action can be seen at
the WinSparkle website.
Notable bugfixes and enhancements include Hercules rendering and font
for the AGI games, numerous bugfixes to SCI games, enhanced Sherlock
games experience, and AmiUpdate on the Amiga port.
"You are in the front yard of a large, abandoned Victorian house."
You can now experience adventure game history, and play Sierra's early
Hi-Res Adventure #1: Mystery House in ScummVM. Dare you leap back to
1980 and take the steps up to the porch? Grab the game and a
daily build, and join our testing by stepping back in time.
We're proud to announce that we now also have support for several other
games using the same ADL system — which feature advanced technologies
such as color graphics! Perhaps you'd rather save the planet (Hi-Res
Adventure #0: Mission Asteroid), or save the princess (
Hi-Res Adventure #2: The Wizard and the Princess)?
We're working on the rest of the Hi-Res Adventure games, but in the
meantime, we're releasing support for the Apple II versions of these
three games for testing, and look forward to seeing any bug reports for
problems you might find. We'd like to include these in our next release,
so be sure to read through our
and don't forget to take some
Mystery House was released into the public
domain by Sierra On-Line in 1987, to celebrate their 7th anniversary.
You can download it for free. For more details about the
other games and where you might be able to buy a copy, take a peek
at our wiki pages.
If you happen to have original floppies for any of the Hi-Res Adventure
games (for any platform), we want to hear from you. In particular, if
you have an Apple II version of Hi-Res Adventure #3: Cranston Manor,
please get in touch. Many of these games are rare, and we cannot add
support for all the different releases without your help!
Time flies quickly, and now it is time to start the release cycle for ScummVM 1.9.0.
Two new game engines became production quality, and we would like to ask you to test the following games:
Myst: Masterpiece Edition
Also, our SCI engine team has been busy improving the ScummVM experience with Sierra games, particularly with fixing
the original script bugs. Thus, we would like to ask you to test several of those games as well.
The complete list of the games that require testing for this release can be found on
Please use a daily build of ScummVM for testing. In case you
encounter any bugs, there is a place for them to be reported at our
bug tracker. Please, also track your progress on
the forum thread and we can cross it out
on the wiki.
Please make sure to follow our guidelines for release testing
which can be found here.
Also we're still lacking some screenshots,
so please don't forget to snap some during your gameplay.
And so it has come to this, all things must end. But it is nothing to be sad about for me, this has been a great addition to my experiences and I welcome the change for it has been something short of 3 and a half months that I've been working on DM. Not that I won't be working on it from now on, but I'm definitely taking a few days off, lest I come to dislike it for looking at the codebase for too long.
The pull request to merge the engine is due next week as it still doesn't compile with GCC (strangerke has been working on it relentlessly (think 127kbs of error log reduced to 9)). Relatedly, the code is not particularly compliant with the coding conventions at ScummVM (strangerke is working on it, I'll soon start feeling ashamed and will have no choice but to help him).
As for the future of this blog, it is possible that I will post updates for when something major gets incorporated into the engine (think support for other versions).
Almost forgot about the new stuff, if I remember correctly it's convenient loading/saving from the launcher and from the inventory. And also there are debugger commands like godmode, noclip, set pos/map and the aptly named, gimme, which spawns items. Entering the commands without arguments will output their usage, call 'help' for a list of them.
Gimme can be used like this: call 'listItems', if you are looking for something enter any part of it in caps like this 'listItems OF FEAR'. Once you found what you are looking for, call gimme with its name: 'gimme HORN OF FEAR'.
Setting the map is slightly broken. For best results, teleport to an adjacent map, then use pos to set your position next to some stairs and off you go. Avoid using noclip.
I am sorry for not writing in a while, but as the finish date for GSoC comes closer, everything has to be ready for the end. My mentor and I agreed that the PR sould be submitted around August 14th, so these last days my intention was to have as much functionality as possible in before the PR came, as I was sure that after that I would have to spend all the time I had fixing things that I either forgot or didn’t know were broken in the first place.
However, I didn’t get to implement much, since a pesky error on my part had me using valgrind for three days, looking for the source of a heap corruption. Luckily I found it and fixed it right in time, and the engine was in at least a playable (albeit not complete) when the PR happened.
On the morning of the 15th I submitted the PR, and by now I have received tons of excellent feedback, and have compiled a list of fixes that need to happen. Thanks to everybody for pointing these things out that fast, so I can get to work right away :)
On a side note, I am planning on writing a postmortem once the GSoC is done, with some important lessons I learned during this experience, which will hopefuly be of some use to future me and anybody that comes after.
For the rest of GSoC I’ll be working on the PR, which you can check out here. Please feel free to pull and test it, I’d be very thankful for any feedback to make the project as good as it can be.
Thanks to the hard work of wjp, we have moved away from SF.net to our
own tracker at
This new service should be faster and more reliable than the old SF.net
All information has been migrated from the old bug tracker, including patches
(though these days we encourage people to submit patches using a
GitHub Pull Request instead).
For authentication, the new bug tracker uses GitHub accounts via OAuth2, which
should make signing up safer and easier. We transferred all accounts from SF.net,
but did not set up any e-mail addresses. Thus, after you log in for the first time,
please make sure you specify your e-mail address in the preferences, otherwise
we will not be able to get in contact with you.
What I was working on during GSoC is Cloud storages support in ScummVM. Describing this feature in my proposal (mirror), I mentioned that it would include an API to interact with supported storage providers (which are Dropbox, OneDrive, Google Drive and Box), saves syncing mechanism, functionality to upload and download games data, and, of course, GUI for all of these. Proposal also has some extra tasks mostly making user experience better.
Some things were rediscussed during my work, but the main idea remained intact. The work is done and pull request already awaits final review before getting merged. API for all four announced storage providers works fine, saves are syncing and games data could be easily downloaded. Not only described extra tasks were complete, but also some functionality not mentioned in the proposal was added.
Saves sync is probably the main reason why Cloud storages support is needed at all. It allows users to easily continue playing the game on another device by simply connecting both to the same storage and doing the sync. It’s automatically started on ScummVM launch, on games saving (including autosaves) and when user opens Save/Load dialog. This dialog was updated to show a progress bar while syncing and also to «lock» slots which are being synced. To indicate that there is a sync in progress, small Cloud icon is shown in the corner.
To use the feature, users must connect a storage first. To do so, they should navigate into Cloud tab of Options dialog, select a storage provider and press «Connect» button. It opens a special Storage Connection Wizard, which provides the instructions on connecting. It has different variations depending on set of libraries ScummVM was compiled with. In the most simple case it says users should navigate to a special short link (to scummvm.org), which redirects them to provider’s page. When they allow ScummVM to use their storage on that page, they are redirected back to scummvm.org, where the code is shown. This code should be typed in the wizard dialog. It’s used by ScummVM to connect to the storage and use provider’s REST API then.
ScummVM page makes the code that way so wizard could check that code has no mistakes in it. If there is a mistake, it notifies user where it probably is. If ScummVM was built with SDL2, pasting from clipboard is supported. Wizard also has «Open URL» button, which makes it easier to navigate to provider’s page on platforms where URL opening was implemtented (these are Windows, Linux, Mac OS X, Android — iOS and Symbian are coming).
But it’s much easier to connect a storage when ScummVM’s built with SDL_net support, because then ScummVM runs a local webserver. In this case users are not redirected to ScummVM site from provider’s page — instead, they navigate directly to webserver’s page. No code typing is needed then, because ScummVM automatically gets it from user browser’s HTTP request. This webserver makes connecting a storage really fast and simple.
Another thing Cloud storage might be used for is games data download. Users can put their games into storage and then easily download on all their devices. A special «Download» button in Cloud tab opens Download Dialog, where users can select a remote directory to download and a local directory to download into. It shows a progress bar there and automatically tries to detect a game when download is complete. Users are also free to run download in background: no detection will happen, but a message will appear on the screen to notify them of finished download.
Both storage connecting and game downloading are shown in a video I’ve recorded. I’ve also posted information about my progress in the blog every week. Feature is documented on the wiki pages, with some diagrams included.
And, finally, we’ve decided that I should do a big extra task. Local webserver, which I originally proposed to simplify storage connecting process only, has been extended to be used for «Wi-Fi Sharing» feature. It means that while ScummVM’s local webserver is running, one can use browser on another device to navigate through directories, download files, create new directories or upload files!
Users can specify server’s port and their ’/root/’ directory within the same Cloud tab. Only files under specified directory and ScummVM’s saves directory are available, so users secure data is safe.
Yay! The color palette is FIXED once and for all! No more radioactive green snot on every object and champion and door and what not! The GUI looks fabulous with it's newfound colours, it's just so much more pleasant to click on it now. Now, the original game uses copper to stretch those few colours the Amiga platform could offer at any given moment and given that ScummVM has no support for something like that (and why would it?) I shied away from even coming close to trying to fix it. Now as the end is nigh, it had to be fixed, and so it was! Phase one, double the palette and offset the pixel colours. Phase two ???. Phase three, profit! Relatedly the engine is almost complete. What's missing is correcting some display functions, hunting down a few annoying bugs and making sure the game can be finished and then all will be well. The later, so I gather, is not yet achievable. The fluxcages spawned to trap Mr Chaos cannot be seen, because the function drawing them is missing, and that particular function happens to be in assembly (... ehh) and so I can't really test if anything is happening at all, gonna have to make it draw some dummy image. As always, here's a nice GIF, basking in it glory:
Cursor got fixed, seems like googling Amiga hardware sprites is all it needed. Also found the bug with the spell symbols, a petty toUpper call in the text drawing method, dunno what is was doing there in the first place. Long story short, dungeon looks a lot nicer now, palette needs a fix and then it will truly look splendid (sans some scrabbled textures). Here, have nice GIFshot:
This week I’ve worked on some security-related updates for LocalWebserver. It now has a «minimal mode» — no Files Manager features are available, only redirect_uri. It’s used automatically in Storage Connection Wizard, and server goes offline the moment it gets the code.
Paths are now dealt with more strictly: «../» is forbidden to use, ScummVM has some «blacklisted» directories and user can define where the «/root/» is. Files outside that folder are not available through Files Manager. Plus, if no rootpath specified, «/root/» is not even listed — only «/saves/» is available then. GUI for changing rootpath is added to the same Cloud tab.
One other thing I did was rebasing. Travis checks PRs by merging with master and then building. Titanic, which wasn’t there when I started, was using OutSaveFile as if it’s typedefed WriteStream. But in my Cloud PR OutSaveFile is a real class (which starts saves sync when finalized). So, I had to rebase and add a simple fix in Titanic, and now Travis checks are passed again.
In order to update WAGE saves, I had to add pos() into WriteStream class. Managed to break a few builds that way.
Also, fixed a few crashes in WAGE games. One was because code tried to copy pixels outside of the Surface, and I added checks, so copied rectangle is clipped to always be within surface area. The other was because operator was used on an empty String, and now that code uses it only when String it not empty.
The title says it all. There are now sounds in the game, it is the first thing that worked on the first try, or so I hope. One can now indulge in the angry grunts the champions make when you bump them into the walls. Makes one wonder if they want to be there in the first place. Why would they follow an order to go headfirst into the wall? Also, blitShrink function has been dusted and adjusted and thus the dungeon looks a lot nicer. It seems that after hours of searching for broken code, I realized that nothing is broken, but the original blitShrink method works a bit differently than what I tried to simulate it with. So it seems I can't avoid the assembly after all.
kacIt has been too long, and I apologize for that, but like a Protoss player taking a base, many things got ready at once in a short short time (I just bought Starcraft II). So, without further ado, here are the occurrences and features of this past week.
Please ignore the graphical noise in the following screenshots, since it’s due to an issue with my display, not the rendering.
The MacGUI PR got merged
The very first thing I did on GSoC was to take the GUI system from WAGE and extract it to graphics, so that I (and hopefully some other devs) could use it for our engines. Over the course of the development I added some things to it, the most important being the support for custom bitmap-based 9patch borders (using _sev’s code).
Just today, the PR issued to merge this extraction to graphics has been merged, so hopefully somebody will find it useful. I know I certainly did.
The save/load system
I had the saving and loading functionality implemented already (luckily in MacVenture it’s pretty straightforward), but it was a pile of hacks that only worked in one savefile and just for Shadowgate. After some work, and much inspiration from WAGE and Drascula, I added support for ScummVM’s saving dialogs and metadata, which is included at the end of the file so as to try and make the savefiles compatible. However, I have no way to test this, since I do not own a Macintosh.
You can see the results of the new save system here:
A glitch in the matrix…
I added detection for Dèjá Vu and Dèjá Vu II, which would be fairly straightforward were not for the fact that all the Dèjá Vu game files had special characters in their names (D?j? Game, I’m looking at you), so I just couldn’t open them. I have a couple of proper solutions in mind, and I have to look at how Dráscula deals with Spanish tildes, but for now it rests as a dirty hack that takes the problem characters (è and á) and just transforms them to ascii.
Here is a screenshot of Dèjá Vu…
And here is a screenshot of Dèjá Vu II: Lost in Las Vegas. Note the recurring theme of the coat.
That is one unfortunate thumbnail, but it is actually the first sound I could find in Dèjá Vu. I implemented the sound system, which has about half a dozen formats, so that now we have sound. I haven’t tested all the formats, only the ones checked here.
Lastly, I implemented the system to read the border files from a file called macventure.zip. Eventually, I’d like to have this file bundled with ScummVM, like Dráscula or Wintermute, but for now just downloading it from here and placing it in a folder findable from ScummVM (the game folder or the extra path) should suffice.
In addition, if you have the games and would like to play, I wrote a short guide here.
As always, I try to keep my Trello updated, and I actually sometimes stream development too, on Twitch.
Well, this week I was mostly working on some fixes for Cloud PR, some minor warnings, TODOs. Updated GUI a little bit: added a «Paste» button in Storage Connection Dialog, so user’s clipboard could be automatically put in the 8 code fields. Dialog also contains a Container now, because buttons couldn’t fit in 320×200. Storage providers logos are now shown, which is just a nice thing to have.
Apart from that, I’m waiting for PR feedback, and thus have to do something while waiting. I’ve joined the ScummVM team and now working on WAGE engine. Well, the only thing I did for now was «porting» save/load code from existing Java implementation of WAGE engine into our ScummVM one.
It was a lovely surprise today to notice that writer Rebecca McCarthy mentioned my enhanced music for classic point and click adventure game Beneath A Steel Sky, which I spotted on the Giant Bomb forum under part 3 of her Adventure Afterlife series.
One of my all time favorite games, if cyberpunk or science fiction interest you I encourage you to play the game. It is available legally for free from SCUMVM or GoG as is James Woodcock’s ( Fan made) enhanced soundtrack, which I recommend you use. Mobile versions are also available if you want to support the dev. Rebecca McCarthy – Giant Bomb
I mentioned it in Adventure Afterlife but the Beneath a Steel Sky remix by James Woodcock is awesome https://t.co/reNMz79fXG
(I don’t have any excuse, I just forgot to post that in time.)
This week I’ve sent my Cloud storage support as pull request to the main ScummVM Github repository, and thus started fixing everything what is not fixed enough, adding new minor features, etc.
Only pasting from clipboard support was added for EditableWidgets (I’d have to fix that too, btw).
I’ve added two new test suites in the Testbed: Cloud and Webserver. I’ve also added one test for openUrl in MiscTests. Almost all my tests are interactive, meaning they require user to check whether the feature works as it should, and press the right button.
Peter Bozsó (uruk-hai), my mentor, added OS X backend for openUrl. iOS backend it not there yet.
Another small feature which lacks iOS backend is the Networking::Connection::isLimited() function, which is used in DownloadDialog to notify users to think whether they want to download game data while using limited connection. For now only Android supports this, other platforms are using default backend, which always returns that connection is not limited.
AJAX version of local webserver’s Files Manager was added this week. One can navigate through directories without page refreshing all the time. This version also contains «breadcrumbs» navigation feature, so one can get up more than one level with one click at the path.
Users can override webserver’s port through the Options dialog now. Yet, if they want to use webserver for auth, they have to use the default value.
Some refactoring/cleanup in the code and different minor fixes were made. More OSD messages added to notify user of success or failure. I’ve also updated Dropbox to use their API v2 everywhere, as v1 is deprecated now.
I’ve added detailed information about the cloud storage support and local webserver to the ScummVM wiki. These should help people understand PR’s code. Some ideas are coming out in the discussion. For example, webserver is being stopped now when users close the Options dialog to prevent it being used by someone else.
At last, the game of Shadowgate is winnable in the ScummVM platform!
There is a screenshot of the final battle with the wizard at the end (spoiler warning).
It took somewhat longer than expected, and it’s in no way as complete as I would like it to be (just look how the interface is broken), but still I’m very proud of that.
To play the game, you can clone and compile my github fork, get the game files, and unpack them using some HSV extracting tool. If anyone is interested, I have a bunch of savefiles to various rooms (more on that later).
Now, what’s next? After talking with my mentor, we have settled in the following order of prioirities to spend the rest of the time:
Fixing the GUI > Adding support for other Macventure games > Add sound > Add Apple II graphics.
I will probably be dancing around the first two, since they are not mutually exclusive and when I get frustrated with one I can work on the other.
Other than that, I try to keep my Trello updated, and the spirits up. Again, I am sorry for falling so behind on schedule, I am suffering the consequences of not doing things properly on the first try, during the June burndown inferno.
Hi all. Been a while since my last posting; and a hectic last couple of weeks. After flying down to Florida for a 4th July long weekend getaway, I was barely back before I had to get ready for a work trip to the west coast. Then I get back to two days of company photo-shoots, which kind of disrupted getting back to normal work; but no sooner than they were done, I come down with a cold and had to stay home for several days. And was too sick to even really use my computer until now. :(
Nevertheless, despite all of that, work has been progressing on Starship Titanic since my last posting, and I've made a lot of progress. Firstly, there's the PET User Interface. This was one of the major areas that still had to be investigated last time. Since then, I've spent a lot of time figuring out how everything works, and re-implementing it all in my ScummVM engine. Behold the fruits of my labor:
Code for all the various areas has been pretty much all implemented. You can enter text in the conversation tab, and click stuff in all the others. There's just a few minor visual and functionality glitches here and there, such as the dials in the above image. Some of the tabs, like the Remote and Rooms tabs, are mostly untested at the moment.. it will be easier to test when I have more of the game logic implemented, and can properly test them with live data. Saving and Loading is also waiting on me to finish the saving and loading code.
As before, I was aided somewhat in implementing the PET by how clean the class hierarchy was designed, and the fact there were various internal error messages scattered about the code to give an indication of the classes' original names and purposes. For example, the code has a single common class CPetGlyph for the square glyphs used in all the different PET tabs, and CPetGlyphs for the collection of glyphs, with all the logic for scrolling and rendering. Individual PET areas simply derived from that, and instantiated whatever glyphs were needed, be they action icons like for Save, Load, and Quit, or inventory items that can be selected.
Once the PET was pretty much done, I started looking into the conversation handling and text parsing. To begin with, I worked one of the easier, self contained areas of vocabulary loading. All the vocab data for Starship Titanic is held in a resource inside the game executable called STVOCAB.TXT. It holds the data for an impressive 4700 words! A lot of these come down to synonyms for common words, and in fact even includes foreign language words, like "ein" as a synonym for "a". Each word entry in the file also contains data for what kind of word it is (such as action, adjective, etc.), as well extra information that is used by the parser to uniquely identify the words. The vocabulary loader builds up the data for each word in turn, building a master list of overall words support by the game, and a linked list of synonyms for each word.
Once I did that, I started looking into the input processing code that gets called when a line of text is entered in the PET. First of all, the game calls some pre-parse methods. These take care of a bunch of standard processing of the line, including:
lowercasing everything and removing extra spaces between words
Conversion of numbers from textual formats into decimal. That was surprising.. the game has special code in place so you can enter numbers like '42', 'forty two', or even 'LXXIII'. That's right.. the parser is so sophisticated, it even handles roman numerals. :)
Expanding common contractions like "it's" to "it is".
Once preprocessing is done, it then breaks down the entered sentence into a series of words. Each word is checked against the word synonym lists to identify the known word for each entered word. Here again, the parser has extra complexities that surprised me. It can not only find word matches based on exact word matches, it has two fairly complicated routines that can identify various forms of pluralization, as well as common word prefixes like 'super', 'anti', 'counter', etc. and find matches on the word without the prefix. At the end of this process, the entire input has been broken done into a linked chain of recognized words, and the real handling of figuring out the player's input can be done using custom logic for each NPC script.
At this point, whilst I had made some inroads on NPC script handling, I somewhat started drifting on what area I worked on. Strangerke had been looking at some of the core game scripts to add me in writing game logic, so to make things simpler in the long-run I went back to the main CGameObject base class, and spent some time figuring out all the remaining unknown methods. Quite a few of the methods were basically stubs calling PET Control methods, so my prior work on the PET was a great help.
Next, there was a bunch of CGameObject methods calling movie code, so I decided it was finally time to figure out what it was doing. I was able to properly implement the game's OSMovie class which handles movies, and it's AVISurface which handles the low level AVI files. It was actually interesting in that some videos have a second video track - I haven't 100% disassembled the movie drawing code, but my impression is that pixels in one are transparent, and in the other are not. This required me to add an extension to our AVIDecoder to allow a callback method for selecting which streams the AVIDecoder would use. That way, I could set up two decoders in the AVISurface class, one with the audio and first video track, and the second with the second video track, if present. This neatly avoids the limitations of one video track per decoder. The replacement movie code is all implemented now, but apart from cursor loading working (the cursors are stored frame by frame as a video), movie playback is still crashing, and will have to be debugged further. But at least I know what the bulk of the movie methods are now.
Finally, I moved onto the Star Control class. This is what implements the game's starmap control.. with PET mostly implemented, NPC scripts partially implemented, and movie handling more or less done, only it and sound are left unlooked at. And as I've mentioned previously, sound handling has a lot of spatial processing for sounds that I may simply not implement - the AVIDecoder already handles video sound, and I'm hoping to hook up the other sound methods to simply use standard ScummVM sound decoders. So that makes the star control the only remaining large area to look into.
Oh boy, and what a large area it is. Even basic identification of classes was already bumping up to nearly 30 classes all specific to just the star control. I felt greater and greater dismay the further I looked into it. Honestly, it was like Hopkins FBI all over again, where they included a full Wolfeinstein 3D style minigame in the PC release. In that case we were lucky, and could simply ignore it. Not so much in this case - all the classes will have to be implemented.
As I've looked into it further, and worked on classes that don't depend on others (so are self contained, and in theory easier to figure out), some of them have started to make sense. There's matrix and vector classes.. somewhat surprisingly, two versions of each, one for floating point numbers and one for doubles. I can only assume back in the day there was space vs speed considerations for having both types; I've not yet reversed all the methods, so I don't know if they can be merged in the future. I've also identified two "star points" classes that use large lists of spatial data that was hard-coded in the executable. Hopefully, the other remaining classes won't be too hard to figure out likewise.
So, all in all, things are going good. I'm starting to feel better, and I'm making inroads on the last major area of the game. Once I get that out of the way, it'll be a matter of finishing off the NPC scripts, implementing miscellaneous methods here and there such as sound handling, and then implement the game logic. Which, with all the core engine implemented, will hopefully be a straightforward, if slow process.
This last week has been, for the most part, incredibly frustrating. The inventory system had so many little bugs in it that it seemed that when I fixed something (often after most of the day looking), something else broke. However, somehow I managed to get it working, and thus, with the skeleton key in hand, I can go on to the fun part of the project: QA! In all seriousness, in the upcoming week I will be focusing on just following a walkthrough of the game to detect and solve the little bugs in the way of winnability. I had a milestone in my planning to have Shadowgate winnable for today, with which I meant a much more polished state that it currently is in. However, several factors and my frustration (no-one but me to blame here) have made it impossible to acomplish.
Well, actually, I wouldn’t know currently whether Shadowgate is winnable or not, because there is a little bug that prevents me from lighting more torches, and that makes it near-impossible to advance more than a few rooms. However, I am really please to see that at least there is nothing major preventing me from playing the game, and that the systems I put in place (read: “copied”) are more or less working.
So, without further ado, here are some screenshots of the first rooms of the game:
Again, I apologize for the short clips, but it is a combination of my switching to Arch Linux (and the limitations of the software I use to screencast) and my general slowness while playing.
I am hopeful that, by the end, I will have a product that I can be proud of, and hopefully somebody can enjoy (I for one am having a blast playing through this game).
My exams were over, I now have to turn my attention back to Director engine. I continued to work 5 days ago. And next things have emerged:
Starting from Director 4, RIFX containers can have little-endian byte order, specifically for this, regular ReadStream was amended to ReadStreamEndian and now engine can work with both orders. In so doing, byte order is determined by first tag (“RIFX” or “XFIR”)
In the majority of the movies, casts not stored directly in the movie. There is a special file, with a special name (surprising!) that stores, common to all movies in folder, sounds, images, texts. For this situation, renew shared casts immediately after jumping to new folder was written. Shared may be some regular buttons for game.
For example: (Spaceship Warlock in our engine)
But determine shared cast movie name still a problem.
Significant progress has been made by sev : storing local/global variables, Lingo macros, built-in-functions and more… On my part, were introduced execution go to loop, go to next/previous commands.
Reading text resource realized a long time ago, and it time to deal with rendering issues. Director font map has been reviewed by sev. And it was decided to use classic mac fonts data file for drawing our text. Future target: rendering with box shadow, borders (if needed)
As it happens, I needs to complete some work related to my student status. It’s about my exams. In this regard, in the coming week my time should be given to questions about tropical geometry and information models/processes.
At the end of week, I will continue to work on Director engine.
And once again I’m writing about my GSOC progress.
Loading transition info and implementation of some movings (8/52).
Imitation 2 track sound system (such as in Director).
Rendering trail sprites (it works like background images)
Parsing new kind of scripts – movie scripts.
Speaking of scripts, there is a work on the Lingo compiler by sev. There is, at present execution some media interface commands like play part of sound files and the processing of alias map. Also put/set commands have been added.
Were reviewed, Director ‘go to movie (label)‘ commands. In many games this is main command, with this you can simulate walking across levels. But this transition using special name of movie, and because of that movie loading was redesigned.
I know I promised to show The Journeyman Project movie files. But right palette still got trouble.
Specifically for this post, I’ve copied in my local code, palette, which contuinity uses as fallback. And some of JMP movies seems more or less pretty.
A week went by, engine changes, but slowly. Now is the moment when differences in Director versions are important.
Under the supervision of sev, I started to learn life cycle of the playback/draw system, it’s important because it can tell about when causes local events, such as frameEnter, frameExit, idle. In other words, we want to achieve event order, same as in Director. For me personally, it was hard to figure out what order is correct, sev advised me to check it right in Director. Because our target game is Journeyman Project, I looked in 4.0 version. By writing a simple script, I have found right positions in my code for calling this events.
It is worth noting, that in other versions the order differs, part of the problem is new events (D6: stepFrame, prepareFrame, beginSprite …).
Maybe you have already guessed that, this events are necessary for our feature Lingo interpreter. In addition to the system events, I’ve also added mouse events, this event are sent to clicked sprite on top layer.
Simple sound wrapper had been written, in JMP we’ll see .wav and .aiff formats. ScummVM audio decoders deal with this.
Decoder for 1bpp pictures was also added. This pictures are sometimes used instead text.
There is now some issues with 256 color palette loading. I hope problems will be solved, and in the next report I can show movies from The Journeyman Project.
Although I have never officially announced my work for classic point and click adventure game The Gene Machine, I have already finished the soundtrack… Just one problem, before I release it in full, I need permission. I have always sought permission to release my enhanced soundtracks, however tracking down those who have the rights to allow me to do just that has proven… well… problematic!
To whet your whistle however, I have decided to release a single track as a preview in the hope that one day, the powers that be will contact either myself or the ScummVM team allowing this to happen.
Until then, enjoy this little taster as we all keep our fingers crossed.
As you may already be aware, this year the ScummVM project is participating to the Google Summer of Code. One of the rules for students who want to participate with us is that they need to submit a simple patch against the ScummVM source code before they are accepted. Usually we direct prospective students to our bug tracker for ideas on what they could implement. But now most of the bugs that are still open are not trivial to fix. So I was looking at the source code hunting for simple things to do when I found a TODO comment I left two years ago when implementing the TaskbarManager API on OS X.
What is the TaskbarManager API?
The TaskbarManager API allows interacting with the ScummVM application icon in the taskbar (or in the case of OS X in the dock). We have implementations of this API for several systems, but the only one that is complete is the implementation for Windows. In details the API allows to:
Display an overlay icon when playing a game. If you have in your extra path png files named after the game IDs, when starting a game the corresponding png image is overlaid on the ScummVM icon in the dock. You can for example get icons from http://www.megamonkey.org/icons/ and below is example of this feature in action.
Display progress. This is for example used in the mass add feature to indicate the number of directories scanned in respect with the total number of directories to scan.
Display a count. This is also used in the mass add feature to indicate how many games are being added.
Notify of an error.
Provide a list of recently played games.
The last two were not implemented on OS X and the TODO comment was related to the last point. The idea was that we could provide a list of recently played games in the ScummVM dock menu and thus provide a shortcut to start a game quickly. I decided to take another look at this feature and wrote some bits of code to check that the idea I had hinted at in the TODO would indeed work. I then waited a few days in case a student wanted to implement this as part of his application to the GSoC. But today I finished implementing this feature, cleaned the code and pushed this to the ScummVM repository.
One aspect to consider here is that we want to customise the menu on the ScummVM icon in the dock when ScummVM is not running. That way we can propose a list of recent items in the menu and start ScummVM directly with a game. On OS X we can provide this feature with a plug-in that implements the NSDockTilePlugIn protocol. If an application bundle contains such a plug-in, the OS loads that plug-in when the application is added to the Dock. So there are actually two separate things to implement:
Obviously we need to implement the plug-in.
But we also need to implement code in ScummVM to update the list of recent games when starting a game.
Saving the list of recent games
The TaskbarManager is part of the ScummVM application and when starting a new game the addRecent method is called. So what I did here was simply to save the list or recent games in a place where the aforementioned plug-in can find it. I decided to use the NSUserDefaults class to do this, which means the list is saved in the user preferences (to be precise in the ~/Library/Preferences/org.scummvm.scummvm.plist file).
(if you don't see the source code below visit the blog as it may not be visible in RSS feeds)
That code is a bit too simple though. There are two main issues with it: the list can grow indefinitely and the same game can appear multiple times in the list. So let's improve the code that updates the array of games.
And that's it. We have this part fully implemented. After playing a few games the ~/Library/Preferences/org.scummvm.scummvm.plist file should look like this:
Implementing the NSDockTilePlugIn
If you took a look at the NSDockTilePlugIn protocol documentation you will have seen that it requires implementing a setDockTile: method, and optionally we can implement a dockMenu method. We actually have nothing to do in the first one, so let's skip it and look directly at the second method.
Here we can note that I am using CFPreferences to read the list of recent games and not NSUserDefaults. Why is that? Do I need to remind you that this code is in a plug-in and not in ScummVM? That means we need to access the preferences of another application. Admittedly we could have used NSUsersDefault addSuiteNamed: to achieve this, but remember, we are implementing a plug-in and not an application. The plug-in is loaded by the SystemUIServer and using NSUserDefaults addSuiteNamed: would have changed the global preferences domain list for the SystemUIServer and not only for the plug-in.
The second point we can note is that the code above is using something called StartGameMenuItem. As you have probably guessed this is a custom class that derives from NSMenuItem. Indeed for each menu item I needed to store somewhere the game ID so that when this menu item is activated it can start the corresponding game. So I decided to inherit from the NSMenuItem class and store the game ID in the derived class. And while I was at it I also added the method to start a new game in that derived class. So here is what this class looks like:
Now if you add ScummVM to the dock, and after playing at least one game, you should see the list of games you played recently in the the dock menu like in the picture below. This provides a quick way to start one of those games.
And here is what it looks like in action:
This is in my opinion the most useful of the features provided by the TaskbarManager API, so I am happy to see it finally implemented (I would have done it sooner if I had not forgotten about it :P).
Edit: Our buildbot uses an older SDK that does not support the NSDockTilePlugIn protocol. So nightly builds from our web site will not contain this new feature. You will need to compile your own version or wait for ScummVM 1.9.0.
What began as a casual lunch-time activity (spread across many, many lunches), my work on Douglas Adam's Starship Titanic is finally starting to see significant results. See below for an example of the current progress from the start of the game: https://www.youtube.com/watch?v=8ypLR4fS6vE
You can't get as far as the ship crashing into your house yet, but at least you can fiddle around with the computer and, more importantly, use the television, and see Douglas Adm's visage scolding you to get on with the game. :)
I was originally attracted to working on the game more for technical reasons then the actual gameplay for several reasons. Firstly, because it was a Windows game.. my previous disassembly work has all been on DOS games, so I thought it would make a nice change of pace. Secondly, the original executable relies on compatibility tweaks to run on modern Windows systems and, according to the GOG forums, multiple people have had trouble getting it to run at all. And thirdly, the ease of disassembly.
The game has, in my opinion, the cleanest and most well thought class structures of any game I've worked on. Part of this clean hierarchy involved the bulk of classes in the game deriving from a common "CSaveableObject" base class that defines, amongst other things, the name of the class. The entire game state is laid out as a tree sturcture, with CRoomItem objects for rooms, CNodeItem objects for positions within a room, CViewItem for the different directional views within a node, and game objects under each view. Saving and loading games, including loading the initial game state for new games, is then a simple matter of dumping the hierarchy to and from disk.
Because of this, it's made it somewhat easier to reverse engineer how the classes are implemented. Since the game loading code needs to be able to locate and create classes by their textual name, it meant that I was able to properly identify and name all the classes the same way they were in the original source code (which I don't have access to). Since the original uses C++ classes and inheritance, it's meant that when I've identified the meaning of a virtual method, I could apply the same name to the same method in all the other objects. So, for exmaple, when I identified the methods for saving and loading an item's fields, I was able to focus on those same methods in all the other classes to handle loading the entire game state.
So as you can see from the above video, progress on the engine is going well. I have all the core logic in place for loading the initial game state, displaying views, and moving between them. I've also been able to graft some of the original's movie class, that handles playing AVI videos for all the game's animations, to use the existing ScummVM AviDecoder. Although there's still parts of CMovie that I don't understand. And there also isn't any background sound yet. Apart from that, there's two main areas left to be handled: firstly, all the hardcoded game logic. If there's one thing that I find a pity, it's that rather than using some kind of scripting system, they chose to implement all the game logic in code. So all the various interactable objects in the game have their own code that will need to be slowly implemented.
The other main area remaining to be figured out is the PET control that provides the game's user interface. Particularly the conversation system, where you can converse with the characters within the game. I've already made some minor in-roads into implementing display of the PET, and various error messages in the original executable have given me some ideas of various classes in the conversation system. But it will still take a while to fully implement the game. Plus of course, dispute recently working on it quite a bit in my off hours, work on this game has primarily been a lunch-time diversion, so it's somewhat limited by my work's totally unreasonable policy that lunch should be limited to only a single hour each day :)