mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8755 3b4a5df2-a311-0410-b5c6-a8a6f20db521
168 lines
5.5 KiB
C++
168 lines
5.5 KiB
C++
#include "PaletteDB.h"
|
|
|
|
namespace LogicalBodyTypes {
|
|
|
|
PaletteDB::PaletteDB(void) : AbstractXMLLoader(StartElementHandle, EndElementHandle, CharacterDataHandle) {
|
|
}
|
|
|
|
PaletteDB::~PaletteDB(void) {
|
|
PaletteTableMap::iterator i = paletteTables.begin();
|
|
for (; i != paletteTables.end(); i++) delete i->second;
|
|
}
|
|
|
|
bool PaletteDB::AddPaletteTable(std::string name, PaletteTable* paletteTable) {
|
|
PaletteTableMap::iterator i = paletteTables.find(name);
|
|
if (i != paletteTables.end()) return false;
|
|
paletteTables[name] = paletteTable;
|
|
return true;
|
|
}
|
|
|
|
PaletteTable* PaletteDB::FindPaletteTable(std::string name) {
|
|
PaletteTableMap::iterator i = paletteTables.find(name);
|
|
if (i == paletteTables.end()) return NULL;
|
|
return i->second;
|
|
}
|
|
|
|
void XMLCALL PaletteDB::StartElementHandle(void* userData, const XML_Char* name, const XML_Char** atts) {
|
|
ParseData* data = (ParseData*)userData;
|
|
switch (data->state) {
|
|
case E_NONE:
|
|
if (strcmp(name, "Palettes") == 0) {
|
|
data->state = E_ELEMENT_PALETTES;
|
|
break;
|
|
}
|
|
case E_ELEMENT_PALETTES:
|
|
if (strcmp(name, "Palette") == 0) {
|
|
data->state = E_ELEMENT_PALETTE;
|
|
XML_Char const* aName = GetAttribute("name", atts);
|
|
XML_Char const* aFileName = GetAttribute("filename", atts);
|
|
if (aFileName == NULL || aName == NULL) throw XMLParseException("Mandatory attribute missing!", name, data->pParser);
|
|
PaletteTable* paletteTable = new PaletteTable();
|
|
if (!paletteTable->Load(aFileName)) throw XMLParseException("Palette table could not be loaded from the specified file!", name, data->pParser);
|
|
Instance().AddPaletteTable(aName, paletteTable);
|
|
break;
|
|
}
|
|
default:
|
|
throw XMLParseException("Unexpected element!", name, data->pParser);
|
|
}
|
|
}
|
|
|
|
void XMLCALL PaletteDB::EndElementHandle(void* userData, const XML_Char* name) {
|
|
ParseData* data = (ParseData*)userData;
|
|
switch (data->state) {
|
|
case E_ELEMENT_PALETTE:
|
|
if (strcmp(name, "Palette") == 0) {
|
|
data->state = E_ELEMENT_PALETTES;
|
|
break;
|
|
}
|
|
case E_ELEMENT_PALETTES:
|
|
if (strcmp(name, "Palettes") == 0) {
|
|
data->state = E_NONE;
|
|
break;
|
|
}
|
|
default:
|
|
throw XMLParseException("Unexpected element! Closing tag missing?", name, data->pParser);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void XMLCALL PaletteDB::CharacterDataHandle(void* userData, const XML_Char* str, int len) {
|
|
}
|
|
|
|
|
|
/*
|
|
BOOLEAN SOLDIERTYPE::CreateSoldierPalettes( void )
|
|
{
|
|
CHAR8 zColFilename[100];
|
|
INT32 iWhich;
|
|
INT32 cnt;
|
|
SGPPaletteEntry Temp8BPPPalette[ 256 ];
|
|
|
|
if (this->p8BPPPalette != NULL) {
|
|
MemFree(this->p8BPPPalette);
|
|
this->p8BPPPalette = NULL;
|
|
}
|
|
|
|
// Allocate mem for new palette
|
|
this->p8BPPPalette = (SGPPaletteEntry *) MemAlloc( sizeof( SGPPaletteEntry ) * 256 );
|
|
memset(this->p8BPPPalette, 0, sizeof(SGPPaletteEntry) * 256);
|
|
CHECKF(this->p8BPPPalette != NULL);
|
|
|
|
// Use col file
|
|
if (CreateSGPPaletteFromCOLFile(Temp8BPPPalette, zColFilename)) {
|
|
// Copy into palette
|
|
memcpy(this->p8BPPPalette, Temp8BPPPalette, sizeof( this->p8BPPPalette ) * 256);
|
|
} else {
|
|
}
|
|
|
|
if (this->p16BPPPalette != NULL) {
|
|
MemFree(this->p16BPPPalette);
|
|
this->p16BPPPalette = NULL;
|
|
}
|
|
|
|
// -- BUILD 16BPP Palette from this
|
|
this->p16BPPPalette = Create16BPPPalette(this->p8BPPPalette);
|
|
|
|
for (iWhich = 0; iWhich < NUM_SOLDIER_SHADES; iWhich++) {
|
|
if (this->pShades[iWhich] != NULL) {
|
|
MemFree(this->pShades[iWhich]);
|
|
this->pShades[iWhich] = NULL;
|
|
}
|
|
}
|
|
|
|
for (iWhich = 0; iWhich < NUM_SOLDIER_EFFECTSHADES; iWhich++) {
|
|
if (this->pEffectShades[iWhich] != NULL) {
|
|
MemFree( this->pEffectShades[ iWhich ] );
|
|
this->pEffectShades[iWhich] = NULL;
|
|
}
|
|
}
|
|
|
|
for (iWhich = 0; iWhich < 20; iWhich++) {
|
|
if (this->pGlowShades[iWhich] != NULL) {
|
|
MemFree( this->pGlowShades[ iWhich ]);
|
|
this->pGlowShades[iWhich] = NULL;
|
|
}
|
|
}
|
|
|
|
CreateSoldierPaletteTables( this, HVOBJECT_GLOW_GREEN );
|
|
|
|
this->pEffectShades[0] = Create16BPPPaletteShaded(this->p8BPPPalette, 100, 100, 100, TRUE);
|
|
this->pEffectShades[1] = Create16BPPPaletteShaded(this->p8BPPPalette, 100, 150, 100, TRUE);
|
|
|
|
// Build shades for glowing visible bad guy
|
|
|
|
// First do visible guy
|
|
this->pGlowShades[0] = Create16BPPPaletteShaded(this->p8BPPPalette, 255, 255, 255, FALSE);
|
|
for (cnt = 1; cnt < 10; cnt++) {
|
|
this->pGlowShades[cnt] = CreateEnemyGlow16BPPPalette(this->p8BPPPalette, gRedGlowR[cnt], 255, FALSE);
|
|
}
|
|
|
|
// Now for gray guy...
|
|
this->pGlowShades[10] = Create16BPPPaletteShaded(this->p8BPPPalette, 100, 100, 100, TRUE);
|
|
for (cnt = 11; cnt < 19; cnt++) {
|
|
this->pGlowShades[cnt] = CreateEnemyGreyGlow16BPPPalette(this->p8BPPPalette, gRedGlowR[cnt], 0, FALSE);
|
|
}
|
|
this->pGlowShades[19] = CreateEnemyGreyGlow16BPPPalette(this->p8BPPPalette, gRedGlowR[18], 0, FALSE);
|
|
|
|
|
|
// ATE: OK, piggyback on the shades we are not using for 2 colored lighting....
|
|
// ORANGE, VISIBLE GUY
|
|
this->pShades[20] = Create16BPPPaletteShaded(this->p8BPPPalette, 255, 255, 255, FALSE);
|
|
for (cnt = 21; cnt < 30; cnt++) {
|
|
this->pShades[cnt] = CreateEnemyGlow16BPPPalette(this->p8BPPPalette, gOrangeGlowR[( cnt - 20 )], gOrangeGlowG[( cnt - 20 )], TRUE);
|
|
}
|
|
|
|
// ORANGE, GREY GUY
|
|
this->pShades[30] = Create16BPPPaletteShaded(this->p8BPPPalette, 100, 100, 100, TRUE);
|
|
for (cnt = 31; cnt < 39; cnt++) {
|
|
this->pShades[cnt] = CreateEnemyGreyGlow16BPPPalette(this->p8BPPPalette, gOrangeGlowR[(cnt - 20)], gOrangeGlowG[(cnt - 20 )], TRUE);
|
|
}
|
|
this->pShades[39] = CreateEnemyGreyGlow16BPPPalette(this->p8BPPPalette, gOrangeGlowR[18], gOrangeGlowG[18], TRUE);
|
|
|
|
return(TRUE);
|
|
}
|
|
*/
|
|
|
|
|
|
}
|