//------------------------------------------------------------------------------------ // Завершаем работу с 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(); }
//----------------------------------------------------------------------------- // Загрузка //----------------------------------------------------------------------------- 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; }