Touhou Patch Center:Download/Changelog
- 1 2019-07-18
- 2 2019-06-19
- 3 2019-05-24
- 4 2019-04-02
- 5 2019-03-22
- 6 2019-03-12
- 7 2019-02-25
- 8 2019-02-03
- 9 2018-12-06
- 10 2018-12-03
- 11 2018-10-22
- 12 2018-09-10
- 13 2018-09-04
- 14 2018-08-11
- 15 2018-06-12
- 16 2018-05-21
- 17 2018-05-13
- 18 2018-04-15
- 19 2018-04-08
- 20 2018-04-02
- 21 2018-03-30
- 22 2018-03-29
- 23 2018-03-04
- 24 2018-03-03
- 25 2018-02-11
- 26 2018-02-07
- 27 2018-01-30
- 28 2018-01-29
- 29 2018-01-25
- 30 2018-01-24
- 31 2018-01-23
- 32 2018-01-13
- 33 2018-01-08
- 34 2018-01-06
- 35 2018-01-05
- 36 2018-01-04
- 37 2017-12-31
- 38 2017-12-30
- 39 2017-12-24
- 40 2017-12-21
- 41 2017-12-20
- 42 2017-12-14
- 43 2017-12-13
- 44 2017-12-11
- 45 2017-12-07
- 46 2017-12-06
- 47 2017-12-02
- 48 2017-11-30
- 49 2017-11-29
- 50 2017-11-27
- 51 2017-11-23
- 52 2017-11-22
- 53 2017-11-20
- 54 2017-11-19
- 55 2017-11-18
- 56 2017-11-16
- 57 2017-11-15
- 58 2017-11-14
- 59 2017-11-05
- 60 2017-11-02
- 61 2017-10-31
- 62 2017-10-28
- 63 2017-10-27
- 64 2017-10-23
- 65 2017-10-06
- 66 2017-09-14
- 67 2017-09-13
- 68 2017-09-05
- 69 2017-08-31
- 70 2017-08-24
- 71 2017-08-17
- 72 2017-08-14
- 73 2017-08-12
- 74 2017-08-08
- 75 2017-07-15
- 76 2017-07-14
- 77 2017-07-04
- 78 2017-07-03
- 79 2017-06-27
- 80 2017-06-22
- 81 2017-06-18
- 82 2017-06-02
- 83 2017-05-31
- 84 2017-05-13
- 85 2017-05-07
- 86 2017-05-06
- 87 2017-04-04
- 88 2017-04-01
- 89 2017-02-24
- 90 2017-02-17
- 91 2017-02-15
- 92 2017-02-05
- 93 2016-08-10
- 94 2016-07-03
- 95 2016-04-14
- 96 2016-03-27
- 97 2016-03-26
- 98 2016-02-17
- 99 2015-10-29
- 100 2014-05-28
- 101 2014-05-12
- 102 2014-05-08
- 103 2014-05-06
- 104 2014-01-27
- 105 2014-01-26
- 106 2014-01-03
- 107 2013-10-25
- 108 2013-08-25
- 109 2013-08-20
- 110 2013-08-15
- 111 2013-08-12
- 112 2013-08-08
- 113 2013-08-05
- 114 2013-07-29
- 115 2013-07-16
- 116 2013-07-14
- 117 2013-07-06
- 118 2013-06-20
- 119 2013-05-29
- 120 2013-05-28
Note that this a "user-friendly" changelog that only includes visible changes, new features or bugfixes. For the full list of changes, refer to the Git commit history.
- Steam integration for DS and GFW (dc6f108)
- Steam integration for TD and DDC (7710751)
- Add advert to UTL (f7371d3)
- Workaround for multi-stage patching crashes (33bb598)
- HTTPSify things (7d26675)
- Steam integration for WBaWC (c350059)
- Start repository discovery on thpatch.net instead of nmlgc.net. (408d934)
- ANM: Restore the correct sprite ordering after a 1-sprite entry -.- (d13e512)
- Steam integration for ISC and LoLK (90269d6)
- Add a lib for translating thcrap itself (69e82cc)
- Mark some strings in configure.cpp as translatable (68805b7)
and a small bug fix.
- TSA: Layout: Integrate TL notes. (fd15695)
- Implement optional pre-rendering and an ID system. (9867620)
- Implement texture rendering and display. (83accc4)
- Draw a black outline around the text. (e5ba405)
- TSA: Remove TL notes on ANM/STD loads, spell cards, and new text boxes. (71e32f6)
- Add a fade-in effect. (7e7ef9b)
- Auto-scroll long TL notes using a configurable reading speed. (f1c4001)
- Support configurable vertical alignment. (304c7be)
- ANM: Always patch the whole texture for 1-sprite entries after all. (2970509)
- Fix a bug that caused bmpfont to not work on some computers. (a5664dc)
- Layout: Calculate ruby offsets at twice the precision. (4c6efa7)
- Layout: Undo the weird shifting of the ruby sprite in ≥TH15. (145f87d)
- Perform a bunch of intricate ASCII string alignment hacks for TH06. (3a32cdb)
- ASCII: Auto-align the translatable bits in TH16.5's replay strings. (146ced1)
- ASCII: Always center TH16.5's replay save menu inside the playfield. (cc1dbe6)
- Restore the option to continue configuration after a write error. (d337c6d)
- Use the git version of the bmpfont generator, with support for vertical text. (14acc4d)
- Fix a potential crash. (4686f55)
- Remember the actual track position when pausing in ≥TH11. (40448da)
BGM modding for TSA games is here! And some ANM patching fixes.
- ANM: Correctly wrap internal sprites that start outside the texture. (7b8ea2f)
- ANM: Get sprite wrapping absolutely right. (efe17c3)
- BGM modding (f6f953d, dc9d434, 5cacc3e, 267ec9e, fa57eaa, a31cc7e, 77d3311, c29f6fb, 437c21f, c10e77f, 1962ea3)
- HTTP: Append the CRC to the URL to facilitate cache-busting. (f8c357a)
- Don't update files.js for files that couldn't be written to disk. (1eb9e67)
- Don't try to download files that couldn't be written to disk. (80a2c46)
- ANM: Always dump sprite boundaries if we have data, to support TH06. (a3248f4)
- ANM: Support patching via JSON. (049d3c5, d82cb59, b0c61df, b9bf39b, 5ee2cb9, 6b6f275)
- Layout: Support underlined text markup via <u$>. (0396a8d)
- Text images: *Actually* support TH07 correctly. (fad573e)
- Cache fonts for TH06-TH09 rather than re-creating them for every line. (2b4264b)
- Warn on close (6548c59)
- Add the Steam AppID for th165. (38bcbf3)
- Add support for putting custom images in place of text sprites. (TH06) (f0b1d7f)
- Text images: Add support for TH07. (3babf7c)
- Csv: allocate a bigger buffer for th105. (769a56e)
Touhou 16.5 full support!
- TH06: Never skip PNG splitting based on the original PNG's pixel format. (0a0cc67)
- Add a breakpoint to calculate the widest string in a list of strings. (2af3d0c)
- Add support for patching subtitles in th155 (win quotes only) (e9227a1)
- Added initial support for mission descriptions (6a26bab)
- Added furigana support in th095 and th125 (aa23dcb)
- Redownload checksum-less invalid JSON files from different servers. (b8b6fc7)
- update: Work around patch updates not working with games started through wrapper patches. (7e234f7)
Map POV/D-pad inputs to the X/Y axes. Funded by an anonymous person.
- Map POV/D-pad inputs to the X/Y axes. (Non-DirectInput mode) (35f1668)
- Map POV/D-pad inputs to the X/Y axes. (DirectInput mode) (3d9f67e)
- Ensure that POV→axis mapping works with Steam's overlay. (3672dc5)
- Restore the "old game build" popup accidentally removed in efbc4b9. (140abd7)
- th155: add a few map files hooks. (7807c2d)
- pl: add an option to split lines before parsing the cells. (f87d8ea)
- pl: add th155 v1.10 support. (323ee56)
- Cache the bitmap fonts on disk. (90bb5e3)
- Add unicode support to the log window. (6e8557c)
- Remove the text limit for the logs. (ac44cd8)
- Add PBS_MARQUEE to progress bars when we don't have any progress to show. (b4f9377)
- Add a "Update other games and patches" checkbox. (ea68b82)
- TFCS: add ruby support. (88e8ea3)
- pl: fix a few th155 dialogs (Mamizou ending for example). (19ec08d)
- TFCS: fix a few non-translated win quotes. (9c19157)
- bmp_font: add support for global replacement fonts. (4b2d4d3)
- Add more space for TFCS files (should fix a crash with th155 lang_ru and some other languages). (3417183)
- th155: generate the bitmap fonts on the fly. (f5aece2)
- Remove updates from the game process. (efbc4b9)
- Run the game even if we don't know it (fixes vpatch not working). (ea13930)
We finally have a blocking updater! Just run any game to see it.
- log: use a window from the current processus for the message boxes. (e32cf2e)
- Add a window to display update progress. For now, this window has a static content. (99ac4c1)
- Update the UI when the download progresses. (89cdb95)
- Add some UI elements, add the update code and make it work in the thcrap_loader context. (315823e)
- Allow update callbacks to cancel the update, and add code behind the "Run the game" button. (af5bdb0)
- Add code behind the "Keep running in background" checkbox and the "check updates every N minutes" edit. (c7a0bed)
- If background updates are enabled, after updating the current stack for the current game, update all the known stacks for all the known games. Repeat every N minutes. (6e53ce9)
- Load/save the settings from/to a config file. (31a7584)
- At launch, close existing instances of the loader UI. (48cf193)
- Run the game even if thcrap_update have been removed. (3a60523)
- Add a button to manually check for updates. (fbfd599)
- Update the thcrap engine. (7c98e8e)
- Add a log box, and display a clean state when the update is finished. (ec85644)
- Implement the "hide logs" button. (4a51f0b)
- Add some styles to the main window. (d0b4761)
- Display the progress texts over the progress bars, remove the background color of static controls, increase the buttons size, add and implement a button to completely disable updates, add a checkbox to delay updates until the game is closed (not implemented yet), put the "keep the updater in background" and "time between updates" settings under "settings and logs", change "display/hide logs" to "settings and logs", and... I think that's all. (eb76467)
- Implement the "Update when the game exits" checkbox. (3351d71)
- Add a scrollbar to the logs window. (8dcc24f)
- Fix left margin of editbox/progress (04b5006)
- Make PrettyPrintPatch not pretty (434dfda)
- Use absolute paths for shortcuts (0c9fbf3)
`thcrap_configure` finally has a GUI!!! 🎉 Also, we fixed what was probably the last long-standing bug that kept ZUN games untranslated despite an otherwise correct configuration. If you know anyone who never could get thcrap to work: Now might be the time to try again.
- Plugins: Load DLL dependencies from the DLL's own directory first. (88e84e6)
- Initial version of configure gui (a8dfb54)
- Make everything async and clickable (d9fa2d3)
- C O M F O R T (09fa020)
- Use IFileDialog on Vista+ (9fce512)
- Improve keyboard usability (a3259ae)
- Change subsystem to Windows (f6fe516)
- Clickable selection between multiple versions (c751255)
- Progressbar marquee when searching games (04996c6)
- Allow to skip the shortcut creation (abad5fd)
- Change "Create shortcuts?" message to be more verbose (8a2609d)
- repo_update: Support .gitignore-style thcrap_ignore.txt files. (eb0a5a1)
- Fix CJK game paths not being recognized properly on DBCS locales. (d4eb88a)
- Load plugins only after having scanned the entire directory. (7794aae)
- Fix the ZUN bug of TH09.5+ crashing with no installed sound devices. (f5825b2)
- Fix TH12.8 still crashing with no installed sound devices. (fc484e5)
- th135: add spell comments support. (9524dc7)
- bmpfont_fix_parameters: ensure our buffer is big enough. (bd7b13c)
BGM loop patching, funded by Splashman.
- Support BGM loop patching for TH07 and later. (0ed1df4)
- Support BGM loop patching for TH06. (3a19d90)
- Loopmod: Decide on a single loops.js file for every game. (bf420cd)
- Add support for th155 win messages. (9d7ec64)
- Make sure that wininet uses UTF-8 internally on DBCS locales. (7e40fd4)
- Load map file for th155 staffroll themes. (a479ec9)
- Add spellcards hooks for th155 (ae15984)
- pl: don't decrease the remaining file size when it's 0. (f7600f7)
- Add the Steam AppID for th155. (762fa76)
Time traevlling from 2018-01-04 because I forgot to commit something. And I tested the build this time! (but I forgot to proofread my commit message...)
- Add a nice syntax to edit a whole instruction. (866962a)
- Log: Show an error message if thcrap_log.txt can't be written to. (3903796)
- Turn the two game location questions into a single clearer one. (6b2f51b)
- pl: bugfix: put a parenthesis at the right place (45b391b)
- Fix URL construction with non-ASCII characters. (1604d8e)
- Move wininet initialization and cleanup out of DllMain. (98ac5d3)
- Fixes rare hangs when starting thcrap_configure.
- Add th155 and fix th155 BGM indexes. (e0d93e1)
- nsml: keep the lock for the whole game patching. (4254541)
- Update the PL parser for th155 support. (e187e7f)
No visible changes (only a bugfix), but ae0fe00 is an internal change needed to make th105 load way faster.
- VFS: while creating the patch object for a map, use a new object instead of updating a copy of the map in place. (f55cd08)
- png: display the correct file name in the logs (part 2). (3c8f5a2)
- th123: load spells.js from th105 as well (15c59b0)
Mostly bugfixes and small changes. Fixes instant_ending for th105.
- zip: Don't mix up access and modification time. (39e7e66)
- Fragmented file reading: use the correct input file size when patching a replaced file. (3df44cf)
- BP_file_header: the rep_buffer will be used as the game buffer, so it needs to be big enough to contain the patch. (5330935)
- update: Ignore servers without an URI scheme. (0a546f6)
- update: Print a specific error message for unknown protocols. (e1b2ab2)
- cv0: use \n line endings instead of \r\n (takes less bytes). (3df44cf)
- vfs: clear the replacement string if we can't replace it with its value. (5f16176)
- th105: load map files for spellcards (c2b5cf6)
- cv0: add ruby support. (4a68994)
- th105: add a breakpoint to change the offset of the text from the top of the textbox, and the line spacing. (70c45c3)
- cv0: fix various bugs with text patching. (c825356)
- cv0: set the textboxes size to 4 lines for endings, and 3 lines for everything else. (aaee70e)
- Draw separating lines between available and selected patches. (d4215d9)
- th105: fallback to another font if the selected font doesn't support a character. (e0495b4)
- cv0: do not end a box with a \ if the patch file ends with a @. (c137e78)
- Support Unicode strings from .ini files in Unicode paths. (f2bb560)
- Set x and y to 0 in th105 dat files. (b78260f)
- Show a more accurate welcome text if updates are disabled. (7b1eb89)
- png: display the correct file name in the logs. (0118cdc)
- th105: add cv0 support. (12a452c)
- cv1: ignore commas in quotes. (9dd4308)
- cv0: add a way to escape commas. (5cf28cf)
- Log: Always display message boxes on top of the foreground window. (de93eec)
- BP_nsml_read_file: make a deep copy of the bp_info instead of a swallow copy. (29521b7)
- Decrypt cv0 and cv1 files. (e7753a7)
- th105: add csv support. (d791e3a)
- th105: add music room support. (26c2d7b)
- Use a theme_id <=> theme_line map for th123. (8b76bf4)
- th123: provide a list of files to *not* inherit from th105. (98530e1)
- th105: adjust the width/height in dat files to fit the related PNGs. (c78ff8d)
- bp_file and nsml: add a few critical sections, so that parallel file reading stops breaking th105 and th123. (a4f1270)
- Add th123 support. (dba93ef)
- BMP/CV2: compute the size needed for the replacement file, allowing replacement with bigger files. (8e878f7)
- Support custom base addresses for the hackpoints of init stages. (6a526a3)
- th105: ignore case when patching files. (8abf9bf)
A feature needed for th16 Steam support
- Support multiple stages of binary hacks and breakpoints. (8cd55ce)
- Add th105 support (c9b328a)
- nsml_file_header: add a fn_size parameter (871b770)
- Fontrules: initialize lfQuality in the replacement rules. (093e381)
- MSG: Correctly align TH13's Parallel Ending explanation. (bead4d4)
- Add Steam integration for games without. (3faaaef)
- Add the Steam AppIDs for the TH16 full and trial versions. (59ff513)
Small bugfix for a bug introduced in 6a7b532
- Patchhooks and vfs: force forward slashes (74e6ee1)
- Allow patches to display a customizable message on startup. (62995b4)
- Read the fileslist in json format (6a7b532)
- Include a dump of the files list if dat_dump != false. (88ebb48)
Bugfix for nsml
- Fragmented file reading: do not clear the file_rep if we need to run the hook later. (6e5cb4c)
Here comes the 1st fangame supported by thcrap!
- Add DumpDatFile for fragmented file loading. (da11c06)
Mostly internal changes. As always, check the commits history on Github for full details.
- Add support for expressions in breakpoint parameters (e321cfb)
- Show a clearer message if an old game version is definitely not supported. (ba7b7fb)
- self: Try to use a non-random name for the backup directory first. (8875efc)
- devicelost: fix using more generic approach (cb3404c)
- devicelost: fixed device not reseting when no reset is required (b853b62)
- TH10: Work around the Game Over theme being No. 8 in trial versions. (017e5d5)
- Add music room support (0dff86a)
- Fix some pl-related bugs. (662751d)
Bugfixes in thcrap_tsa and thcrap_tasofro, and adding the OS version in the user-agent (collected anonymously of course, it will be used for statistics, to decide if we should drop XP support).
- Only accept ENTER to finish patch selection. (a3d3d9d)
- Send the operating system version in the User-Agent. (deae769)
- MSG: Change the speech bubble side *after* terminating the previous box. (246c8e5)
- MSG: Improve log readability of speech bubble shifts and cutoffs. (34acd03)
- TFCS: write all balloons in their own columns for win quotes (e87eef2)
- Go back to storing the required thcrap build as a per-patch setting. (3ac8219)
- Don't crash when running on unknown games (or vpatch). (ff49268)
- ANM: Don't try to initialize sprites for entries without textures. (a49c124)
- Add spellcards support for th135. (531f090, 33c56d9)
- Tweak a few things to support HM story mode. (ddc45e9)
- MSG: Support TH14's new speech bubble shape/direction command. (7d1f521)
- Add support for th135. (7b32736)
- textdisp: Add font quality as a fifth parameter to font rules. (07b5651)
- Shift speech bubbles to make room for longer lines, if necessary. (3bd3efa)
- Plaintext: quote patched lines, and escape the quotes inside them. (3d6a282)
The last pieces of code to reach ULiL full support.
- Tell people to report CRC32 mismatches. (c42b09a)
- Add plaintext files support. (3eeea8e)
- Add support for patching nut instructions (9869734)
- Fix a crash when replacing files around the end of the archive. (f59bdc7)
- Add win quotes support. (dd09d5f)
- Act/Nut: support flex arrays as input (5bc72dd)
A fix for a ZUN bug with th11+ crashing when you lock your computer, and a fix for ULiL v1.41.
- Allocate more space for char_select spellcards, and print warnings to the log when the buffers are too small. (879a9b5)
- tasofro: add binhacks support (b702a46)
Fixes a crash with th09 and th095 on Windows 10, and prepares things for th143 title messages and th145 v1.41
- inject: Correctly reference-count DLLs by not reference-counting at all. (c9ccaa5)
- Spell out the UTF-8 bytes of the → printed during game identification. (414dc3f)
- Fix folder selection. (a44ac18)
- Initialize the folder browse dialog at the current directory. (bbd39e9)
- Generic text: Allow multiple target strings in the same breakpoint. (28439b4)
- Remove a file from the local files.js if it doesn't exist locally. (b839a93)
- Delete files that shouldn't exist according to the local files.js. (cef2cfe)
- Strings: Actually reallocate correctly. (43a7f59)
- There are four steps, not two (55e294f)
- Unload if it has been renamed. (5c44340)
- Don't show the sandbox reconfiguration message for empty patch stacks. (ca8912a)
- Add spellcards support (643bc95)
- Spellcards: use name(id) instead of id(name) and use 0-based IDs for player spellcards. (f9de3dd)
- Story spellcards: fill the spellcards for higher difficulties with translations of lower difficulties. (75b3830)
Some internal changes needed for AoFC patching.
A small internal change needed to patch strings in TH16.
Restored custom.exe translation, and improved both performance and stability of patch downloads.
- Tell people to reconfigure if th145 is run with the sandbox. (e9e3d02)
- Patch support for Urban Legend in Limbo is now stable.
- Fix a bug that disabled translation of the custom.exe programs in the last build. (f2c06bb)
- Make sure that loaded plugins actually have a .dll extension. (5c8d7e3)
- Turns out that the feature of renaming thcrap_update.dll actually comes up quite regularly in discussions about thcrap. Better make sure that renaming it to something like .dll_ actually works, which it didn't before due to backwards compatibility to 16-bit Windows.
- Select the download server based on ping, not total download time. (cd12f20)
- With patches typically consisting of lots of small files, ping becomes the most crucial metric.
- Pick servers based on the average of the last 5 ping measurements. (fcb8a32)
- At least in my test case, this (very arbitrary) value provided enough of a buffer against the ping time spikes that happen from time to time.
Fixes a bug in the last release where the user has to manually extract the new version.
- Add a thcrap_update wrapper, providing offline versions when thcrap_update.dll have been removed. (103f343)
- zip: Iterate over extra fields correctly. (d70c101)
- Fix the immediate game crash when using the "ignore" functionality. (80adf85)
- Add a mechanism for plugins to disable themselves for unsupported games. (91ba2be)
- Add support for some plaintext CSV files. (b94b4c9)
A small release to fix the ULiL ending bugs (and another bug while I'm at it).
- Change the way quotes are parsed in pl files. (a2d96f9)
- Add new balloons supports in endings. (9f4ddfa)
- Apply the balloon expanding after retrieving the user-defined balloon. (c07c37f)
Another small update with a few bug fixes.
- CharNextA: Try to handle the given string as utf-8 before handling it as being in fallback_codepage. (70e84cd)
- pl: automatically use a bigger balloon if we try to display too many lines in it. (a09356e)
Bug fixes, and addition of new features that should have been there before in the tasofro pl parser.
- pl: don't skip lines of text when they follow another line of text (6505d2a)
- pl: add support for the last text block of ending files (6505d2a)
- pl: add quotes escaping (ba3f4c3)
- pl: add ruby support (85bf9f1)
- Update our dependent libraries. Including an important change to Jansson that (finally) preserves the insertion order of JSON object items. (c4636f1)
- Added BP_spell_owner. (3d5c311, 66e6c82)
- ANM: Clamp width and height of sprites to the actual texture. (4f77d8a)
- Fully redo replace_file to fix crashes when the game reads 2 files concurrently. (093f3cd)
- Add hooks support (be964bc, 9a575bf)
- Add story mode support (be964bc, 567aeb3)
- Add support for TFCS files. (7051047)
- Add endings support. (09e2b7e)
- Update our dependent libraries. (e0a7686)
- Apply detours to all import descriptors of a DLL, not just the first one. (02cbe15)
- Support custom fallback codepages as an optional 4th element in version arrays. (1dbf863)
- Tell people to post unknown executables on Gitter or IRC. (f80de97)
- Write run configuration files and games.js in text mode. (920c68b)
- Show an error message if the run configuration was not found. (c3b458e)
- MSG: Correctly insert new >251/255 byte lines that need to be cut off. (4cde95e)
- 1st step of tasofro games support: adding file replacement support in ULiL. (37e91c5)
- Update our dependent libraries. (6a0caf5)
- Actually patch 8-bit grayscale images. (2ae9e67)
- th06: add support for in-games music titles. (90575e7)
- th06: stop using paletted images. (940da5b)
Fix: the previous build should have been built with VS2013 instead of VS2015.
- inject: Only apply detours for newly loaded DLLs a single time. (6b4a0c5)
- Show a notification window during self-updates. (c1634ad)
- th06: add support for patching of 24-bits RGB files. (5bf74d6)
- Update our dependent libraries. (b9edf3b)
- inject: Don't pass an invalid current directory to CreateProcess(). (754ea73)
- PE: Fix the import directory presence check. (b832703)
- Add support for th06 PNG files. (0fb52ce)
- Restore the exports of the LoadLibrary injection detours. (ccc87a5)
- Add function level promotion detours for the CreateFont() family. (ee2741c)
- textdisp: Split the CreateFont() detour to make use of detour promotion. (8d54854)
- textdisp: Introduce a consistent string representation for LOGFONT structures. (e075680)
- textdisp: Add a rule-based font replacement system. (2325832)
- Standardize the handling of the "cave_exec" breakpoint parameter. (c22be49)
- Add json_flex_array_get_string_safe(). (55b31a8)
- Introduce a module hook to be called on thread detach events. (3efc0fe)
- plugin: Optimize module hooks by caching the functions called for each. (705a8da)
- Only download necessary patch data during configuration and updates. (3d949d4, 085e03f, add1b88)
- Self-updater: Delete local files whose updated versions would be 0-byte files. (88cec5b)
- Layout: Only add the original X offset in the final rendering call. (1afe684)
- ANM: Correctly shift the alpha value when blending 16-bit sprites. (2df1642)
- Layout: Don't increment the tab counter if no tab commands were used. (e255d74)
- Layout: Recognize 'l' as a tab command. (9f736d6)
- Layout: Perform full text layout in GetTextExtent(). (75c4bae)
- Layout: Use custom callback functions to render substrings. (e23a26f)
- Layout: Fix an off-by-one error in layout_match(). (181555e)
- Add a module for translation of generic plaintext formats. (498eafe)
- MSG: Cut off replacement strings at the last Unicode code point. (b2ce22e)
- Move the last piece of high-level injection code from the loader to the core. (4d15493)
- Give "exe" precedence over "game" in the run configuration. (43fe482)
- Improve the help messages about passing the target executable. (e249470)
- Don't show two messages on a run configuration syntax error. (d3c1389)
- Show a more helpful error if a game ID wasn't found in games.js. (5f58856)
- repo_update.py: Don't count deleted files towards the file count of a patch. (b80b135)
- Add CreateFontIndirect() and CreateFontIndirectEx(). (ff4ac97)
- Export function level promotion for the CreateFont() family. (5e494b2)
- win32_utf8: Add DragQueryFile(). (bc0963b)
- shell32: Ensure the correct calling convention. (1f87fc1)
- LoadString(): Return the string in the fallback codepage if possible. (8fa2ea4)
- CreateFontIndirect*(): Limit face name conversion to the actual string length. (db836ce)
- Add SHBrowseForFolder(). (9390ff5)
- Add WritePrivateProfileString(). (c3d1e5a)
- Add ExtractIcon() and ExtractIconEx(). (614b2e9)
- Add GetGlyphOutline(). (5220aec)
- Add UnregisterClass(). (a382659)
- Add ExtTextOut() and TabbedTextOut(). (b5b8a64)
- Add the GetFileVersionInfo functions. (f131d83, 18f8c0e)
- RegisterClass*(): Fix a crash if lpszMenuName is an integer resource ID. (05e99e5)
- Add GetOpenFileName() and GetSaveFileName(). (bdec9c1)
- STUB GetClassInfo() and GetClassInfoEx(). (79d2e55)
- StringToUTF8(): Don't include the terminating \0 in the returned length. (6869156)
- FormatMessage(): Support FORMAT_MESSAGE_FROM_STRING. (4edc4c9)
- FormatMessage(): Fix non-allocating calls. (3a000ca)
- FormatMessage(): Fix a few return value and error code issues. (aa81dde)
- FormatMessage(): Parse the formatting syntax and convert any string arguments. (2c7b0e7)
- FormatMessage(): Actually use the correct size for the allocated buffer. (16f7b87)
- OPENFILENAME functions: Write nFileOffset and nFileExtension. (aa5b4ec)
- FormatMessage(): Fix FORMAT_MESSAGE_ARGUMENT_ARRAY for 32-bit builds. (ecae46a)
- Add GetCommandLine(). (f0db87b)
- Add CommandLineToArgv(). (a9204f1)
- Add DirectSoundCaptureEnumerate() and DirectSoundEnumerate(). (3f1de63)
- Add main(). (8cf7cba)
When ZUN releases a game *outside* your vacations for a change, RL swamps you with work and your hardware starts failing, it's just going to take a while for 14.3 support to get done. Therefore, this is merely an intermediate release, focusing on fixes for bugs pointed out by our new members in the patch network, but also adding a bit of the functionality required for th143.
- Fix random crashes in the hot-repatching module on Wine. (cca89be)
- ... with "random" meaning "shortly after starting the game, if updated patch data needs to be downloaded".
- Always skip the UTF-8 byte order mark on JSON loading. (bfcd6a4)
- Thanks to Nazeo for pointing that out.
- Not only does this streamline the code a lot, it also fixes a long-standing bug: In patch configurations that have both a replacement file bigger than the original and a .jdiff patch on top, the replacement file would have been cut to the size of the original game file during .jdiff application, losing data in the process.
- Thanks to Gamer251's Mima patch for creating such a configuration and revealing this flaw.
- This also allows a patch to clear all data in a certain JSON file below its own position in a patch stack, by replacing its contents with an empty array ().
- This might be useful if a patch decides to use only the native .msg format for in-game dialogue instead of .jdiff. Since .jdiff's are always resolved and applied after .msg's, a .jdiff in any position in a patch stack would always be prioritized over a .msg. Therefore, a patch can keep its own translations while still being stacked together with others.
- Filter out Thumbs.db when enumerating the files of a patch. (7969b5d)
- Add EnumFontFamiliesEx(). (4fcda3a)
Just a one-line change to register the th143 dialog file name pattern in order to make translations show up.
- Register the th143 dialog file name pattern. (934e554)
... and just when you thought you had a rock-solid build, you notice a bug in the one main thing you wanted to focus on. Oh well, at least we do have the option to ship updates on a daily basis now.
- Fix a logic error with read-only repository files. (989c14b)
- Use SHBrowseForFolder() to select the root game path. (93434c9, 07ff6da)
- Ask to search in another directory if no games were found at all. (5e22082, cef7bc6)
- repo_update.py: Catch the error thrown if files.js doesn't exist. (8281756)
Over three months of development, resulting in digitally signed automatic updates of thcrap itself... as well as lots of features nobody has asked for, and which will only matter a few years from now.
- Use a custom resolving chain for global.js and the game's main JSON files. (6f949fd, 91a63f1, 1d816c1)
- Previously, game-specific settings from patches at a lower position in the stack would overwrite global settings from higher up. This allows global.js to reach its full redundancy-elimination potential.
- Move thcrap updating information from patch.js to the run configuration. (05c22da)
- Check for a valid file name pointer when dumping a data file. (8ec5006)
- Would have caused a crash if BP_file_loaded() was called after the file was replaced by BP_file_load() in particular modding scenarios.
- Optionally check a binary hack against an expected sequence of bytes. (1377d71)
- This can be used to selectively disable certain binary hacks if they would crash a particular variety of a game build. Especially helpful for cooperation with certain other patches (*cough*gensokyo.org*cough*) which have statically modified the binary to such an extent as to make unpatching their modifications annoying enough.
- Fixes bug #49.
- Detour ExitProcess() to properly shut down any thcrap worker threads. (88c4bca)
- This has fixed a crash on quitting the game for at least one person.
- textdisp_CreateFontA(): Only override iCharSet if a face name is given. (e63c33d)
- Mainly of interest for people who use thcrap without a translation patch.
- Implement detour chaining. (3e31513, 89804b7, d52176d, c313805, c24a3d6, 2c93b6a, 6b31af6, 0898307, 0a2fab7, e8ad369, f756546)
- A great technical breakthrough that allows for forwards-compatible patches using IAT detouring! Yes, it doesn't qualify as a visible feature at all, but this is the kind of innovation and consideration that makes this engine so special.
- AKA "hot-repatching". Mostly to address a slight design flaw in the custom formats used by thcrap, this brings "self-updating" to a completely new level. However, it is currently only implemented for the following file types:
- Hardcoded strings and their locations (stringdefs.js and stringlocs.js)
- Format specifications (formats.js)
- Music titles (themes.js) and comments (musiccmt.js)
- Spell cards (spells.js) and comments (spellcomments.js)
- Other data formats won't be repatchable without investing a lot of effort.
- AKA "hot-repatching". Mostly to address a slight design flaw in the custom formats used by thcrap, this brings "self-updating" to a completely new level. However, it is currently only implemented for the following file types:
- json_object_get_create(): Fail if the containing object is NULL. (c3a74ae)
- This has certainly caused crashes for someone out there.
- ... although it kind of saddens me that this sort of reinforces the notion of Zip being The Universal Standard Deflate Container. It quite frankly a terrible format which we all should have stopped using together with MS-DOS and floppy disks.
- Use the flexible array loop for dependencies. (a659bdb)
- Whoops... This broke automatic dependency resolution for every patch with just one dependency. And I only noticed it when a Japanese user wanted to use Skipgame and nothing else.
- Link to the default zlib1.dll instead of zlibwapi.dll. (2f1ee51)
- Yes, you can delete the latter file now. ☺
- Allow deletion of unmodified patch files by using JSON nulls in files.js. (5511a73, 8419e11)
- Move update notifications for thcrap and the game itself to thcrap_update. (9945b0b, 5f6dd9d)
- Add digitally signed automatic updates of thcrap itself. (210ccee)
- MSG patching: Increment the line counter correctly to repair hard line patching. (4483137)
- Well, counting is hard, it seems. Add the general horror of the .msg patcher and a lack of testing with the 2 ½ games that need this feature, and you have what is probably the most embarrassing bug in thcrap history. Fixes bug #52.
- Remove the <f$> ruby layout parser introduced in 2013-08-20. (bd25a1b)
- While "automatic ruby support everywhere" may have been a nice thought, the results were never exactly pretty, and barely legible at 640x480.
- BP_ruby_offset(): Fix a crash if "font_dialog" or "font_ruby" are not given. (c56c2d6)
- Layout: Don't overwrite the current width when defining a tabstop. (88fa8be)
- Will be relevant for hardcoded string translation later on.
- Layout: Parse font-related commands before anything else. (bc6cde0)
- sprite_patch_set(): Verify the destination sprite coordinates. (1c2b4ea)
- Fixes a bug introduced with advanced image patching in 2014-01-03. ANM entries can define sprites with coordinates outside the dimensions of the original texture. However, if these happen to be inside the dimensions of a replacement image, the sprite is "patched" regardless - thus, overwriting random memory in the process and crashing the application.
- This broke the trial versions of th14 when used with the Western name order patch, prior to a corresponding fix to the data itself.
- Thanks to Rindou for reporting this issue.
- Layout: Only use the rightmost tab cell for the last token on a line. (2cd72e4)
- Previously, this effectively did not render any token beyond the first one that didn't provide a second parameter. As a result, this broke a lot of potential layout options.
- repo_update.py: Dump JSON with Git-compatible whitespace. (8e0e5a9)
- repo_update.py: Explicitly set UTF-8 encoding for text I/O. (d8e047a)
- Add a script to digitally sign a release archive. (a32097d)
- Don't try to create directories with empty names when writing JSON files. (6ee318c)
- Enforce Unix line endings for JSON files. (6f1dc60)
- Apparently, GitHub automatically does this. As a result, the checksums created by the script would no longer match up with the actual content downloaded from there if we didn't do this ourself. And well, compatibility with GitHub is more important than compatibility with the original Notepad.
(Mainly as a result of frustration from anything else, this project was greatly enhanced in this release in an attempt to provide locale independence for various additional Touhou fangames.)
- Add MoveFile(), MoveFileEx() and MoveFileWithProgress(). (aab31b9)
- Add GetTempPath(). (eb16651)
- Add GetFileAttributes() and GetFileAttributesEx(). (86dca73)
- Add LoadString(). (fe31606)
- Add WideCharToMultiByte() (df6e55c) and MultiByteToWideChar(). (2d00d59)
- This might be quite a controversial change, seeing that it robs a program of the ability to convert between any other single- or multi-byte encoding that is not UTF-8 - which is probably why AppLocale doesn't do anything similar. However, it has only improved things as far as I've tested...
- Well, we had to enter C runtime territory at one point.
Hotfix to repair update notifications, which have been broken since 2014-01-03.
- Fix a reference counting issue that broke update notifications in 2014-01-03. (6c02237)
- Luckily, this is thcrap and there is still the possibility for nifty workarounds to deal with the problem that every user of 2014-01-03 will never see any regular update notification...
8 bugfixes of varying intensity, multi-address breakpoints, the most proper Ruby annotation patching we will ever have, and finally, a script to create your own custom patch server! Global Touhou Patch Network, here we come!
- Add a script to build and update a patch repository. (4e9bf7e)
- Support breakpoints with multiple addresses. (5a6eb6d)
- Eliminate crashes when an "archive" object is no string. (926ffa6)
- Tell the user to download KB2533623 if DLL injection failed. (30c4bca)
- Only use the LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR flag if KB2533623 is installed. (e127e53)
- Another cause for DLL injection failure, and hopefully the last one. The LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR flag of LoadLibraryEx is unsupported on Windows XP, but the function works just fine otherwise. However, on Windows Vista and 7 installations *without* KB2533623 installed, the function just outright fails entirely if that flag is given. As a result, the last build broke thcrap for pretty much everyone who hasn't updated their Windows Vista or 7 since KB2533623 was published in 2011.
- Fall back to IAT detouring by pointer if OriginalFirstThunk is not available. (f67f391)
- Fixes a crash that previously occurred in this case. This is particularly likely to happen with unpacked versions of previously packed binaries (UPX decompressor, I'm looking at you).
- Introduce a global run configuration file at the bottom of the hierarchy. (a46e85d)
- This can be used to define general run configuration elements shared by all games.
- binhacks_apply(): Fix a logic flaw in the log counting. (59326af)
- thcrap_detour(): Show the name of the module the detours are applied to. (e68f3bb)
- Display a repository's contact e-mail address. (66adc21)
- Fix a potential buffer overflow when determining the .msg.jdiff slot key. (eafcef3)
- One of the last few fixed char arrays left in the code, and it was susceptible to a buffer overflow. Hooray.
- MSG patching: Don't patch in invalid TSA ruby syntax due to utter plebbery. (2b977f8)
- Just... just... No, I won't reproduce the commit message here. Click the link above to see the full horror.
- Music Room patching: Don't print "@" for untranslated music titles. (671c3f1)
- Add a breakpoint to calculate the X offset for variable-width Ruby annotations. (52fcf75, 6f12955)
- Third attempt at patching ruby annotations. At a cost of requiring 6 values per game, we finally got it right this time. Fixes bug #47.
- ServerDownloadFile(): Fix potential memory leaks. (5228147)
- Ensure graceful termination while an update is in progress. (701fafd)
- Add IsDBCSLeadByteFB(). (593e62f)
- Required to provide enough "AppLocale" support to run (an unpacked) Danmakufu without crashing.
Finally, advanced image patching, patch dependencies, another bunch of small things... and a New Year's Resolution of never taking as long with releasing new build ever again during active development.
- Do string table lookups for string parameters in variable argument lists. (ff80749)
- Required to translate certain hardcoded ASCII strings that only appear as a parameter to a sprintf format string.
- Persistent string concatenation (777e684, 0aff366)
- Required for that one instance in the custom.exe of Embodiment of Scarlet Devil.
- Support relative paths in the run configuration by turning them into absolute ones internally. (2e97df7)
- Fix some memory leaks and reference counting issues. (4eb4589, 9796e4c, b3c5b41)
- Fixes bug #41.
- inject_CreateRemoteThread(): Catch and detour LoadLibraryW(). (800f89f, dfef694)
- Required for patched Phantasmagoria of Flower View netplay on top of Adonis.
- thcrap_init(): Don't log exported functions. (e759573)
- Use LoadLibraryEx() in the injection payload to guarantee the correct DLL path. (f4b1db7)
- This should fix the "Could not load the DLL" errors resulting from old DLL versions in the game's own directory, which we have always advised against anyway.
- Write relative paths. (590c767)
- Hardcode srv.thpatch.net as the default patch server. (f0a8642)
- Of course, this setting can still be overridden through the command line. This merely eliminates the need to bundle a server.js with thcrap.
- Mention that the shortcuts work from anywhere. (e492cb5)
- Rename the patch list "server" concept to "repository". (74874ed)
- Prior to this, we had two things called "server": the list of patches downloadable from one place (stored in server.js) and the actual download URLs (stored in the "servers" array of server.js and patch.js).
- Add recursive patch repository discovery. (5e96e59, f70f3b2, 6893df0)
- Global Touhou Patch Repository Network, here we come!
- Display all locally available repositories in the patch selection. (148a995, 23c6c3d, cb79f57)
- Move the list of selected patches to the bottom. (8def119)
- Makes sense to put it closer to where the user is actually looking when selecting patches, especially once there'll be a lot to scroll.
- Truncate long patch IDs. (3ee71c7)
- Patch dependency resolution (f9f7b98, 6a8afe6, 6c96689)
- Works either absolute (by directly specifying the target repository ID) or relative (and then resolves a dependency first on a patch's own server, then globally across all known repositories).
- Use a new method for naming run configurations. (d55dc72)
- Now, all patches below the first translation ("lang_") patch don't show up in the name. I bet that people aren't particularly enthused about being told all the dependencies necessary for their language.
- Ask for a custom run configuration file name. (ed2bb60)
- ... and that's just in case we swallowed too much by doing the above.
- Ask if existing run configuration files should be overwritten. (3a9630d)
- Require the selection of at least one patch. (392f75b)
- I know at least two people who once accidentally pressed Enter without selecting a patch. Sure, running without any patches might be a valid use case - thcrap behaves effectively like AppLocale then. That's not what people usually want though.
- Print errors if writing failed, and ask the user to continue. (2ffe0a8)
- Reword the patch selection. (107095f)
- Set a sufficiently large console screen buffer to hold the patch list on Wine. (0a90aa2, dec593a, 151e176)
- Fixes bug #46.
- Correctly parse nested layout markup. (6a04d41)
- Set window title to translated game title and identified build. (af4059b, c4225b2)
- Advanced image patching:
- Alpha-based patching on sprite level. (95b032a, 57e3681, 9cc4146, cdd1bab)
- By classifying an alpha channel into one of three states ("empty" if all alpha values are 0, "opaque" if all alpha values are 0xff, and "full" for everything else), we can selectively patch parts of images, defined by the ANM entry's sprite list. This can drastically reduce the size of the replacement PNGs in certain cases: If only certain sprites of an image need to be edited, the unchanged ones can be "ignored" by simply deleting them (that is, zeroing their alpha channel).
- Perform alpha blending for opaque originals. (4c7a0a9, f8afd46)
- Walk the patch stack. (240cf4c)
- Alpha-based patching on sprite level. (95b032a, 57e3681, 9cc4146, cdd1bab)
- Fix a logic flaw in ANM sprite boundary resizing. (45d0944)
- Use the new files.js file instead of patch.js for updating. (a6fead3, 2ed4deb, 69fa00f, f6ea9d8)
- Way easier to handle.
- Add SetDlgItemText(). (6040e89)
The result of two months worth of painstaking detail work. DLL injection chaining (read: vpatch) support, a number of smaller bug fixes, and quite a lot of general quality improvements throughout the code base.
- Actually *call* strings_patch(). -.- (ae43fbf)
- Necessary to translate the confirmation message box in custom.exe.
- Eliminate directory creation confusion and patch CreateDirectoryA(). (b2bb918)
- Now, the initial creation of the AppData directory for games from th125 on no longer fails if a user name contains non-ASCII characters.
- Patch Win32 dialog font sizes. (cbac032)
- Correctly determine the size of patched Win32 dialog items, once and for all. (825f3da, bf74586)
- strings_vsprintf(): Rewrite to work independently of string encoding. (d5b9036)
- Hardcoded ASCII strings can now safely appear in-game.
- Introduce a "Rx" syntax for hexadecimal addresses relative to the game's base address. (66f3b38, 569199b)
- Use three methods to determine the entry point of the game process. (80605dc)
- DLL injection (and thus, thcrap as a whole) now also work for games using address space layout randomization.
- Detour CreateProcess() and LoadLibrary() for DLL injection chaining. (4f2c45b 1ae967e, 1f927bb, 8eea3e6, 1893659)
- Detour CreateRemoteThread() to apply the thcrap detours to newly injected DLLs. (49e296e, 53e1aba, 6e93053)
- Add inject_CreateProcessW(). (3500e44)
- Or in short: thcrap can now be chained to vpatch.
- Add a basic custom exception handler. (f3c4ba2)
- Crash logs now at least contain the exact code address where the crash occurred.
- log_nprint(): Check if the console was opened. (00de661)
- tsa_CreateWindowExA(): Observe CW_USEDEFAULT. (8ebb088)
- Add GetModuleFileNameEx(). (f30b830)
- Redirect GetWindowLong and SetWindowLong to their W equivalents. (f9edf6c)
- Fixes a window title glitch in th135.
- Add GetPrivateProfileInt(). (2a8b75d)
- Required for vpatch.
Win32 dialog patching, and a couple of smaller fixes for bigger problems.
- Win32 dialog patching (f3ebea3, eff1907, 1fc959f, 89ccf7f)
- strings_lookup() for MessageBox and CreateWindowEx. (07e0df4)
- Fix window placement bugs in the original games. (71c1dca)
- If a Touhou game is closed while being minimized, the game window will no longer be placed at some unreachable "pseudo-minimized" position on new sessions.
- If the game window was moved to another monitor which is then disconnected, the game window will now still be created at a visible place, approximating its old position.
- Do string lookup in GetTextExtent(), not in GetTextExtentBase(). (cc018b3)
- Fixes a regression introduced in 2013-08-20 where string lookup in GetTextExtent() was not working as expected (noticeable in the th07 main menu descriptions).
- Add the custom.exe bug fix for Western systems. (b1f8031)
- Maximize the height of the console window. (af3f982)
- We've been accumulating so many patches lately that they've been starting to go beyond the already enlarged console window.
- Add CreateDialogParam and DialogBoxParam. (609e844)
- Now, Windows dialogs also come with "AppLocale functionality".
- Add DrawText. (78d562c)
Music Room and proper ruby. 'nuff said.
- stack_game_file_resolve(): Fix build-specific files to actually work as expected. (75889b5)
- Add ruby layout. (ac3e47b)
- GetTextExtent: Take layout markup into account. (089896a)
- Add Music Room comment patching. (324159a, d73613d)
- Add Music Room title patching. (cc50311)
Another three small things: two in the updater, and one in the build configuration.
- Include zlib in the libpng DLL... apparently, this is necessary on some systems.
Three small things - one of that actually being a rather important improvement - before th14 comes out. Nothing relevant.
- Well, it's the th14 full version release and still no GUI... (cb49224)
- Disable console by default in new run configurations. (9b27784)
- Actually verify the CRC32 of downloaded files. (25759eb)
Hardcoded string translation... and comparatively many bug fixes.
- Use thread-local storage for the global file_rep_t object. (File patching is thread-safe now.) (35e8c1d)
- IsLatestBuild: Fix a crash if latest is neither array nor string.(8facb6a)
- Include build-specific files in the patch stack resolving functions. (1e07240)
- Add basic translation of hardcoded strings via dictionary lookup. (e51a8e1)
- Add a safe and persistent vsprintf handler. (06089df)
- CreateFontA: Check hardcoded strings for a replacement font. (9de60fc)
- Layout command 't': Choose the longest string out of all given parameters. (Fixes a logic flaw in ending text alignment.) (e874005)
- Add GetEnvironmentVariable. (Necessary to run th125 and later with user names that contain non-ASCII characters.) (afa4a21)
A text layout parser, and bug fixes in the UTF-8 wrappers.
- StringToUTF16: Actually observe input and output widths correctly. (c230ad4)
- TextOutU/GetTextExtentPoint32U: Clear out the wchar_t buffer before writing. (dd0712e)
- Add a TextOut hook with a parser for special tabstop and alignment syntax. (3457eb4, d034d5a, 611b434, 2ed1cce)
Images! (and probably Endings!, too)
- Remove the th11 English patch assist font width kludge. (f869d73)
- Fix the infinite loop on failed plug-in loading. (64915c6)
- Move logging for file breakpoint down to the resolving functions. (09db994)
- Fix the server number comparison. (3db5748)
- Add basic ANM patching for all formats. (4257d53, 7cce33e, d056c74, cd4905b)
- Add patching support for multiple textures in one image, starting at custom positions (d231f3a)
- Add ANM sprite boundary dumping, invoked by dat_dump. (276c8f4)
Answers to a couple of smaller problems that came up with doing spell cards.
- Thread-safe ESP manipulation in the breakpoint handler (19c8893)
- Add GetTextExtentForFont. (7b23f0c)
- Use a custom pausing function instead of system("pause"). (22e6361)
- Automatically look up breakpoint functions using the runconfig key. (37bbff6)
- Remove manual breakpoint registration. (eb521ff)
- Add support for multi-slot breakpoints. (0f88b5e)
- Refactor stack file resolving to include support for game-local JSON files. (ea7b4e1)
- Run patch hooks even without a dedicated patch file. (8e9c3a5)
Mostly a maintenance build, preparing for the move to open-source development.
- Log file now includes the build date and Windows username of the builder
- JSON loading now skips over UTF-8 byte order marks
- Split off the Unicode wrappers to the Win32 API into its own module (win32_utf8)
- Display the server URL at the first screen
- Fix bug #13 (thcrap_configure can't tell the root path on its own)
- Now using UTF-8 almost everywhere
- Consistent UTF-8 logging to thcrap_log.txt
- Improved Unicode support - now, every game should be able to run from directories with CJK file names
- Run configuration archives are now checked for existence
- patch.js can now recommend a minimum version of the patch engine (read: update checking)
- Lots of refactoring
- Patch selection now shows patches sorted alphabetically
- Local server.js is now overwritten with the latest version downloaded from the server
- Fix bug #3 (Game crash after Alice Bossfight)
- Fixed a delayed crash in th09 when returning to the main menu from in-game. (This confirms that this game, like th08, also adds 4 bytes to every file size, just to be annoying.)
... and other stuff I forgot about.
- thcrap_configure now has an icon instead of thcrap_loader - people are probably more likely to click something with a nice icon first
- Added a hook for GetModuleFileNameA and SetCurrentDirectoryA - we can now run th14 out of that Chinese directory name
- Completely rewritten game locating based on user feedback
- _except_handler4_common is now fixed properly - no need for the alternate build anymore
- run configuration can now contain an "exe" parameter to directly launch a specific game (this didn't work properly in the release build - shame on me)
- more error reporting in the downloader (Gray21oh, where are you)