diff --git a/.gitignore b/.gitignore index c3db964e..356fe780 100644 --- a/.gitignore +++ b/.gitignore @@ -531,3 +531,5 @@ palmod/Release/Venture50.txt palmod/Release/RedEarthE.txt palmod/Game/bb.txt palmod/Release/KOF03E.txt +palmod/Release/DANKUGAe.txt +palmod/Debug/DANKUGAe.txt diff --git a/palmod/Game/Cyberbots_A_DEF.h b/palmod/Game/Cyberbots_A_DEF.h index 150298e1..ea5b9b40 100644 --- a/palmod/Game/Cyberbots_A_DEF.h +++ b/palmod/Game/Cyberbots_A_DEF.h @@ -27,7 +27,6 @@ const UINT16 Cyberbots_A_IMGIDS_USED[] = indexCyberbots_Vise, // 0xB4 indexCyberbots_Warlock, // 0xB5 indexCyberbots_Bonus, // 0xB6 - }; //---MACHINES--- @@ -528,7 +527,7 @@ const sGame_PaletteDataset Cyberbots_A_VISE_PORTRAIT_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_CYCLONE_P1_PALETTES[] = { - { L"P1 Cyclone Top", 0x4Fd66, 0x4Fd86, indexCyberbots_Cyclone, 0x3, &pairFullyLinkedNode }, + { L"P1 Cyclone Top", 0x4Fd66, 0x4Fd86, indexCyberbots_Cyclone, 0x3, &pairNextAndNextAndNextAndNext13 }, { L"P1 Cyclone Legs", 0x505e6, 0x50606, indexCyberbots_Cyclone, 0x2 }, { L"P1 Cyclone Arm", 0x50de6, 0x50e06, indexCyberbots_Cyclone, 0x0 }, { L"P1 Cyclone Weapon", 0x51c06, 0x51c26, indexCyberbots_Cyclone, 0x4 }, @@ -536,7 +535,7 @@ const sGame_PaletteDataset Cyberbots_A_CYCLONE_P1_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_CYCLONE_P2_PALETTES[] = { - { L"P2 Cyclone Top", 0x4Fde6, 0x4Fe06, indexCyberbots_Cyclone, 0x3, &pairFullyLinkedNode }, + { L"P2 Cyclone Top", 0x4Fde6, 0x4Fe06, indexCyberbots_Cyclone, 0x3, &pairNextAndNextAndNextAndNext9 }, { L"P2 Cyclone Legs", 0x50666, 0x50686, indexCyberbots_Cyclone, 0x2 }, { L"P2 Cyclone Arm", 0x50e66, 0x50e86, indexCyberbots_Cyclone, 0x0 }, { L"P2 Cyclone Weapon", 0x51d86, 0x51da6, indexCyberbots_Cyclone, 0x4 }, @@ -544,7 +543,7 @@ const sGame_PaletteDataset Cyberbots_A_CYCLONE_P2_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_CYCLONE_P1_UNDERWATER_PALETTES[] = { - { L"P1 Cyclone Top Underwater", 0x50066, 0x50086, indexCyberbots_Cyclone, 0x3, &pairFullyLinkedNode }, + { L"P1 Cyclone Top Underwater", 0x50066, 0x50086, indexCyberbots_Cyclone, 0x3, &pairNextAndNextAndNextAndNext5 }, { L"P1 Cyclone Legs Underwater", 0x508e6, 0x50906, indexCyberbots_Cyclone, 0x2 }, { L"P1 Cyclone Arm Underwater", 0x510e6, 0x51106, indexCyberbots_Cyclone, 0x0 }, { L"P1 Cyclone Weapon Underwater", 0x51f06, 0x51f26, indexCyberbots_Cyclone, 0x4 }, @@ -552,16 +551,15 @@ const sGame_PaletteDataset Cyberbots_A_CYCLONE_P1_UNDERWATER_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_CYCLONE_P2_UNDERWATER_PALETTES[] = { - { L"P2 Cyclone Top Underwater", 0x500e6, 0x50106, indexCyberbots_Cyclone, 0x3, &pairFullyLinkedNode }, + { L"P2 Cyclone Top Underwater", 0x500e6, 0x50106, indexCyberbots_Cyclone, 0x3, &pairNextAndNextAndNextAndNext }, { L"P2 Cyclone Legs Underwater", 0x50966, 0x50986, indexCyberbots_Cyclone, 0x2 }, { L"P2 Cyclone Arm Underwater", 0x51166, 0x51186, indexCyberbots_Cyclone, 0x0 }, { L"P2 Cyclone Weapon Underwater", 0x52086, 0x520a6, indexCyberbots_Cyclone, 0x4 }, }; -//Shared-- This could be linked to the normal palette display const sGame_PaletteDataset Cyberbots_A_CYCLONE_SHARED_PALETTES[] = { - { L"Cyclone Drill", 0x51906, 0x51926, indexCyberbots_Cyclone, 0x1 }, + { L"Shared: Cyclone Drill", 0x51906, 0x51926, indexCyberbots_Cyclone, 0x1 }, }; const sGame_PaletteDataset Cyberbots_A_CYCLONE_PORTRAIT_PALETTES[] = @@ -712,35 +710,35 @@ const sGame_PaletteDataset Cyberbots_A_HELION_PORTRAIT_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_WARLOCK_P1_PALETTES[] = { - { L"P1 Warlock", 0x50306, 0x50326, indexCyberbots_Warlock, 0x0, &pairFullyLinkedNode }, + { L"P1 Warlock", 0x50306, 0x50326, indexCyberbots_Warlock, 0x0, &pairNextAndNext12 }, { L"P1 Warlock Effects", 0x50aa6, 0x50ac6, indexCyberbots_Warlock, 0x1 }, { L"P1 Warlock Soul Blade", 0x521e6, 0x52206 }, }; const sGame_PaletteDataset Cyberbots_A_WARLOCK_P2_PALETTES[] = { - { L"P2 Warlock", 0x501c6, 0x501e6, indexCyberbots_Warlock, 0x0, &pairFullyLinkedNode }, + { L"P2 Warlock", 0x501c6, 0x501e6, indexCyberbots_Warlock, 0x0, &pairNextAndNext9 }, { L"P2 Warlock Effects", 0x50a26, 0x50a46, indexCyberbots_Warlock, 0x1 }, { L"P2 Warlock Soul Blade", 0x52166, 0x52186 }, }; const sGame_PaletteDataset Cyberbots_A_WARLOCK_P1_UNDERWATER_PALETTES[] = { - { L"P1 Warlock Underwater", 0x503a6, 0x503c6, indexCyberbots_Warlock, 0x0, &pairFullyLinkedNode }, + { L"P1 Warlock Underwater", 0x503a6, 0x503c6, indexCyberbots_Warlock, 0x0, &pairNextAndNext6 }, { L"P1 Warlock Effects Underwater", 0x50ba6, 0x50bc6, indexCyberbots_Warlock, 0x1 }, { L"P1 Warlock Soul Blade Underwater", 0x522e6, 0x52306 }, }; const sGame_PaletteDataset Cyberbots_A_WARLOCK_P2_UNDERWATER_PALETTES[] = { - { L"P2 Warlock Underwater", 0x50266, 0x50286, indexCyberbots_Warlock, 0x0, &pairFullyLinkedNode }, + { L"P2 Warlock Underwater", 0x50266, 0x50286, indexCyberbots_Warlock, 0x0, &pairNextAndNextSkipped }, { L"P2 Warlock Effects Underwater", 0x50b26, 0x50b46, indexCyberbots_Warlock, 0x1 }, { L"P2 Warlock Soul Blade Underwater", 0x52266, 0x52286 }, }; const sGame_PaletteDataset Cyberbots_A_WARLOCK_SHARED_PALETTES[] = { - {L"Warlock Soul Drain", 0x51926, 0x51946, indexCyberbots_Warlock, 0x2 }, + {L"Shared: Warlock Soul Drain", 0x51926, 0x51946, indexCyberbots_Warlock, 0x2 }, }; const sGame_PaletteDataset Cyberbots_A_WARLOCK_PORTRAIT_PALETTES[] = @@ -858,7 +856,7 @@ const sGame_PaletteDataset Cyberbots_A_BONUS_INTRO_PALETTES[] = const sGame_PaletteDataset Cyberbots_A_BONUS_SELECTSCREEN_PALETTES[] = { - { L"Select Background", 0x4db84, 0x4dd84 }, + { L"Select Background", 0x4db64, 0x4db84 }, { L"Select Cursor", 0x41a7e, 0x41a9e }, { L"Select Timer", 0x41abe, 0x41ade }, { L"Select Text", 0x41ade, 0x41afe }, @@ -1087,21 +1085,21 @@ const sDescTreeNode Cyberbots_A_BONUS_COLLECTION[] = const sDescTreeNode Cyberbots_A_UNITS[] = { { L"BX-02 BLODIA", DESC_NODETYPE_TREE, (void*)Cyberbots_A_BLODIA_COLLECTION, ARRAYSIZE(Cyberbots_A_BLODIA_COLLECTION) }, - { L"S-008 SUPER-8", DESC_NODETYPE_TREE, (void*)Cyberbots_A_SUPER8_COLLECTION, ARRAYSIZE(Cyberbots_A_SUPER8_COLLECTION) }, - { L"UVA-02 HELION", DESC_NODETYPE_TREE, (void*)Cyberbots_A_HELION_COLLECTION, ARRAYSIZE(Cyberbots_A_HELION_COLLECTION) }, - { L"RF-004 REPTOS", DESC_NODETYPE_TREE, (void*)Cyberbots_A_REPTOS_COLLECTION, ARRAYSIZE(Cyberbots_A_REPTOS_COLLECTION) }, - { L"FZ-900J KILLER BEE", DESC_NODETYPE_TREE, (void*)Cyberbots_A_KILLERBEE_COLLECTION, ARRAYSIZE(Cyberbots_A_KILLERBEE_COLLECTION) }, - { L"GP-N1 GULDIN", DESC_NODETYPE_TREE, (void*)Cyberbots_A_GULDIN_COLLECTION, ARRAYSIZE(Cyberbots_A_GULDIN_COLLECTION) }, - { L"FZ-100 FORDY", DESC_NODETYPE_TREE, (void*)Cyberbots_A_FORDY_COLLECTION, ARRAYSIZE(Cyberbots_A_FORDY_COLLECTION) }, - { L"GP-V4 VISE", DESC_NODETYPE_TREE, (void*)Cyberbots_A_VISE_COLLECTION, ARRAYSIZE(Cyberbots_A_VISE_COLLECTION) }, - { L"P-10033 GAITS", DESC_NODETYPE_TREE, (void*)Cyberbots_A_GAITS_COLLECTION, ARRAYSIZE(Cyberbots_A_GAITS_COLLECTION) }, - { L"BX-04S SWORDSMAN", DESC_NODETYPE_TREE, (void*)Cyberbots_A_SWORDSMAN_COLLECTION, ARRAYSIZE(Cyberbots_A_SWORDSMAN_COLLECTION) }, { L"BX-07R RIOT", DESC_NODETYPE_TREE, (void*)Cyberbots_A_RIOT_COLLECTION, ARRAYSIZE(Cyberbots_A_RIOT_COLLECTION) }, + { L"RF-004 REPTOS", DESC_NODETYPE_TREE, (void*)Cyberbots_A_REPTOS_COLLECTION, ARRAYSIZE(Cyberbots_A_REPTOS_COLLECTION) }, { L"RF-009 LIGHTNING", DESC_NODETYPE_TREE, (void*)Cyberbots_A_LIGHTNING_COLLECTION, ARRAYSIZE(Cyberbots_A_LIGHTNING_COLLECTION) }, { L"RF-027 JACKAL", DESC_NODETYPE_TREE, (void*)Cyberbots_A_JACKAL_COLLECTION, ARRAYSIZE(Cyberbots_A_JACKAL_COLLECTION) }, + { L"FZ-100 FORDY", DESC_NODETYPE_TREE, (void*)Cyberbots_A_FORDY_COLLECTION, ARRAYSIZE(Cyberbots_A_FORDY_COLLECTION) }, { L"FZ-202 TARANTULA", DESC_NODETYPE_TREE, (void*)Cyberbots_A_TARANTULA_COLLECTION, ARRAYSIZE(Cyberbots_A_TARANTULA_COLLECTION) }, + { L"FZ-900J KILLER BEE", DESC_NODETYPE_TREE, (void*)Cyberbots_A_KILLERBEE_COLLECTION, ARRAYSIZE(Cyberbots_A_KILLERBEE_COLLECTION) }, + { L"GP-N1 GULDIN", DESC_NODETYPE_TREE, (void*)Cyberbots_A_GULDIN_COLLECTION, ARRAYSIZE(Cyberbots_A_GULDIN_COLLECTION) }, + { L"GP-V4 VISE", DESC_NODETYPE_TREE, (void*)Cyberbots_A_VISE_COLLECTION, ARRAYSIZE(Cyberbots_A_VISE_COLLECTION) }, { L"GP-D2 CYCLONE", DESC_NODETYPE_TREE, (void*)Cyberbots_A_CYCLONE_COLLECTION, ARRAYSIZE(Cyberbots_A_CYCLONE_COLLECTION) }, + { L"P-10033 GAITS", DESC_NODETYPE_TREE, (void*)Cyberbots_A_GAITS_COLLECTION, ARRAYSIZE(Cyberbots_A_GAITS_COLLECTION) }, + + { L"S-008 SUPER-8", DESC_NODETYPE_TREE, (void*)Cyberbots_A_SUPER8_COLLECTION, ARRAYSIZE(Cyberbots_A_SUPER8_COLLECTION) }, + { L"UVA-02 HELION", DESC_NODETYPE_TREE, (void*)Cyberbots_A_HELION_COLLECTION, ARRAYSIZE(Cyberbots_A_HELION_COLLECTION) }, { L"X-O WARLOCK", DESC_NODETYPE_TREE, (void*)Cyberbots_A_WARLOCK_COLLECTION, ARRAYSIZE(Cyberbots_A_WARLOCK_COLLECTION) }, { L"UNKNOWN 404", DESC_NODETYPE_TREE, (void*)Cyberbots_A_404_COLLECTION, ARRAYSIZE(Cyberbots_A_404_COLLECTION) }, diff --git a/palmod/Game/GameClass.cpp b/palmod/Game/GameClass.cpp index 615103f7..a1c1f1c9 100644 --- a/palmod/Game/GameClass.cpp +++ b/palmod/Game/GameClass.cpp @@ -1495,75 +1495,118 @@ BOOL CGameClass::_UpdatePalImg(const sDescTreeNode* pGameUnits, int* rgExtraCoun ClearSetImgTicket(pImgArray); } - else if (paletteDataSet->pPalettePairingInfo->nPalettesToJoin == 3) + else if ((paletteDataSet->pPalettePairingInfo->nPalettesToJoin == 3) || + (paletteDataSet->pPalettePairingInfo->nPalettesToJoin == 4) || + (paletteDataSet->pPalettePairingInfo->nPalettesToJoin == 5)) { - const INT8 nPeerPaletteDistance1 = paletteDataSet->pPalettePairingInfo->nNodeIncrementToPartner; - const INT8 nPeerPaletteDistance2 = paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo2ndPartner; - const sGame_PaletteDataset* paletteDataSetToJoin1 = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + nPeerPaletteDistance1, ppExtraDef); - const sGame_PaletteDataset* paletteDataSetToJoin2 = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + nPeerPaletteDistance2, ppExtraDef); - fShouldUseAlternateLoadLogic = true; + std::vector vsPaletteDataSetToJoin; + std::vector vnPeerPaletteDistances; + bool fAllNodesFound = true; - ClearSetImgTicket( - CreateImgTicket(paletteDataSet->indexImgToUse, paletteDataSet->indexOffsetToUse, - CreateImgTicket(paletteDataSetToJoin1->indexImgToUse, paletteDataSetToJoin1->indexOffsetToUse, - CreateImgTicket(paletteDataSetToJoin2->indexImgToUse, paletteDataSetToJoin2->indexOffsetToUse) - )) - ); - - //Set each palette - sDescNode* JoinedNode[] = { - GetMainTree()->GetDescNode(Node01, Node02, Node03, -1), - GetMainTree()->GetDescNode(Node01, Node02, Node03 + nPeerPaletteDistance1, -1), - GetMainTree()->GetDescNode(Node01, Node02, Node03 + nPeerPaletteDistance2, -1) - }; - - //Set each palette - CreateDefPal(JoinedNode[0], 0); - CreateDefPal(JoinedNode[1], 1); - CreateDefPal(JoinedNode[2], 2); - - SetSourcePal(0, NodeGet->uUnitId, nSrcStart, nSrcAmt, nNodeIncrement); - SetSourcePal(1, NodeGet->uUnitId, nSrcStart + nPeerPaletteDistance1, nSrcAmt, nNodeIncrement); - SetSourcePal(2, NodeGet->uUnitId, nSrcStart + nPeerPaletteDistance2, nSrcAmt, nNodeIncrement); - } - else if (paletteDataSet->pPalettePairingInfo->nPalettesToJoin == 4) - { - const INT8 nPeerPaletteDistance1 = paletteDataSet->pPalettePairingInfo->nNodeIncrementToPartner; - const INT8 nPeerPaletteDistance2 = paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo2ndPartner; - const INT8 nPeerPaletteDistance3 = paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo3rdPartner; - const sGame_PaletteDataset* paletteDataSetToJoin1 = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + nPeerPaletteDistance1, ppExtraDef); - const sGame_PaletteDataset* paletteDataSetToJoin2 = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + nPeerPaletteDistance2, ppExtraDef); - const sGame_PaletteDataset* paletteDataSetToJoin3 = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + nPeerPaletteDistance3, ppExtraDef); - fShouldUseAlternateLoadLogic = true; + for (int nPairIndex = 0; nPairIndex < paletteDataSet->pPalettePairingInfo->nPalettesToJoin; nPairIndex++) + { + switch (nPairIndex) + { + default: + // Fail + fAllNodesFound = false; + __fallthrough; + case 0: + vnPeerPaletteDistances.push_back(0); + break; + case 1: + vnPeerPaletteDistances.push_back(paletteDataSet->pPalettePairingInfo->nNodeIncrementToPartner); + break; + case 2: + vnPeerPaletteDistances.push_back(paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo2ndPartner); + break; + case 3: + vnPeerPaletteDistances.push_back(paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo3rdPartner); + break; + case 4: + vnPeerPaletteDistances.push_back(paletteDataSet->pPalettePairingInfo->nOverallNodeIncrementTo4thPartner); + break; + } + + const sGame_PaletteDataset* paletteDataSetToJoin = _GetSpecificPalette(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId + vnPeerPaletteDistances[nPairIndex], ppExtraDef); + + if (paletteDataSetToJoin) + { + vsPaletteDataSetToJoin.push_back(paletteDataSetToJoin); + } + else + { + fAllNodesFound = false; + } + } + + std::vector vsJoinedNodes; + + for (int nNodeIndex = 0; nNodeIndex < paletteDataSet->pPalettePairingInfo->nPalettesToJoin; nNodeIndex++) + { + sDescNode* sSearchedNode = nullptr; + + // We need to readjust the nodes here. + UINT16 nNodeSize = _GetNodeSizeFromPaletteId(pGameUnits, rgExtraCount, nNormalUnitCount, nExtraUnitLocation, NodeGet->uUnitId, NodeGet->uPalId, ppExtraDef); + UINT16 nAdjustedCollectionIndex = Node02; + INT32 nAdjustedButtonIndex = Node03 + vnPeerPaletteDistances[nNodeIndex]; + + while (nAdjustedButtonIndex >= 0) + { + sSearchedNode = GetMainTree()->GetDescNode(Node01, nAdjustedCollectionIndex, nAdjustedButtonIndex, -1); + + if (sSearchedNode) + { + break; + } + + // This palette isn't in this node: walk to the next available node for this unit. + nAdjustedButtonIndex -= nNodeSize; + nAdjustedCollectionIndex++; + } - ClearSetImgTicket( - CreateImgTicket(paletteDataSet->indexImgToUse, paletteDataSet->indexOffsetToUse, - CreateImgTicket(paletteDataSetToJoin1->indexImgToUse, paletteDataSetToJoin1->indexOffsetToUse, - CreateImgTicket(paletteDataSetToJoin2->indexImgToUse, paletteDataSetToJoin2->indexOffsetToUse, - CreateImgTicket(paletteDataSetToJoin3->indexImgToUse, paletteDataSetToJoin3->indexOffsetToUse) - ))) - ); - - //Set each palette - sDescNode* JoinedNode[] = { - GetMainTree()->GetDescNode(Node01, Node02, Node03, -1), - GetMainTree()->GetDescNode(Node01, Node02, Node03 + nPeerPaletteDistance1, -1), - GetMainTree()->GetDescNode(Node01, Node02, Node03 + nPeerPaletteDistance2, -1), - GetMainTree()->GetDescNode(Node01, Node02, Node03 + nPeerPaletteDistance3, -1) - }; - - //Set each palette - CreateDefPal(JoinedNode[0], 0); - CreateDefPal(JoinedNode[1], 1); - CreateDefPal(JoinedNode[2], 2); - CreateDefPal(JoinedNode[3], 3); - - SetSourcePal(0, NodeGet->uUnitId, nSrcStart, nSrcAmt, nNodeIncrement); - SetSourcePal(1, NodeGet->uUnitId, nSrcStart + nPeerPaletteDistance1, nSrcAmt, nNodeIncrement); - SetSourcePal(2, NodeGet->uUnitId, nSrcStart + nPeerPaletteDistance2, nSrcAmt, nNodeIncrement); - SetSourcePal(3, NodeGet->uUnitId, nSrcStart + nPeerPaletteDistance3, nSrcAmt, nNodeIncrement); + if (sSearchedNode) + { + vsJoinedNodes.push_back(sSearchedNode); + } + else + { + fAllNodesFound = false; + } + } + + if (fAllNodesFound) + { + fShouldUseAlternateLoadLogic = true; + + std::vector vsImagePairs; + sImgTicket* pPreviousImage = nullptr; + + for (int nNodeIndex = (paletteDataSet->pPalettePairingInfo->nPalettesToJoin - 1); nNodeIndex >= 0; nNodeIndex--) + { + sImgTicket* pThisImage = CreateImgTicket(vsPaletteDataSetToJoin[nNodeIndex]->indexImgToUse, vsPaletteDataSetToJoin[nNodeIndex]->indexOffsetToUse, pPreviousImage); + + vsImagePairs.push_back(pThisImage); + + pPreviousImage = pThisImage; + } + + ClearSetImgTicket(vsImagePairs[(paletteDataSet->pPalettePairingInfo->nPalettesToJoin - 1)]); + + for (int nPairIndex = 0; nPairIndex < paletteDataSet->pPalettePairingInfo->nPalettesToJoin; nPairIndex++) + { + //Set each palette + CreateDefPal(vsJoinedNodes[nPairIndex], nPairIndex); + + SetSourcePal(nPairIndex, NodeGet->uUnitId, nSrcStart + vnPeerPaletteDistances[nPairIndex], nSrcAmt, nNodeIncrement); + } + } + else + { + OutputDebugString(L"ERROR: Invalid palette pairing requested. You probably want to check the linkage here.\n"); + } } - else + else // Old two pair style: this still allows for offset shifts which we're mostly not using in current previews { int nXOffs = paletteDataSet->pPalettePairingInfo->nXOffs; int nYOffs = paletteDataSet->pPalettePairingInfo->nYOffs; diff --git a/palmod/Game/GameDef.h b/palmod/Game/GameDef.h index 95a012e1..6e223724 100644 --- a/palmod/Game/GameDef.h +++ b/palmod/Game/GameDef.h @@ -375,6 +375,7 @@ struct stPairedPaletteInfo int nPalettesToJoin = 2; int nOverallNodeIncrementTo2ndPartner = 2; int nOverallNodeIncrementTo3rdPartner = 3; + int nOverallNodeIncrementTo4thPartner = 4; }; struct sGame_PaletteDataset @@ -416,16 +417,26 @@ const stPairedPaletteInfo pairPreviousFlipped2 = { -2, 0, 0, true }; const stPairedPaletteInfo pairNextAndNext = { 1, 0, 0, false, 3 }; // triple display... requires special handling in code const stPairedPaletteInfo pairNextAndNextSkipped = { 1, 0, 0, false, 3, 3 }; // triple display... requires special handling in code +const stPairedPaletteInfo pairNextAndNext6 = { 1, 0, 0, false, 3, 6 }; // triple display... requires special handling in code +const stPairedPaletteInfo pairNextAndNext9 = { 1, 0, 0, false, 3, 9 }; // triple display... requires special handling in code +const stPairedPaletteInfo pairNextAndNext12 = { 1, 0, 0, false, 3, 12 }; // triple display... requires special handling in code const stPairedPaletteInfo pairNextAndNext39 = { 1, 0, 0, false, 3, 39 }; // triple display... requires special handling in code const stPairedPaletteInfo pairNextAndNext41 = { 1, 0, 0, false, 3, 41 }; // triple display... requires special handling in code const stPairedPaletteInfo pairNextAndNext54 = { 1, 0, 0, false, 3, 54 }; // triple display... requires special handling in code const stPairedPaletteInfo pairNextSkippedAndNextSkipped = { 2, 0, 0, false, 3, 4 }; // triple display... requires special handling in code +const stPairedPaletteInfo pairNext4AndNext = { 4, 0, 0, false, 3, 3 }; // triple display... requires special handling in code + const stPairedPaletteInfo pairNextAndNextAndNext = { 1, 0, 0, false, 4 }; // quad display... requires special handling in code const stPairedPaletteInfo pairNextAndNext32AndNextSkipped = { 1, 0, 0, false, 4, 32, 34 }; // quad display... requires special handling in code const stPairedPaletteInfo pairNextAndNext41AndNext = { 1, 0, 0, false, 4, 41, 42 }; // quad display... requires special handling in code const stPairedPaletteInfo pairNextSkippedAndNextSkippedAndNext = { 2, 0, 0, false, 4, 4, 5 }; // quad display... requires special handling in code -const stPairedPaletteInfo pairNext4AndNext = { 4, 0, 0, false, 3, 3 }; // triple display... requires special handling in code + +const stPairedPaletteInfo pairNextAndNextAndNextAndNext = { 1, 0, 0, false, 5, 2, 3, 4 }; // quad display... requires special handling in code +const stPairedPaletteInfo pairNextAndNextAndNextAndNext5 = { 1, 0, 0, false, 5, 2, 3, 8 }; // quad display... requires special handling in code +const stPairedPaletteInfo pairNextAndNextAndNextAndNext9 = { 1, 0, 0, false, 5, 2, 3, 12 }; // quad display... requires special handling in code +const stPairedPaletteInfo pairNextAndNextAndNextAndNext13 = { 1, 0, 0, false, 5, 2, 3, 16 }; // quad display... requires special handling in code + // Vs Series const stPairedPaletteInfo pairCapComNinjas = { 1, 28, -4 }; diff --git a/palmod/ImgOutDlg.cpp b/palmod/ImgOutDlg.cpp index 97599221..36d50f94 100644 --- a/palmod/ImgOutDlg.cpp +++ b/palmod/ImgOutDlg.cpp @@ -505,6 +505,7 @@ void CImgOutDlg::ExportToIndexedPNG(CString save_str, CString output_str, CStrin lodepng::State state; unsigned nPaletteOffset = 0; + bool fWrittenTheOneTransparencyColor = false; for (int nImageIndex = 0; nImageIndex < nImageCount; nImageIndex++) { @@ -558,8 +559,19 @@ void CImgOutDlg::ExportToIndexedPNG(CString save_str, CString output_str, CStrin { if (bTransPNG) { - lodepng_palette_add(&state.info_png.color, 0, 0, 0, 0); - lodepng_palette_add(&state.info_raw, 0, 0, 0, 0); + if (!fWrittenTheOneTransparencyColor) + { + fWrittenTheOneTransparencyColor = true; + lodepng_palette_add(&state.info_png.color, 0, 0, 0, 0); + lodepng_palette_add(&state.info_raw, 0, 0, 0, 0); + } + else + { + // Force alpha so that photoshop understands this PNG is indexed instead of RBG: + // Photoshop only accepts single-transparency indexed PNGs + lodepng_palette_add(&state.info_png.color, 0, 0, 0, 0xFF); + lodepng_palette_add(&state.info_raw, 0, 0, 0, 0xFF); + } } else {