TODO: Difference between revisions
Jump to navigation
Jump to search
(81 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
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 [[Developer_Central|general contributor overview]], including our [[Code_Formatting_Conventions|Code Formatting Conventions]], [[Commit_Guidelines|Commit Guidelines]] and [https://github.com/xoreos/xoreos/blob/master/CODE_OF_CONDUCT.md Code of Conduct]. If you plan to do any of these tasks, please also [[Contact_us|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. :) | |||
('''See also:''' the Kanban-like "Projects" boards on GitHub: https://github.com/orgs/xoreos/projects?type=classic) | |||
== Documentation == | |||
=== Developer information === | |||
* Extend the developer information on the wiki | |||
** Explain how to get the xoreos sources on various platforms | |||
** Expand GNU/Linux compiling instructions to cover more distributions | |||
** Expand Mac OS X compiling instructions | |||
*** Xcode | |||
*** Homebrew/MacPorts/Fink | |||
*** CMake, Libraries | |||
** [http://wiki.arx-libertatis.org/Developer_Information Arx Libertatis] has an extensive dev page | |||
* Document file formats on the wiki? | |||
** Or integrate info into XentaxWiki? | |||
** Both? | |||
=== User information === | |||
* More user information on the wiki | |||
** How to download xoreos | |||
** How to install the games on various platforms | |||
** [http://wiki.arx-libertatis.org/Main_Page Arx Libertatis] does that pretty well | |||
=== Modder information === | |||
* Link to relevant modding resources | |||
* Maybe even some kind of Modder's Handbook | |||
** A big overview of modding Aurora games in general | |||
*** Differences and commonalities between games | |||
** Linking/Grouping engine functions between games | |||
== Website == | |||
=== Design === | |||
* Better website design? | |||
** It still should be static in the end | |||
*** No PHP or Rails | |||
*** Very light on JavaScript | |||
*** No Flash! | |||
** Maybe a bit more unique, graphical | |||
** For legal reasons, we shouldn't directly use art or designs from the original games | |||
*** Something inspired by the art of the orginal games would fit | |||
=== Octopress === | |||
* Move away from Octopress? | |||
** Alternative should still produce static HTML somehow | |||
** Octopress works rather well. It reads Markdown, which is a plus | |||
* Octopress 3.0? | |||
** Not finished yet, it seems | |||
== Standalone(ish) fixes/improvements == | == Standalone(ish) fixes/improvements == | ||
Line 19: | Line 70: | ||
* CJK glyphs tend to be more complex and therefore wider. They're usually rendered twice as wide as Latin glyphs | * 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 | * Our console code needs to take that into account | ||
=== Fuzzing === | |||
* Set up fuzzing targets for everything for [https://llvm.org/docs/LibFuzzer.html libFuzzer] | |||
** File readers, image decoders, etc. | |||
* Can be integrated with [http://lcamtuf.coredump.cx/afl/ afl] (american fuzzy lop): https://github.com/llvm-mirror/compiler-rt/blob/master/lib/fuzzer/afl/afl_driver.cpp | |||
* Integrate it with our build system somehow | |||
** ./configure flag for building with fuzzing instrumentation? | |||
** Needs to check that the compiler can do that | |||
** make fuzzers then builds the targets? | |||
* File formats previously manually fuzzed with afl: | |||
** CBGT, CDPTH, DDS, NBFS, NCGR, NCLR, SBM, TGA, TPC, TXB | |||
** 2DA, KEY/BIF, ERF, GFF3, GFF4, GDA, TLK, NSBTX, RIM, SMALL, SSF | |||
* Continuous fuzzing via [https://github.com/google/oss-fuzz OSS-Fuzz] (currently only taking "important" projects) | |||
=== Script decompiler === | === Script decompiler === | ||
* It might be quite useful to have a NWScript decompiler in xoreos-tools | * It might be quite useful to have a NWScript decompiler in xoreos-tools | ||
** | * We have a script disassembler, ncsdis | ||
* | ** Which already does code flow analysis | ||
* Missing: | |||
** Code generation | |||
** Collapsing of instruction chains into single-line NWScript code | |||
*** For example, "int var = foo * bar + quux" compiles to a long chain with multiple temporaries | |||
** Proper handling of structs and vectors | |||
=== Script compiler === | |||
* An NWScript compiler might be useful as well | |||
** A script assembler might be an easy first step | |||
=== File format writers === | === File format writers === | ||
Line 29: | Line 102: | ||
** Both necessary to create save games compatible with the original games | ** Both necessary to create save games compatible with the original games | ||
** Also useful for a xml2gff tool | ** Also useful for a xml2gff tool | ||
* | * xml2tlk | ||
** TalkTable_GFF::write02() and ::write05() | |||
** | ** Needs GFF4Writer | ||
** | |||
* Archive (ERF, RIM, KEY/BIF) packers? | * Archive (ERF, RIM, KEY/BIF) packers? | ||
Line 46: | Line 117: | ||
*** And all whitespace before "foo=bar" into a "prefix" variable | *** 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? | ** Maybe even always add BOM and \r when writing a new config file on Windows? | ||
=== GUI === | === GUI === | ||
* xoreos could use a global GUI to start games from | * xoreos could use a global GUI to start games from | ||
** https://github.com/ocornut/imgui? | |||
* Should probably be similar to ScummVM's GUI, at least in effect | * Should probably be similar to ScummVM's GUI, at least in effect | ||
* Should read the config file, list all targets | * Should read the config file, list all targets | ||
Line 79: | Line 146: | ||
=== Localization === | === Localization === | ||
* Text in exceptions? | * 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 | * Strings for the engine loader progress bar | ||
* Debug console string | * Debug console string | ||
* GUI (see above) strings | * GUI (see above) strings | ||
* [http://www.gnu.org/software/gettext/ GNU gettext] would be one solution | * [http://www.gnu.org/software/gettext/ GNU gettext] would be one solution | ||
=== Unit tests === | |||
* More unit tests | |||
=== Phaethon === | |||
* More readers | |||
* Writers? | |||
=== Model converters === | |||
* Document the model formats | |||
* Convert between the binary model formats and their ASCII equivalents | |||
* Convert between the binary model formats and ones that can be opened by modelling tools | |||
** 3D Studio Max | |||
** Blender | |||
=== 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 | |||
* [http://sourceforge.net/projects/neveredit/ Neveredit] might still be worth a look | |||
== Build system == | == Build system == | ||
Line 89: | Line 179: | ||
=== CMake === | === CMake === | ||
* Current doesn't set the git version to "+unk" when git isn't found | * Current doesn't set the git version to "+unk" when git isn't found | ||
* make doxygen? | * make doxygen? | ||
=== Autotools === | === Autotools === | ||
* Suppress the "fatal: not a git repository" when building gitstamp without a git directory | * Suppress the "fatal: not a git repository" when building gitstamp without a git directory | ||
* Increased modularity | * Increased modularity | ||
** Disabling engines | ** Disabling engines | ||
** Making library dependencies optional (and disabling certain features, then) | ** Making library dependencies optional (and disabling certain features, then) | ||
*** liblzma | *** liblzma? Only needed for the iOS version of KotOR | ||
*** libxml2 | *** libxml2? Only needed for the two Dragon Age games | ||
** When something is disabled, skip it, if possible | ** When something is disabled, skip it, if possible | ||
*** Like the videos in KotOR Mac | *** Like the videos in KotOR Mac | ||
** If skipping is not possible, error out | ** If skipping is not possible, error out | ||
** | |||
== Nitro == | |||
* The Nintendo DS (Nitro) specific file formats should probably be moved out of src/aurora/ and into src/nitro | |||
* nitrofile, cdpth, nsbtx, smallfile | |||
** nsbtx needs to be split into a class accessing the textures in src/nitro/ and an archive class on top in src/aurora/ | |||
** This means src/aurora/ accesses src/nitro/, so libnitro.la needs to come after libaurora.la in the linking order | |||
* ndsrom as well? | |||
* What about nftrfont and model_sonic in src/graphics/aurora/? | |||
** src/graphics/nitro/? | |||
** This would have src/graphics/nitro/ access src/graphics/aurora/, so graphics/libnitro.la needs to come before graphics/libaurora.la in the linking order | |||
** That would be the other way round than for src/nitro/. Too confusing? | |||
== Graphics == | == Graphics == | ||
Line 120: | Line 209: | ||
* Mostly working in NWN thanks to jbowtie's work | * Mostly working in NWN thanks to jbowtie's work | ||
* Might need some cleanup | * Might need some cleanup | ||
* Models should smoothly change between different animations | * 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. | * 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. | ||
Line 126: | Line 214: | ||
=== Lighting === | === Lighting === | ||
* We don't yet have a proper light system | * We don't yet have a proper light system | ||
* I started working on it: [ | * I started working on it: [https://drmccoy.de/xoreos/20150809T223407.png], but my approach is seriously lacking. You can see the edges of the tiles that make up on NWN area in many cases ([https://drmccoy.de/xoreos/20150809T223507.png], [https://drmccoy.de/xoreos/20150809T223548.png]) | ||
** See the [https://github.com/xoreos/xoreos/tree/light light branch] in the git repository | |||
** Of course, the actual glLight* stuff won't be relevant anymore as soon as shaders are there | |||
** Lighting in several (ASCII?) area tiles is broken | |||
*** The door in Prelude.nwm's "m0q1a" area | |||
*** A water tile in Chapter2.nwm's "map_m2q1a" area | |||
*** A sloped snow tile in XP2_Chapter3.nwm's "thecityoflostsou" | |||
=== Materials === | === Materials === | ||
* Materials in The Witcher are closely tied to shaders | * Materials in The Witcher are closely tied to shaders | ||
Line 151: | Line 244: | ||
=== XMV/WMV === | === XMV/WMV === | ||
* Used in Xbox versions of KotOR/KotOR2 | * Used in Xbox versions of KotOR/KotOR2 | ||
* Our WMV decoder (for XMV videos used in Xbox versions) is missing P-frames and J- | * Our WMV decoder (for XMV videos used in Xbox versions) is missing P-frames and J-frames | ||
** Code exists in ffmpeg, but is connected to the MPEG-4 family mess | ** Code exists in ffmpeg, but is connected to the MPEG-4 family mess | ||
=== Actimagine VX === | === Actimagine VX === | ||
* Used in the Nintendo DS game Sonic Chronicles | * Used in the Nintendo DS game Sonic Chronicles | ||
* https://wiki.multimedia.cx/index.php?title=Actimagine_Video_Codec | |||
=== Sorenson 3 === | === Sorenson 3 === | ||
Line 164: | Line 258: | ||
** Somebody implementing Sorenson 3 for xoreos should ideally give explicit permission to relicense it GPLv2+ for ScummVM | ** 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+ | *** Of course, if the decoder is based on prior work by other people, it has to be compatible with both GPLv2+ and GPLv3+ | ||
=== Optimizations === | |||
* Optimize our simple BitStream interface | |||
** See [https://fgiesen.wordpress.com/2016/01/02/end-of-buffer-checks-in-decompressors/ this blog post] | |||
** Specifically, we don't do any peeking at all | |||
** It still needs to handle different memory layouts, though | |||
* Likewise, our Huffman class could probably be tuned a lot | |||
* Pull in fft/rdft/dct/mdct optimizations from FFmpeg? | |||
* I experimented with that in a private branch and it didn't do anything for Bink performance | |||
== Sound == | == Sound == | ||
Line 176: | Line 279: | ||
** Scripts then probably tell FMOD to play event lists out of that group | ** Scripts then probably tell FMOD to play event lists out of that group | ||
=== | === Wwise === | ||
* Dragon Age 2 uses | * Dragon Age 2 uses Wwise for sound and music | ||
* Should be similar in concept to FMD | * Should be similar in concept to FMD | ||
Line 190: | Line 293: | ||
* Controller support for Sonic? It is a Nintendo DS game after all | * Controller support for Sonic? It is a Nintendo DS game after all | ||
* Controller support for the non-console versions of the Dragon Age games? | * Controller support for the non-console versions of the Dragon Age games? | ||
== Network == | |||
* We need a network subsystem | |||
** [https://www.libsdl.org/projects/SDL_net/ SDL_net]? | |||
** [http://www.boost.org/doc/libs/release/libs/asio/ 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 == | == Engines == | ||
=== Script system === | === Script system === | ||
* | * ImperatorPrime had started on a script system rewrite | ||
** | ** Includes functions with real signatures | ||
* | ** Maybe switch to that, if it works | ||
* | * Rounds, object heartbeat scripts | ||
* KotOR2 and NWN2 have some extensions | * KotOR2 and NWN2 have some extensions | ||
** | ** It seems like they don't need any extensions to the low-level bytecode stuff | ||
* Witcher uses Lua scripts together with NWScript | * Witcher uses Lua scripts together with NWScript | ||
* Sonic has no scripts at all, it seems | * Sonic has no scripts at all, it seems | ||
* Currently a script in an infinite loop locks the game thread | |||
** Timeout? Asynchronous script execution? | |||
=== NWN === | === NWN === | ||
* Menus | * Menus | ||
** Basics are there, but needs fleshing out | ** Basics are there, but needs fleshing out | ||
** | ** Character generator is mostly working | ||
* | * [[Pathfinding]], walkmesh | ||
** "Moving" should move the PC, not the camera | |||
** NPC walking | |||
** Triggers, areas on the floor that calls scripts on enter/leave | |||
* Models | |||
** ASCII models need averaging of smooth group normals | |||
* NWN objects need an inventory concept | * NWN objects need an inventory concept | ||
** Player characters' might be different | ** Player characters' might be different | ||
Line 224: | Line 339: | ||
=== KotOR/KotOR2 === | === KotOR/KotOR2 === | ||
* Menus | * Menus | ||
** | ** Most menu skeletons exist - much of the content is yet to be added. | ||
** | ** Add item descriptions in item slot equip screen (when you select an item and can press 'equip' button). | ||
** Add sliders to applicable settings. | |||
** Add journal/quest log content to Journal menu. | |||
** Display all items owned in Items menu. | |||
*** Including sort/filter buttons. | |||
** Add updating for the loading bar in loading screens. | |||
***[[File:Loadingbar_upd.png|none|thumb]] | |||
** Button highlights (when you hover or select a button in a menu, the button should be highlighted appropriately). | |||
***[[File:Btn_hl.png|none|thumb|KoTOR (left) xoreos (right)]] | |||
* Containers | |||
** Enable player to transfer items into containers. | |||
* Class selection | |||
** Smokey background effect | |||
** Lighting on the character model | |||
** Scaling when hovering over different classes | |||
*** Not hovered: | |||
****[[File:Class_hl_inactive.png|none|thumb|KoTOR (left) xoreos (right)]] | |||
*** Hovered: | |||
****[[File:Class_hl_active.png|none|thumb|KoTOR (left) xoreos (right)]] | |||
* Dialogues | * Dialogues | ||
** DLG files, similar to NWN | ** DLG files, similar to NWN | ||
Line 233: | Line 369: | ||
*** Passing parameters to scripts | *** Passing parameters to scripts | ||
*** Call several scripts, combine with AND/OR for branching | *** Call several scripts, combine with AND/OR for branching | ||
* Animations | * Animations | ||
** | ** Mostly working now | ||
** | ** Animation transitions/interpolation to transition smoothly from one animation to another. | ||
*** | ** Combat animations for abilities. | ||
*** | *** This includes feats like Power Attack/Blast, Flurry, etc. | ||
*** Right now we only have default attack animations play. | |||
** Combat defense and damage received animations. | |||
*** Receiving attack and/or ability animations. | |||
* GUI / HUD (non-menu) | |||
** Display actions on intractable characters. | |||
*** I.e. display attack actions you can use on enemies when you target one. | |||
** Better align the hover/target circles to objects. | |||
*** E.g. ensure the circles align to a character's head. | |||
** Display action queue while in combat. | |||
*** Actions in the queue should correctly be added to and removed from the queue when executed. | |||
** Display damage/heal values as floating text above the receiver. | |||
** Prevent hovering or targeting objects outside player field of view. | |||
*** Including objects behind walls, too far, etc. | |||
* NPCs | |||
** Enable NPCs to engage in actions. | |||
*** Includes combat, animations, etc. | |||
* Movement | |||
** Improve follow-target movement of characters. | |||
*** Auto-calculate route to target. | |||
**** This means party members should find a way to walk around things when they are stuck while trying to follow the leader. | |||
* Camera | |||
** Enable hold down right-click to pan camera. | |||
** Prevent camera from seeing through walls when moving into them at an angle. | |||
* Minigames | * Minigames | ||
** Swoop racing | ** Swoop racing | ||
Line 245: | Line 410: | ||
=== Jade Empire === | === Jade Empire === | ||
* Menus | * Menus | ||
** | ** Main menu with options submenu is there | ||
* Minigames | * Minigames | ||
** Flyer, top-down shoot-em-up thing | ** Flyer, top-down shoot-em-up thing | ||
Line 251: | Line 416: | ||
* Player character | * Player character | ||
** Needs research | ** Needs research | ||
* Sound | |||
** Uses an ASCII variant of the [http://wiki.multimedia.cx/index.php?title=XACT XACT formats] | |||
*** Cues probably not as complex as FMOD/Wwise | |||
*** Effects need extension of the Sound system, maybe | |||
** Xbox version might use the binary format? | |||
*** Sound banks could be handles as archives and indexed in the ResourceManager? | |||
** [https://github.com/flibitijibibo/FACT FACT] is an implementation of XAudio, including XACT, zlib-licensed | |||
=== NWN2 === | === NWN2 === | ||
Line 260: | Line 432: | ||
*** Call into the original Granny DLL to convert between binary and ASCII Granny data, though | *** Call into the original Granny DLL to convert between binary and ASCII Granny data, though | ||
** [https://github.com/berenm/xoreos-tools/tree/granny berenm started some Granny RE] | ** [https://github.com/berenm/xoreos-tools/tree/granny berenm started some Granny RE] | ||
** Based on berenm's RE efforts, Arbos has written a tool to convert to/from MDB+GR2: https://github.com/Arbos/nwn2mdk | |||
*** Probably a good starting point for integrating NWN2 animations into xoreos | |||
* Facial animations (FaceFX) | * Facial animations (FaceFX) | ||
* Trees (SpeedTree) | * Trees (SpeedTree) | ||
Line 265: | Line 439: | ||
* Player character | * Player character | ||
** Reading of PC files in creature | ** Reading of PC files in creature | ||
* Walkmeshes. CromFr wrote a specs document here: https://gist.github.com/CromFr/104bac52dc9191099d9d9e3dbd2c4975 | |||
=== Sonic Chronicles === | === Sonic Chronicles === | ||
Line 281: | Line 456: | ||
=== The Witcher === | === The Witcher === | ||
* Menus | * Menus | ||
** | ** Apparently build using Lua | ||
** System/Scripts/ has gui*.luc files | |||
* Animations | * Animations | ||
** Needs research | ** Needs research | ||
Line 289: | Line 465: | ||
=== Dragon Age: Origins / Dragon Age 2 === | === Dragon Age: Origins / Dragon Age 2 === | ||
* Menus | * Menus | ||
** | ** [https://en.wikipedia.org/wiki/Scaleform_GFx Scaleform GFx] | ||
** [http://social.bioware.com/wiki/datoolset/index.php/UI_Tutorial_%28draft%29 UI Tutorial] on the Dragon Age toolset wiki | |||
** Flash-based! | |||
** A good starting point for a reimplementation might be [https://en.wikipedia.org/wiki/Gameswf Gameswf]. | |||
** [https://en.wikipedia.org/wiki/Gnash Gnash], [https://en.wikipedia.org/wiki/Lightspark Lightspark], [https://en.wikipedia.org/wiki/Swfdec Swfdec] | |||
** [http://www.nowrap.de/flasm.html Flasm] can disassemble/assemble ActionScript, [http://www.nowrap.de/flare.html Flare] can decompile it | |||
** [https://wwwimages2.adobe.com/content/dam/acom/en/devnet/pdf/swf-file-format-spec.pdf swf-file-format-spec.pdf] is a great reference which covers mostly every aspect of the gfx files. | |||
** [https://github.com/jindrapetrik/jpexs-decompiler jpexs-decompiler] can decompile and handles scaleform specific tags. | |||
* Animations | * Animations | ||
** Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite | ** Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite |
Latest revision as of 02:57, 25 February 2024
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. :)
(See also: the Kanban-like "Projects" boards on GitHub: https://github.com/orgs/xoreos/projects?type=classic)
Documentation
Developer information
- Extend the developer information on the wiki
- Explain how to get the xoreos sources on various platforms
- Expand GNU/Linux compiling instructions to cover more distributions
- Expand Mac OS X compiling instructions
- Xcode
- Homebrew/MacPorts/Fink
- CMake, Libraries
- Arx Libertatis has an extensive dev page
- Document file formats on the wiki?
- Or integrate info into XentaxWiki?
- Both?
User information
- More user information on the wiki
- How to download xoreos
- How to install the games on various platforms
- Arx Libertatis does that pretty well
Modder information
- Link to relevant modding resources
- Maybe even some kind of Modder's Handbook
- A big overview of modding Aurora games in general
- Differences and commonalities between games
- Linking/Grouping engine functions between games
- A big overview of modding Aurora games in general
Website
Design
- Better website design?
- It still should be static in the end
- No PHP or Rails
- Very light on JavaScript
- No Flash!
- Maybe a bit more unique, graphical
- For legal reasons, we shouldn't directly use art or designs from the original games
- Something inspired by the art of the orginal games would fit
- It still should be static in the end
Octopress
- Move away from Octopress?
- Alternative should still produce static HTML somehow
- Octopress works rather well. It reads Markdown, which is a plus
- Octopress 3.0?
- Not finished yet, it seems
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
Fuzzing
- Set up fuzzing targets for everything for libFuzzer
- File readers, image decoders, etc.
- Can be integrated with afl (american fuzzy lop): https://github.com/llvm-mirror/compiler-rt/blob/master/lib/fuzzer/afl/afl_driver.cpp
- Integrate it with our build system somehow
- ./configure flag for building with fuzzing instrumentation?
- Needs to check that the compiler can do that
- make fuzzers then builds the targets?
- File formats previously manually fuzzed with afl:
- CBGT, CDPTH, DDS, NBFS, NCGR, NCLR, SBM, TGA, TPC, TXB
- 2DA, KEY/BIF, ERF, GFF3, GFF4, GDA, TLK, NSBTX, RIM, SMALL, SSF
- Continuous fuzzing via OSS-Fuzz (currently only taking "important" projects)
Script decompiler
- It might be quite useful to have a NWScript decompiler in xoreos-tools
- We have a script disassembler, ncsdis
- Which already does code flow analysis
- Missing:
- Code generation
- Collapsing of instruction chains into single-line NWScript code
- For example, "int var = foo * bar + quux" compiles to a long chain with multiple temporaries
- Proper handling of structs and vectors
Script compiler
- An NWScript compiler might be useful as well
- A script assembler might be an easy first step
File format writers
- GFF3Writer, GFF4Writer
- Both necessary to create save games compatible with the original games
- Also useful for a xml2gff tool
- xml2tlk
- TalkTable_GFF::write02() and ::write05()
- Needs GFF4Writer
- 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?
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
Unit tests
- More unit tests
Phaethon
- More readers
- Writers?
Model converters
- Document the model formats
- Convert between the binary model formats and their ASCII equivalents
- Convert between the binary model formats and ones that can be opened by modelling tools
- 3D Studio Max
- Blender
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 doxygen?
Autotools
- Suppress the "fatal: not a git repository" when building gitstamp without a git directory
- Increased modularity
- Disabling engines
- Making library dependencies optional (and disabling certain features, then)
- liblzma? Only needed for the iOS version of KotOR
- libxml2? Only needed for the two Dragon Age games
- When something is disabled, skip it, if possible
- Like the videos in KotOR Mac
- If skipping is not possible, error out
Nitro
- The Nintendo DS (Nitro) specific file formats should probably be moved out of src/aurora/ and into src/nitro
- nitrofile, cdpth, nsbtx, smallfile
- nsbtx needs to be split into a class accessing the textures in src/nitro/ and an archive class on top in src/aurora/
- This means src/aurora/ accesses src/nitro/, so libnitro.la needs to come after libaurora.la in the linking order
- ndsrom as well?
- What about nftrfont and model_sonic in src/graphics/aurora/?
- src/graphics/nitro/?
- This would have src/graphics/nitro/ access src/graphics/aurora/, so graphics/libnitro.la needs to come before graphics/libaurora.la in the linking order
- That would be the other way round than for src/nitro/. Too confusing?
Graphics
MDL supermodels and animations
- Mostly working in NWN thanks to jbowtie's work
- Might need some cleanup
- 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
- Of course, the actual glLight* stuff won't be relevant anymore as soon as shaders are there
- Lighting in several (ASCII?) area tiles is broken
- The door in Prelude.nwm's "m0q1a" area
- A water tile in Chapter2.nwm's "map_m2q1a" area
- A sloped snow tile in XP2_Chapter3.nwm's "thecityoflostsou"
Materials
- 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-frames
- Code exists in ffmpeg, but is connected to the MPEG-4 family mess
Actimagine VX
- Used in the Nintendo DS game Sonic Chronicles
- https://wiki.multimedia.cx/index.php?title=Actimagine_Video_Codec
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+
Optimizations
- Optimize our simple BitStream interface
- See this blog post
- Specifically, we don't do any peeking at all
- It still needs to handle different memory layouts, though
- Likewise, our Huffman class could probably be tuned a lot
- Pull in fft/rdft/dct/mdct optimizations from FFmpeg?
- I experimented with that in a private branch and it didn't do anything for Bink performance
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
Wwise
- Dragon Age 2 uses Wwise 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
- ImperatorPrime had started on a script system rewrite
- Includes functions with real signatures
- Maybe switch to that, if it works
- Rounds, object heartbeat scripts
- KotOR2 and NWN2 have some extensions
- It seems like they don't need any extensions to the low-level bytecode stuff
- Witcher uses Lua scripts together with NWScript
- Sonic has no scripts at all, it seems
- Currently a script in an infinite loop locks the game thread
- Timeout? Asynchronous script execution?
NWN
- Menus
- Basics are there, but needs fleshing out
- Character generator is mostly working
- Pathfinding, walkmesh
- "Moving" should move the PC, not the camera
- NPC walking
- Triggers, areas on the floor that calls scripts on enter/leave
- Models
- ASCII models need averaging of smooth group normals
- 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
- 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
- Most menu skeletons exist - much of the content is yet to be added.
- Add item descriptions in item slot equip screen (when you select an item and can press 'equip' button).
- Add sliders to applicable settings.
- Add journal/quest log content to Journal menu.
- Display all items owned in Items menu.
- Including sort/filter buttons.
- Add updating for the loading bar in loading screens.
- Button highlights (when you hover or select a button in a menu, the button should be highlighted appropriately).
- Containers
- Enable player to transfer items into containers.
- Class selection
- Smokey background effect
- Lighting on the character model
- Scaling when hovering over different classes
- Not hovered:
- Hovered:
- Not hovered:
- 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
- Mostly working now
- Animation transitions/interpolation to transition smoothly from one animation to another.
- Combat animations for abilities.
- This includes feats like Power Attack/Blast, Flurry, etc.
- Right now we only have default attack animations play.
- Combat defense and damage received animations.
- Receiving attack and/or ability animations.
- GUI / HUD (non-menu)
- Display actions on intractable characters.
- I.e. display attack actions you can use on enemies when you target one.
- Better align the hover/target circles to objects.
- E.g. ensure the circles align to a character's head.
- Display action queue while in combat.
- Actions in the queue should correctly be added to and removed from the queue when executed.
- Display damage/heal values as floating text above the receiver.
- Prevent hovering or targeting objects outside player field of view.
- Including objects behind walls, too far, etc.
- Display actions on intractable characters.
- NPCs
- Enable NPCs to engage in actions.
- Includes combat, animations, etc.
- Enable NPCs to engage in actions.
- Movement
- Improve follow-target movement of characters.
- Auto-calculate route to target.
- This means party members should find a way to walk around things when they are stuck while trying to follow the leader.
- Auto-calculate route to target.
- Improve follow-target movement of characters.
- Camera
- Enable hold down right-click to pan camera.
- Prevent camera from seeing through walls when moving into them at an angle.
- Minigames
- Swoop racing
- Pazaak
- Hardcoded, mostly removed from usual game logic
Jade Empire
- Menus
- Main menu with options submenu is there
- Minigames
- Flyer, top-down shoot-em-up thing
- Hardcoded, mostly removed from usual game logic
- Player character
- Needs research
- Sound
- Uses an ASCII variant of the XACT formats
- Cues probably not as complex as FMOD/Wwise
- Effects need extension of the Sound system, maybe
- Xbox version might use the binary format?
- Sound banks could be handles as archives and indexed in the ResourceManager?
- FACT is an implementation of XAudio, including XACT, zlib-licensed
- Uses an ASCII variant of the XACT formats
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
- Based on berenm's RE efforts, Arbos has written a tool to convert to/from MDB+GR2: https://github.com/Arbos/nwn2mdk
- Probably a good starting point for integrating NWN2 animations into xoreos
- 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
- Walkmeshes. CromFr wrote a specs document here: https://gist.github.com/CromFr/104bac52dc9191099d9d9e3dbd2c4975
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
- Apparently build using Lua
- System/Scripts/ has gui*.luc files
- Animations
- Needs research
- Player character, Geralt
- Needs research
Dragon Age: Origins / Dragon Age 2
- Menus
- Scaleform GFx
- UI Tutorial on the Dragon Age toolset wiki
- Flash-based!
- A good starting point for a reimplementation might be Gameswf.
- Gnash, Lightspark, Swfdec
- Flasm can disassemble/assemble ActionScript, Flare can decompile it
- swf-file-format-spec.pdf is a great reference which covers mostly every aspect of the gfx files.
- jpexs-decompiler can decompile and handles scaleform specific tags.
- Animations
- Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite