Skip to content

Commit e7ee57b

Browse files
committed
unify(maputil): Merge MapUtil code (#1771)
1 parent 8d46a46 commit e7ee57b

File tree

5 files changed

+134
-7
lines changed

5 files changed

+134
-7
lines changed

Generals/Code/GameEngine/Include/GameClient/MapUtil.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class MapMetaData
7272
{
7373
public:
7474
UnicodeString m_displayName;
75+
AsciiString m_nameLookupTag;
7576
Region3D m_extent;
7677
Int m_numPlayers;
7778
Bool m_isMultiplayer;
@@ -125,6 +126,8 @@ Int populateMapListboxNoReset( GameWindow *listbox, Bool useSystemMaps, Bool isM
125126
Bool isValidMap( AsciiString mapName, Bool isMultiplayer ); /// Validate a map
126127
Image *getMapPreviewImage( AsciiString mapName );
127128
AsciiString getDefaultMap( Bool isMultiplayer ); /// Find a valid map
129+
AsciiString getDefaultOfficialMap();
130+
Bool isOfficialMap( AsciiString mapName );
128131
Bool parseMapPreviewChunk(DataChunkInput &file, DataChunkInfo *info, void *userData);
129132
void findDrawPositions( Int startX, Int startY, Int width, Int height, Region3D extent,
130133
ICoord2D *ul, ICoord2D *lr );

Generals/Code/GameEngine/Source/Common/INI/INIMapCache.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "Lib/BaseType.h"
3434
#include "Common/INI.h"
3535
#include "GameClient/MapUtil.h"
36+
#include "GameClient/GameText.h"
3637
#include "GameNetwork/NetworkDefs.h"
3738
#include "Common/NameKeyGenerator.h"
3839
#include "Common/WellKnownKeys.h"
@@ -46,6 +47,7 @@ class MapMetaDataReader
4647
Int m_numPlayers;
4748
Bool m_isMultiplayer;
4849
AsciiString m_asciiDisplayName;
50+
AsciiString m_asciiNameLookupTag;
4951

5052
Bool m_isOfficial;
5153
WinTimeStamp m_timestamp;
@@ -92,6 +94,7 @@ const FieldParse MapMetaDataReader::m_mapFieldParseTable[] =
9294
{ "timestampLo", INI::parseInt, NULL, offsetof( MapMetaDataReader, m_timestamp.m_lowTimeStamp ) },
9395
{ "timestampHi", INI::parseInt, NULL, offsetof( MapMetaDataReader, m_timestamp.m_highTimeStamp ) },
9496
{ "displayName", INI::parseAsciiString, NULL, offsetof( MapMetaDataReader, m_asciiDisplayName ) },
97+
{ "nameLookupTag", INI::parseAsciiString, NULL, offsetof( MapMetaDataReader, m_asciiNameLookupTag ) },
9598

9699
{ "supplyPosition", parseSupplyPositionCoord3D, NULL, NULL },
97100
{ "techPosition", parseTechPositionsCoord3D, NULL, NULL },
@@ -136,7 +139,36 @@ void INI::parseMapCacheDefinition( INI* ini )
136139

137140
md.m_waypoints[TheNameKeyGenerator->keyToName(TheKey_InitialCameraPosition)] = mdr.m_initialCameraPosition;
138141

142+
#if RTS_GENERALS
139143
md.m_displayName = QuotedPrintableToUnicodeString(mdr.m_asciiDisplayName);
144+
#else
145+
md.m_nameLookupTag = QuotedPrintableToAsciiString(mdr.m_asciiNameLookupTag);
146+
147+
if (md.m_nameLookupTag.isEmpty())
148+
{
149+
// maps without localized name tags
150+
AsciiString tempdisplayname;
151+
tempdisplayname = name.reverseFind('\\') + 1;
152+
md.m_displayName.translate(tempdisplayname);
153+
if (md.m_numPlayers >= 2)
154+
{
155+
UnicodeString extension;
156+
extension.format(L" (%d)", md.m_numPlayers);
157+
md.m_displayName.concat(extension);
158+
}
159+
}
160+
else
161+
{
162+
// official maps with name tags
163+
md.m_displayName = TheGameText->fetch(md.m_nameLookupTag);
164+
if (md.m_numPlayers >= 2)
165+
{
166+
UnicodeString extension;
167+
extension.format(L" (%d)", md.m_numPlayers);
168+
md.m_displayName.concat(extension);
169+
}
170+
}
171+
#endif
140172

141173
AsciiString startingCamName;
142174
for (Int i=0; i<md.m_numPlayers; ++i)

Generals/Code/GameEngine/Source/GameClient/MapUtil.cpp

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,12 @@ void MapCache::writeCacheINI( Bool userDir )
405405
fprintf(fp, " extentMin = X:%2.2f Y:%2.2f Z:%2.2f\n", md.m_extent.lo.x, md.m_extent.lo.y, md.m_extent.lo.z);
406406
fprintf(fp, " extentMax = X:%2.2f Y:%2.2f Z:%2.2f\n", md.m_extent.hi.x, md.m_extent.hi.y, md.m_extent.hi.z);
407407

408+
// BAD AND NOW UNUSED: the mapcache.ini should not contain localized data... using the lookup tag instead
409+
#if RTS_GENERALS
408410
fprintf(fp, " displayName = %s\n", UnicodeStringToQuotedPrintable(md.m_displayName).str());
411+
#else
412+
fprintf(fp, " nameLookupTag = %s\n", md.m_nameLookupTag.str());
413+
#endif
409414

410415
Coord3D pos;
411416
WaypointMap::iterator itw = md.m_waypoints.begin();
@@ -645,6 +650,31 @@ Bool MapCache::addMap( AsciiString dirName, AsciiString fname, FileInfo *fileInf
645650
if ((md.m_filesize == filesize) &&
646651
(md.m_CRC != 0))
647652
{
653+
// Force a lookup so that we don't display the English localization in all builds.
654+
if (md.m_nameLookupTag.isEmpty())
655+
{
656+
// unofficial maps or maps without names
657+
AsciiString tempdisplayname;
658+
tempdisplayname = fname.reverseFind('\\') + 1;
659+
(*this)[lowerFname].m_displayName.translate(tempdisplayname);
660+
if (md.m_numPlayers >= 2)
661+
{
662+
UnicodeString extension;
663+
extension.format(L" (%d)", md.m_numPlayers);
664+
(*this)[lowerFname].m_displayName.concat(extension);
665+
}
666+
}
667+
else
668+
{
669+
// official maps with name tags
670+
(*this)[lowerFname].m_displayName = TheGameText->fetch(md.m_nameLookupTag);
671+
if (md.m_numPlayers >= 2)
672+
{
673+
UnicodeString extension;
674+
extension.format(L" (%d)", md.m_numPlayers);
675+
(*this)[lowerFname].m_displayName.concat(extension);
676+
}
677+
}
648678
// DEBUG_LOG(("MapCache::addMap - found match for map %s", lowerFname.str()));
649679
return FALSE; // OK, it checks out.
650680
}
@@ -676,6 +706,7 @@ Bool MapCache::addMap( AsciiString dirName, AsciiString fname, FileInfo *fileInf
676706

677707
Bool exists = false;
678708
AsciiString munkee = worldDict.getAsciiString(TheKey_mapName, &exists);
709+
md.m_nameLookupTag = munkee;
679710
if (!exists || munkee.isEmpty())
680711
{
681712
DEBUG_LOG(("Missing TheKey_mapName!"));
@@ -766,13 +797,15 @@ Int populateMapListboxNoReset( GameWindow *listbox, Bool useSystemMaps, Bool isM
766797
const Image *easyImage = NULL;
767798
const Image *mediumImage = NULL;
768799
const Image *brutalImage = NULL;
800+
const Image *maxBrutalImage = NULL;
769801
SkirmishBattleHonors *battleHonors = NULL;
770802
Int w = 10, h = 10;
771803
if (numColumns > 1)
772804
{
773805
easyImage = TheMappedImageCollection->findImageByName("Star-Bronze");
774806
mediumImage = TheMappedImageCollection->findImageByName("Star-Silver");
775807
brutalImage = TheMappedImageCollection->findImageByName("Star-Gold");
808+
maxBrutalImage = TheMappedImageCollection->findImageByName("RedYell_Star");
776809
battleHonors = new SkirmishBattleHonors;
777810

778811
w = (brutalImage)?brutalImage->getImageWidth():10;
@@ -843,6 +876,16 @@ typedef MapDisplayToFileNameList::iterator MapDisplayToFileNameListIter;
843876
}
844877
*/
845878

879+
#if RTS_ZEROHOUR
880+
//Patch 1.03 -- Purposely filter out these broken maps that exist in Generals.
881+
if( !asciiMapName.compare( "maps\\armored fury\\armored fury.map" ) ||
882+
!asciiMapName.compare( "maps\\scorched earth\\scorched earth.map" ) )
883+
{
884+
++tempit;
885+
continue;
886+
}
887+
#endif
888+
846889
DEBUG_ASSERTCRASH(it != TheMapCache->end(), ("Map %s not found in map cache.", tempit->str()));
847890
if (it->first.startsWithNoCase(mapDir.str()) && isMultiplayer == it->second.m_isMultiplayer && !it->second.m_displayName.isEmpty())
848891
{
@@ -857,8 +900,17 @@ typedef MapDisplayToFileNameList::iterator MapDisplayToFileNameListIter;
857900
Int numBrutal = battleHonors->getEnduranceMedal(it->first.str(), SLOT_BRUTAL_AI);
858901
if (numBrutal)
859902
{
860-
imageItemData = 3;
861-
index = GadgetListBoxAddEntryImage( listbox, brutalImage, index, 0, w, h, TRUE);
903+
int maxBrutalSlots = it->second.m_numPlayers - 1;
904+
if (maxBrutalImage != NULL && numBrutal == maxBrutalSlots)
905+
{
906+
index = GadgetListBoxAddEntryImage( listbox, maxBrutalImage, index, 0, w, h, TRUE);
907+
imageItemData = 4;
908+
}
909+
else
910+
{
911+
index = GadgetListBoxAddEntryImage( listbox, brutalImage, index, 0, w, h, TRUE);
912+
imageItemData = 3;
913+
}
862914
}
863915
else if (numMedium)
864916
{
@@ -984,6 +1036,39 @@ AsciiString getDefaultMap( Bool isMultiplayer )
9841036
return AsciiString::TheEmptyString;
9851037
}
9861038

1039+
1040+
AsciiString getDefaultOfficialMap()
1041+
{
1042+
if(!TheMapCache)
1043+
return AsciiString::TheEmptyString;
1044+
TheMapCache->updateCache();
1045+
1046+
MapCache::iterator it = TheMapCache->begin();
1047+
while (it != TheMapCache->end())
1048+
{
1049+
if (it->second.m_isMultiplayer && it->second.m_isOfficial)
1050+
{
1051+
return it->first;
1052+
}
1053+
++it;
1054+
}
1055+
return AsciiString::TheEmptyString;
1056+
}
1057+
1058+
1059+
Bool isOfficialMap( AsciiString mapName )
1060+
{
1061+
if(!TheMapCache || mapName.isEmpty())
1062+
return FALSE;
1063+
TheMapCache->updateCache();
1064+
mapName.toLower();
1065+
MapCache::iterator it = TheMapCache->find(mapName);
1066+
if (it != TheMapCache->end())
1067+
return it->second.m_isOfficial;
1068+
return FALSE;
1069+
}
1070+
1071+
9871072
const MapMetaData *MapCache::findMap(AsciiString mapName)
9881073
{
9891074
mapName.toLower();

GeneralsMD/Code/GameEngine/Source/Common/INI/INIMapCache.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ void INI::parseMapCacheDefinition( INI* ini )
139139

140140
md.m_waypoints[TheNameKeyGenerator->keyToName(TheKey_InitialCameraPosition)] = mdr.m_initialCameraPosition;
141141

142-
// md.m_displayName = QuotedPrintableToUnicodeString(mdr.m_asciiDisplayName);
143-
// this string is never to be used, but we'll leave it in to allow people with an old mapcache.ini to parse it
142+
#if RTS_GENERALS
143+
md.m_displayName = QuotedPrintableToUnicodeString(mdr.m_asciiDisplayName);
144+
#else
144145
md.m_nameLookupTag = QuotedPrintableToAsciiString(mdr.m_asciiNameLookupTag);
145146

146147
if (md.m_nameLookupTag.isEmpty())
@@ -167,6 +168,7 @@ void INI::parseMapCacheDefinition( INI* ini )
167168
md.m_displayName.concat(extension);
168169
}
169170
}
171+
#endif
170172

171173
AsciiString startingCamName;
172174
for (Int i=0; i<md.m_numPlayers; ++i)

GeneralsMD/Code/GameEngine/Source/GameClient/MapUtil.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,11 @@ void MapCache::writeCacheINI( Bool userDir )
406406
fprintf(fp, " extentMax = X:%2.2f Y:%2.2f Z:%2.2f\n", md.m_extent.hi.x, md.m_extent.hi.y, md.m_extent.hi.z);
407407

408408
// BAD AND NOW UNUSED: the mapcache.ini should not contain localized data... using the lookup tag instead
409-
// fprintf(fp, " displayName = %s\n", UnicodeStringToQuotedPrintable(md.m_displayName).str());
409+
#if RTS_GENERALS
410+
fprintf(fp, " displayName = %s\n", UnicodeStringToQuotedPrintable(md.m_displayName).str());
411+
#else
410412
fprintf(fp, " nameLookupTag = %s\n", md.m_nameLookupTag.str());
413+
#endif
411414

412415
Coord3D pos;
413416
WaypointMap::iterator itw = md.m_waypoints.begin();
@@ -873,13 +876,15 @@ typedef MapDisplayToFileNameList::iterator MapDisplayToFileNameListIter;
873876
}
874877
*/
875878

879+
#if RTS_ZEROHOUR
876880
//Patch 1.03 -- Purposely filter out these broken maps that exist in Generals.
877881
if( !asciiMapName.compare( "maps\\armored fury\\armored fury.map" ) ||
878882
!asciiMapName.compare( "maps\\scorched earth\\scorched earth.map" ) )
879883
{
880884
++tempit;
881885
continue;
882886
}
887+
#endif
883888

884889
DEBUG_ASSERTCRASH(it != TheMapCache->end(), ("Map %s not found in map cache.", tempit->str()));
885890
if (it->first.startsWithNoCase(mapDir.str()) && isMultiplayer == it->second.m_isMultiplayer && !it->second.m_displayName.isEmpty())
@@ -896,7 +901,7 @@ typedef MapDisplayToFileNameList::iterator MapDisplayToFileNameListIter;
896901
if (numBrutal)
897902
{
898903
int maxBrutalSlots = it->second.m_numPlayers - 1;
899-
if (numBrutal == maxBrutalSlots)
904+
if (maxBrutalImage != NULL && numBrutal == maxBrutalSlots)
900905
{
901906
index = GadgetListBoxAddEntryImage( listbox, maxBrutalImage, index, 0, w, h, TRUE);
902907
imageItemData = 4;
@@ -1223,7 +1228,7 @@ Image *getMapPreviewImage( AsciiString mapName )
12231228
mapPreviewImage->setStatus(IMAGE_STATUS_RAW_TEXTURE);
12241229
// allocate our terrain texture
12251230
TextureClass * texture = new TextureClass( size.x, size.y,
1226-
WW3D_FORMAT_X8R8G8B8, TextureClass::MIP_LEVELS_1 );
1231+
WW3D_FORMAT_X8R8G8B8, MIP_LEVELS_1 );
12271232
uv.lo.x = 0.0f;
12281233
uv.lo.y = 1.0f;
12291234
uv.hi.x = 1.0f;

0 commit comments

Comments
 (0)