-
Notifications
You must be signed in to change notification settings - Fork 0
/
TODO.mw
442 lines (381 loc) · 19.4 KB
/
TODO.mw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
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)
== 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 ==
=== Broken NWN2 XML ===
* Not standards-conforming XML. Need custom XML parser; stock XML parsing libraries will just throw errors.
** <nowiki><?xml version="1.0" encoding="NWN2UI"></nowiki>
** 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
* [https://github.com/xoreos/xoreos-tools/pull/1 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 [http://fonts.jp/hanazono/ 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 [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 ===
* 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
** https://github.com/ocornut/imgui?
* 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
* [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 ==
=== 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: [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 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 [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 ==
=== 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
** [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 ==
=== 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
** Many are already there
** Updating for loading screen loading bar
[[File:Loadingbar_upd.png|none|thumb]]
** Button highlights
[[File:Btn_hl.png|none|thumb|KoTOR (left) xoreos (right)]]
** 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
** 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
* 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 [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 ===
* Menus
** Implemented using XML
** See [[#Broken NWN2 XML|Broken NWN2 XML]]
* Animations (Granny)
** [https://github.com/SkywingvL/nwn2dev-public nwn2-dev] contains some code working with Granny data
*** 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]
** 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)
* 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
** [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
** Bone animations, best implemented with shaders, blocked by the graphics subsystem rewrite