OpenSAGE Dev Diary #4 (2017-12-24)

OpenSAGE is an open-source re-implementation of the SAGE game engine. SAGE was the game engine used in C&C Generals, C&C Generals Zero Hour, Battle for Middle-earth and its sequels, C&C 3 and its sequel, and Red Alert 3 and its sequel. I’ve been working on OpenSAGE for 6 months, and made some good progress, so I’ve started this series of blog posts to talk about what is happening in the project each week. You can also star or watch the OpenSAGE GitHub repo for a more real-time view of things.

Following on from last week’s post, here is what’s been happening this week in OpenSAGE.

Progress this week

This week in OpenSAGE:

  • I’ve worked on UI rendering, in particular the main menu. The main menu now responds to mouse input, and you can click buttons. C&C Generals .wnd files use a callback system, and those callbacks are implemented in engine code, so I’m having to guess at their implementations just from observing behaviour in the running game. For example, when you first see the main menu, only the logo is visible, but then after any mouse (or keyboard) input, the border and buttons animate in. As far as I can tell that is done in the MainMenuInput callback. Every UI element (or “window” as they’re called in .wnd files) has an input callback and a system callback. If it’s not specified in the .wnd file, then the engine appears to use default callbacks based on window type (button, textbox, etc.). The input callback receives mouse and keyboard messages, and turns them into “system” messages like “the skirmish button was pressed”, and these system messages are passed to the system callback. One of the system callbacks is PassMessagesToParentSystem, which passes any messages to the system callback of the parent window. In most .wnd files I’ve looked at so far, eventually at the top level, the .wnd defines a system callback that actually does something. The design seems heavily inspired by win32 window messages, but it’s not the same.

  • Stephan Vedder submitted another great pull request, this time adding initial support for the .apt format, used to define UI screens in Battle for Middle-earth (BFME) and later SAGE games.

Just a short update this week. Until next time!