TODO
This is a long rambly list of things left to do in xoreos and xoreos-tools. Anybody is welcome to tackle any of these tasks, but please also read our general contributor overview, including our Code Formatting Conventions, Commit Guidelines and Code of Conduct. If you plan to do any of these tasks, please also contact us beforehand, so we can better coordinate multiple people interested in doing the same task, and discuss how to best solve the problem. Thanks. :)
Standalone(ish) fixes/improvements
Broken NWN2 XML
- Not standards-conforming XML. Need custom XML parser; stock XML parsing libraries will just throw errors.
- <?xml version="1.0" encoding="NWN2UI">
- No single root element
- Attribute values not enclosed in quotes most of the time
- Special characters in attribute values not properly escaped
- Unmatched quotes on several occasions
- Event functions
- Special values like PARENT_WIDTH
- Altrite is working on a broken-XML fixer
CJK glyphs in the console
- The "system font" we use for our debug console, DejaVu Sans Mono Bold, does not feature any CJK (Chinese, Japanese, Korean) glyphs
- Not strictly necessary, but nice to have for printing, say, Witcher area names in Asian languages
- We could maybe integrate CJK glyphs from the Hanazono fonts or other suitable libre fonts
- We need to match the height with DejaVu Sans Mono Bold
- CJK glyphs tend to be more complex and therefore wider. They're usually rendered twice as wide as Latin glyphs
- Our console code needs to take that into account
Script decompiler
- It might be quite useful to have a NWScript decompiler in xoreos-tools
- Script disassembler is probably easier, as a first step
- A script compiler might be useful as well
File format writers
- GFF3Writer, GFF4Writer
- Both necessary to create save games compatible with the original games
- Also useful for a xml2gff tool
- TLKWriter
- Or extend TalkTable_TLK with a method to save into a TLK file?
- Same with TalkTable_GFF?
- xml2tlk tool
- Or extend TalkTable_TLK with a method to save into a TLK file?
- Extend TwoDAFile to write binary 2DA?
- Archive (ERF, RIM, KEY/BIF) packers?
Config file
- Should be more preserving of the layout
- Especially empty lines
- UTF-8 Byte-Order-Mark when using native Windows editors
- \r is currently always stripped. Maybe preserve that too
- Autodetect when \r is already used, and add it to new config lines too
- This basically needs a complete rewrite of the config parser
- Don't just look for comments, just throw everything after "foo=bar" into the "comment" variable, including whitespace
- And all whitespace before "foo=bar" into a "prefix" variable
- Maybe even always add BOM and \r when writing a new config file on Windows?
Windows-specific / Wine-specific
- When running my mingw32 cross-compiled xoreos EXE in Wine, the menu button texts are partially cut off
- Z-fighting issue?
- Does that also occur on a real Windows?
GUI
- xoreos could use a global GUI to start games from
- Should probably be similar to ScummVM's GUI, at least in effect
- Should read the config file, list all targets
- Press a "Play" button to play the game
- Press an "Edit" button to edit the entry
- Dialog options to edit common settings
- An additional free-form editor?
- Game-specific options?
- A button to edit global settings ("xoreos" config domain)
- For the future, a way to immediately load a saved game?
- An "Add" button to add a game
- File browser
- Select directories for most game
- Select file for Sonic Chronicles
- View current saved games of a target?
- File browser
- Probably implemented using OpenGL, just like, say, the console
- Theme-able/Skinable?
- Some potential stumbling blocks
- Displaying "uncommon" text in both game descriptions and file paths
- "Decomposed" letters, i.e. base letter + combining glyphs
- CJK
- Arabic and other scripts where letters change depending on their place in the word
- Right-to-left
- Shortening those strings when they don't fit in their fields is also potentially difficult
- Displaying "uncommon" text in both game descriptions and file paths
Localization
- Text in exceptions?
- At least the user-visible ones, like "Failed to detect game"
- Or maybe we should clean that up and split them into "program logic failure" and "user failure", with only the latter translated
- Strings for the engine loader progress bar
- Debug console string
- GUI (see above) strings
- GNU gettext would be one solution
Resource Explorer
- A portable, user-friendly graphical resource explorer could be useful
- Phaethon is a start
Full-fledged modding toolset
- Similar to the NWN, NWN2 or Witcher toolset, but portable and FLOSS
- Might also support other games?
- Out of scope for xoreos
- Still, such a thing would be welcome under the xoreos banner
- Neveredit might still be worth a look
Build system
CMake
- Current doesn't set the git version to "+unk" when git isn't found
- make install?
- make doxygen?
Autotools
- Debian's lintian complains about statically linking to glew
- Maybe check for system glew in configure, and use the included glew only as a fallback
- And a configure flag to force on or the other
- Suppress the "fatal: not a git repository" when building gitstamp without a git directory
- Build everything as C++
- Currently, we build glew and Lua as C, the rest as C++, and then link them together
- We might want to change that to compile everything as C++ instead
- We might want to only use the C++ compiler in the configure script too
- clone2727 really wants to do that
- Increased modularity
- Disabling engines
- Dropping library dependencies when the still enabled engine don't need them
- Making library dependencies optional (and disabling certain features, then)
- liblzma is only needed for the iOS version of KotOR
- libxml2 is only needed for the two Dragon Age games
- libxvidcore is only needed for the Mac version of KotOR
- libvorbis/libogg are probably only needed for The Witcher
- When something is disabled, skip it, if possible
- Like the videos in KotOR Mac
- If skipping is not possible, error out
- We should then show a summary of what is enabled/disabled at the end of the configure script
- Disabling engines
Graphics
MDL supermodels and animations
- Mostly working in NWN thanks to jbowtie's work
- Might need some cleanup
- Animation scale is off in a lot of cases. Mostly visible in the talking and yawning animations in non-human characters
- Models should smoothly change between different animations
- The animation system probably needs to be a bit more complex, to allow for "overlaying" different animations onto each other. For example, for speaking while holding an object and keeping the head focused on the PC character.
Lighting
- We don't yet have a proper light system
- I started working on it: [1], but my approach is seriously lacking. You can see the edges of the tiles that make up on NWN area in many cases ([2], [3])
- See the light branch in the git repository
Materials
- NWN and more excessively KotOR/KotOR2 use material properties in combination of semi-transparent textures to create metallic textures. My OpenGL knowledge is quite basic, I generally fudge through everything :P. Research there would be needed
- Materials in The Witcher are closely tied to shaders
OpenGL and Shaders
- mirv_ is currently working on a graphics system overhaul, complete with shader support
- All Aurora games use shaders in some form
- NWN uses ARB shaders. We probably need to rewrite them from scratch
- DirectX shaders might be automatically convertible with Cg?
- Otherwise, look at what Wine does with the shaders, and use that as a basis?
- All the games, even NWN, use some form of shaders. Still totally missing from xoreos, since we have no idea how to use them in general yet. Moreover, this was before GLSL, so they're in the old assembly-like language. We probably need to rewrite them from scratch
- We need shaders for tinting in NWN2 (objects and area geometry) and TexturePaint nodes in Witcher
SDL 1.2
- Optionally link against SDL 1.2 instead of SDL 2
- Should ideally use a configure flag to select between the two
- Maybe a CMake flag as well, if possible
- Assigned to clone2727, so anybody interested in this should coordinate with him
Videos
XMV/WMV
- Used in Xbox versions of KotOR/KotOR2
- Our WMV decoder (for XMV videos used in Xbox versions) is missing P-frames and J-frame
- Code exists in ffmpeg, but is connected to the MPEG-4 family mess
Actimagine VX
- Used in the Nintendo DS game Sonic Chronicles
Sorenson 3
- One single video in the Mac port of KotOR2, the Aspyr logo, uses the Sorenson 3 codec
- ffmpeg has a decoder, but it's connected to the MPEG-4 family mess (SVQ3 is similar to H.264)
- ScummVM needs that too
- While xoreos is GPLv3+, ScummVM is GPLv2+
- Somebody implementing Sorenson 3 for xoreos should ideally give explicit permission to relicense it GPLv2+ for ScummVM
- Of course, if the decoder is based on prior work by other people, it has to be compatible with both GPLv2+ and GPLv3+
Sound
FMOD
- Dragon Age: Origins uses FMOD for sound and music
- I have experimental FSB (FMOD sound bank) support working in a private branch
- FEV (FMOD events) format is still unknown to us
- Apparently, groups of event lists with events
- Event is everything from "play sound", over "set volume" to "apply echo"
- Game areas specify the group to use for the area
- Scripts then probably tell FMOD to play event lists out of that group
Wwave
- Dragon Age 2 uses Wwave for sound and music
- Should be similar in concept to FMD
Events
Gamepad binding
- The Xbox versions of KotOR and KotOR2 don't use a mouse. We have basic support for joysticks/gamepads, but no real bindings to the engine or ideas how to handle that in general
- We might want to handle the controller support the new KotOR2 Steam update brought
- override folder contains a gamepad.txt then
- Also hack in controller support for a non-Steam KotOR2? And for KotOR?
- Controller support in Jade Empire
- Controller support for Sonic? It is a Nintendo DS game after all
- Controller support for the non-console versions of the Dragon Age games?
Network
- We need a network subsystem
- SDL_net?
- Boost.Asio?
- More options here: http://stackoverflow.com/questions/118945/best-c-c-network-library
- Engines need to be split into client and server classes
- The original engines all still do that, even when not exposing anything to users
- NWN and NWN2 allow user multiplayer
Engines
Script system
- Needs rewrite, badly
- ImperatorPrime has started with that
- Afterwards, can mostly copied to other engines
- They need new engine function tables, though
- The names and signatures of which we have
- KotOR2 and NWN2 have some extensions
- Might need extending the script bytecode parser, might not
- Witcher uses Lua scripts together with NWScript
- Sonic has no scripts at all, it seems
NWN
- Menus
- Basics are there, but needs fleshing out
- Supermanu is working on the character generator
- Pathfinding, walkmesh
- "Moving" should move the PC, not the camera
- NPC walking
- Triggers, areas on the floor that calls scripts on enter/leave
- NWN objects need an inventory concept
- Player characters' might be different
- Inventory tetris
- Inventory item icons
- Player characters' might be different
- Multi-page asian fonts
- In fact, the Graphics::Aurora::TextureFont class needs to be made codepage-aware
- The multi-page fonts carry a "codepage" setting in their TXI
- Single-page fonts do not. Detect from the current language?
- Since CP-1252 is quite similar to Latin1, and the Latin1 characters map cleanly to UTF-32, it currently just works for games using CP-1252
- It's probably very broken in a Russian NWN
- LanguageID 0 is not necessarily "English", but "The language of the game install"
- This is okay for languages with Latin characters
- Messes up strings in community modules with Asian languages that stuff strings in to languageID 0
- The original fails there too, though
KotOR/KotOR2
- Menus
- Basic structure is already there, just missing most of the specific widgets stuff
- Semi-hardcoded, with GFF files (hierachical data, similar to XML in spirit) describing the setup. The xoreos-tools repository has a tool for converting GFF files into XML for easy reading.
- Dialogues
- DLG files, similar to NWN
- Some extensions, like camera setup
- Dialogues are displayed very different than NWN
- KotOR2 has script extensions
- Passing parameters to scripts
- Call several scripts, combine with AND/OR for branching
- Animations
- Should be similar to NWN
- No player character shown
- Needs character creator menus
- Loading of character files in class Creature
- Minigames
- Swoop racing
- Pazaak
- Hardcoded, mostly removed from usual game logic
Jade Empire
- Menus
- Apparently very similar to KotOR's menus
- Minigames
- Flyer, top-down shoot-em-up thing
- Hardcoded, mostly removed from usual game logic
- Player character
- Needs research
NWN2
- Menus
- Implemented using XML
- See Broken NWN2 XML
- Animations (Granny)
- nwn2-dev contains some code working with Granny data
- Call into the original Granny DLL to convert between binary and ASCII Granny data, though
- berenm started some Granny RE
- nwn2-dev contains some code working with Granny data
- Facial animations (FaceFX)
- Trees (SpeedTree)
- Proper evaluation of creature model parts (equipped items)
- Player character
- Reading of PC files in creature
Sonic Chronicles
- Allow using the contents from an extracted NDS file?
- Menus
- GUI files that are GFF
- Actions in a state machine in GDA files?
- Music/Sound
- Music is apparently similar to MIDI, or to a tracker format?
- Sounds and instruments for music are in a sound_data.sadl archive
- Animations
- Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite
- Player character(s)
- Needs research
The Witcher
- Menus
- Needs research
- Animations
- Needs research
- Player character, Geralt
- Needs research
Dragon Age: Origins / Dragon Age 2
- Menus
- Needs research
- Animations
- Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite