inline
void cGrannyLoader::InsertAnimset(TiXmlElement *set_node)
{
	if (!set_node) return;

	XML::Node value;
	cAnimSet * animset = new cAnimSet;
	value = set_node->FirstChildElement("ID");
	animset->id = value.asInteger();

	if (value = set_node->FirstChildElement("DEFAULTANIM")) 
	{
		animset->defaultanim = mulpath + to_lower(value.asString());

		// animtype 을 anim_typeid 로 변경
		int anim_typeid = TypeData::GetAnimType("default.animation");

		if (anim_typeid != -1) 
			animset->anim_names.insert(make_pair(anim_typeid, animset->defaultanim));
	}


	TiXmlElement *anim_node = set_node->FirstChildElement("ANIMATION");
	while (anim_node) 
	{
		std::string animtype = "", filename = "";
		if (value = anim_node->FirstChildElement("TYPE"))
			animtype = value.asString();
		if ((value = anim_node->FirstChildElement("FILE")))
			filename = mulpath + to_lower(value.asString());

		// animtype 을 anim_typeid 로 변경
		int anim_typeid = TypeData::GetAnimType(animtype);

		if (anim_typeid != -1) 
			animset->anim_names.insert(make_pair(anim_typeid, filename));

		anim_node = anim_node->NextSiblingElement("ANIMATION");
	}

	m_animsets.insert(make_pair(animset->id, animset));
}
inline
void cGrannyLoader::InsertCharacterAOS(TiXmlElement *char_node)
{
	if (!char_node) return;

	XML::Node value;

	std::string filename, default_anim, desc;
	int animset = -1;

	int left_hand_bone = -1;
	int right_hand_bone = -1;
	int hand = HAND_NONE;

	value = char_node->FirstChildElement("ID");
	Uint32 id = value.asInteger();
	if (value = char_node->FirstChildElement("ANIMSET"))
		animset = value.asInteger();

	if (value = char_node->FirstChildElement ("LEFT_HAND_BONE"))
	{
		left_hand_bone = value.asInteger ();
		hand = HAND_OWNER;
	}
	if (value = char_node->FirstChildElement ("RIGHT_HAND_BONE"))
	{
		right_hand_bone = value.asInteger ();
		hand = HAND_OWNER;
	}

	if (value = char_node->FirstChildElement("DESCRIPTION"))
		desc = value.asString();

	Uint16 assign = 0;
	if (value = char_node->FirstChildElement("ASSIGN"))
		assign = value.asInteger();
	id |= assign << 16;

	map <int, cAnimSet *>::iterator iter;
	map <int, string>::iterator name_iter;


	iter = m_animsets.find(animset);

	if (id && (iter != m_animsets.end())) 
	{
		assert(iter->second);
		cGrannyModelAOS * model = new cGrannyModelAOS (tex_basepath, iter->second->defaultanim);
		model->SetHandBones (left_hand_bone, right_hand_bone);
		model->SetHand (hand);
		model->SetAnimset (animset);
		model->desc = desc;

		// HARKON : bodypart is freed by loader
		model->setFreeBodyParts(false);

		for(int i = 0; AOSBodyInfo[i].id != 0; i++) 
		{
			const AOSBodyData& Data = AOSBodyInfo[i];
			TiXmlElement *submodel = char_node->FirstChildElement(Data.name);
			if (submodel) 
			{
				cGrannyModel *m = model->AddModel(Data.id, mulpath + to_lower(submodel->GetText()));
				UINT id2 = 0xC000 | id << 4 | Data.id;
				models.insert(make_pair(id2, m));
			}
		}

		for (name_iter=iter->second->anim_names.begin(); name_iter!=iter->second->anim_names.end();name_iter++)
		{ 
			model->AddAnimation(name_iter->first, name_iter->second);
		}
		//models.erase(id);
		if (models.find(id)!=models.end()) 
		{
			pDebug.Log("Warning: duplicated model id : %d\n", id);
			delete models.find(id)->second;
			models.erase(id);
		}
		models.insert(make_pair(id, model));

	} 
	else 
	{
		pDebug.Log ("Warning: Invalid Granny AOS Definition");
	}
}
inline
void cGrannyLoader::InsertCharacter(TiXmlElement *char_node)
{
	if (!char_node) return;

	XML::Node value;
	std::string filename = "", default_anim = "", prefix = "", desc;
	int left_hand_bone = -1;
	int right_hand_bone = -1;
	int animset = -1;
	int hand = HAND_NONE;

	value = char_node->FirstChildElement("ID");
	Uint32 id = (value != NULL) ? value.asInteger() : 0;

	if (value = char_node->FirstChildElement("FILE")) 
		filename = mulpath + to_lower(value.asString());

	if (value = char_node->FirstChildElement("ANIMSET"))
		animset = value.asInteger();
	if (value = char_node->FirstChildElement("PREFIX"))
		prefix = to_lower(value.asString());

	if (value = char_node->FirstChildElement("LEFT_HAND_BONE")) 
	{
		left_hand_bone = value.asInteger();
		hand = HAND_OWNER;
	}
	if (value = char_node->FirstChildElement("RIGHT_HAND_BONE")) 
	{
		right_hand_bone = value.asInteger();
		hand = HAND_OWNER;
	}

	if (value = char_node->FirstChildElement("HAND")) 
	{
		if (value.asString () == "left")
			hand = HAND_LEFT;
		if (value.asString () == "right")
			hand = HAND_RIGHT;
	}

	if (value = char_node->FirstChildElement("DESCRIPTION"))
		desc = value.asString();

	Uint16 assign = 0;
	if (value = char_node->FirstChildElement("ASSIGN"))
		assign = value.asInteger();
	id |= assign << 16;

	// humonoid, monster can hold weapons.
	if (assign == 0 && (animset <= 1 || animset == 3)) 
		hand = HAND_OWNER; 

	map <int, cAnimSet *>::iterator iter;
	map <int, string>::iterator name_iter;

	iter = m_animsets.find(animset);

	if (id && (iter != m_animsets.end())) 
	{
		assert(iter->second);
		cGrannyModel * model = new cGrannyModelTD (filename, tex_basepath, iter->second->defaultanim, prefix);
		model->SetHandBones(left_hand_bone, right_hand_bone);
		model->SetHand(hand);
		model->desc = desc;

		model->SetAnimset (animset);

		for (name_iter=iter->second->anim_names.begin(); name_iter!=iter->second->anim_names.end();name_iter++)
		{
			model->AddAnimation(name_iter->first, name_iter->second);
		}

		//models.erase(id);
		if (models.find(id)!=models.end()) 
		{
			pDebug.Log("Warning: duplicated model id : %d", id);
			delete models.find(id)->second;
			models.erase(id);
		}
		models.insert(make_pair(id, model));
	} 
	else 
	{
		pDebug.Log ("Warning: Invalid Granny Definition");
	}
}
Beispiel #4
0
bool Config::Init()
{
	// Default values, if they are not set under config.xml those will be used.
	// Section GFX
	m_vParserInfo.push_back( ParserData( "GFX", IS_SECTION, NULL ) );
	m_vParserInfo.push_back( ParserData( "WIDTH", IS_INTEGER, &m_iWidth ) );
	m_vParserInfo.push_back( ParserData( "HEIGHT", IS_INTEGER, &m_iHeight ) );
	m_vParserInfo.push_back( ParserData( "BPP", IS_INTEGER, &m_iBPP ) );
	m_vParserInfo.push_back( ParserData( "CURSOR", IS_INTEGER, &m_iCursor ) );
	m_vParserInfo.push_back( ParserData( "PERSPECTIVE", IS_INTEGER, &m_iPerspective ) );
	m_vParserInfo.push_back( ParserData( "FULLSCREEN", IS_INTEGER, &m_iStartFullScreen ) );
	m_vParserInfo.push_back( ParserData( "ROOF_FADE_TIME", IS_INTEGER, &m_iRoofFadeTime ) );
	m_vParserInfo.push_back( ParserData( "ROOF_FADE_ALPHA", IS_INTEGER, &m_iRoofFadeAlpha ) );
	m_vParserInfo.push_back( ParserData( "ZBUFFER_SIZE", IS_INTEGER, &m_iDepthBuffer ) );
	m_vParserInfo.push_back( ParserData( "MAXZOOM", IS_INTEGER, &m_iMaxZoom ) );
	m_vParserInfo.push_back( ParserData( "MAXANGLE", IS_INTEGER, &m_iMaxAngle ) );
	m_vParserInfo.push_back( ParserData( "VIEWDISTANCE", IS_INTEGER, &m_iViewDistance ) );
	m_vParserInfo.push_back( ParserData( "BRIGHTNESS", IS_INTEGER, &m_iBrightness ) );

	// Section UO
	m_vParserInfo.push_back( ParserData( "UO", IS_SECTION, NULL ) );
	m_vParserInfo.push_back( ParserData( "STARTX", IS_INTEGER, &m_iStartX ) );
	m_vParserInfo.push_back( ParserData( "STARTY", IS_INTEGER, &m_iStartY ) );
	m_vParserInfo.push_back( ParserData( "STARTZ", IS_INTEGER, &m_iStartZ ) );
	m_vParserInfo.push_back( ParserData( "MULPATH", IS_STRING, &m_sMulPath ) );
	// m_vParserInfo.push_back( ParserData( "COMPRESSED_MAP", IS_STRING, &m_sCompressedMap ) );
	m_vParserInfo.push_back( ParserData( "POPUP_MENU", IS_INTEGER, &m_iPopup ) );
	m_vParserInfo.push_back( ParserData( "AOS", IS_INTEGER, &m_iAOSToolTips ) );
	m_vParserInfo.push_back( ParserData( "CLIENT_IDENTIFICATION", IS_STRING, &m_sClientVersion ) );
	m_vParserInfo.push_back( ParserData( "USE_CLILOCS", IS_INTEGER, &m_iClilocs ) );
	m_vParserInfo.push_back( ParserData( "CLILOC_LANGUAGE", IS_STRING, &m_sClilocLang ) );
	m_vParserInfo.push_back( ParserData( "SPEECH_HUE", IS_INTEGER, &m_iSpeechHue ) );
	m_vParserInfo.push_back( ParserData( "AOSTOOLTIPS", IS_INTEGER, &m_iAOSToolTips ) );
    //Artix added speech.mul config option
    m_vParserInfo.push_back( ParserData( "USE_SPEECH", IS_INTEGER, &m_iSpeech ) );
	// Section NET
	m_vParserInfo.push_back( ParserData( "NET", IS_SECTION, NULL ) );
	m_vParserInfo.push_back( ParserData( "PORT", IS_INTEGER, &m_iServerPort ) );
	m_vParserInfo.push_back( ParserData( "SERVER", IS_STRING, &m_sServer ) );
	m_vParserInfo.push_back( ParserData( "LOGIN", IS_STRING, &m_sLogin ) );
	m_vParserInfo.push_back( ParserData( "PASSWORD", IS_STRING, &m_sPassword ) );
	m_vParserInfo.push_back( ParserData( "IS_SPHERE", IS_INTEGER, &m_iIsSphere ) );
	m_vParserInfo.push_back( ParserData( "IS_SPHERE55R", IS_INTEGER, &m_iIsSphere55R ) );
	m_vParserInfo.push_back( ParserData( "IS_POL", IS_INTEGER, &m_iIsPol ) );
	m_vParserInfo.push_back( ParserData( "IS_RUNUO", IS_INTEGER, &m_iIsRunUO ) );
	m_vParserInfo.push_back( ParserData( "IS_UOX3", IS_INTEGER, &m_iIsUox3 ) );
	m_vParserInfo.push_back( ParserData( "CLIENT_KEY", IS_INTEGER, &m_iClientKey ) );

	// Section Sound
	m_vParserInfo.push_back( ParserData( "SOUND", IS_SECTION, NULL ) );
	m_vParserInfo.push_back( ParserData( "MUSIC", IS_INTEGER, &m_iMusic ) );
	m_vParserInfo.push_back( ParserData( "SOUND", IS_INTEGER, &m_iSound ) );
	m_vParserInfo.push_back( ParserData( "FREQUENCY", IS_INTEGER, &m_iFrequency ) );
	m_vParserInfo.push_back( ParserData( "STEREO", IS_INTEGER, &m_iStereo ) );
	m_vParserInfo.push_back( ParserData( "CHUNKSIZE", IS_INTEGER, &m_iChunkSize ) );
	m_vParserInfo.push_back( ParserData( "MUSICVOLUME", IS_INTEGER, &m_iMusicVolume ) );
	m_vParserInfo.push_back( ParserData( "SOUNDVOLUME", IS_INTEGER, &m_iSoundVolume ) );
	m_vParserInfo.push_back( ParserData( "MP3", IS_INTEGER, &m_iMP3 ) );
	m_vParserInfo.push_back( ParserData( "FOOTSTEPS", IS_INTEGER, &m_iFootSteps ) );

	// Section Iris Client
	m_vParserInfo.push_back( ParserData( "IRIS", IS_SECTION, NULL ) );
	m_vParserInfo.push_back( ParserData( "SCRIPTS_PATH", IS_STRING, &m_sScriptPath ) );
	m_vParserInfo.push_back( ParserData( "MOUSEOVER_TIMER", IS_INTEGER, &m_iMouseMotionTimer ) );
	m_vParserInfo.push_back( ParserData( "", IS_END, NULL ) );


	// After adding to the vector our struct start filling it with actual values
	XML::Parser kParser;

	kParser.loadData( "./xml/config.xml" );
	XML::Node *kDocument = kParser.parseDocument();
	XML::Node *kConfig = kDocument->findNode( "CONFIG" );

	if ( !kConfig )
	{
		THROWEXCEPTION( "Could not find configuration node." );

		return false;
	}

	XML::Node *kValue = NULL, *kSection = NULL;
	// Read all values from config.xml
	for ( int i = 0; m_vParserInfo[i].iType != IS_END; i++ )
	{
		const ParserData &Data = m_vParserInfo[i];

		if ( Data.iType == IS_SECTION )
		{
			kSection = kConfig->findNode( Data.sName );
		}
		else
		{
			// If no section is loaded get from <config>
			kValue = kSection != NULL ? kSection->findNode( Data.sName ) : kConfig->findNode( Data.sName );

			if ( kValue != NULL )
			{
				if ( Data.iType == IS_BOOL )
				{
					*reinterpret_cast<bool *>( Data.pData ) = kValue->asBool();
				}
				else if ( Data.iType == IS_INTEGER )
				{
					*reinterpret_cast<int *>( Data.pData ) = kValue->asInteger();
				}
				else if ( Data.iType == IS_STRING )
				{
					*reinterpret_cast<std::string *>( Data.pData ) = kValue->asString();
				}
			}
		}
	}


	// Read Fonts bit of the file
	XML::Node *kFontSet = kConfig->findNode( "FONTSET" );

	if ( kFontSet )
	{
		int idx = 0;
		XML::Node *kFontNode = NULL;
		FontInfo kFontInfo;

		while ( ( kFontNode = kFontSet->findNode( "FONT", idx++ ) ) )
		{
			if ( !kFontNode->lookupAttribute( "ID", kFontInfo.iId ) )
			{
				continue;
			}

			if ( !kFontNode->lookupAttribute( "FILE", kFontInfo.sFileName ) )
			{
				continue;
			}

			if ( !kFontNode->lookupAttribute( "NAME", kFontInfo.sFontName ) )
			{
				continue;
			}

			if ( !kFontNode->lookupAttribute( "SIZE", kFontInfo.iSize ) )
			{
				continue;
			}

			if ( !kFontNode->lookupAttribute( "HUE",  kFontInfo.iHue ) )
			{
				continue;
			}

			FontManager::GetInstance()->AddTTFFont( kFontInfo.iId, kFontInfo.sFileName, kFontInfo.sFontName, kFontInfo.iSize, kFontInfo.iHue );
		}
	}


	// Depth Buffer
	if ( m_iDepthBuffer <= 0 )
	{
		m_iDepthBuffer = 16;
	}

	// View Distance
	if ( m_iViewDistance < 3 )
	{
		m_iViewDistance = 3;
	}

	// Max Zoom
	if ( m_iMaxZoom <= 0 )
	{
		m_iMaxZoom = 0;
	}

	// Max Angle
	if ( m_iMaxAngle < 10 )
	{
		m_iMaxAngle = 10;
	}

	// Max Angle
	if ( m_iMaxAngle > 90 )
	{
		m_iMaxAngle = 90;
	}

	// Fix Mul path if no / at the end
	if ( m_sMulPath.size() )
	{
		char cLastChar = m_sMulPath[m_sMulPath.length() - 1];

		if ( ( cLastChar != '/' ) && ( cLastChar != '\\' ) )
		{
			m_sMulPath += "/";
		}
	}

	return true;
}