Open main menu

Summer of Code/GSoC Ideas 2022

< Summer of Code
Revision as of 23:37, 26 March 2022 by Sev (talk | contribs) (Added incomplete engines task)

If you'd like to get involved in ScummVM, we'd love to help you get started!

We've had a lot of successful student projects as part of Google's Summer of Code in previous years -- we hope to inspire you to work with us and (hopefully) add your own success.

We often get asks by participants with no experience with ScummVM whether they have the necessary skills to participate with us. The idea of GSoC is to introduce students to open source development, so we are not expecting you to have experience with ScummVM. You will have time during the application and community bonding periods to familiarize yourself with the project. The technical skills required to work with us varies from task to task. For any work on ScummVM, you'll probably need to already be comfortable with a basic level of C++. Some of the tasks might need more specialized knowledge (working on a 3D game engine may need you to understand some OpenGL and 3D math, and some engine tasks may require some assembly or reverse engineering knowledge); we give our thoughts about this alongside each suggested task, below.

Most importantly, we'd like you to join our community. There are many previous GSoC participants who are still involved in our project, and whether or not you participate as part of Summer of Code, we'd love for you to get involved too.

You should come to our Discord Server and introduce yourself in the #scummvm-gsoc channel! We're friendly, and it's often the easiest way to ask questions about the tasks and the code in general. The channel is the main form of everyday communication for the project, and there will almost always be developers there who can discuss your project ideas, answer questions and help out.

You can find more information about what we expect from you before you apply at GSoC Application.

Introduction

We have a list of potential tasks further down on this page, but before you look at them, perhaps you'd like to take a look at some of the successful projects from previous years! We encourage all of our students to maintain a blog during their summer work, which is a nice way to get some sense of what they accomplished.

One popular type of task is to improve our support for the games you love, whether this means a new game engine, or helping us to perfect an existing one.

Sometimes source code is available - in recent summers, students integrated code supporting games such as Sfinx (blog), The Prince and the Coward (blog) and Avalanche (blog) into ScummVM. In fact, our support for the Wintermute engine was not only started by a GSoC student (blog), who integrated the code into our tree, but also drastically improved by another student a year later (blog).

     

A more challenging (but hopefully rewarding) idea is to start (or continue) reverse engineering a game where no source is available. Two good examples are the pair of students who drastically improved support for Escape from Monkey Island (blog, blog), and the work on improving Operation Stealth (blog). Another option is to work on merging (and improving) someone else's reverse engineering work, such as was done with the ZVision engine (blog).

If you'd prefer to improve ScummVM more directly, there are even more options available there; in the past, students have (to give some examples) improved our OpenGL support, added a testing framework (blog), improved our scaler code (blog), written a new GUI framework, added loadable modules for embedded platforms (blog), rearchitected our keyboard input code (blog) and added support for high-colour (16bpp and above) graphics. It's difficult for us to imagine ScummVM as it was before some of these projects, you can make a huge difference!

Tasks

General contacts: Our Discord server our mailing list, or contact sev, Arnaud Boutonné

The ideas here are meant to be just that - ideas. We hope they help inspire your proposals, but you should also consider suggesting your own completely new project ideas. Pick something you really want to see improved/fixed, and come and talk to us about it!

If you're looking for more inspiration for ideas, beware of our TODO (and the other TODO lists linked from there) and our OpenTasks pages. Many of the tasks listed there might be incomplete or outdated, or too difficult for a new developer. The best thing to do is to come and talk to us!

Game Tasks

Technical contacts: Our Discord channel, our mailing list, or contact sev, John Willis, Arnaud Boutonné, Filippos Karapetis,

If you already have reverse engineering experience, you could consider working on one of the external in-development game engines, or even on support for a new game. However, doing this kind of work is very difficult and time-consuming - you would have to convince us that you have the necessary skills to actually be sufficiently productive, probably by demonstrating some actual progress first.

If you don't feel quite up to that level of challenge, we have lots of other suggestions:

Macromedia Director

  • Technical contacts: sev
  • Difficulty level: Medium. You'll need a reasonable level of programming experience, and probably some Director games.
  • Size: 175 or 350 hours

Many 90s-era adventure games were developed using the Macromedia (now Adobe) Director tool. It would be nice to be able to play these games in ScummVM! We have a WIP engine in ScummVM tree, but it requires much more work in order to implement all hundreds of Lingo commands.

Enhance SAGA engine for supporting Amiga Inherit the Earth

  • Technical contacts: sev
  • Difficulty level: Medium.
  • Size: 175 hours

We have been supporting the Inherit the Earth game for a long while. However, Amiga versions are not yet supported by this target. We have the original source codes, and the main difference is the data bundles format.

The Immortal

  • Technical contacts dreammaster or sev
  • Difficulty level: Hard. Good knowledge of C++ and assembly (x86 or 68K or 6502) is required.
  • Size: 350 hours

The immortal was released in 1990 by Electronic Arts. It's a mix of genres involving RPG elements with action and puzzles. The gameplay is different one variant to the other, and all variants are written in assembly, making it more difficult to support all the variants.

In 2018, a GSoC student picked this task but, due to personal issues, didn't manage to complete the task. The purpose of the task is therefore to implement an engine for a variant of the game, using the original sources and the work of JoeFish as a documentation.

Screenshots on Mobygames



Penumbra: Overture (HPL1 engine)

  • Technical contacts aquadran or sev
  • Difficulty level: Hard. OpenGL knowledge is required
  • Size: 350 hours

Frictional Games has released full sources for their HPL1 engine under GPLv3 license (link), around 100k lines of code. This is accompanied with around 37k lines of game-specific code for Penumbra: Overture (link).

(Source for Amnesia: The Dark Descent and Amnesia: A Machine for Pigs were also released, but they use the HPL2 engine).

The purpose of this project is to port the HPL1 engine to ScummVM, with the goal of supporting Penumbra: Overture. Also determine what additional steps would be needed to support other HPL1 games (Penumbra: Black Plague and Penumbra: Requiem).


YAGA engine

  • Technical contacts: sev
  • Difficulty level: Medium.
  • Size: 175 hours

This engine was used for two latter Humongous Entertainment games, Pajama Sam: Life is Rough When You Lose Your Stuff and Putt-Putt: Pep's Birthday Surprise. The engine is basically an extension of Python 2.2. There exists an almost complete reimplementation by cyx on GitHub and we also have the complete source code, thus, implementing the missing feature in cyx implementation, "Lip Sync" is part of this task also.

The task is relatively straightforward, the only difficulty with it is adding Python as an external dependency, but mentor is there to help.

The goal is to bring cyx's code to ScummVM and use the original code as a reference later.


Finishing implementation of incomplete engines

  • Technical contacts: sev
  • Difficulty level: Medium or High
  • Size: 175 hours or 350 hours

ScummVM currently has a number of engines which are very close to completion. Many of them were parts of previous GSoCs. For them, we need a playthrough and slight bugfixing, or additional portability fixes.

Some of the engines are:

Bring your own Adventure or RPG Reimplementation (only existing games)

  • Technical contacts: Talk to us on Discord, or send us an email.
  • Difficulty: Hard. You'll need good knowledge of C++, as well as knowledge of (reading) assembly.
  • Size: 350 hours

Our project consists of re-implementations of classic games, and we have listed a number of potential new game engines that you could work on here on our ideas page. However, you may have a classic 2D Adventure game or Role Playing Game (RPG) you are interested in yourself that is suitable for ScummVM that you would like to reverse engineer and re-implement. If so, great!

Adding a completely new game engine is not easy, and you will have to convince us that you are aware of the challenges involved, that the game you are interested in is feasible, and that you have the necessary skills. Preferably, you will already have done some preliminary investigation, into for example data file formats, disassembly, etc.

Please come talk to us to see if we have a mentor who would be interested in working with you on such a game. We'd be happy to help out.

Smaller Tasks

Add Keymapper to more games

  • Technical contacts: sev
  • Difficulty: Easy
  • Size: 175 or 350 hours, depending on number of games

ScummVM includes a global fully configurable keymapper, but this requires engines to be adapted to use it. The feature documentation: Keymapper, some reference implementations: Wintermute has per-game keymaps; a pull request with adding keymapper to HDB engine; a commit with adding Keymapper to a simpler engine, Griffon.


Support Unicode input in GUI

  • Technical contacts: sev
  • Difficulty: Medium
  • Size: 175 hours

Last year we enhanced our GUI for supporting Unicode output. Now we need to enhance our input system, so Unicode input is supported as well. This includes RTL support (we have FriBiDi employed for output).

Networking code for Moonbase Commander

  • Technical contacts: sev
  • Difficulty level: Medium
  • Size: 175 hours

Moonbase Commander is a SCUMM-based strategy game. The original supported up to 4 network players. We have the source code for the original game, but it is based on top of Microsoft DirectPlay. We need to do a clean reimplementation, not necessarily compatible with the original. There is an unfinished server code based written in PHP. The code supports creating game sessions, joining sessions and the gameplay.

The optional task extension is fixing several remaining rendering bugs in the game.

Optimize blending code for AGS games

  • Difficulty level: Medium
  • Size: 175 hours

One of the main bottleneck in term of performances for AGS games in ScummVM lies in the way sprites are blended together. The AGS engine has 10 different blending modes, and they are currently implemented in a generic way with the colors for both sources being decomposed into their RGBA components before being blended, and then the resulting color being composed back. Those generic decompositions and composition operations are slow and in many cases could be eliminated when implementing specialised versions of the blending functions for a specific pixel format. The task will consist in first changing the blending code so that it can benefit from specialised implementations (for example use template functions or a function pointer). Then specialized optimized implementations of the blending functions can be added for the most commonly used input and output pixel formats combinations.

Infrastructure Tasks

Finally, there's always plenty of other practical tasks on our wishlist!

Automated system for packaging freeware games with ScummVM

Background

ScummVM is distributed on our website as a standalone app without any games included, which cannot be used until games are added.

Thanks to generous support from game authors, the ScummVM website offers eleven freeware games for download, but they need to be manually downloaded and added to ScummVM.

Proposal

It would be great to develop a game-agnostic, automated system that would let us package a game, e.g. provide screenshots, game descriptions, metadata, and create distributables for different platforms. For example, we could have Beneath a Steel Sky bundled together with ScummVM, with its own logo, description, with the resulting distributables ready to upload to various platforms (Linux packages, Google Play, Apple App Store, Steam, ForgeTV store, and anything beyond that).

User Benefits

Users will be able to download a single distributable for a particular game, such as Beneath a Steel Sky, and run it without any additional configuration. This is especially useful on platforms where apps are typically distributed through an app store (such as iOS).

For freeware games that ScummVM is permitted to distribute, this would allow them to reach a wider audience by being available on more niche platforms. Should new freeware games become available, they would also be able to be distributed with minimal effort.

These automated scripts will also provide a reference for game authors who want to bundle their own games with ScummVM to be sold for their own.

Future Ideas

Potentially and in the future this system could also be used for DLC on platforms that support it, like Steam, Android Play Store or Apple App Store. However, DLC support for Android and iOS is out of scope for this project.

Support for shaders and arbitrary scalers

  • Technical contacts: sev
  • Difficulty: Medium
  • Size: 175 hours

ScummVM uses software scalers for graphics enhancements. In 2012 we were running GSoC for turning them into plugins. That work It was recently merged in ScummVM but could require some more love like adding xBRZ scalers.

Modern systems often have OpenGL with shader support. RetroArch project shaders are standard for them in open source gaming. LordHoto started and rootfather continued work on adding support for those to ScummVM. Their unfinished work could be found here: https://github.com/lotharsm/scummvm/tree/shaderscaler . There is also a second branch that adds a hard-coded CRT shader that may be useful as a reference. This can be found here: https://github.com/braindx/scummvm/tree/crt-emulation

We need to add both improvements to our scaler system. Recent PSP2 port already adds some basics for scalers, particularly in GUI, so that could be reused too.

We need to have it tested on desktops and at least Android, but preferably also Windows and iOS.


System for checking the game files integrity

  • Technical contacts: sev
  • Difficulty: Medium
  • Size: 350 hours

ScummVM requires game data files to operate. Very often, especially when copying from the old media, the files could be damaged. Thus, we need a system that could let the end-users compute all the checksums and compare them with the reference.

The solution will consist of two parts: server and additional functionality within ScummVM. In order to avoid any potential problems with the copyrighted material, only checksums could be passed to the server.

The ScummVM part:

Calculates checksums of all files of a given game/title and submits them to the server. After receiving the response from the server, the end-user is presented with the results of the check: if all files are correct or list of files with different checksums.

Optionally, the users could have the possibility to give their consent to submit their checksums as the new game variant.

The server part:

It should keep checksums of all files of all known games in a DB.

It can receive a list of files to check against from ScummVM, perform a match with the DB and provide the result back in machine-readable form.

Additionally, it must support command-line utility for mass-populating the DB, performed by the developers.

Additionally, it must have a web interface that will let the authenticated users (developers) browse through the existing checksums.

Optionally, it could have a way to see and approve the submitted entries.