Парсер GameInfo.txt и подобных по структуре файлов

Для тех, кто хочет сделать мир лучше.
Закрыто
Сообщение
Автор
Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#1 Сообщение 18.01.2010, 14:16

Может у кого сабж есть?
Я спрашиваю, потому что не хочу изобретать велосипед. Если нет, то можно попробовать написать свой.

Насколько я знаю, нужно использовать файлы KeyValues.cpp|~.h в качестве основных для парсинга.

И да, Phoenix использует "некошерный" метод чтения Gameinfo.txt, если что, а мне это теперь также нужно для парсинга installscript*.vdf. Уверен, что, если таковой найдется/напишу, то он будет полезен не только мне.

И ещё (просто интересно): никто незнает как называется способ представления данных в Gameinfo-подобных файлах: SteamML, SML (Steam Markup Language) или как-то ещё? Просто способ чтения и представления данных очень схож с XML, как вы могли заметить %) .

Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#2 Сообщение 18.01.2010, 15:00

Ну этот способ вобще никак не называется :)

А читается это все очень просто (во всяком случае должно, код из hl2 beta)
Код

Код: Выделить всё

//-----------------------------------------------------------------------------
// Purpose: Грузим (тут код от vgui, но разницы нет, ненужное можно вырезать)
// Например можно делать return rDat; и потом передавать его функции ниже
//-----------------------------------------------------------------------------
void BuildGroup::LoadControlSettings(const char *controlResourceName, const char *pathID)
{
	KeyValues *rDat = new KeyValues(controlResourceName);

	// load the resource data from the file
	rDat->UsesEscapeSequences( true ); // VGUI may use them in .res files
	rDat->LoadFromFile( (IBaseFileSystem*)filesystem(), controlResourceName, pathID);

	// save off the resource name
	delete [] m_pResourceName;
	m_pResourceName = new char[strlen(controlResourceName) + 1];
	strcpy(m_pResourceName, controlResourceName);

	if (pathID)
	{
		delete [] m_pResourcePathID;
		m_pResourcePathID = new char[strlen(pathID) + 1];
		strcpy(m_pResourcePathID, pathID);
	}

	// loop through the resource data sticking info into controls
	ApplySettings(rDat);

	rDat->deleteThis();
}
//Тут используем то что получили сверху (если был return)
void VOID(KeyValues *inResourceData)
{
	const char *imageName = inResourceData->GetString("image", NULL);
BLAH....
BLAH....
BLAH....
}

//А вот так грузим
LoadControlSettings("Resource/UI/ClassMenu.res");
Наибольшая проблема наверное (IBaseFileSystem*)filesystem(), хотя как знать...

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#3 Сообщение 18.01.2010, 15:37

Хм...тогда для моего случая можно будет простеньку либу сообразить %) .

Аватара пользователя
koshmel
VIP
VIP
Сообщения: 373
Зарегистрирован: 24.03.2007
Контактная информация:

#4 Сообщение 18.01.2010, 19:45

в SourceSDK все есть
Изображение
kadet89 писал(а):Не врубился в этот алгоритм...но думаю моно попробовать через бинарник изменить саму команду...только вот в каком файле она?

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#5 Сообщение 18.01.2010, 19:49

koshmel
Да, я понял - поэтому и спрашиваю, что может у кого есть либо уже скомпиленный парсер или примеры...впрочем, и того, что здесь есть хватает...пожалуй, закрою. Всем спасибо.

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#6 Сообщение 01.02.2010, 13:04

У меня есть модуль, читающий файлы SteamScheme.res. Там вроде как структура таже.
Если надо - сегодня ночью выложу.
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#7 Сообщение 02.02.2010, 15:40

Ну давай - раз уж на то пошло. Я просто думал, что нормального модуля чтения ни у кого нет, а свой скомпилить что-то не выходит...я чувствую себя ламером %)

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#8 Сообщение 03.02.2010, 01:11

Вот мой проект (хз какой давности уже). Тебе нужен класс pVALVEResourceFile из TypeLib.pas ;) Думаю, переписать будет несложно + можешь оптимизировать ибо я его тогда делал по принципу "абы работало".
Последний раз редактировалось $t@t!c_V()1D 03.02.2010, 01:11, всего редактировалось 2 раза.
Причина: Перезалил...вдруг кому понадобится
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#9 Сообщение 03.02.2010, 17:41

Как-то слишком...примитивно что ль %) . В keyvalues и XML-подобные getnextsibling|~prevsibling|~parent|~nextchildnode...впрочем ладно - оптимизировать, так оптимизировать.

Закрыто