Implement new n-0 policy for my sanity

This commit is contained in:
Will Toohey 2021-07-18 23:07:10 +10:00
parent fc6ccd56f6
commit 5443cc09c0
10 changed files with 82 additions and 518 deletions

View File

@ -10,6 +10,7 @@ These days, I do not create the patches. Everything is community submitted.
If you would like new hex edits, make them yourself and make a pull request!
## Patch rules
- *New*: No n-0 newer than 1 year ago. [Why?](docs/why_no_n_minus_zero.md)
- Rhythm games only. Bombergirl is the one exception, it's Konami anyway.
- No autoplay patches
- It is far too easy to accidentally get people banned from their networks
@ -34,8 +35,3 @@ multiple commits, I will squash and merge.
Please do not worry about submitting "bad" PRs. If there is something wrong, I
will tell you how to fix it or I will fix it myself before merging.
Submitting a PR for an n-0 game is frowned upon in the general community and
might make you disliked. The BemaniPatcher repository does not judge, and **I
will merge n-0 patches**, but please be mindful that your submission may have
unintended consequences for you.

View File

@ -1,190 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>IIDX BISTROVER DLL Modder</title>
<link rel="stylesheet" href="css/style.css" />
<!-- don't hate -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script type="text/javascript" src="js/FileSaver.min.js"></script>
<script type="text/javascript" src="js/dllpatcher.js"></script>
<script type="text/javascript">
window.addEventListener("load", function () {
new PatchContainer([
//LDJ-2021042600
new Patcher("bm2dx.dll", "2021-04-26", [
{
name: "SSE4.2 Fix",
patches: [
{ offset: 0x20A454, off: [0xF3, 0x45, 0x0F], on: [0x90, 0x90, 0x90] },
],
},
{
name: "Skip Camera Error",
patches: [{ offset: 0x6B231B, off: [0x84], on: [0x81] }],
},
{
name: "Force 120hz timing and adapter mode in LDJ (Experimental)",
patches: [
{ offset: 0x3C6063, off: [0x75], on: [0xeb] },
{ offset: 0x771A5E, off: [0x3c], on: [0x78] },
{ offset: 0x771C49, off: [0x74, 0x03], on: [0x90, 0x90] },
],
},
{
name: "Shim Lightning Mode IO (for spicetools)",
patches: [
{
offset: 0x715FBE,
off: [0x0f, 0x84, 0x8d, 0x00, 0x00, 0x00],
on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90],
},
{ offset: 0x78BFE4, off: [0x0f, 0x84], on: [0x90, 0xe9] },
{ offset: 0x78C750, off: [0x9c, 0xe4], on: [0x3c, 0xdd] },
],
},
{
name: "Bypass lightning monitor error",
patches: [
{ offset: 0x6A4D91, off: [0x0f, 0x85], on: [0x90, 0xe9] },
],
},
{
name: "Force LDJ software video decoder for all boot modes",
patches: [
{
offset: 0x715FB7,
off: [0x83, 0x78, 0x08, 0x02],
on: [0x83, 0x78, 0x08, 0x05],
},
],
},
{
name: "Unscramble touch screen keypad in TDJ",
patches: [
{
offset: 0x7488F5,
off: [0x4d, 0x03, 0xc8, 0x49, 0xf7, 0xf1],
on: [0xba, 0x0c, 0x00, 0x00, 0x00, 0x90],
},
],
},
{
name: "1P Premium Free",
patches: [
{
offset: 0x65BD64,
off: [0x75],
on: [0xEB],
},
],
},
{
name: "2P Premium Free",
patches: [
{
offset: 0x65BF15,
off: [0x74, 0x55],
on: [0x90, 0x90],
},
{ offset: 0x65BF2B, off: [0x74, 0x3F], on: [0x90, 0x90] },
],
},
{
name: "Premium Free Timer Freeze",
tooltip:
"Freezes the timer in PREMIUM FREE mode, allowing unlimited play until exit",
patches: [{ offset: 0x42E5DD, off: [0x7e], on: [0xeb] }],
},
{
name: "Unlock All Songs",
patches: [
{ offset: 0x429D49, off: [0x75, 0x24], on: [0x90, 0x90] },
],
},
{
name: "Unlock All 12s",
patches: [
{
offset: 0x429AF0,
off: [0x83, 0xff, 0x03, 0x74, 0x05, 0x83, 0xff, 0x08],
on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90],
},
],
},
{
name: "Skip Decide Screen",
patches: [
{
offset: 0x348980,
off: [0xe8, 0x6b, 0x00, 0x00, 0x00],
on: [0x90, 0x90, 0x90, 0x90, 0x90],
},
],
},
{
name: "CS-style song start delay",
tooltip : "Holding Start will pause the song at the beginning until you release it",
patches: [
{
offset: 0x68D453,
off: [0x7d, 0x4d],
on: [0x90, 0x90],
},
],
},
{
name: "Cursor Lock",
patches: [
{ offset: 0x662ECF, off: [0x74, 0x1f], on: [0x90, 0x90] },
],
},
{
name: "Quick Retry",
patches: [
{ offset: 0x40E36F, off: [0x32, 0xC0], on: [0xB0, 0x01] },
],
},
{
name: "Standard/Menu Timer Freeze",
patches: [{ offset: 0x6D6B77, off: [0x74], on: [0xeb] }],
},
{
name: "WASAPI Shared Mode (with 44100Hz)",
patches: [{ offset: 0x20A541, off: [0x01], on: [0x00] }],
},
{
name: "Always show FAST/SLOW total",
patches: [
{ offset: 0x678863, off: [0x74], on: [0x75] },
{ offset: 0x678A80, off: [0x74], on: [0x75] },
],
},
{
name: "Hide all bottom text",
patches: [
{ offset: 0x32EA01, off: [0x7F, 0x12, 0x44, 0x8B, 0xCB, 0x4C, 0x8D, 0x05, 0xBB, 0x06, 0x63, 0x00], on: [0x90, 0xE9, 0x22, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90] }, //EXTRA PASELI: %d
{ offset: 0x32EDBD, off: [0xE8, 0xAE, 0xAF, 0x00, 0x00], on: [0x90, 0x90, 0x90, 0x90, 0x90] }, //INSERT COIN[S]
{ offset: 0x32EC0B, off: [0xFF, 0x15, 0xCF, 0xA7, 0x62, 0x00], on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90] }, //PASELI: ******
{ offset: 0x32ECA9, off: [0xFF, 0x15, 0x31, 0xA7, 0x62, 0x00], on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90] }, //PASELI: NO ACCOUNT
{ offset: 0x32EB24, off: [0x48, 0x8D, 0x05, 0x3D, 0x12, 0x77, 0x04], on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90] }, //PASELI: NOT AVAILABLE
{ offset: 0x32E926, off: [0xFF, 0x15, 0xB4, 0xAA, 0x62, 0x00], on: [0x90, 0x90, 0x90, 0x90, 0x90, 0x90] }, //CREDIT: %d
],
},
{
name: "FREE PLAY text to LED ticker",
tooltip: "Song Title/Ticker information will display instead of FREEPLAY",
patches: [
{ offset: 0x32EABF, off: [0xAD, 0x05, 0x63, 0x00], on: [0x49, 0x56, 0x00, 0x05] },
],
},
]),
]);
});
</script>
</head>
<body>
<h1>IIDX BISTROVER DLL Modder</h1>
</body>
</html>

View File

@ -1,122 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>CHUNITHM PARADISE Modder</title>
<link rel="stylesheet" href="css/style.css">
<!-- don't hate -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script type="text/javascript" src="js/FileSaver.min.js"></script>
<script type="text/javascript" src="js/dllpatcher.js"></script>
<script type="text/javascript">
window.addEventListener("load", function () {
new Patcher("chuniApp.exe", "", [
{
name: "Allow 127.0.0.1/localhost as the network server",
patches: [
{offset: 0x9B5BF0, off: [0x55, 0x8B, 0xEC], on: [0x31, 0xC0, 0xC3]},
{offset: 0x1743510, off: [0x31, 0x32, 0x37, 0x2F], on: [0x30, 0x2F, 0x38, 0x00]}
]
},
{
name: "Disable shop close lockout",
tooltip: "Disables ~12-8am lockout. Does not disable maint lockout from 6:30-7am JST",
patches: [
{offset: 0x9DD843, off: [0x74], on: [0xEB]},
],
},
{
name: "Force shared audio mode, system audio samplerate must be 48000",
tooltip: "Improves compatibility but may increase latency",
patches: [
{offset: 0xD1134A, off: [0x01], on: [0x00]},
],
},
{
name: "Force 2 channel audio output",
patches: [
{offset: 0xD11421, off: [0x75, 0x3F], on: [0x90, 0x90]},
],
},
{
name: "Disable Song Select Timer",
tooltip: "May only work when playing with card.",
patches: [
{offset: 0x784A42, off: [0x74], on: [0xEB]},
],
},
{
name: "Set All Timers to 999",
patches: [
{offset: 0x62D790, off: [0x8B, 0x44, 0x24, 0x04, 0x69, 0xC0, 0xE8, 0x03, 0x00, 0x00], on: [0xB8, 0x58, 0x3E, 0x0F, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90]},
],
},
{
// lin714093880 & esterTion
name: "Patch for head-to-head play",
tooltip: "Fix infinite sync while trying to connect to head to head play.",
patches: [
{offset: 0x48C9B3, off: [0x01], on: [0x00]},
]
},
{
name: "Auto Play",
patches: [
{offset: 0x747369, off: [0x00], on: [0x01]},
],
},
{
// maybenotuseful
name: "Patch for Windows 7",
tooltip: "May not be able to connect to the server",
patches: [
{offset: 0x1bdd428, off: [0x45, 0x78], on: [0x5F, 0x41]},
{offset: 0x1bdd430, off: [0x43, 0x61, 0x6E, 0x63, 0x65, 0x6C, 0x51, 0x75, 0x65, 0x72, 0x79], on: [0x51, 0x75, 0x65, 0x72, 0x79, 0x5F, 0x41, 0x00, 0x00, 0x00, 0x00]},
],
},
{
// ikaros14
name: "Increase max credits to 254",
patches: [
{offset: 0xCB28D7, off: [0x8A, 0x5D, 0x14], on: [0xB3, 0xFE, 0x90]},
],
},
{
// esterTion
name: "Free Play",
tooltip: "Endless credits",
patches: [
{offset: 0xCB2CF5, off: [0x28], on: [0x08]},
],
},
{
// esterTion
name: "Dummy LED",
tooltip: "Skip LED board check",
patches: [
{offset: 0x24A5E7, off: [0x00], on: [0x01]},
],
},
{
name: "No Encryption",
tooltip: "Title server workaround",
patches: [
{offset: 0x3E2832, off: [0x39], on: [0xC3]},
]
},
{
name: "No TLS",
tooltip: "Title server workaround",
patches: [
{offset: 0xD04D09, off: [0x81, 0xE3, 0x00, 0x00, 0x80, 0x00], on: [0x31, 0xDB, 0x90, 0x90, 0x90, 0x90]},
]
}
]);
});
</script>
</head>
<body>
<h1>CHUNITHM PARADISE Modder</h1>
</body>
</html>

View File

@ -0,0 +1,81 @@
# What does n-0 mean?
"n-0" is part of a common nomenclature in the arcade scene referring to
freshness of data. "n-0" (n minus zero) is the current game release, like a
mathematical equation. "n-1" is the previous game release. Rarely you will see
"n+1" where the next, unreleased version of a game is leaked early.
A time can also be added to specify lengths instead of versions. For example,
"n-6 months" or "n-1 year".
# Why no n-0 in Bemanipatcher?
The original policy of this repo was to accept any patch set that looked sane
and had consistent style, to be a "global" repository for all games that had
been released. Sometimes some private release would have hex edits appear as a
PR, so I accepted them because I didn't want to get into the drama of "why does
he have data but I don't".
In mid 2021, some groups decided they'd start leaking the latest updates for
pretty much every game under the sun. In addition to being a hugely
irresponsible idea (Sega is especially litigious), this produced a lot of noise
in PRs from people hastily trying to port edits.
I have had several terrible PRs submitted that I have had to revert. These
include:
- Broken patches
- Misattributed sources
- Totally-fine patch sets where I immediately received a Discord DM saying "I
didn't want that to be public, delete it please"
- PRs opened and closed almost immediately by someone reconsidering
- PRs opened, merged and then reverted by the original uploader
As such, this repo now has a new rule: No n-0, unless it is more than a year
old.
# When is n-0 OK? Why is day-old n-1 OK?
In addition to the obvious frustration I have with all these junk PRs, read on
for some moral soapboxing as to why you should reconsider public n-0.
**Remember: this is my own opinion.** I like to think it's a fairly common one. You are welcome to disagree with me, but it won't change the policy.
Why the year rule? When a new game comes out, why is the n-0 from yesterday
suddenly OK? There are two important aspects to my reasoning: Acting in good
faith, and preservation.
You have to remember that rhythm games are an extremely niche market when
compared to all other game formats. Arcade rhythm games are even more niche, and
critically, comprise a different payment model (credits vs gacha/one-time-buy).
Compared to huge MOBAs and FPS games where the majority just pays and plays the
game, the at-home-arcade community *is* big enough to cause financial problems
if they all stay at home, which is why we've seen COVID hit Sega hard enough to
start closing flagship arcades in Akihabara.
I have heard firsthand from arcade operators that as soon as home-data is
released that matches or exceeds the version in their arcade, attendance drops
sharply. After all, with no commute and no credits, playing at home on your ASC
is usually good enough.
So the first point, acting in good faith. By releasing old data, you minimise
depriving arcade operators of their income. Whether it's in Japan and the coins
go straight to Konami, or you're in Europe and they fund your local arcade's
next cab purchase, it's critical to actually financially support the games in
this niche.
Adding the 1 year specifier is for games like Jubeat and Reflecbeat - games that
have not seen a new release in years. I believe it's acting in good faith to
release year old data. If there's been literally no updates in a year... That's
on Konami for abandoning a property.
The second aspect is preservation. Except for buying an offline cab and hoping
it has the right version (good luck), there is simply no way to legitimately
play old releases of these games. This is why n-1 suddenly becomes "good" once
the next version of the game is released. So much digital history has been lost
due to bitrot and always-online games becoming unplayable. I like the idea of
being able to play every game in a series ever released.
# Why did you write all this?
A lot of people who share my opinion like to loudly flame newcomers thirsty for
the latest data, chastising them for not innately knowing the correct etiquette.
This is my attempt to explain where my opinions come from. If it's useful to
even 1 person, it's done its job.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

View File

@ -62,12 +62,6 @@
<div>CHUNITHM CRYSTAL</div>
</div>
</a>
<a href="chuniparadise.html" class="gameicon">
<div>
<img src="img/chuniparadise.png">
<div>CHUNITHM PARADISE</div>
</div>
</a>
<a href="tricoro.html" class="gameicon">
<div>
<img src="img/tricoro.png">
@ -116,12 +110,6 @@
<div>beatmania IIDX 27 HEROIC VERSE</div>
</div>
</a>
<a href="bistrover.html" class="gameicon">
<div>
<img src="img/bistrover.png">
<div>beatmania IIDX 28 BISTROVER</div>
</div>
</a>
<a href="ddr2014.html" class="gameicon">
<div>
<img src="img/ddr2014.png">
@ -308,12 +296,6 @@
<div>SDVX V VIVID WAVE</div>
</div>
</a>
<a href="sdvx6.html" class="gameicon">
<div>
<img src="img/sdvx6.png">
<div>SDVX VI EXCEED GEAR</div>
</div>
</a>
</div>
<pre class="tagline">Patches are community created. <a href="https://github.com/mon/BemaniPatcher/">Submit your own via Pull Request!</a></pre>
<pre class="tagline"><em>Converted to a web-tool by <a href="https://github.com/mon/">mon</a></em></pre>

View File

@ -11,16 +11,6 @@
<script type="text/javascript">
window.addEventListener("load", function() {
new PatchContainer([
new Patcher("jubeat.dll", "2020-09-16", [
{
name: "SELECT MUSIC Timer Lock",
patches: [{ offset: 0xa0632, off: [0x75], on: [0xeb] }],
},
{
name: "Skip CATEGORY SELECT",
patches: [{ offset: 0xb95f7, off: [0x04], on: [0x07] }],
},
]),
new Patcher("jubeat.dll", "2020-07-27", [
{
name: "Disable Turorial",

View File

@ -1,173 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>SDVX VI DLL Modder</title>
<link rel="stylesheet" href="css/style.css" />
<!-- don't hate -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script type="text/javascript" src="js/FileSaver.min.js"></script>
<script type="text/javascript" src="js/dllpatcher.js"></script>
<script type="text/javascript">
window.addEventListener("load", function () {
new PatchContainer([
new Patcher("soundvoltex.dll", "2021-04-28", [
{
name: "Disable power change", //patch by Xyen
tooltip: "Prevents power mode change on startup",
patches: [{ offset: 0x1ec553, off: [0x75], on: [0xeb] }],
},
{
name: "Disable monitor change", //patch by Xyen
tooltip: "Prevents monitor setting changes on startup",
patches: [{ offset: 0x1ec5eb, off: [0x75], on: [0xeb] }],
},
{
name: "Shared mode WASAPI",
tooltip:
"Only replaces the first audio device init attempt. Set output to 44100Hz 16bit if it doesn't work.",
patches: [{ offset: 0x42b089, off: [0x04], on: [0x00] }],
},
{
name: "Timer freeze", // ikaros14
patches: [{ offset: 0x71166, off: [0x84], on: [0x85] }],
},
{
name: "Allow non E004 cards",
tooltip: "Allows cards that do not have E004 card IDs (such as mifare cards) to work.",
patches: [
{ offset: 0xA4B, off: [0x75, 0x12], on: [0x90, 0x90] },
{ offset: 0xA53, off: [0x74], on: [0xEB] }
],
},
{
type: "union",
name: "Premium Time Length",
offset: 0x297996,
patches: [
{
name: "Default (10 Minutes)",
patch: [0x00, 0x70, 0xc9, 0xb2, 0x8b, 0x00, 0x00, 0x00],
},
{
name: "20 Minutes",
patch: [0x00, 0xe0, 0x92, 0x65, 0x17, 0x01, 0x00, 0x00],
},
{
name: "30 Minutes",
patch: [0x00, 0x50, 0x5c, 0x18, 0xa3, 0x01, 0x00, 0x00],
},
{
name: "1 Hour",
patch: [0x00, 0xa0, 0xb8, 0x30, 0x46, 0x03, 0x00, 0x00],
},
],
},
]),
new Patcher("soundvoltex.dll", "2021-05-18", [
{
name: "Disable power change", //patch by Xyen
tooltip: "Prevents power mode change on startup",
patches: [{ offset: 0x1ecd13, off: [0x75], on: [0xeb] }],
},
{
name: "Disable monitor change", //patch by Xyen
tooltip: "Prevents monitor setting changes on startup",
patches: [{ offset: 0x1ecdab, off: [0x75], on: [0xeb] }],
},
{
name: "Force BIO2 (KFC) IO in Valkyrie mode",
tooltip: "Will only work with <spec __type=\"str\">F</spec> changed to either G or H, in ea3-config.xml.",
patches: [{ offset: 0x3f1bd5, off: [0x87, 0x05], on: [0x47, 0x0c] }],
},
{
name: "120Hz Support",
patches: [{ offset: 0x6fc0be, off: [0x4e], on: [0x5e] }],
},
{
name: "Shared mode WASAPI",
tooltip:
"Only replaces the first audio device init attempt. Set output to 44100Hz 16bit if it doesn't work.",
patches: [{ offset: 0x42d009, off: [0x04], on: [0x00] }],
},
{
name: "Timer freeze", // ikaros14
patches: [{ offset: 0x713d6, off: [0x84], on: [0x85] }],
},
{
type: "union",
name: "Premium Time Length",
offset: 0x298d16,
patches: [
{
name: "Default (10 Minutes)",
patch: [0x00, 0x70, 0xc9, 0xb2, 0x8b, 0x00, 0x00, 0x00],
},
{
name: "20 Minutes",
patch: [0x00, 0xe0, 0x92, 0x65, 0x17, 0x01, 0x00, 0x00],
},
{
name: "30 Minutes",
patch: [0x00, 0x50, 0x5c, 0x18, 0xa3, 0x01, 0x00, 0x00],
},
{
name: "1 Hour",
patch: [0x00, 0xa0, 0xb8, 0x30, 0x46, 0x03, 0x00, 0x00],
},
],
},
]),
new Patcher("soundvoltex.dll", "2021-06-16", [
{
name: "Disable power change", //patch by Xyen
tooltip: "Prevents power mode change on startup",
patches: [{ offset: 0x1ECEC3, off: [0x75], on: [0xeb] }],
},
{
name: "Disable monitor change", //patch by Xyen
tooltip: "Prevents monitor setting changes on startup",
patches: [{ offset: 0x1ECF5B, off: [0x75], on: [0xeb] }],
},
{
name: "Shared mode WASAPI",
tooltip:
"Only replaces the first audio device init attempt. Set output to 44100Hz 16bit if it doesn't work.",
patches: [{ offset: 0x42EC39, off: [0x04], on: [0x00] }],
},
{
name: "Timer freeze", // ikaros14
patches: [{ offset: 0x71406, off: [0x84], on: [0x85] }],
},
{
type: "union",
name: "Premium Time Length",
offset: 0x29A116,
patches: [
{
name: "Default (10 Minutes)",
patch: [0x00, 0x70, 0xc9, 0xb2, 0x8b, 0x00, 0x00, 0x00],
},
{
name: "20 Minutes",
patch: [0x00, 0xe0, 0x92, 0x65, 0x17, 0x01, 0x00, 0x00],
},
{
name: "30 Minutes",
patch: [0x00, 0x50, 0x5c, 0x18, 0xa3, 0x01, 0x00, 0x00],
},
{
name: "1 Hour",
patch: [0x00, 0xa0, 0xb8, 0x30, 0x46, 0x03, 0x00, 0x00],
},
],
},
]),
]);
});
</script>
</head>
<body>
<h1>SDVX VI DLL Modder</h1>
</body>
</html>