/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
* Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
* Deliantra is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* The authors can be reached via e-mail to
*/
#include
#include
#include "face.h"
#include "crc.h"
faceidx blank_face, empty_face;
facehash_t facehash;
std::vector faces;
/* the only thing this table is used for now is to
* translate the colorname in the magicmap field of the
* face into a numeric index that is then sent to the
* client for magic map commands. The order of this table
* must match that of the NDI colors in include/newclient.h.
*/
static const char *const colorname[] = {
"black", /* 0 */
"white", /* 1 */
"blue", /* 2 */
"red", /* 3 */
"orange", /* 4 */
"light_blue", /* 5 */
"dark_orange", /* 6 */
"green", /* 7 */
"light_green", /* 8 */
"grey", /* 9 */
"brown", /* 10 */
"yellow", /* 11 */
"khaki" /* 12 */
};
/*
* Returns the matching color in the coloralias if found,
* 0 otherwise. Note that 0 will actually be black, so there is no
* way the calling function can tell if an error occurred or not
*/
static uint8
find_color (const char *name)
{
uint8 i;
for (i = 0; i < sizeof (colorname) / sizeof (*colorname); i++)
if (!strcmp (name, colorname[i]))
return i;
LOG (llevError, "Unknown color: %s\n", name);
return 0;
}
faceidx
face_find (const char *name, faceidx defidx)
{
if (!name)
return defidx;
facehash_t::iterator i = facehash.find (name);
return i == facehash.end ()
? defidx : i->second;
}
faceinfo *
face_info (faceidx idx)
{
assert (0 < (faceidx)-1); // faceidx must be unsigned
if (idx >= faces.size ())
return 0;
return &faces [idx];
}
facedata *
faceinfo::data (int faceset) const
{
return (facedata *)&(faceset && !type && data64.data.size () ? data64 : data32);
}
facedata *
face_data (faceidx idx, int faceset)
{
if (faceinfo *f = face_info (idx))
return f->data (faceset);
return 0;
}