From 13df336966c08780f948b7e03add79c9037434d7 Mon Sep 17 00:00:00 2001 From: avihal Date: Fri, 18 May 2012 16:51:18 +0000 Subject: [PATCH] GSdx: CRC Hacks: Import from Cutie - PLEASE HELP WITH TESTING: - 14 Updated hacks, 41 new hacks (See full list at the first comment). - New crc-hacks might have patial crc lists, so it's possible that some copies won't get the benefit (yet). - Non crc-hacks code was NOT imported from Cutie, so some crc hacks might not be as effective as within Cutie itself. - New region: CH, few more CRCs. Note: Due to the very big list of affected games, I couldn't test the vast majority of them, and so your help would be appreciated in testing. Please report (even if someone else already reported with the same result as yours) with the following format: - (reason) - tested e.g.: Tomb Raider Legend - Better (removes garbage graphics) - tested a little. GTA San Andreas - Better (removes ghosts) - tested a little. And of course, big thank you goes to the author of Cutie, for the time put into improving PCSX2, and for respecting the GPL license and releasing the code. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5214 96395faa-99c1-11dd-bbfe-3dabce05a288 --- plugins/GSdx/GSCrc.cpp | 123 +++++ plugins/GSdx/GSCrc.h | 47 ++ plugins/GSdx/GSState.cpp | 961 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 1095 insertions(+), 36 deletions(-) diff --git a/plugins/GSdx/GSCrc.cpp b/plugins/GSdx/GSCrc.cpp index 5bffeb484c..2b2fd43ea4 100644 --- a/plugins/GSdx/GSCrc.cpp +++ b/plugins/GSdx/GSCrc.cpp @@ -94,6 +94,7 @@ CRC::Game CRC::m_games[] = {0x0393B6BE, DBZBT2, EU, 0}, {0xE2F289ED, DBZBT2, JP, 0}, // Sparking Neo! {0xE29C09A3, DBZBT2, KO, 0}, //DragonBall Z Sparking Neo + {0x0BAA4387, DBZBT2, JP, 0}, {0x35AA84D1, DBZBT2, NoRegion, 0}, {0x428113C2, DBZBT3, US, 0}, {0xA422BB13, DBZBT3, EU, 0}, @@ -101,19 +102,24 @@ CRC::Game CRC::m_games[] = {0x983C53D2, DBZBT3, NoRegion, 0}, {0x983C53D3, DBZBT3, NoRegion, 0}, {0x9B0E119F, DBZBT3, KO, 0}, //DragonBall Z Sparking Meteo + {0xF28D21F1, DBZBT3, JP, 0}, {0x72B3802A, SFEX3, US, 0}, {0x71521863, SFEX3, US, 0}, {0x28703748, Bully, US, 0}, + {0x019CFA48, Bully, JP, 0}, {0xC78A495D, BullyCC, US, 0}, {0xC19A374E, SoTC, US, 0}, {0x7D8F539A, SoTC, EU, 0}, {0x0F0C4A9C, SoTC, EU, 0}, {0x877F3436, SoTC, JP, 0}, {0xA17D6AAA, SoTC, KO, 0}, + {0x877B3D35, SoTC, CH, 0}, {0x3122B508, OnePieceGrandAdventure, US, 0}, {0x8DF14A24, OnePieceGrandAdventure, EU, 0}, {0xE446C9F9, OnePieceGrandAdventure, KO, 0}, {0xCA2073B3, OnePieceGrandBattle, KO, 0}, + {0x66953267, OnePieceGrandAdventure, JP, 0}, + {0x947B933B, OnePieceGrandAdventure, US, 0}, {0xB049DD5E, OnePieceGrandBattle, US, 0}, {0x5D02CC5B, OnePieceGrandBattle, NoRegion, 0}, {0x6F8545DB, ICO, US, 0}, @@ -121,12 +127,17 @@ CRC::Game CRC::m_games[] = {0x2DF2C1EA, ICO, KO, 0}, {0x5C991F4E, ICO, NoRegion, 0}, {0x7ACF7E03, ICO, NoRegion, 0}, + {0x29C28734, ICO, CH, 0}, {0xAEAD1CA3, GT4, JP, 0}, {0x30E41D93, GT4, KO, 0}, {0x44A61C8F, GT4, EU, 0}, {0x0086E35B, GT4, EU, 0}, {0x77E61C8A, GT4, US, 0}, {0x33C6E35E, GT4, US, 0}, + {0x7ABDBB5E, GT3, CH, 0}, //GT4中文D9版 + {0x3E9D448A, GT3, CH, 0}, //GT4中文D5版 + {0xAD66643C, GT3, CH, 0}, //GT4中文D9轉D5版 + {0x6810C3BC, GT3, CH, 0}, //GRAN TURISMO Concept 2002 Tokyo-Geneva中文版 {0x85AE91B3, GT3, US, 0}, {0xC220951A, GT3, NoRegion, 0}, {0x60013EBD, GTConcept, EU, 0}, @@ -146,6 +157,8 @@ CRC::Game CRC::m_games[] = {0x3A03D62F, CrashBandicootWoC, EU, 0}, {0x013E349D, ResidentEvil4, US, 0}, {0x6BA2F6B9, ResidentEvil4, NoRegion, 0}, + {0xDBB7A559, ResidentEvil4, US, 0}, + {0x6BA2F6B9, ResidentEvil4, EU, 0}, {0x60FA8C69, ResidentEvil4, JP, 0}, {0x5F254B7C, ResidentEvil4, KO, 0}, {0x72E1E60E, Spartan, NoRegion, 0}, @@ -155,6 +168,7 @@ CRC::Game CRC::m_games[] = {0x1B9B7563, AceCombat4, NoRegion, 0}, {0xEC432B24, Drakengard2, EU, 0}, {0x1648E3C9, Drakengard2, US, 0}, + {0xB7ADB13A, Drakengard2, CH, 0}, //復仇龍騎士2 {0xFC46EA61, Tekken5, JP, 0}, {0x1F88EE37, Tekken5, EU, 0}, {0x1F88BECD, Tekken5, EU, 0}, //language selector... @@ -172,6 +186,9 @@ CRC::Game CRC::m_games[] = {0xE23D532B, GodOfWar, NoRegion, 0}, {0xDF1AF973, GodOfWar, NoRegion, 0}, {0xD6385328, GodOfWar, NoRegion, 0}, + {0x1A85E924, GodOfWar, NoRegion, 0}, //天幻1+2,不能同時使用 + {0xCA052D22, GodOfWar, JP, 0}, + {0x608ACBD3, GodOfWar, CH, 0}, //完美漢化修改版 {0x2F123FD8, GodOfWar2, RU, 0}, {0x2F123FD8, GodOfWar2, US, 0}, {0x44A8A22A, GodOfWar2, EU, 0}, @@ -180,7 +197,12 @@ CRC::Game CRC::m_games[] = {0xF8CD3DF6, GodOfWar2, NoRegion, 0}, {0x0B82BFF7, GodOfWar2, NoRegion, 0}, {0x5990866F, GodOfWar2, NoRegion, 0}, + {0xE96E55BD, GodOfWar2, JP, 0}, + {0xC4C4FD5F, GodOfWar2, CH, 0}, + {0x5990866f, GodOfWar2, NoRegion, 0}, {0xDCD9A9F7, GodOfWar2, NoRegion, 0}, + {0xFA0DF523, GodOfWar2, CH, 0}, //完美漢化修改版D5 + {0x9FEE3466, GodOfWar2, CH, 0}, //完美漢化修改版D9 {0x5D482F18, JackieChanAdv, NoRegion, 0}, {0xF0A6D880, HarvestMoon, US, 0}, {0x75C01A04, NamcoXCapcom, US, 0}, @@ -207,6 +229,8 @@ CRC::Game CRC::m_games[] = {0xFADEBC45, Genji, EU, 0}, {0xB4776FC1, Genji, JP, 0}, {0x56242EC9, Genji, KO, 0}, + {0xCDAF243D, Genji, CH, 0}, + {0x2A5E0B61, Genji, CH, 0}, {0x7D4EA48F, Genji, NoRegion, 0}, {0xE04EA200, StarOcean3, EU, 0}, {0x23A97857, StarOcean3, US, 0}, @@ -237,6 +261,7 @@ CRC::Game CRC::m_games[] = {0xE47C1A9C, SMTDDS2, JP, ZWriteMustNotClear}, // SMT Digital Devil Saga 2 {0x0B8AB37B, RozenMaidenGebetGarden, JP, 0}, {0x1CC39DBD, SuikodenTactics, US, 0}, + {0xB808413B, SuikodenTactics, JP, 0}, //幻想水滸傳狂想曲 {0x3E205556, SuikodenTactics, EU, 0}, {0xB808413B, SuikodenTactics, JP, 0}, {0x64C58FB4, TenchuFS, US, 0}, @@ -272,6 +297,7 @@ CRC::Game CRC::m_games[] = {0x9ABF90FB, LordOfTheRingsTwoTowers, ES, 0}, {0xC0E909E9, LordOfTheRingsTwoTowers, JP, 0}, {0x6898435D, LordOfTheRingsTwoTowers, KO, 0}, + {0xDC2F9B98, LordOfTheRingsTwoTowers, CH, 0}, //魔戒二部曲 {0xEB198738, LordOfTheRingsThirdAge, US, 0}, {0x614F4CF4, LordOfTheRingsThirdAge, EU, 0}, {0x37CD4279, LordOfTheRingsThirdAge, KO, 0}, @@ -293,14 +319,53 @@ CRC::Game CRC::m_games[] = {0x3A446111, CastlevaniaCoD, US, 0}, {0xF321BC38, CastlevaniaCoD, EU, 0}, {0x950876FA, CastlevaniaCoD, KO, 0}, + {0x237B84D3, CastlevaniaCoD, CH, 0}, {0x28270F7D, CastlevaniaLoI, US, 0}, {0x306CDADA, CastlevaniaLoI, EU, 0}, {0xA36CFF6C, CastlevaniaLoI, JP, 0}, {0x9A93FE5D, CastlevaniaLoI, KO, 0}, + {0xA79B0491, NanoBreaker, JP, 0}, + {0x7985D894, FinalFightStreetwise, US, 0}, + {0xED4BF0D3, FinalFightStreetwise, US, 0}, //紅星 + {0xCBB87BF9, EvangelionJo, JP, 0}, //新世紀福音戰士:序 + {0x278A91FD, CaptainTsubasa, JP, 0}, //足球小將翼 + {0xC5B75C7C, Oneechanbara2Special, JP, 0}, //性感女劍士2特別編 + {0xC0659AD1, NarutimateAccel, JP, 0}, //火影忍者疾風傳 + {0xF3D9DFBE, NarutimateAccel, JP, 0}, + {0x59739DDE, Naruto, JP, 0}, //木葉英雄3 + {0xF7786EE4, EternalPoison, JP, 0}, //粉紅劇毒 + {0x2BE55519, EternalPoison, US, 0}, + {0xE01F57EC, LegoBatman, US, 0}, //樂高蝙蝠俠 + {0xE0347841, XE3, JP, 0}, //異域傳說3 + {0xA4E88698, XE3, CH, 0}, + {0x25FC361B, DevilMayCry3, US, 0}, //SE + {0x2F7D8AD5, DevilMayCry3, US, 0}, + {0x0BED0AF9, DevilMayCry3, US, 0}, + {0x79B8A95F, DevilMayCry3, US, 0}, + {0x18C9343F, DevilMayCry3, EU, 0}, //SE + {0x7ADCB24A, DevilMayCry3, EU, 0}, + {0x7F3D692D, DevilMayCry3, CH, 0}, + {0x79C952B0, DevilMayCry3, JP, 0}, //SE + {0x7F3DDEAB, DevilMayCry3, JP, 0}, + {0x1A85E924, DevilMayCry3, CH, 0}, //惡魔獵人3三合一中文特別版 + {0x0a8ef911, ArctheLad, US, 0}, //亞克傳承-精靈之黃昏 + {0x2C5E7DEA, ArctheLad, CH, 0}, + {0xE69E7F58, ArctheLad, US, 0}, //亞克傳承-黑暗之終結 + {0xB1995E29, ShadowofRome, EU, 0}, //羅馬之影 + {0x958DCA28, ShadowofRome, EU, 0}, + {0x57818AF6, ShadowofRome, US, 0}, + {0xF21EE6E0, CrashNburn, US, 0}, + {0x694A998E, TombRaiderUnderworld, JP, 0}, //8代地城奪寶 + {0xB639EB17, TombRaiderAnniversary, US, 0}, + {0xB05805B6, TombRaiderAnniversary, JP, 0}, //十週年紀念版 重返禁地 + {0xBC8B3F50, TombRaiderLegend, US, 0}, //7代傳奇 + {0x08FFF00D, SSX3, JP, 0}, //極限滑雪3 {0x5C891FF1, Black, US, 0}, {0xCAA04879, Black, EU, 0}, {0xADDFF505, Black, EU, 0}, //? {0xB3A9F9ED, Black, JP, 0}, + {0x7838882F, VF4, JP, 0}, + {0xEA131B57, VF4, US, 0}, {0x4F755D39, TyTasmanianTiger, US, 0}, {0xD59D3252, TyTasmanianTiger, EU, 0}, {0x5A1BB2A1, TyTasmanianTiger2, US, 0}, @@ -350,19 +415,77 @@ CRC::Game CRC::m_games[] = {0x98C7B76D, NanoBreaker, US, 0}, {0x7098BE76, NanoBreaker, KO, 0}, {0x9B89F425, NanoBreaker, EU, 0}, + {0xA79B0491, NanoBreaker, JP, 0}, //奈米殺神 {0x519E816B, Kunoichi, US, 0}, //Nightshade {0x3FB419FD, Kunoichi, JP, 0}, + {0x086D198E, Kunoichi, CH, 0}, {0x3B470BBD, Kunoichi, EU, 0}, {0x6BA65DD8, Kunoichi, KO, 0}, {0XD3F182A3, Yakuza, EU, 0}, {0x6F9F99F8, Yakuza, EU, 0}, {0x388F687B, Yakuza, US, 0}, + {0xB7B3800A, Yakuza, JP, 0}, {0xA60C2E65, Yakuza2, EU, 0}, {0x800E3E5A, Yakuza2, EU, 0}, {0x97E9C87E, Yakuza2, US, 0}, + {0xC6B95C48, Yakuza2, JP, 0}, {0x9000252A, SkyGunner, JP, 0}, + {0x93092623, SkyGunner, JP, 0}, {0xA9461CB2, SkyGunner, US, 0}, + {0xB799A60C, SkyGunner, NoRegion, 0}, {0x6848699B, JamesBondEverythingOrNothing, US, 0}, + {0xF7FB054C, Siren, CH, 0}, //死魂曲 + {0x90F4B057, ZettaiZetsumeiToshi2, CH, 0}, + {0xC988ECBB, ZettaiZetsumeiToshi2, JP, 0}, + {0x81CA29BE, VF4EVO, EU, 0}, + {0xC9DEF513, VF4EVO, US, 0}, + {0x7B402694, VF4EVO, KO, 0}, + {0xAB01411F, VF4EVO, JP, 0}, + {0xE11DFA28, Dororo, CH, 0}, + {0x89954774, Dororo, US, 0}, + {0xBD17248E, ShinOnimusha, JP, 0}, + {0xBE17248E, ShinOnimusha, JP, 0}, + {0xB817248E, ShinOnimusha, JP, 0}, + {0x812C5A96, ShinOnimusha, EU, 0}, + {0xFE44479E, ShinOnimusha, US, 0}, + {0xFFDE85E9, ShinOnimusha, US, 0}, + {0xE21404E2, GetaWay, US, 0}, + {0xE78971DF, GetaWayBlackMonday, US, 0}, + {0x1130BF23, SakuraTaisen, CH, 0}, //櫻花大戰熾熱之血 + {0xEF06DBD6, SakuraWarsSoLongMyLove, JP, 0}, //櫻花大戰5 + {0xDD41054D, SakuraWarsSoLongMyLove, US, 0}, //櫻花大戰5 + {0x4A4B623A, FightingBeautyWulong, JP,0}, //格鬥美神武龍 + {0x5AC7E79C, TouristTrophy, CH, 0}, //摩拖車浪漫旅 + {0xA1B3F232, GTASanAndreas, EU, 0}, //俠盜獵車手聖安地列斯 + {0x399A49CA, GTASanAndreas, US, 0}, + {0x60FE139C, GTASanAndreas, JP, 0}, + {0x2615F542, FrontMission5, JP, 0}, + {0xF60255AC, FrontMission5, JP, 0}, + {0xCB783836, FrontMission5, JP, 0}, + {0xAEDAEE99, GodHand, JP, 0}, + {0x6FB69282, GodHand, US, 0}, + {0x9637D496, KnightsOfTheTemple2, JP, 0}, //聖堂騎士團2 + {0x4E811100, UltramanFightingEvolution, JP, 0}, //超能力霸王戰鬥進化重生 + {0x0643F90C, RogueGalaxy, US, 0}, //俠盜銀河 + {0xCDEE4B19, RogueGalaxy, JP, 0}, + {0xF7F181C3, DeathByDegreesTekkenNinaWilliams, CH, 0}, //鐵拳妮娜 + {0x771C3B47, AlpineRacer3, JP, 0}, //阿爾卑斯山滑雪大賽3 + {0x449E1F6B, HummerBadlands, US, 0}, + {0xAEA1B3AD, SengokuBasara, JP, 0}, + {0x5B659BED, Grandia3, JP, 0}, + {0x5B657DAD, Grandia3, US, 0}, + {0x830B6FB1, TalesofSymphonia, JP, 0}, + {0x8409FD51, TalesofDestiny, JP, 0}, //導演剪輯版 + {0xA90CD846, TalesofDestiny, JP, 0}, + {0xC4D0FACC, SDGundamGGeneration, JP, 0}, //世紀戰役 + {0xBBDE6926, SDGundamGGeneration, JP, 0}, //戰魂 + {0x49D60A00, SDGundamGGeneration, JP, 0}, //NEO + {0xFB8554A0, SoulCalibur3, JP, 0}, + {0x027C604C, SoulCalibur3, US, 0}, + {0x24090A12, SoulCalibur3, EU, 0}, + {0xFC0F8A5B, Simple2000Vol114, JP, 0}, + {0x0098F740, SeintoSeiya, NoRegion, 0}, //聖鬥士星矢-黃道十二宮 + {0xBDD9BAAD, UrbanReign, US, 0}, //街頭爭霸 }; hash_map CRC::m_map; diff --git a/plugins/GSdx/GSCrc.h b/plugins/GSdx/GSCrc.h index faddeb7b65..fd2a69371e 100644 --- a/plugins/GSdx/GSCrc.h +++ b/plugins/GSdx/GSCrc.h @@ -83,11 +83,21 @@ public: SMTDDS1, SMTDDS2, RozenMaidenGebetGarden, + EvangelionJo, SuikodenTactics, + CaptainTsubasa, + Oneechanbara2Special, + NarutimateAccel, + Naruto, + EternalPoison, + LegoBatman, + XE3, TenchuWoH, TenchuFS, Sly3, Sly2, + ShadowofRome, + ArctheLad, DemonStone, BigMuthaTruckers, TimeSplitters2, @@ -102,7 +112,14 @@ public: BleachBladeBattlers, CastlevaniaCoD, CastlevaniaLoI, + FinalFightStreetwise, + CrashNburn, + TombRaiderUnderworld, + TombRaiderAnniversary, + TombRaiderLegend, + SSX3, Black, + VF4, TyTasmanianTiger, TyTasmanianTiger2, FFVIIDoC, @@ -127,6 +144,35 @@ public: Yakuza2, SkyGunner, JamesBondEverythingOrNothing, + Siren, + ZettaiZetsumeiToshi2, + VF4EVO, + Dororo, + ShinOnimusha, + GetaWay, + GetaWayBlackMonday, + SakuraTaisen, + SakuraWarsSoLongMyLove, + FightingBeautyWulong, + TouristTrophy, + GTASanAndreas, + FrontMission5, + GodHand, + KnightsOfTheTemple2, + UltramanFightingEvolution, + RogueGalaxy, + DeathByDegreesTekkenNinaWilliams, + AlpineRacer3, + HummerBadlands, + SengokuBasara, + Grandia3, + TalesofSymphonia, + TalesofDestiny, + SDGundamGGeneration, + SoulCalibur3, + Simple2000Vol114, + SeintoSeiya, + UrbanReign, TitleCount, }; @@ -142,6 +188,7 @@ public: DE, IT, ES, + CH, ASIA, KO, RegionCount, diff --git a/plugins/GSdx/GSState.cpp b/plugins/GSdx/GSState.cpp index 9400239698..21f342cb8f 100644 --- a/plugins/GSdx/GSState.cpp +++ b/plugins/GSdx/GSState.cpp @@ -3108,6 +3108,10 @@ bool GSC_ICO(const GSFrameInfo& fi, int& skip) { skip = 1; } + else if(fi.TME && fi.FBP == 0x0800 && (fi.TBP0 == 0x2800 || fi.TBP0 ==0x2c00) && fi.TPSM ==0 && fi.FBMSK == 0) + { + skip = 1; //重影 + } } else { @@ -3258,6 +3262,10 @@ bool GSC_ResidentEvil4(const GSFrameInfo& fi, int& skip) { skip = 176; } + else if(fi.TME && fi.FBP ==0x03100 && (fi.TBP0==0x2a00 ||fi.TBP0==0x3480) && fi.TPSM ==0 && fi.FBMSK == 0) + { + skip = 1; //重影 + } } return true; @@ -3267,10 +3275,27 @@ bool GSC_Spartan(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(fi.TME && fi.FBP == 0x02000 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSM_PSMCT32) + if(g_crc_region == CRC::NoRegion &&fi.TME && fi.FBP == 0x02000 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSM_PSMCT32) { skip = 107; } + if(g_crc_region == CRC::JP && fi.TME && fi.FBP == 0x02180 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x2180 && fi.TPSM == PSM_PSMCT32) + { + skip = 3; + } + else + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } } return true; @@ -3297,7 +3322,11 @@ bool GSC_Drakengard2(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(fi.TME && fi.FBP == 0x026c0 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x00a00 && fi.TPSM == PSM_PSMCT32) + if(g_crc_region == CRC::CH && fi.TME && fi.FBP == 0x026c0 && fi.TBP0 == 0x00a00 && fi.FPSM ==2) + { + skip =34; + } + if((g_crc_region == CRC::US || g_crc_region == CRC::EU) && fi.TME && fi.FBP == 0x026c0 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x00a00 && fi.TPSM == PSM_PSMCT32) { skip = 64; } @@ -3318,9 +3347,13 @@ bool GSC_Tekken5(const GSFrameInfo& fi, int& skip) { skip = 2; } - else if(fi.TME && fi.FBP == 0x00000 && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32 && fi.FBMSK == 0x00FFFFFF) + else if(fi.TME) { - skip = 5; //city at sunset's... sun... + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 24; + } } } @@ -3396,6 +3429,14 @@ bool GSC_GodOfWar2(const GSFrameInfo& fi, int& skip) { skip = 1; // wall of fog } + else if(fi.TPSM == PSM_PSMCT24 && fi.TME && (fi.FBP ==0x1300 ) && (fi.TBP0 ==0x0F00 || fi.TBP0 ==0x1300 || fi.TBP0==0x2b00)) // || fi.FBP == 0x0100 //消水下黑線跟光源 + { + skip = 1; // 重影 + } + else if(fi.TPSM == PSM_PSMCT24 && fi.TME && (fi.FBP ==0x0100 ) && (fi.TBP0==0x2b00 || fi.TBP0==0x2e80)) //480P下2e80 + { + skip = 1; // 水下黑線 + } } } else @@ -3508,7 +3549,15 @@ bool GSC_Genji(const GSFrameInfo& fi, int& skip) { if(fi.TME && fi.FBP == 0x01500 && fi.FPSM == PSM_PSMCT16 && fi.TBP0 == 0x00e00 && fi.TPSM == PSM_PSMZ16) { - skip = 6; // + skip = 6; //左上方缺塊 + } + else if(fi.TPSM == PSM_PSMCT24 && fi.TME ==0x0001 && fi.TBP0==fi.FBP) + { + skip = 1; // 模糊 + } + else if(fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + { + skip = 1; //白霧 } } else @@ -3545,11 +3594,11 @@ bool GSC_ValkyrieProfile2(const GSFrameInfo& fi, int& skip) /*if(fi.TME && (fi.FBP == 0x018c0 || fi.FBP == 0x02180) && fi.FPSM == fi.TPSM && fi.TBP0 >= 0x03200 && fi.TPSM == PSM_PSMCT32) //NTSC only, !(fi.TBP0 == 0x03580 || fi.TBP0 == 0x03960) { skip = 1; //red garbage in lost forest, removes other effects... - } + }*/ if(fi.TME && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT16 && fi.FBMSK == 0x03FFF) { - skip = 1; //garbage in cutscenes, doesn't remove completely, better use "Alpha Hack" - }*/ + skip = 1; // CMV的豎紋 + } if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) { skip = 1000; // @@ -3570,7 +3619,11 @@ bool GSC_RadiataStories(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) + if(fi.TME && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT16 && fi.FBMSK == 0x03FFF) + { + skip = 1; // CMV的豎紋 + } + else if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) { skip = 1000; // } @@ -3598,8 +3651,34 @@ bool GSC_HauntingGround(const GSFrameInfo& fi, int& skip) { skip = 1; // bloom } - else if(fi.TME && fi.FBP == fi.TBP0 && fi.TBP0 == 0x3000 && fi.FBMSK == 0xFFFFFF && - GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) + else if(fi.TME && (fi.FBP ==0x2200) && (fi.TBP0 ==0x3a80) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; // 模糊 + } + else if(fi.FBP ==0x2200 && fi.TBP0==0x3000 && fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + { + skip = 1; //霧 + } + else if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + + return true; +} + +bool GSC_EvangelionJo(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.TBP0 == 0x2BC0 || (fi.FBP == 0 || fi.FBP == 0x1180) && (fi.FPSM | fi.TPSM) == 0) { skip = 1; } @@ -3612,7 +3691,8 @@ bool GSC_SuikodenTactics(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(!fi.TME && fi.TPSM == PSM_PSMT8H && fi.FPSM == 0 && fi.FBMSK == 0x0FF000000 && fi.TBP0 == 0 && GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) + if( !fi.TME && fi.TPSM == PSM_PSMT8H && fi.FPSM == 0 && + fi.FBMSK == 0x0FF000000 && fi.TBP0 == 0 && GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) { skip = 4; } @@ -3621,6 +3701,137 @@ bool GSC_SuikodenTactics(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_CaptainTsubasa(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x1C00 && !fi.FBMSK) + { + skip = 1; + } + } + return true; +} + +bool GSC_Oneechanbara2Special(const GSFrameInfo& fi, int& skip) +{ +// 高分辨率下重影 + if(skip == 0) + { + if(fi.TPSM == PSM_PSMCT24 && fi.TME && fi.FBP == 0x01180) + { + skip = 1; // 重影 + } + } + + return true; +} + +bool GSC_NarutimateAccel(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x3800 && fi.TBP0 == 0 && (fi.FPSM | fi.TPSM) == 0) + { + skip = 105; + } + else if(!fi.TME && fi.FBP == 0x3800 && fi.TBP0 == 0x1E00 && fi.FPSM == 0 && fi.TPSM == 49 && fi.FBMSK == 0xFF000000) + { + skip = 1; + } + } + else + { + if(fi.FBP == 0 && fi.TBP0 == 0x3800 && fi.TME && (fi.FPSM | fi.TPSM) == 0) + { + skip = 1; + } + } + + return true; +} + +bool GSC_Naruto(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x3800 && fi.TBP0 == 0 && (fi.FPSM | fi.TPSM) == 0) + { + skip = 105; + } + else if(!fi.TME && fi.FBP == 0x3800 && fi.TBP0 == 0x1E00 && fi.FPSM == 0 && fi.TPSM == 49 && fi.FBMSK == 0xFF000000) + { + skip = 0; + } + } + else + { + if(fi.FBP == 0 && fi.TBP0 == 0x3800 && fi.TME && (fi.FPSM | fi.TPSM) == 0) + { + skip = 1; + } + } + + return true; +} + + +bool GSC_EternalPoison(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TPSM == PSM_PSMCT16S && fi.TBP0 == 0x3200) + { + skip = 1; //陰影 + } + } + return true; +} + +bool GSC_LegoBatman(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.TPSM == PSM_PSMZ16 && fi.FPSM == PSM_PSMCT16 && fi.FBMSK == 0x00000) + { + skip = 3; //去黑霧 + } + } + return true; +} + +bool GSC_SakuraTaisen(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(!fi.TME && (fi.FBP == 0x0 || fi.FBP == 0x1180) && (fi.TBP0!=0x3fc0 && fi.TBP0!=0x3c9a && fi.TBP0 !=0x3dec /*fi.TBP0 ==0x38d0 || fi.TBP0==0x3912 ||fi.TBP0==0x3bdc ||fi.TBP0==0x3ab3 ||fi.TBP0<=0x3a92*/) && fi.FPSM == PSM_PSMCT32 && (fi.TPSM == PSM_PSMT8 || fi.TPSM == PSM_PSMT4) && (fi.FBMSK == 0x00FFFFFF || !fi.FBMSK)) + { + skip = 0; //3dec 3fc0 3c9a + } + if(!fi.TME && (fi.FBP | fi.TBP0) !=0 && (fi.FBP | fi.TBP0) !=0x1180 && (fi.FBP | fi.TBP0) !=0x3be0 && (fi.FBP | fi.TBP0) !=0x3c80 && fi.TBP0!=0x3c9a && (fi.FBP | fi.TBP0) !=0x3d80 && fi.TBP0 !=0x3dec&& fi.FPSM == PSM_PSMCT32 && (fi.FBMSK==0)) + { + skip =0; //3dec 3fc0 3c9a + } + if(!fi.TME && (fi.FBP | fi.TBP0) !=0 && (fi.FBP | fi.TBP0) !=0x1180 && (fi.FBP | fi.TBP0) !=0x3be0 && (fi.FBP | fi.TBP0) !=0x3c80 && (fi.FBP | fi.TBP0) !=0x3d80 && fi.TBP0!=0x3c9a && fi.TBP0 !=0x3de && fi.FPSM == PSM_PSMCT32 && (fi.FBMSK==0)) + { + skip =1; //3dec 3fc0 3c9a + } + else if(fi.TME && (fi.FBP == 0 || fi.FBP == 0x1180) && fi.TBP0 == 0x35B8 && fi.TPSM == PSM_PSMT4) + { + skip = 1; + } + else + { + if(!fi.TME && (fi.FBP | fi.TBP0) ==0x38d0 && fi.FPSM == PSM_PSMCT32 ) + { + skip = 1; //3dec 3fc0 3c9a + } + } + } + + return true; +} + bool GSC_Tenchu(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -3674,6 +3885,97 @@ bool GSC_Sly2(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_ShadowofRome(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.FBP && fi.TPSM == PSM_PSMT8H && ( fi.FBMSK ==0x00FFFFFF)) + { + skip =1; //霧 + } + else if(fi.TME ==0x0001 && (fi.TBP0==0x1300 || fi.TBP0==0x0f00) && fi.FBMSK>=0xFFFFFF) + { + skip = 1; //樹林霧和水紋 + } + else if(fi.TME && (fi.FBP >=0x0) && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 ==0x0160 ||fi.TBP0==0x01e0 || fi.TBP0<=0x0800) && fi.TPSM == PSM_PSMT8) + { + skip = 1; //速度 + } + else if(fi.TME && (fi.TBP0==0x0700) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) + { + skip = 1; //模糊 + } + } + + return true; +} + +bool GSC_FFXII(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + return true; +} + +bool GSC_FFX2(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + return true; +} + +bool GSC_FFX(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + return true; +} + +bool GSC_ArctheLad(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + /*if(fi.TPSM == PSM_PSMT8H && fi.FBMSK >= 0xFFFFFFF) + { + skip = 1; + }*/ + } + return true; +} + bool GSC_DemonStone(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -3843,7 +4145,7 @@ bool GSC_Castlevania(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(fi.TME && fi.FBP == 0x00000 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMCT16S && fi.FBMSK == 0x00FFFFFF) + if(fi.TME && fi.FBP == 0 && fi.TBP0 && fi.TPSM == 10 && fi.FBMSK == 0xFFFFFF) { skip = 2; } @@ -3876,6 +4178,96 @@ bool GSC_Black(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_CrashNburn(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + + return true; +} + +bool GSC_TombRaider(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x01000 && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; + } + } + return true; +} + +bool GSC_TombRaiderLegend(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x01000 && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32 && (fi.TBP0 == 0x2b60 ||fi.TBP0 == 0x2b80 || fi.TBP0 == 0x2E60 ||fi.TBP0 ==0x3020 ||fi.TBP0 == 0x3200 || fi.TBP0 == 0x3320)) + { + skip = 1; //花屏 + } + else if(fi.TPSM == PSM_PSMCT32 && (fi.TPSM | fi.FBP)==0x2fa0 && (fi.TBP0==0x2bc0 ) && fi.FBMSK ==0) + { + skip = 2; // 花屏 + } + + + }// ||fi.TBP0 ==0x2F00 + + return true; +} + +bool GSC_TombRaiderUnderWorld(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == 0x01000 && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32 && (fi.TBP0 == 0x2B60 /*|| fi.TBP0 == 0x2EFF || fi.TBP0 ==0x2F00 || fi.TBP0 == 0x3020*/ || fi.TBP0 >= 0x2C01 && fi.TBP0!=0x3029 && fi.TBP0!=0x302d)) + { + skip = 1; //花屏 + } + else if(fi.TPSM == PSM_PSMCT32 && (fi.TPSM | fi.FBP)==0x2c00 && (fi.TBP0 ==0x0ee0) && fi.FBMSK ==0) + { + skip = 2; // 水下黑屏 + } + /*else if(fi.TPSM == PSM_PSMCT16 && (fi.TPSM | fi.FBP)>=0x0 && (fi.TBP0 >=0x0) && fi.FBMSK ==0) + { + skip = 600; // 加速 + }*/ + } + + return true; +} + +bool GSC_SSX3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + + return true; +} + bool GSC_FFVIIDoC(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -3893,6 +4285,29 @@ bool GSC_FFVIIDoC(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_DevilMayCry3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + + if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMCT16 && fi.TBP0 == 0x01000 && fi.TPSM == PSM_PSMZ16) + { + skip = 32; + } + if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMZ32 && fi.TBP0 == 0x0800 && fi.TPSM == PSM_PSMT8H) + { + skip = 16; + } + if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x0 && fi.TPSM == PSM_PSMT8H) + { + skip = 24; + } + } + + return true; +} + + bool GSC_StarWarsForceUnleashed(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -3961,28 +4376,6 @@ bool GSC_BlackHawkDown(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_DevilMayCry3(const GSFrameInfo& fi, int& skip) -{ - if(skip == 0) - { - - if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMCT16 && fi.TBP0 == 0x01000 && fi.TPSM == PSM_PSMZ16) - { - skip = 32; - } - if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMZ32 && fi.TBP0 == 0x0800 && fi.TPSM == PSM_PSMT8H) - { - skip = 16; - } - if(fi.TME && fi.FBP == 0x01800 && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x0 && fi.TPSM == PSM_PSMT8H) - { - skip = 24; - } - } - - return true; -} - bool GSC_Burnout(const GSFrameInfo& fi, int& skip) { if(skip == 0) @@ -4062,6 +4455,18 @@ bool GSC_TalesOfLegendia(const GSFrameInfo& fi, int& skip) { skip = 2; } + if(fi.TME && fi.FBP && fi.FPSM == PSM_PSMCT32 && fi.TBP0 == 0x3d80) + { + skip = 1; //左上方缺塊2a00 + } + if(fi.TME && fi.FBP ==0x1c00 && (fi.TBP0==0x2e80 ||fi.TBP0==0x2d80) && fi.TPSM ==0 && fi.FBMSK == 0xff000000) + { + skip = 1; //重影 + } + if(!fi.TME && fi.FBP ==0x2a00 && (fi.TBP0==0x1C00 ) && fi.TPSM ==0 && fi.FBMSK == 0x00FFFFFF) + { + skip = 1; //中毒圖層錯位 + } } return true; @@ -4084,10 +4489,31 @@ bool GSC_Kunoichi(const GSFrameInfo& fi, int& skip) { if(skip == 0) { - if(!fi.TME && (fi.FBP == 0x0 || fi.FBP == 0x00700 || fi.FBP == 0x00800) && fi.FPSM == PSM_PSMCT32 && (fi.TPSM == PSM_PSMT8 || fi.TPSM == PSM_PSMT4) && fi.FBMSK == 0x00FFFFFF) + if(!fi.TME && (fi.FBP == 0x0 || fi.FBP == 0x00700 || fi.FBP == 0x00800) && fi.FPSM == PSM_PSMCT32 && fi.FBMSK == 0x00FFFFFF) { skip = 3; } + if(fi.TME && (fi.FBP ==0x0700 || fi.FBP==0) && fi.TBP0==0x0e00 && fi.TPSM ==0 && fi.FBMSK == 0) + { + skip = 1; //殺陣黑屏 + } + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + else + { + if(fi.TME && (fi.FBP == 0x0e00) && fi.FPSM == PSM_PSMCT32 && fi.FBMSK == 0xFF000000) + { + skip = 0; + } } return true; @@ -4169,6 +4595,427 @@ bool GSC_JamesBondEverythingOrNothing(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_ZettaiZetsumeiToshi2(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.TPSM == PSM_PSMCT16S && (fi.FBMSK >= 0x6FFFFFFF || fi.FBMSK ==0) ) + { + skip = 1000; + } + else if(fi.TME && fi.TPSM == PSM_PSMCT32 && fi.FBMSK == 0xFF000000) + { + skip = 2; // 霧 + } + else if((fi.FBP | fi.TBP0)&& fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT16 && fi.FBMSK == 0x3FFF) + { + skip = 1000; + } + + } + else + { + if(!fi.TME && fi.TPSM == PSM_PSMCT32 && fi.FBP==0x1180 && fi.TBP0==0x1180 && (fi.FBMSK ==0)) + { + skip = 0; // + } + if(fi.TME && fi.TPSM == PSM_PSMT4 && fi.FBP && (fi.TBP0!=0x3753)) + { + skip = 0; // + } + if(fi.TME && fi.TPSM == PSM_PSMT8H && fi.FBP ==0x22e0 && fi.TBP0 ==0x36e0 ) + { + skip = 0; // + } + if(!fi.TME && fi.TPSM == PSM_PSMT8H && fi.FBP ==0x22e0 ) + { + skip = 0; // + } + if(fi.TME && fi.TPSM == PSM_PSMT8 && (fi.FBP==0x1180 || fi.FBP==0) && (fi.TBP0 !=0x3764 && fi.TBP0!=0x370f)) + { + skip = 0; // + } + if(fi.TME && fi.TPSM == PSM_PSMCT16S && (fi.FBP==0x1180 )) + { + skip = 2; // + } + + } + + return true; +} + +bool GSC_ShinOnimusha(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + + if(fi.TME && fi.FBP == 0x001000 && (fi.TBP0 ==0 || fi.TBP0 == 0x0800) && fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0x00FFFFFF) + { + skip = 0; //水波紋 沒必要了? + } + else if(fi.TPSM == PSM_PSMCT24 && fi.TME && fi.FBP == 0x01000) // || fi.FBP == 0x00000 + { + skip = 28; // 重影28 30 56 64 + } + else if(fi.FBP && fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0xFFFFFF) + { + skip = 0; //24 33 40 92白霧 沒必要了? + } + else if(fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0xFF000000) + { + skip = 1; //撿東西時的白霧 + } + else if(fi.TME && (fi.TBP0 ==0x1400 || fi.TBP0 ==0x1000 ||fi.TBP0 == 0x1200) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) + { + skip = 1; + } //消除泛光過度 水紋等光影 + + } + + return true; +} + +bool GSC_XE3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TPSM == PSM_PSMT8H && fi.FBMSK >= 0xEFFFFFFF) + { + skip = 73; //動畫 + } + else if(fi.TME && fi.FBP ==0x03800 && fi.TBP0 && fi.TPSM ==0 && fi.FBMSK == 0) + { + skip = 1; //重影 + } + /*else if(fi.TPSM ==0x00000 && PSM_PSMCT24 && fi.TME && fi.FBP == 0x03800) + { + skip = 1 ; // 光源 + }*/ + /*else if(fi.TME ==0 && (fi.FBP ==0 ) && fi.FPSM == PSM_PSMCT32 && ( fi.TPSM == PSM_PSMT8 || fi.TPSM == PSM_PSMT4) && (fi.FBMSK == 0x00FFFFFF || fi.FBMSK == 0xFF000000)) + { + skip = 1; //去黑暗 + }*/ + else + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 1; + } + } + } + } + return true; +} + +bool GSC_GetaWay(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if((fi.FBP ==0 || fi.FBP ==0x1180)&& fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + { + skip = 1; + } + } + + return true; +} + +bool GSC_SakuraWarsSoLongMyLove(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME==0 && fi.FBP != fi.TBP0 && fi.TBP0 && fi.FBMSK == 0x00FFFFFF) + { + skip = 3; //去黑暗 + } + else if(fi.TME==0 && fi.FBP == fi.TBP0 && (fi.TBP0 ==0x1200 ||fi.TBP0 ==0x1180 ||fi.TBP0 ==0) && fi.FBMSK == 0x00FFFFFF) + { + skip = 3; //去黑暗 + } + else if(fi.TME && (fi.FBP ==0 || fi.FBP ==0x1180) && fi.FPSM == PSM_PSMCT32 && fi.TBP0 ==0x3F3F && fi.TPSM == PSM_PSMT8) + { + skip = 1; //機甲泛光 + } + } + + return true; +} + +bool GSC_FightingBeautyWulong(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.TBP0 ==0x0700 || fi.TBP0 ==0x0a80) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) + { + skip = 1; + } //消除模糊 + } + + return true; +} + +bool GSC_TouristTrophy(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP >= 0x02f00 && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01180) && fi.TPSM == PSM_PSMT8) + { + skip = 770; + } + if(fi.TME && fi.FBP >= 0x02de0 && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 ==0 || fi.TBP0==0x1a40 ||fi.TBP0 ==0x2300) && fi.TPSM == PSM_PSMT8) + { + skip = 770; //480P + } + } + + return true; +} + +bool GSC_GTASanAndreas(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP ==0x0a00 || fi.FBP ==0x08c0) && (fi.TBP0 ==0x1b80 || fi.TBP0 ==0x1a40) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; // 重影跟水波紋 + } + } + + return true; +} + +bool GSC_FrontMission5(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + { + skip = 1; //動畫 + } + if(fi.TME && (fi.FBP ==0x1000) && (fi.TBP0 ==0x2e00 || fi.TBP0 ==0x3200) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; //影子fi.TBP0 ==0x1f00 + } + } + + return true; +} + +bool GSC_GodHand(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP ==0x0) && (fi.TBP0 ==0x2800) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; // 模糊 + } + } + + return true; +} + +bool GSC_KnightsOfTheTemple2(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TPSM == PSM_PSMT8H && fi.FBMSK == 0) + { + skip = 1; //重影 + } + else if(fi.TPSM ==0x00000 && PSM_PSMCT24 && fi.TME && (fi.FBP ==0x3400 ||fi.FBP==0x3a00)) + { + skip = 1 ; //光源 + } + } + + return true; +} + +bool GSC_UltramanFightingEvolution(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP==0x2a00 && fi.FPSM == PSM_PSMZ24 && fi.TBP0 == 0x1c00 && fi.TPSM == PSM_PSMZ24) + { + skip = 5; // blur 不損光源 + } + } + + return true; +} + +bool GSC_RogueGalaxy(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.TBP0==0x2c40) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) + { + skip = 1; //場景閃爍 + } + + } + + return true; +} + +bool GSC_DeathByDegreesTekkenNinaWilliams(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP ==0 ) && fi.TBP0==0x34a0 && (fi.TPSM == PSM_PSMCT32)) + { + skip = 1; //去動畫窗格 + } + else if((fi.FBP ==0x3500)&& fi.TPSM == PSM_PSMT8 && fi.FBMSK == 0xFFFF00FF) + { + skip = 4; //水下白霧 + } + } + if(fi.TME) + { + if((fi.FBP | fi.TBP0 | fi.FPSM | fi.TPSM) && (fi.FBMSK == 0x00FFFFFF )) + { + skip = 1; //動畫速度 + } + } + return true; +} + +bool GSC_AlpineRacer3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(!fi.TME && fi.FBP == 0 && fi.TBP0>=0 && (fi.TPSM >= 0 ) && (fi.FBMSK ==0x0001 ||fi.FBMSK == 0x00FFFFFF)) + { + skip = 2; //去黑暗 + } + } + + return true; +} + +bool GSC_HummerBadlands(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP ==0x0a00) && (fi.TBP0 ==0x03200 || fi.TBP0==0x3700) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; //影子 + } + } + + return true; +} + +bool GSC_SengokuBasara(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.TBP0==0x1800 ) && fi.FBMSK==0xFF000000) + { + skip = 1; //霧 + } + } + + return true; +} + +bool GSC_Grandia3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP ==0x0 || fi.FBP ==0x0e00) && (fi.TBP0 ==0x2a00 ||fi.TBP0==0x0e00 ||fi.TBP0==0) && fi.FPSM == fi.TPSM && fi.TPSM == PSM_PSMCT32) + { + skip = 1; // 模糊 + } + } + + + return true; +} + +bool GSC_FinalFightStreetwise(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(!fi.TME && (fi.FBP == 0 || fi.FBP == 0x08c0) && fi.FPSM == PSM_PSMCT32 && (fi.TPSM == PSM_PSMT8 || fi.TPSM == PSM_PSMT4) && fi.FBMSK == 0x00FFFFFF) + { + skip = 3; + } + } + + return true; +} + +bool GSC_TalesofSymphonia(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && (fi.FBP >= 0) && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 == 0x2bc0 || fi.TBP0 <= 0x0200) && (fi.FBMSK==0xFF000000 ||fi.FBMSK==0x00FFFFFF)) + { + skip = 1; //fi.FBMSK==0造成動畫黑屏,加速戰鬥速度 + } + if(fi.TME && (fi.TBP0==0x1180 || fi.TBP0==0x1a40 || fi.TBP0==0x2300) && fi.FBMSK>=0xFF000000) + { + skip = 1; //過場殘影 + } + } + + return true; +} + +bool GSC_SoulCalibur3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME) + { + // depth textures (bully, mgs3s1 intro, Front Mission 5) + if( (fi.TPSM == PSM_PSMZ32 || fi.TPSM == PSM_PSMZ24 || fi.TPSM == PSM_PSMZ16 || fi.TPSM == PSM_PSMZ16S) || + // General, often problematic post processing + (GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)) ) + { + skip = 2; + } + } + } + + return true; +} + +bool GSC_Simple2000Vol114(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME==0 && (fi.FBP==0x1500) && (fi.TBP0==0x2c97 || fi.TBP0==0x2ace || fi.TBP0==0x03d0 || fi.TBP0==0x2448) && (fi.FBMSK == 0x0000)) + { + skip = 1; //去影子 + } + if(fi.TME && (fi.FBP==0x0e00) && (fi.TBP0==0x1000) && (fi.FBMSK == 0x0000)) + { + skip = 1; //去迷霧 + } + } + return true; +} +bool GSC_UrbanReign(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP==0x0000 && fi.TBP0==0x3980 && fi.FPSM==fi.TPSM && fi.TPSM == PSM_PSMCT32 && fi.TPSM ==0 && fi.FBMSK == 0x0) + { + skip = 1; //黑影 + } + } + return true; +} + #ifdef ENABLE_DYNAMIC_CRC_HACK #define DYNA_DLL_PATH "c:/dev/pcsx2/trunk/tools/dynacrchack/DynaCrcHack.dll" @@ -4356,11 +5203,24 @@ bool GSState::IsBadFrame(int& skip, int UserHacks_SkipDraw) map[CRC::ValkyrieProfile2] = GSC_ValkyrieProfile2; map[CRC::RadiataStories] = GSC_RadiataStories; map[CRC::HauntingGround] = GSC_HauntingGround; + map[CRC::EvangelionJo] = GSC_EvangelionJo; map[CRC::SuikodenTactics] = GSC_SuikodenTactics; + map[CRC::CaptainTsubasa] = GSC_CaptainTsubasa; + map[CRC::Oneechanbara2Special] = GSC_Oneechanbara2Special; + map[CRC::NarutimateAccel] = GSC_NarutimateAccel; + map[CRC::Naruto] = GSC_Naruto; + map[CRC::EternalPoison] = GSC_EternalPoison; + map[CRC::LegoBatman] = GSC_LegoBatman; + map[CRC::SakuraTaisen] = GSC_SakuraTaisen; map[CRC::TenchuWoH] = GSC_Tenchu; map[CRC::TenchuFS] = GSC_Tenchu; map[CRC::Sly3] = GSC_Sly3; map[CRC::Sly2] = GSC_Sly2; + map[CRC::ShadowofRome] = GSC_ShadowofRome; + map[CRC::FFXII] = GSC_FFXII; + map[CRC::FFX2] = GSC_FFX2; + map[CRC::FFX] = GSC_FFX; + map[CRC::ArctheLad] = GSC_ArctheLad; map[CRC::DemonStone] = GSC_DemonStone; map[CRC::BigMuthaTruckers] = GSC_BigMuthaTruckers; map[CRC::TimeSplitters2] = GSC_TimeSplitters2; @@ -4372,6 +5232,11 @@ bool GSState::IsBadFrame(int& skip, int UserHacks_SkipDraw) map[CRC::BleachBladeBattlers] = GSC_BleachBladeBattlers; map[CRC::CastlevaniaCoD] = GSC_Castlevania; map[CRC::CastlevaniaLoI] = GSC_Castlevania; + map[CRC::CrashNburn] = GSC_CrashNburn; + map[CRC::TombRaiderUnderworld] = GSC_TombRaiderUnderWorld; + map[CRC::TombRaiderAnniversary] = GSC_TombRaider; + map[CRC::TombRaiderLegend] = GSC_TombRaiderLegend; + map[CRC::SSX3] = GSC_SSX3; map[CRC::Black] = GSC_Black; map[CRC::FFVIIDoC] = GSC_FFVIIDoC; map[CRC::StarWarsForceUnleashed] = GSC_StarWarsForceUnleashed; @@ -4392,6 +5257,30 @@ bool GSState::IsBadFrame(int& skip, int UserHacks_SkipDraw) map[CRC::Yakuza2] = GSC_Yakuza2; map[CRC::SkyGunner] = GSC_SkyGunner; map[CRC::JamesBondEverythingOrNothing] = GSC_JamesBondEverythingOrNothing; + map[CRC::ZettaiZetsumeiToshi2] = GSC_ZettaiZetsumeiToshi2; + map[CRC::ShinOnimusha] = GSC_ShinOnimusha; + map[CRC::XE3] = GSC_XE3; + map[CRC::GetaWay] = GSC_GetaWay; + map[CRC::GetaWayBlackMonday] = GSC_GetaWay; + map[CRC::SakuraWarsSoLongMyLove] = GSC_SakuraWarsSoLongMyLove; + map[CRC::FightingBeautyWulong] = GSC_FightingBeautyWulong; + map[CRC::TouristTrophy] = GSC_TouristTrophy; + map[CRC::GTASanAndreas] = GSC_GTASanAndreas; + map[CRC::FrontMission5] = GSC_FrontMission5; + map[CRC::GodHand] = GSC_GodHand; + map[CRC::KnightsOfTheTemple2] = GSC_KnightsOfTheTemple2; + map[CRC::UltramanFightingEvolution] = GSC_UltramanFightingEvolution; + map[CRC::RogueGalaxy] = GSC_RogueGalaxy; + map[CRC::DeathByDegreesTekkenNinaWilliams] = GSC_DeathByDegreesTekkenNinaWilliams; + map[CRC::AlpineRacer3] = GSC_AlpineRacer3; + map[CRC::HummerBadlands] = GSC_HummerBadlands; + map[CRC::SengokuBasara] = GSC_SengokuBasara; + map[CRC::Grandia3] = GSC_Grandia3; + map[CRC::FinalFightStreetwise] = GSC_FinalFightStreetwise; + map[CRC::TalesofSymphonia] = GSC_TalesofSymphonia; + map[CRC::SoulCalibur3] = GSC_SoulCalibur3; + map[CRC::Simple2000Vol114] = GSC_Simple2000Vol114; + map[CRC::UrbanReign] = GSC_UrbanReign; } // TODO: just set gsc in SetGameCRC once