Mercurial > mm7
diff PaletteManager.cpp @ 0:9c0607679772
init
author | Ritor1 |
---|---|
date | Sat, 12 Jan 2013 09:45:18 +0600 |
parents | |
children | 9824e2eeee30 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PaletteManager.cpp Sat Jan 12 09:45:18 2013 +0600 @@ -0,0 +1,880 @@ +#include "PaletteManager.h" +#include "Texture.h" +#include "Game.h" +#include "LOD.h" + +#include "mm7_data.h" + + + + +PaletteManager *pPaletteManager = new PaletteManager; + + + + +//----- (0048A643) -------------------------------------------------------- +bool __fastcall HSV2RGB(float *a1, float *a2, float *a3, float a4, float a5, float a6) +{ + float *v6; // ebx@1 + float *v7; // edi@1 + float *v8; // esi@1 + double v9; // st7@5 + signed __int64 v10; // qax@5 + double v11; // st7@5 + double v12; // st5@5 + int v13; // eax@6 + int v14; // eax@7 + int v15; // eax@8 + int v16; // eax@9 + float v17; // eax@11 + float a3a; // [sp+1Ch] [bp+8h]@14 + float a4b; // [sp+20h] [bp+Ch]@5 + float a4c; // [sp+20h] [bp+Ch]@5 + float a4a; // [sp+20h] [bp+Ch]@5 + + v6 = a3; + v7 = a2; + v8 = a1; + if ( a5 == 0.0 ) + { + *a3 = a6; + *a2 = a6; + *a1 = a6; + goto LABEL_20; + } + if ( a4 == 360.0 ) + a4 = 0.0; + v9 = a4 * 0.01666666666666667; + a4b = v9; + floor(v9); + v10 = (signed __int64)v9; + a4c = a4b - (double)(signed int)(signed __int64)v9; + v11 = (1.0 - a5) * a6; + v12 = (1.0 - a4c * a5) * a6; + a4a = (1.0 - (1.0 - a4c) * a5) * a6; + if ( (int)v10 ) + { + v13 = v10 - 1; + if ( v13 ) + { + v14 = v13 - 1; + if ( v14 ) + { + v15 = v14 - 1; + if ( v15 ) + { + v16 = v15 - 1; + if ( v16 ) + { + if ( v16 != 1 ) + goto LABEL_20; + *v8 = a6; + v17 = v12; + *v7 = v11; + goto LABEL_12; + } + *(int *)v8 = LODWORD(a4a); + *v7 = v11; + } + else + { + *v8 = v11; + a3a = v12; + *(int *)v7 = LODWORD(a3a); + } + v17 = a6; + } + else + { + *v8 = v11; + *(int *)v7 = LODWORD(a6); + v17 = a4a; + } +LABEL_12: + *(int *)v6 = LODWORD(v17); + goto LABEL_20; + } + *v8 = v12; + *v7 = a6; + } + else + { + *v8 = a6; + *(int *)v7 = LODWORD(a4a); + } + *a3 = v11; +LABEL_20: + if ( *v8 > 1.0 ) + *v8 = 1.0; + if ( *v7 > 1.0 ) + *v7 = 1.0; + if ( *v6 > 1.0 ) + *v6 = 1.0; + if ( *v8 < 0.0 ) + *v8 = 0.0; + if ( *v7 < 0.0 ) + *v7 = 0.0; + if ( *v6 < 0.0 ) + *v6 = 0.0; + return 1; +} + +//----- (0048A7AA) -------------------------------------------------------- +void __fastcall RGB2HSV(float *a1, float *a2, float a3, float a4, float a5, float *a6) +{ + double v6; // st7@2 + double v7; // st6@7 + double v8; // st5@12 + double v9; // st7@15 + double v10; // st7@17 + double v11; // st7@21 + __int16 v12; // fps@21 + unsigned __int8 v13; // c0@21 + unsigned __int8 v14; // c2@21 + float a6a; // [sp+14h] [bp+14h]@16 + + if ( a3 <= (double)a4 ) + v6 = a4; + else + v6 = a3; + if ( v6 < a5 ) + v6 = a5; + if ( a3 <= (double)a4 ) + v7 = a3; + else + v7 = a4; + if ( v7 > a5 ) + v7 = a5; + *a6 = v6; + if ( v6 == 0.0 ) + v8 = 0.0; + else + v8 = (v6 - v7) / v6; + *a2 = v8; + if ( v8 == 0.0 ) + { + v9 = 0.0; +LABEL_23: + *a1 = v9; + return; + } + a6a = v6 - v7; + if ( a3 == v6 ) + { + v10 = (a4 - a5) / a6a; + } + else + { + if ( a4 == v6 ) + v10 = (a5 - a3) / a6a + 2.0; + else + v10 = (a3 - a4) / a6a + 4.0; + } + //*a1 = v10; + //v11 = *a1 * 60.0; + //UNDEF(v12); + *a1 = v10 * 60.0; + if (*a1 < 0) + { + *a1 += 360.0; + } +} + + + +//----- (0048A8A3) -------------------------------------------------------- +int PaletteManager::LockAll() +{ + int *v1; // edx@1 + signed int v2; // eax@1 + + v1 = &this->pPaletteIDs[1]; + v2 = 1; + do + { + if ( *v1 ) + this->_num_locked = v2 + 1; + ++v2; + ++v1; + } + while ( v2 < 50 ); + return this->_num_locked; +} + +//----- (0048A8CC) -------------------------------------------------------- +int PaletteManager::LockTestAll() +{ + char *v1; // edx@1 + signed int v2; // eax@1 + + v1 = (char *)&this->pPaletteIDs[1]; + v2 = 1; + do + { + if ( *(int *)v1 ) + this->_pal_lock_test = v2 + 1; + ++v2; + v1 += 4; + } + while ( v2 < 50 ); + return this->_pal_lock_test; +} + + +//----- (0048A8F5) -------------------------------------------------------- +void PaletteManager::SetColorChannelInfo(int uNumRBits, int uNumGBits, int uNumBBits) +{ + PaletteManager *v4; // esi@1 + int v5; // edi@1 + int v6; // eax@1 + int v7; // ebx@1 + + v4 = this; + this->uNumTargetRBits = uNumRBits; + this->uNumTargetGBits = uNumGBits; + v5 = this->uNumTargetGBits; + this->uNumTargetBBits = uNumBBits; + v6 = MakeColorMaskFromBitDepth(uNumRBits); + v7 = v4->uNumTargetBBits; + v4->uTargetRMask = v6 << (v5 + v4->uNumTargetBBits); + v4->uTargetGMask = MakeColorMaskFromBitDepth(v5) << v7; + v4->uTargetBMask = MakeColorMaskFromBitDepth(v7); +} + + +//----- (00489BE0) -------------------------------------------------------- +int PaletteManager::CalcPalettes_LUT(int a2) +{ + PaletteManager *v2; // esi@1 + char *v3; // edi@1 + signed int v4; // ebx@4 + float v5; // ST08_4@5 + float v6; // ST04_4@5 + float v7; // ST00_4@5 + int v8; // eax@7 + float *v9; // edx@8 + float *v10; // ST0C_4@8 + float *v11; // ecx@8 + int v12; // ebx@8 + int v13; // eax@8 + float v14; // ebx@8 + float v15; // ST08_4@8 + float v16; // ST04_4@8 + float v17; // ST00_4@8 + unsigned __int8 v18; // sf@8 + unsigned __int8 v19; // of@8 + int v20; // eax@10 + double v21; // st5@11 + float v22; // ST0C_4@13 + unsigned int v23; // eax@13 + __int16 v24; // bx@16 + int v25; // eax@16 + double v26; // st7@20 + float v27; // ST0C_4@22 + unsigned int v28; // eax@22 + __int16 v29; // bx@25 + __int16 *v30; // eax@25 + int v31; // eax@27 + double v32; // st5@28 + float v33; // ST0C_4@30 + float v34; // ST08_4@30 + unsigned int v35; // ebx@30 + signed __int64 v36; // qax@33 + signed int v37; // edx@33 + char v38; // cl@33 + unsigned int v39; // ebx@33 + signed int v40; // edi@33 + unsigned int v41; // ecx@33 + unsigned int v42; // ecx@35 + int v43; // eax@39 + signed int v44; // edx@39 + unsigned __int8 v45; // al@40 + double v46; // st6@43 + signed int v47; // eax@43 + int v48; // eax@45 + double v49; // st6@47 + float v50; // ST08_4@49 + unsigned int v51; // ebx@49 + int v52; // edi@55 + int v53; // ebx@55 + signed __int64 v54; // qax@55 + double v55; // st7@56 + unsigned int v56; // ecx@57 + unsigned int v57; // ecx@59 + //int v58; // edx@61 + unsigned int v59; // ecx@61 + unsigned int v60; // eax@63 + char v61; // cl@63 + int result; // eax@63 + float v63[256]; // [sp+1Ch] [bp-C38h]@5 + float v64[256]; // [sp+41Ch] [bp-838h]@5 + int a6[256]; // [sp+81Ch] [bp-438h]@5 + int v66; // [sp+C1Ch] [bp-38h]@43 + float v67; // [sp+C20h] [bp-34h]@43 + float v68; // [sp+C24h] [bp-30h]@43 + PaletteManager *v69; // [sp+C28h] [bp-2Ch]@9 + float v70; // [sp+C2Ch] [bp-28h]@43 + double v71; // [sp+C30h] [bp-24h]@10 + int v72; // [sp+C38h] [bp-1Ch]@9 + int v73; // [sp+C3Ch] [bp-18h]@9 + int i; // [sp+C40h] [bp-14h]@7 + float v75; // [sp+C44h] [bp-10h]@5 + float a2a; // [sp+C48h] [bp-Ch]@13 + float a1; // [sp+C4Ch] [bp-8h]@13 + float a3; // [sp+C50h] [bp-4h]@13 + signed int v79; // [sp+C5Ch] [bp+8h]@33 + signed int v80; // [sp+C5Ch] [bp+8h]@43 + int v81; // [sp+C5Ch] [bp+8h]@57 + + v2 = this; + v3 = (char *)this + 768 * a2; + if (pPalette_tintColor[0] || pPalette_tintColor[1] || pPalette_tintColor[2]) + { + v8 = 0; + i = 0; + do + { + v9 = (float *)((char *)v63 + v8); + v10 = (float *)((char *)a6 + v8); + v11 = (float *)((char *)v64 + v8); + v12 = pPalette_tintColor[1]; + LODWORD(v75) = pPalette_tintColor[2] + (unsigned __int8)v3[2]; + v13 = v12 + (unsigned __int8)v3[1]; + LODWORD(v14) = (unsigned __int8)*v3; + v15 = (double)SLODWORD(v75) * 0.00196078431372549; + LODWORD(v75) = v13; + LODWORD(v75) = LODWORD(v14) + pPalette_tintColor[0]; + v16 = (double)v13 * 0.00196078431372549; + v17 = (double)SLODWORD(v75) * 0.00196078431372549; + RGB2HSV(v11, v9, v17, v16, v15, v10); + v3 += 3; + v8 = i + 4; + v19 = __OFSUB__(i + 4, 1024); + v18 = i - 1020 < 0; + i += 4; + } + while ( v18 ^ v19 ); + } + else + { + v4 = 0; + do + { + LODWORD(v75) = (unsigned __int8)v3[2]; + v5 = (double)SLODWORD(v75) * 0.00392156862745098; + LODWORD(v75) = (unsigned __int8)v3[1]; + v6 = (double)SLODWORD(v75) * 0.00392156862745098; + LODWORD(v75) = (unsigned __int8)*v3; + v7 = (double)SLODWORD(v75) * 0.00392156862745098; + RGB2HSV(&v64[v4], &v63[v4], v7, v6, v5, (float *)&a6[v4]); + ++v4; + v3 += 3; + } + while ( v4 < 256 ); + } + v69 = (PaletteManager *)((char *)v2 + 16384 * a2); + v72 = 0; + v73 = (int)v69->pPalette1; + do + { + v20 = 0; + i = 0; + v71 = 1.0 - (double)v72 * 0.03225806451612903; + do + { + v21 = *(float *)((char *)a6 + v20) * v71; + if ( v21 < 0.0 ) + v21 = 0.0; + v22 = v21; + HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v20), *(float *)((char *)v63 + v20), v22); + v23 = v2->uNumTargetGBits; + if ( v23 == 6 ) + { + a1 = a1 * 31.0; + a2a = a2a * 62.0; + a3 = a3 * 31.0; + } + else + { + a1 = a1 * 31.0; + a2a = a2a * 31.0; + a3 = a3 * 31.0; + } + v24 = (unsigned __int64)(signed __int64)a3 | ((unsigned __int16)(signed __int64)a2a << v2->uNumTargetBBits) | (unsigned __int16)((unsigned __int16)(signed __int64)a1 << (v2->uNumTargetBBits + v23)); + v25 = v73; + v73 += 2; + *(short *)v25 = v24; + v20 = i + 4; + v19 = __OFSUB__(i + 4, 1024); + v18 = i - 1020 < 0; + i += 4; + } + while ( v18 ^ v19 ); + ++v72; + } + while ( v72 < 32 ); + v72 = 0; + v73 = (int)v69->field_199600_palettes; + do + { + i = 0; + v71 = 1.0 - (double)v72 * 0.03225806451612903; + do + { + v26 = *(float *)&a6[i] * v71; + if ( v26 < 0.0 ) + v26 = 0.0; + v27 = v26; + HSV2RGB(&a1, &a2a, &a3, 1.0, 1.0, v27); + v28 = v2->uNumTargetGBits; + if ( v28 == 6 ) + { + a1 = a1 * 31.0; + a2a = a2a * 62.0; + a3 = a3 * 31.0; + } + else + { + a1 = a1 * 31.0; + a2a = a2a * 31.0; + a3 = a3 * 31.0; + } + v29 = (unsigned __int64)(signed __int64)a3 | ((unsigned __int16)(signed __int64)a2a << v2->uNumTargetBBits) | (unsigned __int16)((unsigned __int16)(signed __int64)a1 << (v2->uNumTargetBBits + v28)); + v30 = (__int16 *)v73; + ++i; + v73 += 2; + v19 = __OFSUB__(i, 256); + v18 = i - 256 < 0; + *v30 = v29; + } + while ( v18 ^ v19 ); + ++v72; + } + while ( v72 < 32 ); + v73 = (int)((char *)v2 + 512 * (a2 + 4875)); + v31 = 0; + i = 0; + do + { + v32 = (*(float *)((char *)a6 + v31) - 0.8) * 0.8387096774193549 + 0.8; + if ( v32 < 0.0 ) + v32 = 0.0; + v33 = v32; + v34 = *(float *)((char *)v63 + v31) * 0.7034339229968783; + HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v31), v34, v33); + v35 = v2->uNumTargetGBits; + if ( v35 == 6 ) + { + a1 = a1 * 31.0; + a2a = a2a * 62.0; + a3 = a3 * 31.0; + } + else + { + a1 = a1 * 31.0; + a2a = a2a * 31.0; + a3 = a3 * 31.0; + } + v36 = (signed __int64)((a1 + a2a + a3) * 0.3333333333333333 * 8.0); + v37 = (signed int)v36 >> (8 - v2->uNumTargetRBits); + v38 = 8 - v35; + v39 = v2->uNumTargetBBits; + v40 = (signed int)v36 >> v38; + v41 = v2->uNumTargetRBits; + v79 = (signed int)v36 >> (8 - v39); + if ( v37 > (1 << v41) - 1 ) + v37 = (1 << v41) - 1; + v42 = v2->uNumTargetGBits; + if ( v40 > (1 << v42) - 1 ) + v40 = (1 << v42) - 1; + if ( v79 > (1 << v39) - 1 ) + v79 = (1 << v39) - 1; + v43 = v73; + v44 = v37 << (v39 + v2->uNumTargetGBits); + v73 += 2; + *(short *)v43 = v79 | ((short)v40 << v39) | (unsigned __int16)v44; + v31 = i + 4; + v19 = __OFSUB__(i + 4, 1024); + v18 = i - 1020 < 0; + i += 4; + } + while ( v18 ^ v19 ); + v45 = pPalette_mistColor[0]; + if (v45 || pPalette_mistColor[1] || pPalette_mistColor[2]) + { + v46 = (double)v45; + v80 = pPalette_mistColor[1]; + v47 = pPalette_mistColor[2]; + v70 = v46 * 0.00392156862745098; + *((float *)&v71 + 1) = (double)v80 * 0.00392156862745098; + v75 = (double)v47 * 0.00392156862745098; + RGB2HSV(&v68, &v67, v70, *((float *)&v71 + 1), v75, (float *)&v66); + } + v72 = 0; + v73 = (int)v69->field_D1600; + + + do + { + v48 = 0; + for ( i = 0; ; v48 = i ) + { + v49 = *(float *)((char *)v63 + v48); + if ( v49 < 0.0 ) + v49 = 0.0; + v50 = v49; + HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v48), v50, *(float *)((char *)a6 + v48)); + v51 = v2->uNumTargetGBits; + if ( v51 == 6 ) + { + a1 = a1 * 31.0; + a2a = a2a * 62.0; + a3 = a3 * 31.0; + } + else + { + a1 = a1 * 31.0; + a2a = a2a * 31.0; + a3 = a3 * 31.0; + } + if (pPalette_mistColor[0] || pPalette_mistColor[1] || pPalette_mistColor[2]) + { + v55 = (double)v72 * 0.03225806451612903; + v52 = (signed __int64)((double)(1 << v2->uNumTargetRBits) * v70 * v55 + a1 * (1.0 - v55)); + v53 = (signed __int64)((double)(1 << v51) * *((float *)&v71 + 1) * v55 + a2a * (1.0 - v55)); + v54 = (signed __int64)((double)(1 << v2->uNumTargetBBits) * v75 * v55 + a3 * (1.0 - v55)); + } + else + { + v52 = (signed __int64)a1; + v53 = (signed __int64)a2a; + v54 = (signed __int64)a3; + } + v56 = v2->uNumTargetRBits; + v81 = v54; + if ( v52 > (1 << v56) - 1 ) + v52 = (1 << v56) - 1; + v57 = v2->uNumTargetGBits; + if ( v53 > (1 << v57) - 1 ) + v53 = (1 << v57) - 1; + HIDWORD(v54) = v2->uNumTargetBBits; + v59 = v2->uNumTargetBBits; + if ( (signed int)v54 > (1 << v59) - 1 ) + v81 = (1 << v59) - 1; + v60 = v2->uNumTargetGBits; + i += 4; + v61 = uNumTargetBBits + v60; + result = v73; + v73 += 2; + v19 = __OFSUB__(i, 1024); + v18 = i - 1024 < 0; + *(short *)result = v81 | ((short)v53 << uNumTargetBBits) | (v52 << v61); + if ( !(v18 ^ v19) ) + break; + } + ++v72; + } + while ( v72 < 32 ); + return result; +} + + +//----- (0048A300) -------------------------------------------------------- +PaletteManager::PaletteManager(): + uNumTargetRBits(0), uNumTargetGBits(0),uNumTargetBBits(0) +{ + for (uint i = 0; i < 256; ++i) + { + pBaseColors[0][i][0] = i; + pBaseColors[0][i][1] = i; + pBaseColors[0][i][2] = i; + } + + CalcPalettes_LUT(0); + memset(pPaletteIDs, 0, sizeof(pPaletteIDs)); +} + +//----- (0048A336) -------------------------------------------------------- +// make grayscale palette at 0, clear all palettes ids that aren't locked +int PaletteManager::ResetNonLocked() +{ + PaletteManager *v1; // esi@1 + signed int v2; // ecx@1 + int v3; // eax@1 + signed int result; // eax@3 + void *v5; // edi@4 + int v6; // ecx@4 + + v1 = this; + v2 = 0; + v3 = (int)&v1->pBaseColors[0][0][1]; + do + { + *(char *)(v3 + 1) = v2; + *(char *)v3 = v2; + *(char *)(v3 - 1) = v2++; + v3 += 3; + } + while ( v2 < 256 ); + CalcPalettes_LUT(0); + result = v1->_num_locked; + if ( result < 50 ) + { + v5 = &v1->pPaletteIDs[result]; + v6 = 50 - result; + result = 0; + memset(v5, 0, 4 * v6); + } + return result; +} + +//----- (0048A379) -------------------------------------------------------- +// make grayscale palette at 0, clear all palettes ids that aren't in "lock_test" +int PaletteManager::ResetNonTestLocked() +{ + PaletteManager *v1; // esi@1 + signed int v2; // ecx@1 + int v3; // eax@1 + signed int result; // eax@3 + void *v5; // edi@4 + int v6; // ecx@4 + + v1 = this; + v2 = 0; + v3 = (int)&v1->pBaseColors[0][0][1]; + do + { + *(char *)(v3 + 1) = v2; + *(char *)v3 = v2; + *(char *)(v3 - 1) = v2++; + v3 += 3; + } + while ( v2 < 256 ); + CalcPalettes_LUT(0); + result = v1->_pal_lock_test; + if ( result < 50 ) + { + v5 = &v1->pPaletteIDs[result]; + v6 = 50 - result; + result = 0; + memset(v5, 0, 4 * v6); + } + return result; +} + +//----- (0048A3BC) -------------------------------------------------------- +int PaletteManager::LoadPalette(unsigned int uPaletteID) +{ + unsigned int *v2; // ecx@1 + signed int result; // eax@1 + signed int v4; // esi@6 + double v5; // st7@7 + double v6; // st7@12 + double v7; // st6@17 + signed __int64 v8; // qax@17 + double v9; // st6@17 + char v10[768]; // [sp+18h] [bp-388h]@6 + //char v11; // [sp+19h] [bp-387h]@17 + //char v12[766]; // [sp+1Ah] [bp-386h]@17 + char Source[32]; // [sp+360h] [bp-40h]@4 + PaletteManager *v15; // [sp+380h] [bp-20h]@1 + float v16; // [sp+384h] [bp-1Ch]@7 + int v17; // [sp+388h] [bp-18h]@6 + float v18; // [sp+38Ch] [bp-14h]@7 + float a2a; // [sp+390h] [bp-10h]@7 + float a1; // [sp+394h] [bp-Ch]@7 + int a6; // [sp+398h] [bp-8h]@7 + int a3; // [sp+39Ch] [bp-4h]@7 + + v15 = this; + v2 = (unsigned int *)&this->pPaletteIDs[1]; + result = 1; + while ( *v2 != uPaletteID ) + { + ++result; + ++v2; + if ( result >= 50 ) + { + sprintf(Source, "pal%03i", uPaletteID); + + Texture tex; // [sp+318h] [bp-88h]@4 + //Texture::Texture(&tex); + + if ( pBitmaps_LOD->LoadTextureFromLOD(&tex, Source, TEXTURE_24BIT_PALETTE) == 1 ) + { + v4 = 0; + v17 = 1 - (int)&v10; + do + { + LODWORD(a1) = tex.pPalette24[v4]; + a1 = (double)SLODWORD(a1) * 0.0039215689; + LODWORD(a2a) = (unsigned __int8)*(&v10 + v4 + v17 + (unsigned int)tex.pPalette24); + a2a = (double)SLODWORD(a2a) * 0.0039215689; + a3 = tex.pPalette24[v4 + 2]; + *(float *)&a3 = (double)a3 * 0.0039215689; + RGB2HSV(&v16, &v18, a1, a2a, *(float *)&a3, (float *)&a6); + v5 = *(float *)&a6 * 1.1; + if ( v5 >= 0.0 && v5 >= 1.0 ) + { + v5 = 1.0; + } + else + { + if ( v5 < 0.0 ) + v5 = 0.0; + } + *(float *)&a6 = v5; + v6 = v18 * 0.64999998; + if ( v6 >= 0.0 && v6 >= 1.0 ) + { + v6 = 1.0; + } + else + { + if ( v6 < 0.0 ) + v6 = 0.0; + } + v18 = v6; + HSV2RGB(&a1, &a2a, (float *)&a3, v16, v18, *(float *)&a6); + v7 = a2a * 255.0; + v10[v4] = (signed __int64)(a1 * 255.0); + v8 = (signed __int64)v7; + v9 = *(float *)&a3 * 255.0; + v10[v4 + 1] = v8; + v10[v4 + 2] = (signed __int64)v9; + v4 += 3; + } + while ( v4 < 768 ); + tex.Release(); + result = v15->MakePaletteLUT(uPaletteID, v10); + } + else + { + result = 0; + } + return result; + } + } + return result; +} +// 48A3BC: using guessed type char var_386[766]; + +//----- (0048A5A4) -------------------------------------------------------- +int PaletteManager::MakePaletteLUT(int a2, char *entries) +{ + PaletteManager *v3; // edi@1 + signed int result; // eax@1 + int *v5; // ecx@1 + int v6; // eax@4 + int v7; // esi@4 + int v8; // eax@9 + signed int v9; // ecx@9 + int v10; // edx@9 + + v3 = this; + result = 0; + v5 = this->pPaletteIDs; + while ( *v5 != a2 ) + { + ++result; + ++v5; + if ( result >= 50 ) + { + v6 = (int)&v3->pPaletteIDs[1]; + v7 = 1; + while ( *(int *)v6 ) + { + ++v7; + v6 += 4; + if ( v7 >= 50 ) + return 0; + } + v8 = (int)((char *)v3 + 768 * v7); + v9 = 768; + v10 = (int)(entries - v8); + do + { + *(char *)v8 = *(char *)(v10 + v8); + ++v8; + --v9; + } + while ( v9 ); + v3->pPaletteIDs[v7] = a2; + CalcPalettes_LUT(v7); + return v7; + } + } + return result; +} + +//----- (0048A614) -------------------------------------------------------- +void PaletteManager::RecalculateAll() +{ + CalcPalettes_LUT(0); + + for (uint i = 1; i < 50; ++i) + if (pPaletteIDs[i]) + CalcPalettes_LUT(i); +} + + +//----- (0047BE67) -------------------------------------------------------- +unsigned __int16 *PaletteManager::Get(int a1) +{ + return (unsigned __int16 *)pPaletteManager->field_199600_palettes[a1]; +} + +//----- (0047BE72) -------------------------------------------------------- +unsigned __int16 *PaletteManager::Get_Mist_or_Red_LUT(int a1, int a2, char a3) +{ + int v3; // eax@4 + + if ( a3 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) + v3 = 32 * a1 + a2 + 3275; + else + v3 = 32 * a1 + a2 + 1675; + return (unsigned __int16 *)((char *)&pPaletteManager + 512 * v3); +} +// 4D864C: using guessed type char byte_4D864C; + + +//----- (0041F50D) -------------------------------------------------------- +unsigned __int16 *PaletteManager::Get_Dark_or_Red_LUT(int a1, int a2, char a3) +{ + int v3; // eax@4 + + if ( a3 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) + v3 = 32 * a1 + a2 + 3275; + else + v3 = 32 * a1 + a2 + 75; + return (unsigned __int16 *)((char *)&pPaletteManager + 512 * v3); +} +// 4D864C: using guessed type char byte_4D864C; + + +//----- (0047C30E) -------------------------------------------------------- +unsigned __int16 *PaletteManager::_47C30E_get_palette(int a1, char a2) +{ + char *result; // eax@4 + + if ( a2 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) + result = (char *)pPaletteManager->field_199600_palettes[a1]; + else + result = (char *)pPaletteManager->field_D1600[a1]; + return (unsigned __int16 *)result; +} + + +//----- (0047C33F) -------------------------------------------------------- +unsigned __int16 *PaletteManager::_47C33F_get_palette(int a1, char a2) +{ + unsigned __int16 *result; // eax@4 + + if ( a2 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) + result = (unsigned __int16 *)pPaletteManager->field_199600_palettes[a1]; + else + result = (unsigned __int16 *)pPaletteManager->pPalette1[a1]; + return result; +} +// 4D864C: using guessed type char byte_4D864C; \ No newline at end of file