[TVC] [Milk Factory] Motto! Haramase! Honoo no Oppai Isekai Oppai Spy Gakuen! [Decrypted]

Category:
Date:
2026-08-27 11:43 UTC
Submitter:
Anonymous
Seeders:
19
Information:
Leechers:
15
File size:
4.7 GiB
Completed:
114
Info hash:
5f2d265b91362bbe6bdf6f48a189cdf13d9b2220
## TLDR: this copy of the game is now like https://sukebei.nyaa.si/view/4476322/, fully decrypted, so no need to use any hijacker DLL to insert any kind of unofficial patch, and to make proper fixes to the game. --- I would normally would for the MF games to be translated before doing this, but I decided to do it for this one since I was intrigued by how the L2D implementation on was done, since until now we had to be limited by MPEG-1 VIDEO files (seriously, not even MPEG-4???). It is pretty interesting to see how Wamsoft (more specifically Watanabe Go) is implementing new features onto KiriKiri to this day, one can see the great amount of graphic API that are available in the source code of this game that are more aimed towards making this engine actually multiplatform (**for now it is not, so calm down**), and making the engine all around more robust. Something else worth commenting on, is how bad the project hygiene is, the game features a shitton of unused files from older games, specially cut-ins and BGV sound files (maybe the latter for a possible Append patch down the line? It's hard to say, the game has the cut-ins made for the scenes that had [Elma](https://vndb.org/c116755) in HMaid) ![DebugMenu](https://i.postimg.cc/JnvQ6Qdd/screenshot.png) Here's proof of the game running completely decrypted, since it's on debug mode. --- Something I discovered with this game (but in reality is an issue present in the other games too, but solved differently because the code was older), is that the game won't let you save the progress if the game is stored in a path that Windows might deem somewhat problematic (like a network drive or another kind of special path), but will let you load previously created saves (if you have one). It took a long ass time to understand what is going on, but this is just expected behavior, because what's going on is that KiriKiri is activating a parameter called `readOnlyMode`, which does basically deactivate any kind of writing operation to the disk. How does this happen? If you decompile the file called `MainWindow.tjs`, you'll find a function called `saveSystemVariables`, which calls the function `safeSaveStruct`, which is a function that ensures that writing the savegame is done in a safely manner. Sadly, because Windows is managed by a bunch of monkeys, an exception will be caught, and the error message with the text `rename failed: {actual error message}` will be seen in KiriKiri's console. Then, once back at `saveSystemVariables`, that function will obviously go onto the catch portion of the function, since `safeSaveStruct` failed, which is where the part where the variable `readOnlyMode` is set to 1, and thus, disabling all saving operations. For context, here are both functions: ``` function saveSystemVariables(arg0 = 0) { // A LOT OF CODE IN BETWEEN THAT DOES NOT MATTER FOR OUR PURPOSES while (1) { try { local1 = Storages.isExistentStorage; var local2 = getSystemSaveDataFileName("sc"); var local3 = local1(local2); var local4 = getSystemSaveDataFileName("su"); var local5 = local1(local4); safeSaveStruct(local2, scflags, saveDataMode, local3); safeSaveStruct(local4, sflags, saveDataMode, local5); Storages.commitSavedata(); break; } catch (e) { Storages.rollbackSavedata(); Debug.notice("saveSystemVariables失敗 : " + e.message); if (callHook("onSaveSystemVariablesFailed", e.message)) { continue; } else { if (!isSwitch()) { readOnlyMode = 1; ---> This is where the game disables saving } break; } } } } ``` ``` function safeSaveStruct(arg0, arg1, arg2, arg3 = 1, arg4) { function _save(arg0, arg1, arg2) { (Dictionary.saveStruct incontextof arg0)(arg1, arg2); } if (arg4 === void) { arg4 = _save; } if (_disableSafeSaveStruct === void) { try { if (typeof Storages.deleteFile == "undefined") { Plugins.link("fstat.dll"); } } catch (e) { } _disableSafeSaveStruct = isSwitch() || (typeof Storages.deleteFile != "Object" || typeof Storages.moveFile != "Object"); } if (_disableSafeSaveStruct || !isLocalStorage(arg0)) { arg4(arg1, arg0, arg2); return -1; } else { var local0 = Storages.chopStorageExt(arg0); var local1 = Storages.extractStorageExt(arg0); var local2 = local0 + "~" + local1; var local3 = local0 + "_" + local1; arg4(arg1, local3, arg2); if (arg3) { Storages.deleteFile(local2); Storages.moveFile(arg0, local2); } if (!Storages.moveFile(local3, arg0)) { Storages.deleteFile(local3); Storages.moveFile(local2, arg0); throw new Exception("rename failed:" + arg0); } return 1; } } ``` To avoid this issue, one can simply ensure that `_disableSafeSaveStruct` is always set to 1, by swapping `_disableSafeSaveStruct = isSwitch() || (typeof Storages.deleteFile != "Object" || typeof Storages.moveFile != "Object");` to `_disableSafeSaveStruct = 1;`. The other way to ensure this works, but in a more clean way, **ALTHOUGH IT HAS NOT BEEN TESTED BY ME**, it's by adding this code onto `MainWindow.tjs`: ``` var _renameSafeCache; function isRenameSafe(arg0) { if (_renameSafeCache !== void) { return _renameSafeCache; } var local0 = arg0 + "_renametest1"; var local1 = arg0 + "_renametest2"; try { [].save(local0); Storages.deleteFile(local1); if (!Storages.moveFile(local0, local1)) { throw new Exception("rename test failed"); } Storages.deleteFile(local1); _renameSafeCache = 1; } catch (e) { try { Storages.deleteFile(local0); } catch (e2) { } try { Storages.deleteFile(local1); } catch (e2) { } _renameSafeCache = 0; } return _renameSafeCache; } ``` Then, swap `_disableSafeSaveStruct = isSwitch() || (typeof Storages.deleteFile != "Object" || typeof Storages.moveFile != "Object");` for `_disableSafeSaveStruct = isSwitch() || (typeof Storages.deleteFile != "Object" || typeof Storages.moveFile != "Object") || !isRenameSafe(saveDataLocation + dataName);`. --- ### To contact me, I am in the Waffle's Discord server: https://discord.com/invite/nx7VgwZDbA

File list

  • [TVC] [Milk Factory] Motto! Haramase! Honoo no Oppai Isekai Oppai Spy Gakuen!.7z (4.7 GiB)