271 lines
5.2 KiB
C++
271 lines
5.2 KiB
C++
/*=========================================================================
|
|
|
|
ANIMHEADER.CPP
|
|
|
|
Author: Gary Liddon @
|
|
Created:
|
|
Project:
|
|
Purpose:
|
|
|
|
Copyright (c) 1998 G R Liddon
|
|
|
|
===========================================================================*/
|
|
|
|
/*----------------------------------------------------------------------
|
|
Includes
|
|
-------- */
|
|
|
|
/* Std Lib
|
|
------- */
|
|
#include <strstream>
|
|
|
|
/* Glib
|
|
---- */
|
|
#include <pcre.h>
|
|
#include <gobject.hpp>
|
|
|
|
/* Local
|
|
----- */
|
|
#include "animheader.h"
|
|
|
|
/*----------------------------------------------------------------------
|
|
Tyepdefs && Defines
|
|
------------------- */
|
|
using namespace std;
|
|
|
|
/*----------------------------------------------------------------------
|
|
Structure defintions
|
|
-------------------- */
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function Prototypes
|
|
------------------- */
|
|
static int GetHex(char const * Str);
|
|
|
|
/*----------------------------------------------------------------------
|
|
Vars
|
|
---- */
|
|
|
|
/*----------------------------------------------------------------------
|
|
Data
|
|
---- */
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
int GetHex(char const * Str)
|
|
{
|
|
char Buffer[1024];
|
|
strcpy(Buffer,Str);
|
|
|
|
strstream i(Buffer,1024);
|
|
|
|
int Val;
|
|
|
|
i>>hex>>Val;
|
|
return(Val);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
|
|
void MakeAnimHeader( char * line, AnimHeaderItem * item )
|
|
{
|
|
int len;
|
|
int pos;
|
|
char anim[1024];
|
|
char animno[8];
|
|
|
|
pos = 0;
|
|
len = strlen( line );
|
|
|
|
if (len > 4)
|
|
{
|
|
int count = 0;
|
|
|
|
// FIND ANIM
|
|
while(count != 3)
|
|
{
|
|
while(line[pos] != '_')
|
|
{
|
|
pos++;
|
|
if (pos >= len)
|
|
{
|
|
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
|
|
}
|
|
}
|
|
pos++;
|
|
count++;
|
|
}
|
|
|
|
// GET ANIM NAME
|
|
count = 0;
|
|
while(line[pos] != ' ')
|
|
{
|
|
anim[count++] = line[pos++];
|
|
if (pos > len)
|
|
{
|
|
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
|
|
}
|
|
}
|
|
anim[count] = 0;
|
|
|
|
// GET ANIM NUMBER
|
|
pos += 3;
|
|
count = 0;
|
|
while(line[pos] != ',')
|
|
{
|
|
animno[count++] = line[pos++];
|
|
if (pos > len)
|
|
{
|
|
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
|
|
}
|
|
}
|
|
animno[count] = 0;
|
|
|
|
strupr( anim );
|
|
item->m_AnimName = anim;
|
|
item->m_Frame = atoi( animno );
|
|
}
|
|
else
|
|
{
|
|
GObject::Error(ERR_FATAL,"Incorrect header line - %s\n", line);
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
void readAnimHeaderFile(char const * Name, std::vector<AnimHeaderItem> & Items)
|
|
{
|
|
char Line[1024];
|
|
|
|
try
|
|
{
|
|
ifstream InStream;
|
|
|
|
InStream.open(Name,ios::in);
|
|
|
|
if (InStream)
|
|
{
|
|
InStream.getline(Line,1024); // HEADER GUARD
|
|
InStream.getline(Line,1024); // HEADER GUARD
|
|
InStream.getline(Line,1024); // ENUM
|
|
InStream.getline(Line,1024); // {
|
|
InStream.getline(Line,1024); // ANIM COUNT
|
|
|
|
while (!InStream.eof() && Line[0] != '}')
|
|
{
|
|
InStream.getline(Line,1024);
|
|
|
|
if (strlen(Line) && Line[0] != '}')
|
|
{
|
|
AnimHeaderItem MyItem;
|
|
|
|
MakeAnimHeader( Line, &MyItem );
|
|
|
|
InStream.getline(Line,1024); // NUMBER OF FRAMES
|
|
|
|
Items.push_back( MyItem );
|
|
}
|
|
}
|
|
InStream.close();
|
|
}
|
|
else
|
|
{
|
|
throw("Error opening anim header file");
|
|
}
|
|
}
|
|
|
|
catch (char const * E)
|
|
{
|
|
GObject::Error(ERR_FATAL,"Error in AddToTexList : %s",E);
|
|
}
|
|
|
|
}
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
void AnimHeaderFile::load(char const * name)
|
|
{
|
|
vector<AnimHeaderItem> items;
|
|
|
|
readAnimHeaderFile(name,items);
|
|
|
|
int numOfItems;
|
|
|
|
numOfItems=items.size();
|
|
|
|
for (int f=0;f<numOfItems;f++)
|
|
{
|
|
AnimHeaderItem dummyResult;
|
|
|
|
// if (find(items[f].m_texName,dummyResult))
|
|
// GObject::Error(ERR_FATAL,"%s already defined in anim header file database",(char const *)items[f].m_texName);
|
|
|
|
// makeTexNameCompliant(items[f].m_texName);
|
|
|
|
// m_strToInfo[items[f].m_texName]=items[f];
|
|
}
|
|
|
|
m_lastLoadedFile=name;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
void AnimHeaderFile::makeTexNameCompliant(GString & str)
|
|
{
|
|
str.Lower();
|
|
str.Filter("\\",'/');
|
|
}
|
|
|
|
/*----------------------------------------------------------------------
|
|
Function:
|
|
Purpose:
|
|
Params:
|
|
Returns:
|
|
---------------------------------------------------------------------- */
|
|
bool AnimHeaderFile::find(GString const & str,AnimHeaderItem & result)
|
|
{
|
|
GString srchStr;
|
|
map<GString,AnimHeaderItem>::iterator it;
|
|
|
|
srchStr=str;
|
|
|
|
makeTexNameCompliant(srchStr);
|
|
|
|
it=m_strToInfo.find(srchStr);
|
|
|
|
if (it == m_strToInfo.end())
|
|
{
|
|
return(false);
|
|
}
|
|
else
|
|
{
|
|
result=m_strToInfo[srchStr];
|
|
return(true);
|
|
}
|
|
}
|
|
|
|
/*===========================================================================
|
|
end */
|
|
|
|
|