From 759c3293ea93f6544ced124b6a0526a76e1dbc80 Mon Sep 17 00:00:00 2001 From: Zopolis4 <64618338+Zopolis4@users.noreply.github.com> Date: Mon, 22 Nov 2021 17:05:28 +1100 Subject: [PATCH] Initial commit --- Database.xlsx | Bin 0 -> 19344 bytes Patches/F-Zero AX (Japan) (Rev C).patch | Bin 0 -> 475 bytes Patches/F-Zero AX (Japan) (Rev D).patch | Bin 0 -> 475 bytes Patches/F-Zero AX (Japan) (Rev E).patch | Bin 0 -> 475 bytes Patches/F-Zero-AX_fixed.patch | Bin 0 -> 511 bytes Patches/FZeroAx.patch | Bin 0 -> 605 bytes Patches/GVS46E.patch | Bin 0 -> 480 bytes Patches/trihdrGPY(Rev B).patch | Bin 0 -> 554 bytes Patches/trihdrGPY(Rev C).patch | Bin 0 -> 554 bytes Patches/trihdrvs2002 (Export).patch | Bin 0 -> 382 bytes Patches/trihdrvs2002 (Japan).patch | Bin 0 -> 383 bytes Patches/trihdrvs2002 (Type 3).patch | Bin 0 -> 401 bytes Patches/trihdrvs4 (Asia).patch | Bin 0 -> 505 bytes Patches/trihdrvs4 (Asia, Rev B).patch | Bin 0 -> 505 bytes Patches/trihdrvs4 (Export).patch | Bin 0 -> 505 bytes Patches/trihdrvs4 (Export, Rev A).patch | Bin 0 -> 505 bytes Patches/trihdrvs4v2006 (Export).patch | Bin 0 -> 535 bytes Patches/trihdrvs4v2006 (Japan, Rev B).patch | Bin 0 -> 536 bytes Patches/trihdrvs4v2006 (Japan, Rev D).patch | Bin 0 -> 536 bytes Patches/vs406.patch | Bin 0 -> 509 bytes triforcedumprepair.py | 419 ++++++++++++++++++++ 21 files changed, 419 insertions(+) create mode 100644 Database.xlsx create mode 100644 Patches/F-Zero AX (Japan) (Rev C).patch create mode 100644 Patches/F-Zero AX (Japan) (Rev D).patch create mode 100644 Patches/F-Zero AX (Japan) (Rev E).patch create mode 100644 Patches/F-Zero-AX_fixed.patch create mode 100644 Patches/FZeroAx.patch create mode 100644 Patches/GVS46E.patch create mode 100644 Patches/trihdrGPY(Rev B).patch create mode 100644 Patches/trihdrGPY(Rev C).patch create mode 100644 Patches/trihdrvs2002 (Export).patch create mode 100644 Patches/trihdrvs2002 (Japan).patch create mode 100644 Patches/trihdrvs2002 (Type 3).patch create mode 100644 Patches/trihdrvs4 (Asia).patch create mode 100644 Patches/trihdrvs4 (Asia, Rev B).patch create mode 100644 Patches/trihdrvs4 (Export).patch create mode 100644 Patches/trihdrvs4 (Export, Rev A).patch create mode 100644 Patches/trihdrvs4v2006 (Export).patch create mode 100644 Patches/trihdrvs4v2006 (Japan, Rev B).patch create mode 100644 Patches/trihdrvs4v2006 (Japan, Rev D).patch create mode 100644 Patches/vs406.patch create mode 100644 triforcedumprepair.py diff --git a/Database.xlsx b/Database.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..37d1dce9e9062c8421291dedb754a46ba15fdeb9 GIT binary patch literal 19344 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 XDR6*F0|LSTyfy*(?bP2YY=HhBwx5o` literal 0 HcmV?d00001 diff --git a/Patches/F-Zero AX (Japan) (Rev C).patch b/Patches/F-Zero AX (Japan) (Rev C).patch new file mode 100644 index 0000000000000000000000000000000000000000..7cb9c0d5069ab4e8b714ce52f837fdb040f6f5ef GIT binary patch literal 475 zcmZHm4Ku81&lZF6;0EYrY zz`|uS7z9I1E-qhWAJU+~wMxxAki|8C>H53XvoC&KmcGf0(IGU@9%3~g=cD_K@qG>q z2N)QDdJP(U-JBMvuHv@s W2?;%EKhXdRb@3usi+~BBr~?2JkdRRT literal 0 HcmV?d00001 diff --git a/Patches/F-Zero AX (Japan) (Rev D).patch b/Patches/F-Zero AX (Japan) (Rev D).patch new file mode 100644 index 0000000000000000000000000000000000000000..7cb9c0d5069ab4e8b714ce52f837fdb040f6f5ef GIT binary patch literal 475 zcmZHm4Ku81&lZF6;0EYrY zz`|uS7z9I1E-qhWAJU+~wMxxAki|8C>H53XvoC&KmcGf0(IGU@9%3~g=cD_K@qG>q z2N)QDdJP(U-JBMvuHv@s W2?;%EKhXdRb@3usi+~BBr~?2JkdRRT literal 0 HcmV?d00001 diff --git a/Patches/F-Zero AX (Japan) (Rev E).patch b/Patches/F-Zero AX (Japan) (Rev E).patch new file mode 100644 index 0000000000000000000000000000000000000000..7cb9c0d5069ab4e8b714ce52f837fdb040f6f5ef GIT binary patch literal 475 zcmZHm4Ku81&lZF6;0EYrY zz`|uS7z9I1E-qhWAJU+~wMxxAki|8C>H53XvoC&KmcGf0(IGU@9%3~g=cD_K@qG>q z2N)QDdJP(U-JBMvuHv@s W2?;%EKhXdRb@3usi+~BBr~?2JkdRRT literal 0 HcmV?d00001 diff --git a/Patches/F-Zero-AX_fixed.patch b/Patches/F-Zero-AX_fixed.patch new file mode 100644 index 0000000000000000000000000000000000000000..57ae8c3c049b80a273f080a712cfbfc9d825c96d GIT binary patch literal 511 zcmZ5_b z7+4e-6j%OQCdpxxWXBZdu4!%&ds5_~lcR9%hb0J|vgaOE0gb9YdBW*H2n$0b3j+(2 zh5&;D0|$$Pg8-)jLn-e{$Hk5dGID)cLK;jM*j!E=6b)oN#?hg%Kz%A#2UkPO8zvzK zhE}m@la|{!ZN8>8VV!XL$9tQmyr1JJAR6MoAL2qj&PVqdf___{eQ zP+iH@FnwgmpZtI1EW`T314#bAx}ZaKf)Zz8xk_*=C)bOKGYde`B3|Tb5ikK5B@6&; CAesFD literal 0 HcmV?d00001 diff --git a/Patches/FZeroAx.patch b/Patches/FZeroAx.patch new file mode 100644 index 0000000000000000000000000000000000000000..80f11165a2b62984d86ba8265fd22b8372b130d4 GIT binary patch literal 605 zcmZjU}6wt5MWdQ3Mp!3FtD%CoGh$x;$)YcRT40j7te4s0#K~os`=U1n_X#xqZ}FP`PD{XMcjcrd8Z$e&R{2SEa<#ay zaB?2otsnW~%*K_CXMAq2`?_@Z)@2-D%H)oJbn^JKJ@v{8t(BG%3)W25T+`0-F~4E` zaRr711_l-Z1_=kX#fkw!S6UssXN(B>sr-j*8Nzog0{OoI90F-9S4}Q0WZAZ8A%E?-HeE$RhH0#gF literal 0 HcmV?d00001 diff --git a/Patches/GVS46E.patch b/Patches/GVS46E.patch new file mode 100644 index 0000000000000000000000000000000000000000..f1f9e539fc1f21a2cc4ea097d1e0b153ed1e308f GIT binary patch literal 480 zcmZW- z@rvW_0gYP%4#4nXZ~%pnF{4*zQ&7u|mZhAJ-gzwN65{Nr)>i<9y?BwUMZg45`~d)< Ch?~&> literal 0 HcmV?d00001 diff --git a/Patches/trihdrGPY(Rev B).patch b/Patches/trihdrGPY(Rev B).patch new file mode 100644 index 0000000000000000000000000000000000000000..ae38a49672a83e97a830f9086011d574162a19c5 GIT binary patch literal 554 zcmZTAM+d5A6H;VU|?VoV32T7TdWu$bfwk7d&a0d5#h7qrFjs8nP~zeF#Ht2 pA(+N;)#RkoqTE2GMHRazX&!266nFAH0E&C@B3Fxm3BZKF007y1yDR_z literal 0 HcmV?d00001 diff --git a/Patches/trihdrGPY(Rev C).patch b/Patches/trihdrGPY(Rev C).patch new file mode 100644 index 0000000000000000000000000000000000000000..ae38a49672a83e97a830f9086011d574162a19c5 GIT binary patch literal 554 zcmZTAM+d5A6H;VU|?VoV32T7TdWu$bfwk7d&a0d5#h7qrFjs8nP~zeF#Ht2 pA(+N;)#RkoqTE2GMHRazX&!266nFAH0E&C@B3Fxm3BZKF007y1yDR_z literal 0 HcmV?d00001 diff --git a/Patches/trihdrvs2002 (Export).patch b/Patches/trihdrvs2002 (Export).patch new file mode 100644 index 0000000000000000000000000000000000000000..f914f859727fa0b0eca488115769263cbdea46da GIT binary patch literal 382 zcmZ)_Vzu4MGI8-p9u)_oN~>% zsbc$q@W&Gv3>X-gI2d>ogaaq6;LLJbpgKt8|1SJ+z&@~m1?WCTunUcuvSuZPOfXxe cV~Q`t@^(9+3(FZm%19J)g?7;@>#Y? zM)>GHru{Mvj153XI4~qK%<5@%@D37X)EgY~@^AUu7=Lv)C<5Kb0e0aG;gHKhOB%NZ e2045zR|#(AWN|&ESO5wO@gi4?fC)g~GXMZGae0>j literal 0 HcmV?d00001 diff --git a/Patches/trihdrvs2002 (Type 3).patch b/Patches/trihdrvs2002 (Type 3).patch new file mode 100644 index 0000000000000000000000000000000000000000..80aa08baa63a054fa4e206e29cf0871b17bf60ec GIT binary patch literal 401 zcmZ68v}z#aX`fD00u?|2L=Hk z=4eo0Fm(1cU@%c!IC1&P&h{AvJqsBw9onkP_Rw@vo!*nKf`y7Qndfs5=KKrt;$@8Q zeZX*#gQ0_>k6yREDLYW29Peq~G_|rVI?s4}u&V7+4$_bQl~M z6c`kjuUxp0hhu|Kn({8oNAEnAa|v*vsK+Oy@ z6&M1RF>o%JwW`;Ur>fWfsjGvxOORt|>GztS#m6P*KKm-lsP_kAF(2on`;75@4h#nv z7&sId3>tjhoEE6AyREDLYW29Peq~G_|rVI?s4}u&V7+4$_bQl~M z6c`kjuUxp0hhu|Kn({8oNAEnAa|v*vsK+Oy@ z6&M1RF>o%JwW`;Ur>fWfsjGvxOORt|>GztS#m6P*KKm-lsP_kAF(2on`;75@4h#nv z7&sId3>tjhoEE6AyREDLYW29Peq~G_|rVI?s4}u&V7+4$_bQl~M z6c`kjuUxp0hhu|Kn({8oNAEnAa|v*vsK+Oy@ z6&M1RF>o%JwW`;Ur>fWfsjGvxOORt|>GztS#m6P*KKm-lsP_kAF(2on`;75@4h#nv z7&sId3>tjhoEE6AyREDLYW29Peq~G_|rVI?s4}u&V7+4$_bQl~M z6c`kjuUxp0hhu|Kn({8oNAEnAa|v*vsK+Oy@ z6&M1RF>o%JwW`;Ur>fWfsjGvxOORt|>GztS#m6P*KKm-lsP_kAF(2on`;75@4h#nv z7&sId3>tjhoEE6A{HMU<6oZH&qW}W~ zqeFuRg8~p5`WhJ;8nUdoxY!|csbSczNv;mu7Lzix{(XwbkbPvQ_oS;}q2hx@^X4H; zi@CU5nlZlj0mB6jpp6^~3;}5kz9E;5JyvigdMd2iUexN~-4hVzIpvyjQ^ocJ;g2UU z7%(s}aWL>G2nSAB!I|Z>K=sV1JTQD*XOty7XxtKT0EUkOIE0KDy)v7ET5hx~<$Uzc yV>y?QxS>ly0wU~R@9=vCj9TUf4hAL-5uhf6102Z?3fsAND$UXGD7~Xz$^Za9nyxAU literal 0 HcmV?d00001 diff --git a/Patches/trihdrvs4v2006 (Japan, Rev B).patch b/Patches/trihdrvs4v2006 (Japan, Rev B).patch new file mode 100644 index 0000000000000000000000000000000000000000..99e9990e12cb713fbae9895a5ab4e3dcc806e3ed GIT binary patch literal 536 zcmZuICQw&Uud=3l> z3=WJ84U9|*42oL*!BV{JD}sG`e0==x<$Y1PlE8H%({Y8xB(J9nvk$%VSk5IR{nw-& z$+)kxIV2h5dmk`dWB^*pp}-K3*5Dg*+1O(RXQHRVs_jLs4&FThVV+a2IX6{oKM?+S z0)qhq0}}@WkAiUEgcY1wP774ejLHMUC*_Z(34_hskD%~z0Edt&zTV;Y3K+M{4IB(i8X~}mG&sPK?4Yond#BPI4Uf`0>ZJ?-92&5G literal 0 HcmV?d00001 diff --git a/Patches/trihdrvs4v2006 (Japan, Rev D).patch b/Patches/trihdrvs4v2006 (Japan, Rev D).patch new file mode 100644 index 0000000000000000000000000000000000000000..99e9990e12cb713fbae9895a5ab4e3dcc806e3ed GIT binary patch literal 536 zcmZuICQw&Uud=3l> z3=WJ84U9|*42oL*!BV{JD}sG`e0==x<$Y1PlE8H%({Y8xB(J9nvk$%VSk5IR{nw-& z$+)kxIV2h5dmk`dWB^*pp}-K3*5Dg*+1O(RXQHRVs_jLs4&FThVV+a2IX6{oKM?+S z0)qhq0}}@WkAiUEgcY1wP774ejLHMUC*_Z(34_hskD%~z0Edt&zTV;Y3K+M{4IB(i8X~}mG&sPK?4Yond#BPI4Uf`0>ZJ?-92&5G literal 0 HcmV?d00001 diff --git a/Patches/vs406.patch b/Patches/vs406.patch new file mode 100644 index 0000000000000000000000000000000000000000..9ecf9f3df72eabd3fb796f2977bbcfaa097ab284 GIT binary patch literal 509 zcmZ! z;KCrlpuk}0!@zLSkoi*8#K4(Mu``@oWTsvUtxn|c-l;T4!-GkCg+v3w6h6*J_Zj2+ z92gETFmNa^7&Q30IW16K$<;6&V#}yJ{_weLeZ7(4^R`34@Kb<<;2F+UnG*#TZgo<0 sK6+=OpNI;}$Mc3r@%G9eU@noJ&alrEq}*00qjG82|tP literal 0 HcmV?d00001 diff --git a/triforcedumprepair.py b/triforcedumprepair.py new file mode 100644 index 0000000..f23c19f --- /dev/null +++ b/triforcedumprepair.py @@ -0,0 +1,419 @@ +#!/usr/bin/env python3 +import argparse +import os +import bsdiff4 +import hashlib as hash +from pathlib import Path + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('files', nargs='+') + args = parser.parse_args() + for path in args.files: + handle_path(Path(path)) + +def handle_path(path): + if path.is_dir(): + for f in path.iterdir(): + if f.is_file(): + hash_file(f) + else: + hash_file(path) + +def hash_file(file): + md5 = hash.md5() + with open(file, 'rb') as input: + buffer = input.read(65536) + while len(buffer) > 0: + md5.update(buffer) + buffer = input.read(65536) + patch_file(file, md5.hexdigest()) + +def patch_file(file, checksum): + match checksum: + case '02d1d5867bf345af3c8c82587925e582': + if file.name == tdb['GDT-0004C']: + print('Known good dump of F-Zero AX (Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of F-Zero AX (Rev C), renaming from {file.name} to {tdb["GDT-0004C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0004C'])) + case 'ab1e442313cc0cc2dd1f52f0407aed1a': + if file.name == tdb['GDT-0004D']: + print('Known good dump of F-Zero AX (Rev D) with correct filename, nothing to do.') + return + print(f'Known good dump of F-Zero AX (Rev D), renaming from {file.name} to {tdb["GDT-0004D"]}') + os.rename(file, Path(file.parent, tdb['GDT-0004D'])) + case 'd136d34eb303b32308b67f69d4c6e780': + if file.name == tdb['GDT-0004E']: + print('Known good dump of F-Zero AX (Rev E) with correct filename, nothing to do.') + return + print(f'Known good dump of F-Zero AX (Rev E), renaming from {file.name} to {tdb["GDT-0004E"]}') + os.rename(file, Path(file.parent, tdb['GDT-0004E'])) + case '6f6884c5dcd3e44fe0d3a42bf3b826a7': + if file.name == tdb['GDT-0008B']: + print('Known good dump of Gekitou Pro Yakyuu (Rev B) with correct filename, nothing to do.') + return + print(f'Known good dump of Gekitou Pro Yakyuu (Rev B), renaming from {file.name} to {tdb["GDT-0008B"]}') + os.rename(file, Path(file.parent, tdb['GDT-0008B'])) + case 'e074c698e358786013383fe36bc8fcb3': + if file.name == tdb['GDT-0008C']: + print('Known good dump of Gekitou Pro Yakyuu (Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of Gekitou Pro Yakyuu (Rev C), renaming from {file.name} to {tdb["GDT-0008C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0008C'])) + case '3e4665b12b6abe1248d4eb2618b934c5': + if file.name == tdb['GDT-0006A']: + print('Known good dump of The Key Of Avalon - The Wizard Master (client, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (client, Rev A), renaming from {file.name} to {tdb["GDT-0006A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0006A'])) + case '127f78b732f175be610277fbc61f2d1a': + if file.name == tdb['GDT-0006C']: + print('Known good dump of The Key Of Avalon - The Wizard Master (client, Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (client, Rev C), renaming from {file.name} to {tdb["GDT-0006C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0006C'])) + case '6b406cdd8d220f23336c19b6905e6c0e': + if file.name == tdb['GDT-0006E']: + print('Known good dump of The Key Of Avalon - The Wizard Master (client, Rev E) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (client, Rev E), renaming from {file.name} to {tdb["GDT-0006E"]}') + os.rename(file, Path(file.parent, tdb['GDT-0006E'])) + case '4eb0075ff475c7b024158e32a5cf2655': + if file.name == tdb['GDT-0006F']: + print('Known good dump of The Key Of Avalon - The Wizard Master (client, Rev F) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (client, Rev F), renaming from {file.name} to {tdb["GDT-0006F"]}') + os.rename(file, Path(file.parent, tdb['GDT-0006F'])) + case '9fa8c481d0629e5655ffc5436d0df7c3': + if file.name == tdb['GDT-0006G']: + print('Known good dump of The Key Of Avalon - The Wizard Master (client, Rev G) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (client, Rev G), renaming from {file.name} to {tdb["GDT-0006G"]}') + os.rename(file, Path(file.parent, tdb['GDT-0006G'])) + case 'dbacbe42a708958b51b0b59357b3711a': + if file.name == tdb['GDT-0005A']: + print('Known good dump of The Key Of Avalon - The Wizard Master (server, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (server, Rev A), renaming from {file.name} to {tdb["GDT-0005A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0005A'])) + case '46f1d6359114795aa53ddeb292187ea6': + if file.name == tdb['GDT-0005C']: + print('Known good dump of The Key Of Avalon - The Wizard Master (server, Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (server, Rev C), renaming from {file.name} to {tdb["GDT-0005C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0005C'])) + case '50df6d7e611100ec90c10ed75602af6e': + if file.name == tdb['GDT-0005E']: + print('Known good dump of The Key Of Avalon - The Wizard Master (server, Rev E) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (server, Rev E), renaming from {file.name} to {tdb["GDT-0005E"]}') + os.rename(file, Path(file.parent, tdb['GDT-0005E'])) + case '6b64ec19eeed55e93091c7e707424728': + if file.name == tdb['GDT-0005F']: + print('Known good dump of The Key Of Avalon - The Wizard Master (server, Rev F) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (server, Rev F), renaming from {file.name} to {tdb["GDT-0005F"]}') + os.rename(file, Path(file.parent, tdb['GDT-0005F'])) + case '298e7766bb9aa3fbf923b9204fb0423f': + if file.name == tdb['GDT-0005G']: + print('Known good dump of The Key Of Avalon - The Wizard Master (server, Rev G) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon - The Wizard Master (server, Rev G), renaming from {file.name} to {tdb["GDT-0005G"]}') + os.rename(file, Path(file.parent, tdb['GDT-0005G'])) + case '899a66d776320b211559510384ff5bd3': + if file.name == tdb['GDT-0010A']: + print('Known good dump of The Key Of Avalon 1.2 - Summon The New Monsters (client, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 1.2 - Summon The New Monsters (client, Rev A), renaming from {file.name} to {tdb["GDT-0010A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0010A'])) + case '4d5a942a2dc251806bd039e292216782': + if file.name == tdb['GDT-0009A']: + print('Known good dump of The Key Of Avalon 1.2 - Summon The New Monsters (server, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 1.2 - Summon The New Monsters (server, Rev A), renaming from {file.name} to {tdb["GDT-0009A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0009A'])) + case 'ec40384a478539fac39d1e4a175188c9': + if file.name == tdb['GDT-0010C']: + print('Known good dump of The Key Of Avalon 1.3 - Chaotic Sabbat (client, Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 1.3 - Chaotic Sabbat (client, Rev C), renaming from {file.name} to {tdb["GDT-0010C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0010C'])) + case 'c5c1793a315c3232c61c796d3446a18e': + if file.name == tdb['GDT-0009C']: + print('Known good dump of The Key Of Avalon 1.3 - Chaotic Sabbat (server, Rev C) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 1.3 - Chaotic Sabbat (server, Rev C), renaming from {file.name} to {tdb["GDT-0009C"]}') + os.rename(file, Path(file.parent, tdb['GDT-0009C'])) + case 'b80ac04e7cfdf370fabaab680a4f52a5': + if file.name == tdb['GDT-0019A']: + print('Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev A), renaming from {file.name} to {tdb["GDT-0019A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0019A'])) + case '750816ed7e636fbbcc34aaaf9688bd9f': + if file.name == tdb['GDT-0019B']: + print('Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev B) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev B), renaming from {file.name} to {tdb["GDT-0019B"]}') + os.rename(file, Path(file.parent, tdb['GDT-0019B'])) + case '6ab1732d4080d54b0ccbc73c45e726c3': + if file.name == tdb['GDT-0018A']: + print('Known good dump of The Key Of Avalon 2.5 - War of the Key (server, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 2.5 - War of the Key (server, Rev A), renaming from {file.name} to {tdb["GDT-0018A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0018A'])) + case 'be1ae078d862ae4f7e1b3f02151fce66': + if file.name == tdb['GDT-0019B']: + print('Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev B) with correct filename, nothing to do.') + return + print(f'Known good dump of The Key Of Avalon 2.5 - War of the Key (client, Rev B), renaming from {file.name} to {tdb["GDT-0018B"]}') + os.rename(file, Path(file.parent, tdb['GDT-0018B'])) + case '5134088e7495d64b10747368df400d5f': + if file.name == tdb['GDT-0011']: + print('Known good dump of Triforce DIMM Updater (3.17) with correct filename, nothing to do.') + return + print(f'Known good dump of Triforce DIMM Updater (3.17), renaming from {file.name} to {tdb["GDT-0011"]}') + os.rename(file, Path(file.parent, tdb['GDT-0011'])) + case 'dadf78d080caa10796484afad4d4d7ce': + if file.name == tdb['GDT-0022A']: + print('Known good dump of Triforce Firmware Update For Compact Flash Box (4.01) with correct filename, nothing to do.') + return + print(f'Known good dump of Triforce Firmware Update For Compact Flash Box (4.01), renaming from {file.name} to {tdb["GDT-0022A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0022A'])) + case 'b218ab878c6f1fbc5fa79d175db3e6f7': + if file.name == tdb['GDT-0014']: + print('Known good dump of Virtua Striker 4 (Asia) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 (Asia), renaming from {file.name} to {tdb["GDT-0014"]}') + os.rename(file, Path(file.parent, tdb['GDT-0014'])) + case '24cf61f44201747d8cf2f86d90c0309e': + if file.name == tdb['GDT-0014B']: + print('Known good dump of Virtua Striker 4 (Asia, Rev B) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 (Asia, Rev B), renaming from {file.name} to {tdb["GDT-0014B"]}') + os.rename(file, Path(file.parent, tdb['GDT-0014B'])) + case '4dafecb6de804835435551f734b21a49': + if file.name == tdb['GDT-0015']: + print('Known good dump of Virtua Striker 4 (Export) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 (Export), renaming from {file.name} to {tdb["GDT-0015"]}') + os.rename(file, Path(file.parent, tdb['GDT-0015'])) + case 'c9a1b56df120ad96f731b621d59b648a': + if file.name == tdb['GDT-0015A']: + print('Known good dump of Virtua Striker 4 (Export, Rev A) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 (Export, Rev A), renaming from {file.name} to {tdb["GDT-0015A"]}') + os.rename(file, Path(file.parent, tdb['GDT-0015A'])) + case '53a0eb3d593b3280911269d2aee2f6b1': + if file.name == tdb['GDT-0021']: + print('Known good dump of Virtua Striker 4 Ver.2006 (Export) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 Ver.2006 (Export), renaming from {file.name} to {tdb["GDT-0021"]}') + os.rename(file, Path(file.parent, tdb['GDT-0021'])) + case 'bd8e8ecbe1f8958dd8f2cc0cdf30dc5a': + if file.name == tdb['GDT-0020B']: + print('Known good dump of Virtua Striker 4 Ver.2006 (Japan, Rev B) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 Ver.2006 (Japan, Rev B), renaming from {file.name} to {tdb["GDT-0020B"]}') + os.rename(file, Path(file.parent, tdb['GDT-0020B'])) + case '76bdb7ebfa8eca19fd31374f65359a15': + if file.name == tdb['GDT-0020D']: + print('Known good dump of Virtua Striker 4 Ver.2006 (Japan, Rev D) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 4 Ver.2006 (Japan, Rev D), renaming from {file.name} to {tdb["GDT-0020D"]}') + os.rename(file, Path(file.parent, tdb['GDT-0020D'])) + case 'eec44d152ccd630d68f5df85293e06b3': + if file.name == tdb['GDT-0002']: + print('Known good dump of Virtua Striker 2002 (Export) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 2002 (Export), renaming from {file.name} to {tdb["GDT-0002"]}') + os.rename(file, Path(file.parent, tdb['GDT-0002'])) + case '4ceadb37ab23da1bd2b5fbcc92059193': + if file.name == tdb['GDT-0001']: + print('Known good dump of Virtua Striker 2002 (Japan) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 2002 (Japan), renaming from {file.name} to {tdb["GDT-0001"]}') + os.rename(file, Path(file.parent, tdb['GDT-0001'])) + case '97facc2db79c84ca2bd8a27ed9129c86': + if file.name == tdb['GDT-0012']: + print('Known good dump of Virtua Striker 2002 (Type 3) with correct filename, nothing to do.') + return + print(f'Known good dump of Virtua Striker 2002 (Type 3), renaming from {file.name} to {tdb["GDT-0012"]}') + os.rename(file, Path(file.parent, tdb['GDT-0012'])) + case 'f64f4ee996c29490c5cdd352da640dbd': + if file.name == tdb['GDT-0004D']: + print('Known modified (DOL patch) dump of F-Zero AX (Rev D) with correct filename, patching file.') + file_patch_inplace(file, FZeroAx.patch) + return + print(f'Known modified (DOL patch) dump of F-Zero AX (Rev D), patching file and from {file.name} to {tdb["GDT-0004D"]}') + file_patch_inplace(file, FZeroAx.patch) + os.rename(file, Path(file.parent, tdb['GDT-0004D'])) + case 'dec69ba6805a308fa486ecdb7deba86d': + if file.name == tdb['GDT-0004D']: + print('Known modified (DOL patch) dump of F-Zero AX (Rev D) with correct filename, patching file.') + file_patch_inplace(file, 'F-Zero-AX_fixed.patch') + return + print(f'Known modified (DOL patch) dump of F-Zero AX (Rev D), patching file and from {file.name} to {tdb["GDT-0004D"]}') + file_patch_inplace(file, 'F-Zero-AX_fixed.patch') + os.rename(file, Path(file.parent, tdb['GDT-0004D'])) + case '236561a6fe8b6387a1f0558372d9c4ce': + if file.name == tdb['GDT-0020D']: + print('Known modified (DOL patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev D) with correct filename, patching file.') + file_patch_inplace(file, vs406.patch) + return + print(f'Known modified (DOL patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev D), patching file and from {file.name} to {tdb["GDT-0020D"]}') + file_patch_inplace(file, vs406.patch) + os.rename(file, Path(file.parent, tdb['GDT-0020D'])) + case '3a28d974b96546a89c279a20c3360b04': + if file.name == tdb['GDT-0021']: + print('Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Export) with correct filename, patching file.') + file_patch_inplace(file, GVS46E.patch) + return + print(f'Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Export), patching file and from {file.name} to {tdb["GDT-0021"]}') + file_patch_inplace(file, GVS46E.patch) + os.rename(file, Path(file.parent, tdb['GDT-0021'])) + case 'a8878c592abbb35c5b4d633e1cf9f179': + if file.name == tdb['GDT-0004C']: + print('Known modified (header patch) dump of F-Zero AX (Rev C) with correct filename, patching file.') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev C).patch') + return + print(f'Known modified (header patch) dump of F-Zero AX (Rev C), patching file and from {file.name} to {tdb["GDT-0004C"]}') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev C).patch') + case '1632826dab98f02f87ca474345f59db1': + if file.name == tdb['GDT-0004D']: + print('Known modified (DOL patch) dump of F-Zero AX (Rev D) with correct filename, patching file.') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev D).patch') + return + print(f'Known modified (header patch) dump of F-Zero AX (Rev D), patching file and from {file.name} to {tdb["GDT-0004D"]}') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev D).patch') + case '1632826dab98f02f87ca474345f59db1': + if file.name == tdb['GDT-0004E']: + print('Known modified (header patch) dump of F-Zero AX (Rev E) with correct filename, patching file.') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev E).patch') + return + print(f'Known modified (header patch) dump of F-Zero AX (Rev E), patching file and from {file.name} to {tdb["GDT-0004E"]}') + file_patch_inplace(file, 'F-Zero AX (Japan) (Rev E).patch') + case '61fc061f9bf409d1e41e202d760ecfc0': + if file.name == tdb['GDT-0008B']: + print('Known modified (header patch) dump of Gekitou Pro Yakyuu (Rev B) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrGPY(Rev B).patch') + return + print(f'Known modified (header patch) dump of Gekitou Pro Yakyuu (Rev B), patching file and from {file.name} to {tdb["GDT-0008B"]}') + file_patch_inplace(file, 'trihdrGPY(Rev B).patch') + case '2f668e87163f8c1be1cd6d0302da6241': + if file.name == tdb['GDT-0008C']: + print('Known modified (header patch) dump of Gekitou Pro Yakyuu (Rev C) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrGPY(Rev C).patch') + return + print(f'Known modified (header patch) dump of Gekitou Pro Yakyuu (Rev C), patching file and from {file.name} to {tdb["GDT-0008C"]}') + file_patch_inplace(file, 'trihdrGPY(Rev C).patch') + case 'ac8eefd736b450bec30c250cfbe56882': + if file.name == tdb['GDT-0014']: + print('Known modified (header patch) dump of Virtua Striker 4 (Asia) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4 (Asia).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 (Asia), patching file and from {file.name} to {tdb["GDT-0014"]}') + file_patch_inplace(file, 'trihdrvs4 (Asia).patch') + case '748678d167d9af203442eda9d3e119c9': + if file.name == tdb['GDT-0014B']: + print('Known modified (header patch) dump of Virtua Striker 4 (Asia, Rev B) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4 (Asia, Rev B).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 (Asia, Rev B), patching file and from {file.name} to {tdb["GDT-0014B"]}') + file_patch_inplace(file, 'trihdrvs4 (Asia, Rev B).patch') + case '2723ef745c2ba722e4b069ffe569549a': + if file.name == tdb['GDT-0015']: + print('Known modified (header patch) dump of Virtua Striker 4 (Export) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4 (Export).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 (Export), patching file and from {file.name} to {tdb["GDT-0015"]}') + file_patch_inplace(file, 'trihdrvs4 (Export).patch') + case '37dbfa1cebe6d24c59ff65f0914e30c6': + if file.name == tdb['GDT-0015A']: + print('Known modified (header patch) dump of Virtua Striker 4 (Export, Rev A) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4 (Export, Rev A).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 (Export, Rev A), patching file and from {file.name} to {tdb["GDT-0015A"]}') + file_patch_inplace(file, 'trihdrvs4 (Export, Rev A).patch') + case '37dbfa1cebe6d24c59ff65f0914e30c6': + if file.name == tdb['GDT-0021']: + print('Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Export) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4v2006 (Export).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Export), patching file and from {file.name} to {tdb["GDT-0021"]}') + file_patch_inplace(file, 'trihdrvs4v2006 (Export).patch') + case '504f328b6ee8f864a6e13b9dcf4ff502': + if file.name == tdb['GDT-0020B']: + print('Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev B) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4v2006 (Japan, Rev B).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev B), patching file and from {file.name} to {tdb["GDT-0020B"]}') + file_patch_inplace(file, 'trihdrvs4v2006 (Japan, Rev B).patch') + case '6732f669b24c7b3d2cca5bb2996798e3': + if file.name == tdb['GDT-0020D']: + print('Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev D) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvs4v2006 (Japan, Rev D).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 4 Ver.2006 (Japan, Rev D), patching file and from {file.name} to {tdb["GDT-0020D"]}') + file_patch_inplace(file, 'trihdrvs4v2006 (Japan, Rev D).patch') + case 'c3e6a83debbb605f4a9bd423f22a30a8': + if file.name == tdb['GDT-0002']: + print('Known modified (header patch) dump of Virtua Striker 2002 (Export) with correct filename, patching file.') + file_patch_inplace(file, 'trihdrvsv2002 (Export).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 2002 (Export), patching file and from {file.name} to {tdb["GDT-0002"]}') + file_patch_inplace(file, 'trihdrvs2002 (Export).patch') + case 'b596e077a05a597cbba235dbe641773f': + if file.name == tdb['GDT-0001']: + print('Known modified (header patch) dump of Virtua Striker 2002 (Japan) with correct filename, patching file.') + file_patch_inplace(file,'trihdrvsv2002 (Japan).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 2002 (Japan), patching file and from {file.name} to {tdb["GDT-0001"]}') + file_patch_inplace(file, 'trihdrvs2002 (Japan).patch') + case 'c238af615632568d70a1543c903774d4': + if file.name == tdb['GDT-0012']: + print('Known modified (header patch) dump of Virtua Striker 2002 (Type 3) with correct filename, patching file.') + file_patch_inplace(file,'trihdrvsv2002 (Type 3).patch') + return + print(f'Known modified (header patch) dump of Virtua Striker 2002 (Type 3), patching file and from {file.name} to {tdb["GDT-0012"]}') + file_patch_inplace(file, 'trihdrvs2002 (Type 3).patch') +tdb = { + 'GDT-0001': 'Virtua Striker 2002 (Japan).BIN', + 'GDT-0002': 'Virtua Striker 2002 (Export).BIN', + 'GDT-0004C': 'F-Zero AX (Rev C).BIN', + 'GDT-0004D': 'F-Zero AX (Rev D).BIN', + 'GDT-0004E': 'F-Zero AX (Rev E).BIN', + 'GDT-0005A': 'The Key Of Avalon - The Wizard Master (server, Rev A).GCM', + 'GDT-0005C': 'The Key Of Avalon - The Wizard Master (server, Rev C).GCM', + 'GDT-0005E': 'The Key Of Avalon - The Wizard Master (server, Rev E).GCM', + 'GDT-0005F': 'The Key Of Avalon - The Wizard Master (server, Rev F).GCM', + 'GDT-0005G': 'The Key Of Avalon - The Wizard Master (server, Rev G).GCM', + 'GDT-0006A': 'The Key Of Avalon - The Wizard Master (client, Rev A).GCM', + 'GDT-0006C': 'The Key Of Avalon - The Wizard Master (client, Rev C).GCM', + 'GDT-0006E': 'The Key Of Avalon - The Wizard Master (client, Rev E).GCM', + 'GDT-0006F': 'The Key Of Avalon - The Wizard Master (client, Rev F).GCM', + 'GDT-0006G': 'The Key Of Avalon - The Wizard Master (client, Rev G).GCM', + 'GDT-0008B': 'Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev B).BIN', + 'GDT-0008C': 'Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C).BIN', + 'GDT-0009A': 'The Key Of Avalon 1.2 - Summon The New Monsters (server, Rev A).GCM', + 'GDT-0009C': 'The Key Of Avalon 1.3 - Chaotic Sabbat (server, Rev C).GCM', + 'GDT-0010A': 'The Key Of Avalon 1.2 - Summon The New Monsters (client, Rev A).GCM', + 'GDT-0010C': 'The Key Of Avalon 1.3 - Chaotic Sabbat (client, Rev C).GCM', + 'GDT-0011': 'Triforce DIMM Updater (3.17).BIN', + 'GDT-0012': 'Virtua Striker 2002 (Type 3).BIN', + 'GDT-0014': 'Virtua Striker 4 (Asia).BIN', + 'GDT-0014B': 'Virtua Striker 4 (Asia, Rev B).BIN', + 'GDT-0015': 'Virtua Striker 4 (Export).BIN', + 'GDT-0015A': 'Virtua Striker 4 (Export, Rev A).BIN', + 'GDT-0018A': 'The Key Of Avalon 2.5 - War of the Key (server, Rev A).GCM', + 'GDT-0018B': 'The Key Of Avalon 2.5 - War of the Key (server, Rev B).GCM', + 'GDT-0019A': 'The Key Of Avalon 2.5 - War of the Key (client, Rev A).GCM', + 'GDT-0019B': 'The Key Of Avalon 2.5 - War of the Key (client, Rev B).GCM', + 'GDT-0020B': 'Virtua Striker 4 Ver.2006 (Japan, Rev B).BIN', + 'GDT-0020D': 'Virtua Striker 4 Ver.2006 (Japan, Rev D).BIN', + 'GDT-0021': 'Virtua Striker 4 Ver.2006 (Export).BIN', + 'GDT-0022A': 'Triforce Firmware Update For Compact Flash Box (4.01).BIN' +} +if __name__ == '__main__': + main() \ No newline at end of file