Serious-Engine/Sources/GameMP/Map.cpp
Sébastien Noel 24c71a34dd Fix "Map Screen" when loading a level (no more black screen)
This happen when the engine do not have access to the map graphics
 from both games (ie: we didn't copy "SE1_10.gro")
 Should fix https://github.com/icculus/Serious-Engine/issues/51
2023-05-15 11:31:14 +02:00

742 lines
21 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
#include "StdAfx.h"
#include "LCDDrawing.h"
extern BOOL map_bIsFirstEncounter;
static CTextureObject atoIconsSE[13];
static CTextureObject atoIconsFE[15];
static CTextureObject _toPathDot;
static CTextureObject _toMapBcgLDFE;
static CTextureObject _toMapBcgLUFE;
static CTextureObject _toMapBcgRDFE;
static CTextureObject _toMapBcgRUFE;
static CTextureObject _toMapBcgLDSE;
static CTextureObject _toMapBcgLUSE;
static CTextureObject _toMapBcgRDSE;
static CTextureObject _toMapBcgRUSE;
PIX aIconCoordsSE[][2] =
{
{0, 0}, // 00: Last Episode
{168, 351}, // 01: Palenque 01
{42, 345}, // 02: Palenque 02
{41, 263}, // 03: Teotihuacan 01
{113, 300}, // 04: Teotihuacan 02
{334, 328}, // 05: Teotihuacan 03
{371, 187}, // 06: Ziggurat
{265, 111}, // 07: Atrium
{119, 172}, // 08: Gilgamesh
{0, 145}, // 09: Babel
{90, 30}, // 10: Citadel
{171, 11}, // 11: Land of Damned
{376, 0}, // 12: Cathedral
};
PIX aIconCoordsFE[][2] =
{
{175,404}, // 00: Hatshepsut
{60,381}, // 01: Sand Canyon
{50,300}, // 02: Ramses
{171,304}, // 03: Canyon
{190,225}, // 04: Waterfall
{303,305}, // 05: Oasis
{361,296}, // 06: Dunes
{362,222}, // 07: Suburbs
{321,211}, // 08: Sewers
{316,156}, // 09: Metropolis
{194,157}, // 10: Sphynx
{160,111}, // 11: Karnak
{167,61}, // 12: Luxor
{50,53}, // 13: Sacred
{185,0}, // 14: Pyramid
};
#define LASTEPISODE_BIT 0
#define PALENQUE01_BIT 1
#define PALENQUE02_BIT 2
#define TEOTIHUACAN01_BIT 3
#define TEOTIHUACAN02_BIT 4
#define TEOTIHUACAN03_BIT 5
#define ZIGGURAT_BIT 6
#define ATRIUM_BIT 7
#define GILGAMESH_BIT 8
#define BABEL_BIT 9
#define CITADEL_BIT 10
#define LOD_BIT 11
#define CATHEDRAL_BIT 12
#define HATSHEPSUT_BIT 0
#define SAND_BIT 1
#define RAMSES_BIT 2
#define CANYON_BIT 3
#define WATERFALL_BIT 4
#define OASIS_BIT 5
#define DUNES_BIT 6
#define SUBURBS_BIT 7
#define SEWERS_BIT 8
#define METROPOLIS_BIT 9
#define SPHYNX_BIT 10
#define KARNAK_BIT 11
#define LUXOR_BIT 12
#define SACRED_BIT 13
#define PYRAMID_BIT 14
INDEX aPathPrevNextLevelsSE[][2] =
{
{LASTEPISODE_BIT, PALENQUE01_BIT}, // 00
{PALENQUE01_BIT, PALENQUE02_BIT}, // 01
{PALENQUE02_BIT, TEOTIHUACAN01_BIT }, // 02
{TEOTIHUACAN01_BIT, TEOTIHUACAN02_BIT}, // 03
{TEOTIHUACAN02_BIT, TEOTIHUACAN03_BIT}, // 04
{TEOTIHUACAN03_BIT, ZIGGURAT_BIT}, // 05
{ZIGGURAT_BIT, ATRIUM_BIT}, // 06
{ATRIUM_BIT, GILGAMESH_BIT}, // 07
{GILGAMESH_BIT, BABEL_BIT}, // 08
{BABEL_BIT, CITADEL_BIT}, // 09
{CITADEL_BIT, LOD_BIT}, // 10
{LOD_BIT, CATHEDRAL_BIT}, // 11
};
INDEX aPathPrevNextLevelsFE[][2] =
{
{HATSHEPSUT_BIT, SAND_BIT}, // 00
{SAND_BIT, RAMSES_BIT}, // 01
{RAMSES_BIT, CANYON_BIT}, // 02
{CANYON_BIT, WATERFALL_BIT}, // 03
{CANYON_BIT, OASIS_BIT}, // 04
{WATERFALL_BIT, OASIS_BIT}, // 05
{OASIS_BIT, DUNES_BIT}, // 06
{DUNES_BIT, SUBURBS_BIT}, // 07
{SUBURBS_BIT, SEWERS_BIT}, // 08
{SEWERS_BIT, METROPOLIS_BIT}, // 09
{METROPOLIS_BIT, SPHYNX_BIT}, // 10
{SPHYNX_BIT, KARNAK_BIT}, // 11
{KARNAK_BIT, LUXOR_BIT}, // 12
{LUXOR_BIT, SACRED_BIT}, // 13
{SACRED_BIT, PYRAMID_BIT}, // 14
{LUXOR_BIT, PYRAMID_BIT}, // 15
};
PIX aPathDotsSE[][10][2] =
{
// 00: Palenque01 - Palenque02
{
{-1,-1},
},
// 01: Palenque01 - Palenque02
{
{211,440},
{193,447},
{175,444},
{163,434},
{152,423},
{139,418},
{-1,-1},
},
// 02: Palenque02 - Teotihuacan01
{
{100,372},
{102,363},
{108,354},
{113,345},
{106,338},
{-1,-1},
},
// 03: Teotihuacan01 - Teotihuacan02
{
{153,337},
{166,341},
{180,346},
{194,342},
{207,337},
{-1,-1},
},
// 04: Teotihuacan02 - Teotihuacan03
{
{279,339},
{287,347},
{296,352},
{307,365},
{321,367},
{335,362},
{-1,-1},
},
// 05: Teotihuacan03 - Ziggurat
{
{-1,-1},
},
// 06: Ziggurat - Atrium
{
{412,285},
{396,282},
{383,273},
{368,266},
{354,264},
{-1,-1},
},
// 07: Atrium - Gilgamesh
{
{276,255},
{262,258},
{248,253},
{235,245},
{222,240},
{-1,-1},
},
// 08: Gilgamesh - Babel
{
{152,245},
{136,248},
{118,253},
{100,251},
{85,246},
{69,243},
{-1,-1},
},
// 09: Babel - Citadel
{
{-1,-1},
},
// 10: Citadel - Lod
{
{190,130},
{204,126},
{215,119},
{232,116},
{241,107},
{-1,-1},
},
// 11: Lod - Cathedral
{
{330,108},
{341,117},
{353,126},
{364,136},
{377,146},
{395,147},
{-1,-1},
},
};
PIX aPathDotsFE[][10][2] =
{
// 00: Hatshepsut - Sand
{
{207,435},
{196,440},
{184,444},
{172,443},
{162,439},
{156,432},
{-1,-1},
},
// 01: Sand - Ramses
{
{115,388},
{121,382},
{128,377},
{136,371},
{-1,-1},
},
// 02: Ramses - Canyon
{
{148,368},
{159,370},
{169,374},
{177,379},
{187,381},
{200,380},
{211,376},
{-1,-1},
},
// 03: Canyon - Waterfall
{
{273,339},
{276,331},
{278,322},
{280,313},
{279,305},
{273,298},
{266,293},
{260,288},
{-1,-1},
},
// 04: Canyon - Oasis
{
{288,360},
{295,355},
{302,360},
{310,364},
{319,367},
{328,368},
{-1,-1},
},
// 05: Waterfall - Oasis
{
{294,279},
{302,282},
{310,287},
{316,294},
{320,302},
{323,310},
{327,318},
{332,326},
{337,333},
{-1,-1},
},
// 06: Oasis - Dunes
{
{384,360},
{394,358},
{405,353},
{414,347},
{421,339},
{426,329},
{-1,-1},
},
// 07: Dunes - Suburbs
{
{439,305},
{434,300},
{429,293},
{-1,-1},
},
// 08: Suburbs - Sewers
{
{403,250},
{402,244},
{401,238},
{398,232},
{-1,-1},
},
// 09: Sewers - Metropolis
{
{372,266},
{371,221},
{370,216},
{-1,-1},
},
// 10: Metropolis - Alley
{
{317,211},
{310,215},
{302,219},
{293,222},
{283,222},
{273,221},
{265,218},
{-1,-1},
},
// 11: Alley - Karnak
{
{260,189},
{259,181},
{255,174},
{249,168},
{241,165},
{233,164},
{-1,-1},
},
// 12: Karnak - Luxor
{
{228,143},
{228,136},
{226,129},
{221,123},
{-1,-1},
},
// 13: Luxor - Sacred
{
{175,101},
{169,106},
{162,111},
{154,113},
{145,113},
{136,112},
{-1,-1},
},
// 14: Sacred - Pyramid
{
{126,59},
{134,55},
{142,52},
{151,49},
{160,47},
{170,47},
{179,48},
{188,51},
{-1,-1},
},
// 15: Luxor - Pyramid
{
{212,71},
{217,66},
{225,63},
{234,63},
{244,63},
{253,62},
{261,59},
{-1,-1},
},
};
BOOL ObtainMapData(void)
{
try {
if(!map_bIsFirstEncounter) {
// the second encounter
atoIconsSE[ 0].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Book.tex"));
atoIconsSE[ 1].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level00.tex"));
atoIconsSE[ 2].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level01.tex"));
atoIconsSE[ 3].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level02.tex"));
atoIconsSE[ 4].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level03.tex"));
atoIconsSE[ 5].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level04.tex"));
atoIconsSE[ 6].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level05.tex"));
atoIconsSE[ 7].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level06.tex"));
atoIconsSE[ 8].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level07.tex"));
atoIconsSE[ 9].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level08.tex"));
atoIconsSE[10].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level09.tex"));
atoIconsSE[11].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level10.tex"));
atoIconsSE[12].SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\Level11.tex"));
_toPathDot .SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\PathDot.tex"));
_toMapBcgLDSE .SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\MapBcgLD.tex"));
_toMapBcgLUSE .SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\MapBcgLU.tex"));
_toMapBcgRDSE .SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\MapBcgRD.tex"));
_toMapBcgRUSE .SetData_t(CTFILENAME("TexturesMP\\Computer\\Map\\MapBcgRU.tex"));
// force constant textures
((CTextureData*)atoIconsSE[ 0].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 1].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 2].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 3].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 4].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 5].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 6].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 7].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 8].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[ 9].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[10].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[11].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsSE[12].GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toPathDot .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgLDSE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgLUSE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgRDSE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgRUSE .GetData())->Force(TEX_CONSTANT);
} else {
// the first encounter
atoIconsFE[ 0].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level00.tex"));
atoIconsFE[ 1].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level01.tex"));
atoIconsFE[ 2].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level02.tex"));
atoIconsFE[ 3].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level03.tex"));
atoIconsFE[ 4].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level04.tex"));
atoIconsFE[ 5].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level05.tex"));
atoIconsFE[ 6].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level06.tex"));
atoIconsFE[ 7].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level07.tex"));
atoIconsFE[ 8].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level08.tex"));
atoIconsFE[ 9].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level09.tex"));
atoIconsFE[10].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level10.tex"));
atoIconsFE[11].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level11.tex"));
atoIconsFE[12].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level12.tex"));
atoIconsFE[13].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level13.tex"));
atoIconsFE[14].SetData_t(CTFILENAME("Textures\\Computer\\Map\\Level14.tex"));
_toPathDot .SetData_t(CTFILENAME("Textures\\Computer\\Map\\PathDot.tex"));
_toMapBcgLDFE .SetData_t(CTFILENAME("Textures\\Computer\\Map\\MapBcgLD.tex"));
_toMapBcgLUFE .SetData_t(CTFILENAME("Textures\\Computer\\Map\\MapBcgLU.tex"));
_toMapBcgRDFE .SetData_t(CTFILENAME("Textures\\Computer\\Map\\MapBcgRD.tex"));
_toMapBcgRUFE .SetData_t(CTFILENAME("Textures\\Computer\\Map\\MapBcgRU.tex"));
// force constant textures
((CTextureData*)atoIconsFE[ 0].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 1].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 2].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 3].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 4].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 5].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 6].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 7].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 8].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[ 9].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[10].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[11].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[12].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[13].GetData())->Force(TEX_CONSTANT);
((CTextureData*)atoIconsFE[14].GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toPathDot .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgLDFE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgLUFE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgRDFE .GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toMapBcgRUFE .GetData())->Force(TEX_CONSTANT);
}
}
catch (char *strError) {
CPrintF("%s\n", strError);
return FALSE;
}
return TRUE;
}
void ReleaseMapData(void)
{
atoIconsSE[0].SetData(NULL);
atoIconsSE[1].SetData(NULL);
atoIconsSE[2].SetData(NULL);
atoIconsSE[3].SetData(NULL);
atoIconsSE[4].SetData(NULL);
atoIconsSE[5].SetData(NULL);
atoIconsSE[6].SetData(NULL);
atoIconsSE[7].SetData(NULL);
atoIconsSE[8].SetData(NULL);
atoIconsSE[9].SetData(NULL);
atoIconsSE[10].SetData(NULL);
atoIconsSE[11].SetData(NULL);
atoIconsSE[12].SetData(NULL);
atoIconsFE[0].SetData(NULL);
atoIconsFE[1].SetData(NULL);
atoIconsFE[2].SetData(NULL);
atoIconsFE[3].SetData(NULL);
atoIconsFE[4].SetData(NULL);
atoIconsFE[5].SetData(NULL);
atoIconsFE[6].SetData(NULL);
atoIconsFE[7].SetData(NULL);
atoIconsFE[8].SetData(NULL);
atoIconsFE[9].SetData(NULL);
atoIconsFE[10].SetData(NULL);
atoIconsFE[11].SetData(NULL);
atoIconsFE[12].SetData(NULL);
atoIconsFE[13].SetData(NULL);
atoIconsFE[14].SetData(NULL);
_toPathDot.SetData(NULL);
_toMapBcgLDSE.SetData(NULL);
_toMapBcgLUSE.SetData(NULL);
_toMapBcgRDSE.SetData(NULL);
_toMapBcgRUSE.SetData(NULL);
_toMapBcgLDFE.SetData(NULL);
_toMapBcgLUFE.SetData(NULL);
_toMapBcgRDFE.SetData(NULL);
_toMapBcgRUFE.SetData(NULL);
}
void RenderMap( CDrawPort *pdp, ULONG ulLevelMask, CProgressHookInfo *pphi)
{
if( !ObtainMapData())
{
ReleaseMapData();
return;
}
PIX(*aIconCoords)[2] = map_bIsFirstEncounter ? aIconCoordsFE : aIconCoordsSE;
CTextureObject* atoIcons = map_bIsFirstEncounter ? atoIconsFE : atoIconsSE;
INDEX(*aPathPrevNextLevels)[2] = map_bIsFirstEncounter ? aPathPrevNextLevelsFE : aPathPrevNextLevelsSE;
PIX(*aPathDots)[10][2] = map_bIsFirstEncounter ? aPathDotsFE : aPathDotsSE;
INDEX ctLevels = map_bIsFirstEncounter ? ARRAYCOUNT(aIconCoordsFE) : ARRAYCOUNT(aIconCoordsSE);
CTextureObject* _toMapBcgLD = &_toMapBcgLDSE;
CTextureObject* _toMapBcgLU = &_toMapBcgLUSE;
CTextureObject* _toMapBcgRD = &_toMapBcgRDSE;
CTextureObject* _toMapBcgRU = &_toMapBcgRUSE;
if(map_bIsFirstEncounter) {
_toMapBcgLD = &_toMapBcgLDFE;
_toMapBcgLU = &_toMapBcgLUFE;
_toMapBcgRD = &_toMapBcgRDFE;
_toMapBcgRU = &_toMapBcgRUFE;
}
PIX pixdpw = (PIX) pdp->GetWidth();
PIX pixdph = (PIX) pdp->GetHeight();
PIX imgw = 512;
PIX imgh = 480;
FLOAT fStretch = 0.25f;
// determine max available picture stretch
if( pixdpw>=imgw*2 && pixdph>=imgh*2) {
fStretch = 2.0f;
} else if(pixdpw>=imgw && pixdph>=imgh) {
fStretch = 1.0f;
} else if(pixdpw>=imgw/2 && pixdph>=imgh/2) {
fStretch = 0.5f;
}
// calculate LU offset so picture would be centered in dp
PIX pixSX = (PIX) ((pixdpw-imgw*fStretch)/2);
PIX pixSY = Max( PIX((pixdph-imgh*fStretch)/2), PIX(0));
PIX pixC1S = pixSX; // column 1 start pixel
PIX pixR1S = pixSY; // raw 1 start pixel
PIX pixC1E = (PIX) (pixSX+256*fStretch); // column 1 end pixel
PIX pixR1E = (PIX) (pixSY+256*fStretch); // raw 1 end pixel
PIX pixC2S = (PIX) (pixC1E-fStretch); // column 2 start pixel
PIX pixR2S = (PIX) (pixR1E-fStretch); // raw 2 start pixel
PIX pixC2E = (PIX) (pixC2S+256*fStretch); // column 2 end pixel
PIX pixR2E = (PIX) (pixR2S+256*fStretch); // raw 2 end pixel
if (ulLevelMask == 0x00000001 && !map_bIsFirstEncounter) {
// render the book
//PIX pixX = (PIX) (aIconCoords[0][0]*fStretch+pixC1S);
//PIX pixY = (PIX) (aIconCoords[0][1]*fStretch+pixR1S);
CTextureObject *pto = &atoIcons[0];
// FIXME: DG: or was the line below supposed to use pixX and pixY?
pdp->PutTexture( pto, PIXaabbox2D( PIX2D(pixC1S,pixR1S), PIX2D(pixC2E,pixR2E)), C_WHITE|255);
} else {
// render pale map bcg
pdp->PutTexture( _toMapBcgLU, PIXaabbox2D( PIX2D(pixC1S,pixR1S), PIX2D(pixC1E,pixR1E)), C_WHITE|255);
pdp->PutTexture( _toMapBcgRU, PIXaabbox2D( PIX2D(pixC2S,pixR1S), PIX2D(pixC2E,pixR1E)), C_WHITE|255);
pdp->PutTexture( _toMapBcgLD, PIXaabbox2D( PIX2D(pixC1S,pixR2S), PIX2D(pixC1E,pixR2E)), C_WHITE|255);
pdp->PutTexture( _toMapBcgRD, PIXaabbox2D( PIX2D(pixC2S,pixR2S), PIX2D(pixC2E,pixR2E)), C_WHITE|255);
// render icons
for( INDEX iIcon=(!map_bIsFirstEncounter); iIcon<ctLevels; iIcon++)
{
// if level's icon should be rendered
if( ulLevelMask & (1UL<<iIcon))
{
PIX pixX = (PIX) (aIconCoords[iIcon][0]*fStretch+pixC1S);
PIX pixY = (PIX) (aIconCoords[iIcon][1]*fStretch+pixR1S);
CTextureObject *pto = &atoIcons[iIcon];
PIX pixImgW = (PIX) (((CTextureData *)pto->GetData())->GetPixWidth()*fStretch);
PIX pixImgH = (PIX) (((CTextureData *)pto->GetData())->GetPixHeight()*fStretch);
pdp->PutTexture( pto, PIXaabbox2D( PIX2D(pixX, pixY), PIX2D(pixX+pixImgW, pixY+pixImgH)), C_WHITE|255);
}
}
}
// render paths
for( INDEX iPath=0; iPath<ctLevels; iPath++)
{
INDEX iPrevLevelBit = aPathPrevNextLevels[iPath][0];
INDEX iNextLevelBit = aPathPrevNextLevels[iPath][1];
// if path dots should be rendered:
// if path src and dst levels were discovered and secret level isn't inbetween or hasn't been discovered
if( ulLevelMask&(1UL<<iPrevLevelBit) &&
ulLevelMask&(1UL<<iNextLevelBit) &&
((iNextLevelBit-iPrevLevelBit)==1 || !(ulLevelMask&(1UL<<(iNextLevelBit-1)))))
{
for( INDEX iDot=0; iDot<10; iDot++)
{
PIX pixDotX=(PIX) (pixC1S+aPathDots[iPath][iDot][0]*fStretch);
PIX pixDotY=(PIX) (pixR1S+aPathDots[iPath][iDot][1]*fStretch);
if(aPathDots[iPath][iDot][0]==-1) break;
pdp->PutTexture( &_toPathDot, PIXaabbox2D( PIX2D(pixDotX, pixDotY), PIX2D(pixDotX+8*fStretch, pixDotY+8*fStretch)),
(map_bIsFirstEncounter ? C_WHITE : C_BLACK)|255);
}
}
}
if( pphi != NULL)
{
// set font
pdp->SetFont( _pfdDisplayFont);
pdp->SetTextScaling( fStretch);
pdp->SetTextAspect( 1.0f);
INDEX iPosX, iPosY;
COLOR colText = RGBToColor(200,128,56)|CT_OPAQUE;
if(!map_bIsFirstEncounter) {
// set coordinates and dot colors
if (ulLevelMask == 0x00000001) {
iPosX = 200;
iPosY = 330;
colText = 0x5c6a9aff;
} else {
iPosX = 395;
iPosY = 403;
colText = 0xc87832ff;
}
}
else // DG: make sure iPosX/Y is initialized
{
// no idea if 0 makes sense, but at least it's deterministic
iPosX = 0;
iPosY = 0;
}
PIX pixhtcx = (PIX) (pixC1S+iPosX*fStretch);
PIX pixhtcy = (PIX) (pixR1S+iPosY*fStretch);
if(map_bIsFirstEncounter) {
pixhtcx = pixC1S+116*fStretch;
pixhtcy = pixR1S+220*fStretch;
}
pdp->PutTextC( pphi->phi_strDescription, pixhtcx, pixhtcy, colText);
for( INDEX iProgresDot=0; iProgresDot<16; iProgresDot+=1)
{
if(map_bIsFirstEncounter) {
PIX pixDotX=(PIX) (pixC1S+(48+iProgresDot*8)*fStretch);
PIX pixDotY=(PIX) (pixR1S+249*fStretch);
COLOR colDot = C_WHITE|255;
if(iProgresDot>pphi->phi_fCompleted*16) {
colDot = C_WHITE|64;
}
pdp->PutTexture( &_toPathDot, PIXaabbox2D( PIX2D(pixDotX, pixDotY),
PIX2D(pixDotX+8*fStretch, pixDotY+8*fStretch)), colDot);
} else {
PIX pixDotX=(PIX) (pixC1S+((iPosX-68)+iProgresDot*8)*fStretch);
PIX pixDotY=(PIX) (pixR1S+(iPosY+19)*fStretch);
COLOR colDot = colText|255;
if(iProgresDot>pphi->phi_fCompleted*16) {
colDot = C_BLACK|64;
}
pdp->PutTexture( &_toPathDot, PIXaabbox2D( PIX2D(pixDotX, pixDotY),
PIX2D(pixDotX+2+8*fStretch, pixDotY+2+8*fStretch)), C_BLACK|255);
pdp->PutTexture( &_toPathDot, PIXaabbox2D( PIX2D(pixDotX, pixDotY),
PIX2D(pixDotX+8*fStretch, pixDotY+8*fStretch)), colDot);
}
}
}
// free textures used in map rendering
ReleaseMapData();
}