khanat-opennel-code/code/nel/tools/3d/zone_check_bind/zone_utility.cpp

121 lines
2.9 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// 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/>.
#include "nel/misc/types_nl.h"
#include "nel/misc/file.h"
#include "nel/3d/quad_tree.h"
#include "nel/3d/zone.h"
#include <iostream>
#include <vector>
#include <set>
using namespace NL3D;
using namespace NLMISC;
using namespace std;
/*******************************************************************\
getZoneCoordByName()
\*******************************************************************/
bool getZoneCoordByName(const char * name, uint16& x, uint16& y)
{
uint i;
std::string zoneName(name);
// y
string::size_type ind1 = zoneName.find("_");
if(ind1 == string::npos || ind1>=zoneName.length())
{
nlwarning("bad file name");
return false;
}
std::string ystr = zoneName.substr(0,ind1);
for(i=0; i<ystr.length(); i++)
{
if(!isdigit(ystr[i]))
{
nlwarning("y code size is not a 2 characters code");
return false;
}
}
NLMISC::fromString(ystr, y);
// x
x = 0;
uint ind2 = (uint)zoneName.length();
if((ind2-ind1-1)!=2)
{
nlwarning("x code size is not a 2 characters code");
return false;
}
std::string xstr = zoneName.substr(ind1+1,ind2-ind1-1);
for(i=0; i<xstr.length(); i++)
{
if (isalpha(xstr[i]))
{
x *= 26;
x += (tolower(xstr[i])-'a');
}
else
{
nlwarning("invalid");
return false;
}
}
return true;
}
/*******************************************************************\
getLettersFromNum()
\*******************************************************************/
void getLettersFromNum(uint16 num, std::string& code)
{
if(num>26*26)
{
nlwarning("zone index too high");
return;
}
code.resize(0);
uint16 remainder = num%26;
code += 'A' + num/26;
code += 'A' + remainder;
}
/*******************************************************************\
getZoneNameByCoord()
\*******************************************************************/
void getZoneNameByCoord(uint16 x, uint16 y, std::string& zoneName)
{
// y str
char stmp[10];
sprintf(stmp,"%d",y);
std::string ystrtmp = std::string(stmp);
// x str
std::string xstrtmp;
getLettersFromNum(x, xstrtmp);
// name
zoneName = ystrtmp;
zoneName +="_";
zoneName +=xstrtmp;
}