mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-30 12:50:53 +00:00
395 lines
9.7 KiB
C++
395 lines
9.7 KiB
C++
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU Affero General Public License as
|
||
|
// published by the Free Software Foundation, either version 3 of the
|
||
|
// License, or (at your option) any later version.
|
||
|
//
|
||
|
// 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 Affero General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU Affero General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
#define USE_JPEG
|
||
|
|
||
|
#include <nel/misc/types_nl.h>
|
||
|
#include <nel/misc/file.h>
|
||
|
#include <nel/misc/sstring.h>
|
||
|
#include <nel/misc/path.h>
|
||
|
#include <nel/misc/algo.h>
|
||
|
|
||
|
#include <nel/misc/config_file.h>
|
||
|
#include <nel/misc/bitmap.h>
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
using namespace NLMISC;
|
||
|
using namespace std;
|
||
|
|
||
|
CSString REP_SRC; //= "R:\\code\\ryzom\\src_v2\\client\\";
|
||
|
CSString REP_GUI; //= "R:\\code\\ryzom\\data\\gamedev\\interfaces_v3\\";
|
||
|
CSString REP_ITEM; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\Game_elem\\items\\";
|
||
|
CSString REP_MISSION; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\Game_elem\\mission\\";
|
||
|
CSString REP_SITEM; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\game_element\\sitem\\";
|
||
|
CSString REP_SBRICK; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\game_element\\sbrick\\";
|
||
|
CSString REP_DFN; //= "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\DFN\\";
|
||
|
CSString REP_FACTION;// = "R:\\code\\ryzom\\data_leveldesign\\leveldesign\\World\\factions\\";
|
||
|
|
||
|
typedef vector<string> StringVector;
|
||
|
StringVector listeIcones;
|
||
|
map<CSString, StringVector> citations;
|
||
|
|
||
|
bool addUsedIcons = true;
|
||
|
bool addFreeIcons = true;
|
||
|
|
||
|
|
||
|
// Fill listeIcones from source directories
|
||
|
void findIcons(CConfigFile::CVar *var)
|
||
|
{
|
||
|
nlassert(var != NULL);
|
||
|
|
||
|
// clear vector
|
||
|
listeIcones.clear();
|
||
|
vector<string> files;
|
||
|
|
||
|
// Scan each directory
|
||
|
for (int i=0 ; i<var->size() ; i++)
|
||
|
{
|
||
|
// clear files list
|
||
|
files.clear();
|
||
|
|
||
|
// get files list
|
||
|
CPath::getPathContent(CPath::standardizePath(var->asString(i)), false, false, true, files);
|
||
|
|
||
|
// Convert each file
|
||
|
for (uint j=0 ; j<files.size() ; j++)
|
||
|
{
|
||
|
// get filename
|
||
|
string iconName = CFile::getFilename(files[j]);
|
||
|
|
||
|
// store icon's name
|
||
|
listeIcones.push_back(iconName);
|
||
|
citations[iconName].push_back(iconName);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
string remap2Jpg(const string &s)
|
||
|
{
|
||
|
// change extension from TGA to JPG
|
||
|
string jpg(s);
|
||
|
uint n = jpg.find(".tga");
|
||
|
nlassert(n != string::npos);
|
||
|
jpg.erase(n);
|
||
|
jpg += ".jpg";
|
||
|
|
||
|
return jpg;
|
||
|
}
|
||
|
|
||
|
void writeString(COFile &f, const string &s)
|
||
|
{
|
||
|
f.serialBuffer((uint8*)s.c_str(), s.size());
|
||
|
}
|
||
|
|
||
|
void writeHTMLline(COFile &f, const string &icon, const StringVector files, uint sizeLimit)
|
||
|
{
|
||
|
// discard if needed
|
||
|
if ((files.size() == 1 && !addFreeIcons) || (files.size() > 1 && !addUsedIcons))
|
||
|
return;
|
||
|
|
||
|
// begin line
|
||
|
writeString(f, "<tr>");
|
||
|
|
||
|
// write icon as jpg
|
||
|
writeString(f, "<th><img src=\"");
|
||
|
writeString(f, "images\\");
|
||
|
writeString(f, remap2Jpg(files[0]));
|
||
|
writeString(f, "\"></th>");
|
||
|
|
||
|
// fix limit based on configuration file
|
||
|
uint n;
|
||
|
if (sizeLimit == 0)
|
||
|
n = files.size();
|
||
|
else
|
||
|
n = sizeLimit > files.size() ? files.size() : sizeLimit;
|
||
|
|
||
|
// write each file using this icon
|
||
|
for (uint i=0 ; i<n ; i++)
|
||
|
writeString(f, "<td>" + files[i] + "</td>");
|
||
|
|
||
|
// end line
|
||
|
writeString(f, "</tr>\n");
|
||
|
}
|
||
|
|
||
|
void generateHTML(const string &name, uint sizeLimit)
|
||
|
{
|
||
|
COFile f;
|
||
|
nlassert(f.open(name, false, true));
|
||
|
|
||
|
// write header
|
||
|
writeString(f, "<html>\n<head>\n<title>Nevrax - Ryzom icons</title>\n</title>\n\n<body><table border=1>\n");
|
||
|
|
||
|
// write lines
|
||
|
for (map<CSString, StringVector>::iterator it = citations.begin(); it != citations.end(); ++it)
|
||
|
{
|
||
|
string str = it->second[0];
|
||
|
writeHTMLline(f, str, it->second, sizeLimit);
|
||
|
}
|
||
|
|
||
|
// write end
|
||
|
writeString(f, "</table></body>\n</html>");
|
||
|
|
||
|
f.close();
|
||
|
}
|
||
|
|
||
|
void tga2Jpg(const string &tga, const string &jpg)
|
||
|
{
|
||
|
// read TGA
|
||
|
CIFile fTga;
|
||
|
CBitmap im;
|
||
|
nlassert(fTga.open(tga));
|
||
|
nlassert(im.load(fTga));
|
||
|
fTga.close();
|
||
|
|
||
|
// write JPG
|
||
|
COFile fJpg;
|
||
|
nlassert(fJpg.open(jpg));
|
||
|
nlassert(im.writeJPG(fJpg));
|
||
|
fJpg.close();
|
||
|
}
|
||
|
|
||
|
void convertImages(CConfigFile::CVar *var)
|
||
|
{
|
||
|
nlassert(var != NULL);
|
||
|
|
||
|
// store current path
|
||
|
string curPath = CPath::standardizePath(CPath::getCurrentPath());
|
||
|
|
||
|
// Create 'images' directory in the root folder if not present
|
||
|
if (!CFile::isExists("images"))
|
||
|
CFile::createDirectory("images");
|
||
|
|
||
|
// Scan each directory
|
||
|
for (int i=0 ; i<var->size() ; i++)
|
||
|
{
|
||
|
string path = CPath::standardizePath(var->asString(i));
|
||
|
vector<string> files;
|
||
|
CPath::getPathContent(path, false, false, true, files);
|
||
|
|
||
|
// Convert each file
|
||
|
for (uint j=0 ; j<files.size() ; j++)
|
||
|
{
|
||
|
// get filenames
|
||
|
string file = CFile::getFilename(files[j]);
|
||
|
string src = path + file;
|
||
|
string dst = remap2Jpg(curPath + "images/" + file);
|
||
|
|
||
|
cout << "Copying file (" << i+1 << "/" << var->size() << " - " << j+1 << " / " << files.size() << ") : " << file << " ... ";
|
||
|
|
||
|
// Convert the file
|
||
|
if (!CFile::isExists(dst))
|
||
|
{
|
||
|
tga2Jpg(src, dst);
|
||
|
cout << " OK\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cout << "skipped\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool endsWith( const CSString& s, const CSString& substring )
|
||
|
{
|
||
|
return ( s.right( substring.size() ) == substring );
|
||
|
}
|
||
|
|
||
|
void ProcessDirectory( const CSString& dir, const StringVector& extensions )
|
||
|
{
|
||
|
CSString data;
|
||
|
int nbResults = 0;
|
||
|
int sixieme;
|
||
|
vector<string> files;
|
||
|
|
||
|
|
||
|
printf( "%s\n", dir.c_str() );
|
||
|
CPath::getPathContent ( dir.c_str(), true, false, true, files );
|
||
|
|
||
|
sixieme = files.size() / 6;
|
||
|
|
||
|
printf( "%d files are processed", files.size() );
|
||
|
|
||
|
for (uint32 i=0; i<files.size(); ++i)
|
||
|
{
|
||
|
bool extOK = false;
|
||
|
uint numExt = 0;
|
||
|
|
||
|
while ( ( !extOK ) && ( numExt < extensions.size() ) )
|
||
|
{
|
||
|
extOK = endsWith( files[i], extensions[numExt] );
|
||
|
numExt++;
|
||
|
}
|
||
|
|
||
|
if ( extOK )
|
||
|
{
|
||
|
data.readFromFile( files[i] );
|
||
|
|
||
|
// Don't parse LOG
|
||
|
uint n = data.find("<LOG>");
|
||
|
if (n != CSString::npos)
|
||
|
data.erase(n);
|
||
|
|
||
|
data = data.toLower();
|
||
|
|
||
|
for ( uint it=0; it<listeIcones.size(); it++ )
|
||
|
{
|
||
|
if ( data.contains( CSString(listeIcones[it]).toLower().c_str() ) )
|
||
|
{
|
||
|
string fileName = CFile::getFilename( files[i] );
|
||
|
citations[ listeIcones[it] ].push_back( fileName );
|
||
|
nbResults++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( i%sixieme == 0 )
|
||
|
printf( "." );
|
||
|
}
|
||
|
|
||
|
printf( " %d results found\n\n", nbResults );
|
||
|
}
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
StringVector extensions;
|
||
|
|
||
|
new CApplicationContext();
|
||
|
|
||
|
CSString REP_SRC, REP_GUI, REP_LEVEL_DESIGN;
|
||
|
int searchSrcClient, searchGui, searchLevelDesign;
|
||
|
uint sizeLimit = 5;
|
||
|
|
||
|
CConfigFile cf;
|
||
|
CConfigFile::CVar *var;
|
||
|
cf.load("icon_search.cfg");
|
||
|
|
||
|
var = cf.getVarPtr("SearchClientSrc");
|
||
|
nlassert(var);
|
||
|
searchSrcClient = var->asInt();
|
||
|
|
||
|
var = cf.getVarPtr("ClientSrcPath");
|
||
|
nlassert(var);
|
||
|
REP_SRC = var->asString();
|
||
|
|
||
|
var = cf.getVarPtr("SearchGUI");
|
||
|
nlassert(var);
|
||
|
searchGui = var->asInt();
|
||
|
|
||
|
var = cf.getVarPtr("GUIPath");
|
||
|
nlassert(var);
|
||
|
REP_GUI = var->asString();
|
||
|
|
||
|
var = cf.getVarPtr("SearchLevelDesign");
|
||
|
nlassert(var);
|
||
|
searchLevelDesign = var->asInt();
|
||
|
|
||
|
var = cf.getVarPtr("LevelDesignPath");
|
||
|
nlassert(var);
|
||
|
REP_LEVEL_DESIGN = var->asString();
|
||
|
|
||
|
var = cf.getVarPtr("IconPath");
|
||
|
nlassert(var);
|
||
|
convertImages(var);
|
||
|
findIcons(var);
|
||
|
|
||
|
var = cf.getVarPtr("SizeLimit");
|
||
|
if (var)
|
||
|
sizeLimit = (uint)var->asInt();
|
||
|
|
||
|
var = cf.getVarPtr("AddUsedIcons");
|
||
|
if (var)
|
||
|
addUsedIcons = var->asBool();
|
||
|
|
||
|
var = cf.getVarPtr("AddFreeIcons");
|
||
|
if (var)
|
||
|
addFreeIcons = var->asBool();
|
||
|
|
||
|
REP_ITEM = REP_LEVEL_DESIGN + "leveldesign\\Game_elem\\items\\";
|
||
|
REP_MISSION = REP_LEVEL_DESIGN + "leveldesign\\Game_elem\\mission\\";
|
||
|
REP_SITEM = REP_LEVEL_DESIGN + "leveldesign\\game_element\\sitem\\";
|
||
|
REP_SBRICK = REP_LEVEL_DESIGN + "leveldesign\\game_element\\sbrick\\";
|
||
|
REP_DFN = REP_LEVEL_DESIGN + "leveldesign\\DFN\\";
|
||
|
REP_FACTION = REP_LEVEL_DESIGN + "leveldesign\\World\\factions\\";
|
||
|
|
||
|
var = cf.getVarPtr("Wildcard");
|
||
|
if (var)
|
||
|
for (int i=0 ; i<var->size() ; i++)
|
||
|
for (uint it=0; it<listeIcones.size(); it++)
|
||
|
{
|
||
|
string wild = var->asString(i);
|
||
|
if (testWildCard(listeIcones[it], wild))
|
||
|
{
|
||
|
citations[listeIcones[it]].push_back("Matched with: " + wild);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf( "\nProcessing Directories\n----------------------\n\n" );
|
||
|
|
||
|
|
||
|
// CLIENT SRC FILES
|
||
|
if ( searchSrcClient )
|
||
|
{
|
||
|
extensions.push_back( "cpp" );
|
||
|
extensions.push_back( "h" );
|
||
|
ProcessDirectory( REP_SRC, extensions );
|
||
|
}
|
||
|
|
||
|
// GUI FILES
|
||
|
if ( searchGui )
|
||
|
{
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "xml" );
|
||
|
ProcessDirectory( REP_GUI, extensions );
|
||
|
}
|
||
|
|
||
|
if ( searchLevelDesign )
|
||
|
{
|
||
|
// ITEM FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "item" );
|
||
|
ProcessDirectory( REP_ITEM, extensions );
|
||
|
|
||
|
// MISSION FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "mission_icon" );
|
||
|
ProcessDirectory( REP_MISSION, extensions );
|
||
|
|
||
|
// SITEM FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "sitem" );
|
||
|
ProcessDirectory( REP_SITEM, extensions );
|
||
|
|
||
|
// SBRICK FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "sbrick" );
|
||
|
ProcessDirectory( REP_SBRICK, extensions );
|
||
|
|
||
|
// DFN FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "dfn" );
|
||
|
ProcessDirectory( REP_DFN, extensions );
|
||
|
|
||
|
// FACTION FILES
|
||
|
extensions.clear();
|
||
|
extensions.push_back( "faction" );
|
||
|
ProcessDirectory( REP_FACTION, extensions );
|
||
|
}
|
||
|
|
||
|
generateHTML("icons.html", sizeLimit);
|
||
|
}
|