TODO: Difference between revisions

From xoreos Wiki
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
** Script disassembler is probably easier, as a first step
* We have a script disassembler, ncsdis
* A script compiler might be useful as well
** 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
* TLKWriter
* xml2tlk
** Or extend TalkTable_TLK with a method to save into a TLK file?
** TalkTable_GFF::write02() and ::write05()
*** Same with TalkTable_GFF?
** Needs GFF4Writer
** xml2tlk tool
* Extend TwoDAFile to write binary 2DA?
* 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?
=== 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 ===
=== 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? They are potentially user-visible
* 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 install?
* make doxygen?
* make doxygen?


=== Autotools ===
=== 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
* 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
* Increased modularity
** Disabling engines
** Disabling engines
*** Dropping library dependencies when the still enabled engine don't need them
** Making library dependencies optional (and disabling certain features, then)
** Making library dependencies optional (and disabling certain features, then)
*** liblzma is only needed for the iOS version of KotOR
*** liblzma? Only needed for the iOS version of KotOR
*** libxml2 is only needed for the two Dragon Age games
*** libxml2? 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
** 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
** We should then show a summary of what is enabled/disabled at the end of the configure script
 
== 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
* 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
* 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: [http://drmccoy.de/eos/nwn/20110610T230251.png], but my approach is seriously lacking. You can see the edges of the tiles that make up on NWN area in many cases
* 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 ===
* 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
* 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-frame
* 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


=== Wwave ===
=== Wwise ===
* Dragon Age 2 uses Wwave for sound and music
* 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 ===
* Needs rewrite, badly
* ImperatorPrime had started on a script system rewrite
** ImperatorPrime has started with that
** Includes functions with real signatures
* Afterwards, can mostly copied to other engines
** Maybe switch to that, if it works
** They need new engine function tables, though
* Rounds, object heartbeat scripts
** The names and signatures of which we have
* KotOR2 and NWN2 have some extensions
* KotOR2 and NWN2 have some extensions
** Might need extending the script bytecode parser, might not
** 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
** Supermanu is working on the character generator
** Character generator is mostly working
** Pathfinding, walkmesh
* [[Pathfinding]], walkmesh
*** "Moving" should move the PC, not the camera
** "Moving" should move the PC, not the camera
*** NPC walking
** NPC walking
*** Triggers, areas on the floor that calls scripts on enter/leave
** 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
** Basic structure is already there, just missing most of the specific widgets stuff
** Most menu skeletons exist - much of the content is yet to be added.
** 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.
** 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
** Should be similar to NWN
** Mostly working now
** No player character shown
** Animation transitions/interpolation to transition smoothly from one animation to another.
*** Needs character creator menus
** Combat animations for abilities.
*** Loading of character files in class Creature
*** 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
** Apparently very similar to KotOR's 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
** Needs research
** 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
** Needs research
** [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

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

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?
  • 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

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

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

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
  • 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.
      • Loadingbar upd.png
    • Button highlights (when you hover or select a button in a menu, the button should be highlighted appropriately).
      • 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:
        • KoTOR (left) xoreos (right)
      • Hovered:
        • KoTOR (left) xoreos (right)
  • 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.
  • 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
    • 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

NWN2

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