Exemple #1
0
//------------------------------------------------------------------------------------
// Завершаем работу с VFS
//------------------------------------------------------------------------------------
void vw_ShutdownVFS(void)
{
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// закрываем все открытые файлы
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	if (StartFileVFS != 0)
	{
		// берем указатель на первый файл
		eFILE *Tmp = StartFileVFS;
		// просматриваем все файлы
		while (Tmp != 0)
		{
			eFILE *Tmp1 = Tmp->Next;
			vw_fclose(Tmp);
			Tmp = Tmp1;
		}
	}


	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// устанавливаем указатели в исходное состояние
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	StartFileVFS = 0;
	EndFileVFS = 0;


	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Закрываем VFS
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	vw_CloseVFS();
}
Exemple #2
0
//-----------------------------------------------------------------------------
// Загрузка
//-----------------------------------------------------------------------------
bool cXMLDocument::Load(const char *XMLFileName)
{
	printf("Open XML file: %s\n", XMLFileName);

	// если что-то было загружено ранее - освобождаем
	ReleaseXMLDocument();

	// читаем данные
	eFILE *XMLFile = vw_fopen(XMLFileName);

	if (XMLFile == NULL)
	{
		fprintf(stderr, "XML file not found: %s\n", XMLFileName);
		return false;
	}

	// читаем все данные в буфер
	XMLFile->fseek(0, SEEK_END);
	unsigned int DataLength = XMLFile->ftell();
	XMLFile->fseek(0, SEEK_SET);
	char *Buffer = new char[DataLength+1];
	Buffer[DataLength] = 0;
	XMLFile->fread(Buffer, DataLength, 1);
	vw_fclose(XMLFile);


	// проверяем заголовок
	if (FindSubString(Buffer, "<?xml") == -1)
	{
		fprintf(stderr, "XML file corrupted: %s\n", XMLFileName);
		return false;
	}
	if (FindSubString(Buffer, "?>") == -1)
	{
		fprintf(stderr, "XML file corrupted: %s\n", XMLFileName);
		return false;
	}


	// идем на рекурсивную обработку
	if (!ParseTagContent(Buffer, FindSubString(Buffer, "?>")+strlen("?>"), Buffer+FindSubString(Buffer, "?>")+strlen("?>"), 0))
	{
		fprintf(stderr, "XML file corrupted: %s\n", XMLFileName);
		delete [] Buffer;
		return false;
	}

	if (RootXMLEntry == 0)
	{
		fprintf(stderr, "XML file corrupted, root element not found: %s\n", XMLFileName);
		delete [] Buffer;
		return false;
	}

	delete [] Buffer;
	return true;
}
//------------------------------------------------------------------------------------
// инициализация данных списка миссий
//------------------------------------------------------------------------------------
void MissionsListInit()
{
	// по скрипту, смотрим что загружать + считаем сколько позиций
	cXMLDocument *xmlDoc = new cXMLDocument;

	// читаем данные
	if (!xmlDoc->Load("DATA/SCRIPT/list.xml"))
	{
		fprintf(stderr, "Can't find script file: %s\n", "DATA/SCRIPT/list.xml");
		delete xmlDoc;
		return;
	}


	// проверяем корневой элемент
	if (strcmp("AstroMenaceMissionsList", xmlDoc->RootXMLEntry->Name))
	{
		fprintf(stderr, "Can't find AstroMenaceMissionsList element in the: %s\n", "DATA/SCRIPT/list.xml");
		delete xmlDoc;
		return;
	}


	AllMission = 0;
	cXMLEntry *xmlEntry = xmlDoc->RootXMLEntry->FirstChild;
	while (xmlEntry)
	{
		// считаем, сколько миссий в файле
		if (!strcmp(xmlEntry->Name, "Mission")) AllMission++;

		// берем следующий элемент по порядку
		xmlEntry = xmlEntry->Next;
	}

	// резервируем память
	MissionTitle = new char*[AllMission];
	MissionDescr = new char*[AllMission];
	MissionIcon = new char*[AllMission];
	MissionFile = new char*[AllMission];
	MissionTitleColorR = new float[AllMission];
	MissionTitleColorG = new float[AllMission];
	MissionTitleColorB = new float[AllMission];
	MissionDescrColorR = new float[AllMission];
	MissionDescrColorG = new float[AllMission];
	MissionDescrColorB = new float[AllMission];
	MissionTitleType = new int[AllMission];
	MissionDescrType = new int[AllMission];
	// зануляем данные, на всякий случай
	for (int i=0; i<AllMission; i++)
	{
		MissionTitle[i] = 0;
		MissionDescr[i] = 0;
		MissionIcon[i] = 0;
		MissionFile[i] = 0;
		// установка типа, название (не ссылка)
		MissionTitleType[i] = 0;
		MissionDescrType[i] = 0;
		// установка цвета
		MissionTitleColorR[i] = 1.0f;MissionTitleColorG[i] = 0.5f;MissionTitleColorB[i] = 0.0f;
		MissionDescrColorR[i] = 1.0f;MissionDescrColorG[i] = 1.0f;MissionDescrColorB[i] = 1.0f;
	}




	// второй проход, заполняем массивы
	xmlEntry = xmlDoc->RootXMLEntry->FirstChild;
	int i = 0;
	while (xmlEntry)
	{
		// берем каждую миссию и смотрим настройки
		if (!strcmp(xmlEntry->Name, "Mission"))
		{
			cXMLEntry *TMission = xmlEntry->FirstChild;
			while (TMission)
			{
				// тайтл миссии
				if (!strcmp(TMission->Name, "Title"))
				{
					if (xmlDoc->GetEntryAttribute(TMission, "color") != 0)
					{
						switch (xmlDoc->iGetEntryAttribute(TMission, "color"))
						{
							case 0: // белый
								MissionTitleColorR[i]=1.0f;MissionTitleColorG[i]=1.0f;MissionTitleColorB[i]=1.0f;
								break;
							case 1: // желтый
								MissionTitleColorR[i]=1.0f;MissionTitleColorG[i]=1.0f;MissionTitleColorB[i]=0.0f;
								break;
							case 2: // красный
								MissionTitleColorR[i]=1.0f;MissionTitleColorG[i]=0.0f;MissionTitleColorB[i]=0.0f;
								break;
							case 3: // зеленый
								MissionTitleColorR[i]=0.0f;MissionTitleColorG[i]=1.0f;MissionTitleColorB[i]=0.0f;
								break;
							case 4: // оранжевый
								MissionTitleColorR[i]=1.0f;MissionTitleColorG[i]=0.5f;MissionTitleColorB[i]=0.0f;
								break;
							case 5: // серый,
								MissionTitleColorR[i]=0.5f;MissionTitleColorG[i]=0.5f;MissionTitleColorB[i]=0.5f;
								break;
							case 6: // темно оранжевый
								MissionTitleColorR[i]=1.0f;MissionTitleColorG[i]=0.3f;MissionTitleColorB[i]=0.0f;
								break;
						}
					}
					if (xmlDoc->GetEntryAttribute(TMission, "type") != 0) MissionTitleType[i] = xmlDoc->iGetEntryAttribute(TMission, "type");

					if (TMission->Content != 0)
					{
						MissionTitle[i] = new char[strlen(TMission->Content)+1];
						strcpy(MissionTitle[i], TMission->Content);
					}
				}
				else
				// описание миссии
				if (!strcmp(TMission->Name, "Descr"))
				{
					if (xmlDoc->GetEntryAttribute(TMission, "color") != 0)
					{
						switch (xmlDoc->iGetEntryAttribute(TMission, "color"))
						{
							case 0: // белый
								MissionDescrColorR[i]=1.0f;MissionDescrColorG[i]=1.0f;MissionDescrColorB[i]=1.0f;
								break;
							case 1: // желтый
								MissionDescrColorR[i]=1.0f;MissionDescrColorG[i]=1.0f;MissionDescrColorB[i]=0.0f;
								break;
							case 2: // красный
								MissionDescrColorR[i]=1.0f;MissionDescrColorG[i]=0.0f;MissionDescrColorB[i]=0.0f;
								break;
							case 3: // зеленый
								MissionDescrColorR[i]=0.0f;MissionDescrColorG[i]=1.0f;MissionDescrColorB[i]=0.0f;
								break;
							case 4: // оранжевый
								MissionDescrColorR[i]=1.0f;MissionDescrColorG[i]=0.5f;MissionDescrColorB[i]=0.0f;
								break;
							case 5: // серый,
								MissionDescrColorR[i]=0.5f;MissionDescrColorG[i]=0.5f;MissionDescrColorB[i]=0.5f;
								break;
							case 6: // темно оранжевый
								MissionDescrColorR[i]=0.8f;MissionDescrColorG[i]=0.4f;MissionDescrColorB[i]=0.0f;
								break;
						}
					}
					if (xmlDoc->GetEntryAttribute(TMission, "type") != 0) MissionDescrType[i] = xmlDoc->iGetEntryAttribute(TMission, "type");

					if (TMission->Content != 0)
					{
						MissionDescr[i] = new char[strlen(TMission->Content)+1];
						strcpy(MissionDescr[i], TMission->Content);
					}
				}
				else
				// иконка миссии
				if (!strcmp(TMission->Name, "Icon"))
				{
					if (TMission->Content != 0)
					{
						MissionIcon[i] = new char[strlen(TMission->Content)+1];
						strcpy(MissionIcon[i], TMission->Content);
					}
				}
				else
				// файл миссии
				if (!strcmp(TMission->Name, "File"))
				{
					if (TMission->Content != 0)
					{
						MissionFile[i] = new char[strlen(TMission->Content)+1];
						strcpy(MissionFile[i], TMission->Content);
					}
				}


				// берем следующий элемент
				TMission = TMission->Next;
			}

			i++;
		}
		else
		// проверяем музыку, возможно есть необходимость что-то заменить
		if (!strcmp(xmlEntry->Name, "GameMainMusic"))
		{
			eFILE *file = 0;
			file = vw_fopen(xmlEntry->Content);
			if (file != 0)
			{
				strcpy(GameMainMusic, xmlEntry->Content);
				GameMainMusicSet = true;
				vw_fclose(file);
				fprintf(stderr, "New GameMainMusic music file %s\n", xmlEntry->Content);
			}
			else
				fprintf(stderr, "Unable to find music file %s\n", xmlEntry->Content);
		}
		else
		if (!strcmp(xmlEntry->Name, "GameBossMusic"))
		{
			eFILE *file = 0;
			file = vw_fopen(xmlEntry->Content);
			if (file != 0)
			{
				strcpy(GameBossMusic, xmlEntry->Content);
				GameBossMusicSet = true;
				vw_fclose(file);
				fprintf(stderr, "New GameBossMusic music file %s\n", xmlEntry->Content);
			}
			else
				fprintf(stderr, "Unable to find music file %s\n", xmlEntry->Content);
		}
		else
		if (!strcmp(xmlEntry->Name, "GameDeathMusic"))
		{
			eFILE *file = 0;
			file = vw_fopen(xmlEntry->Content);
			if (file != 0)
			{
				strcpy(GameDeathMusic, xmlEntry->Content);
				GameDeathMusicSet = true;
				vw_fclose(file);
				fprintf(stderr, "New GameDeathMusic music file %s\n", xmlEntry->Content);
			}
			else
				fprintf(stderr, "Unable to find music file %s\n", xmlEntry->Content);
		}


		// берем следующий элемент по порядку
		xmlEntry = xmlEntry->Next;
	}


	// чистим память, со скриптом работать больше не надо
	delete xmlDoc;
}