Где и как считать информацию о карте?
Без варкрафта и без редактора карт.
Где хранится эта информация? Нужно ли распаковывать карту для считывания?
Название
Автор
Описание
Дополнение
Ландшафт
Размеры
Playable Area
Количество игроков
Картинка миникарты

Принятый ответ

vasya1, проблема знака '-' в том что не получится в пути написать пробелы, поэтому лучше путь пихать в кавычки "")
только нафиг '-' писать) Да и вообще никто так не делает вроде)

вроде решил проблему
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
4
5 лет назад
0
Текст из этого окна хранится в war3map.wts. Чтобы получить этот файл, нужно распаковать карту.
1
27
5 лет назад
1
могу скинуть перевод и разбор. но он не полный. могу даже ошибаться.
Загруженные файлы
0
32
5 лет назад
0
Насколько помню большая часть инфы в war3map.i, некоторая инфа в мпк архиве продублирована.
0
5
5 лет назад
Отредактирован vasya1
0
короче
Название - w3m/w3x или war3map.w3i(UTF65001)+war3map.wts или war3map.j+war3map.wts
Автор - war3map.w3i(UTF65001)+war3map.wts или war3map.j
Описание - war3map.w3i(UTF65001)+war3map.wts или war3map.j+war3map.wts
Дополнение - war3map.w3i первый символ 12-ROC, 19-TFT
Ландшафт - war3map.w3i
Размеры - war3map.w3i
Playable Area - war3map.w3i
Количество игроков - war3map.w3i или war3map.wts
Картинка постер - war3mapPreview.tga
Картинка миникарты и постер - war3mapMap.blp (сжата) или war3mapMap.b00 или war3mapMap.tga
extract image from war3mapMap.blp
  1. extract 'war3mapMap.blp' from map file (using StromLib or Strom.dll - see zezula.net/en/mpq/stormlib.html)
  2. open this blp-file and filter header
  3. decompress jpeg data (using a jpeglib, e.g ijl.dll from warcraft dir) (Intel Jpeg Library Version 1.5.4.36)
а нет парсера ?
нашел только кривой недоделанный на питоне github.com/ChristophHaag/wc3map
и онлайн побаловаться wc3.rivsoft.net
ещё есть?
могу скинуть перевод
файл хороший, его зарелизили в отдельную статью тут? релизьте уже
1
28
5 лет назад
1
vasya1, тебе стоит обратиться к Kirill78, он создатель IrinaBot.
0
18
5 лет назад
0
В war3map.w3i всё хранится
В ROC картах он чуть отличается от TFT
Если говорить по версиям, то близзарды .w3i меняли только в 1.31 чтобы добавить пункт с луа и еще какие то 4 константы + они убрали различие между ROC и TFT картами (т.е и в тех и в других будет одна и та же структура .w3i)

У меня есть сурс от парсера, но он заточен чтобы брать нужные значения, типа высота-ширина карты и т.д
И там нету гуи)
Ну всмысле тупо код чтобы распарсить .w3i
0
5
5 лет назад
0
У меня есть сурс от парсера, но он заточен чтобы брать нужные значения, типа высота-ширина карты и т.д
И там нету гуи)
Ну всмысле тупо код чтобы распарсить .w3i
неси сюда
1
18
5 лет назад
1
это с гитхаба украл:
HANDLE SubFile;

if( SFileOpenFileEx( MapMPQ, "war3map.w3i", 0, &SubFile ) )
{
	uint32_t FileLength = SFileGetFileSize( SubFile, NULL );

	if( FileLength > 0 && FileLength != 0xFFFFFFFF )
	{
		char *SubFileData = new char[FileLength];
		DWORD BytesRead = 0;

		if( SFileReadFile( SubFile, SubFileData, FileLength, &BytesRead, NULL ) )
		{
			istringstream ISS( string( SubFileData, BytesRead ) );

			// war3map.w3i format found at http://www.wc3campaigns.net/tools/specs/index.html by Zepir/PitzerMike

			string GarbageString;
			uint32_t FileFormat;
			uint32_t RawMapWidth;
			uint32_t RawMapHeight;
			uint32_t RawMapFlags;
			uint32_t RawMapNumPlayers;
			uint32_t RawMapNumTeams;

			ISS.read( (char *)&FileFormat, 4 );				// file format (18 = ROC, 25 = TFT)

			if( FileFormat == 18 || FileFormat == 25 )
			{
				ISS.seekg( 4, ios :: cur );					// number of saves
				ISS.read( (char *)&EditorVersion, 4 );		// editor version
				getline( ISS, GarbageString, '\0' );		// map name
				getline( ISS, GarbageString, '\0' );		// map author
				getline( ISS, GarbageString, '\0' );		// map description
				getline( ISS, GarbageString, '\0' );		// players recommended
				ISS.seekg( 32, ios :: cur );				// camera bounds
				ISS.seekg( 16, ios :: cur );				// camera bounds complements
				ISS.read( (char *)&RawMapWidth, 4 );		// map width
				ISS.read( (char *)&RawMapHeight, 4 );		// map height
				ISS.read( (char *)&RawMapFlags, 4 );		// flags
				ISS.seekg( 1, ios :: cur );					// map main ground type

				if( FileFormat == 18 )
					ISS.seekg( 4, ios :: cur );				// campaign background number
				else if( FileFormat == 25 )
				{
					ISS.seekg( 4, ios :: cur );				// loading screen background number
					getline( ISS, GarbageString, '\0' );	// path of custom loading screen model
				}

				getline( ISS, GarbageString, '\0' );		// map loading screen text
				getline( ISS, GarbageString, '\0' );		// map loading screen title
				getline( ISS, GarbageString, '\0' );		// map loading screen subtitle

				if( FileFormat == 18 )
					ISS.seekg( 4, ios :: cur );				// map loading screen number
				else if( FileFormat == 25 )
				{
					ISS.seekg( 4, ios :: cur );				// used game data set
					getline( ISS, GarbageString, '\0' );	// prologue screen path
				}

				getline( ISS, GarbageString, '\0' );		// prologue screen text
				getline( ISS, GarbageString, '\0' );		// prologue screen title
				getline( ISS, GarbageString, '\0' );		// prologue screen subtitle

				if( FileFormat == 25 )
				{
					ISS.seekg( 4, ios :: cur );				// uses terrain fog
					ISS.seekg( 4, ios :: cur );				// fog start z height
					ISS.seekg( 4, ios :: cur );				// fog end z height
					ISS.seekg( 4, ios :: cur );				// fog density
					ISS.seekg( 1, ios :: cur );				// fog red value
					ISS.seekg( 1, ios :: cur );				// fog green value
					ISS.seekg( 1, ios :: cur );				// fog blue value
					ISS.seekg( 1, ios :: cur );				// fog alpha value
					ISS.seekg( 4, ios :: cur );				// global weather id
					getline( ISS, GarbageString, '\0' );	// custom sound environment
					ISS.seekg( 1, ios :: cur );				// tileset id of the used custom light environment
					ISS.seekg( 1, ios :: cur );				// custom water tinting red value
					ISS.seekg( 1, ios :: cur );				// custom water tinting green value
					ISS.seekg( 1, ios :: cur );				// custom water tinting blue value
					ISS.seekg( 1, ios :: cur );				// custom water tinting alpha value
				}

				ISS.read( (char *)&RawMapNumPlayers, 4 );	// number of players
				uint32_t ClosedSlots = 0;

				for( uint32_t i = 0; i < RawMapNumPlayers; ++i )
				{
					CGameSlot Slot( 0, 255, SLOTSTATUS_OPEN, 0, 0, 1, SLOTRACE_RANDOM );
					uint32_t Colour;
					uint32_t Status;
					uint32_t Race;

					ISS.read( (char *)&Colour, 4 );			// colour
					Slot.SetColour( Colour );
					ISS.read( (char *)&Status, 4 );			// status

					if( Status == 1 )
						Slot.SetSlotStatus( SLOTSTATUS_OPEN );
					else if( Status == 2 )
					{
						Slot.SetSlotStatus( SLOTSTATUS_OCCUPIED );
						Slot.SetComputer( 1 );
						Slot.SetComputerType( SLOTCOMP_NORMAL );
					}
					else
					{
						Slot.SetSlotStatus( SLOTSTATUS_CLOSED );
						++ClosedSlots;
					}

					ISS.read( (char *)&Race, 4 );			// race

					if( Race == 1 )
						Slot.SetRace( SLOTRACE_HUMAN );
					else if( Race == 2 )
						Slot.SetRace( SLOTRACE_ORC );
					else if( Race == 3 )
						Slot.SetRace( SLOTRACE_UNDEAD );
					else if( Race == 4 )
						Slot.SetRace( SLOTRACE_NIGHTELF );
					else
						Slot.SetRace( SLOTRACE_RANDOM );

					ISS.seekg( 4, ios :: cur );				// fixed start position
					getline( ISS, GarbageString, '\0' );	// player name
					ISS.seekg( 4, ios :: cur );				// start position x
					ISS.seekg( 4, ios :: cur );				// start position y
					ISS.seekg( 4, ios :: cur );				// ally low priorities
					ISS.seekg( 4, ios :: cur );				// ally high priorities

					if( Slot.GetSlotStatus( ) != SLOTSTATUS_CLOSED )
						Slots.push_back( Slot );
				}

				ISS.read( (char *)&RawMapNumTeams, 4 );		// number of teams

				for( uint32_t i = 0; i < RawMapNumTeams; ++i )
				{
					uint32_t Flags;
					uint32_t PlayerMask;

					ISS.read( (char *)&Flags, 4 );			// flags
					ISS.read( (char *)&PlayerMask, 4 );		// player mask

					for( unsigned char j = 0; j < MAX_SLOTS; ++j )
					{
						if( PlayerMask & 1 )
						{
							for( vector<CGameSlot> :: iterator k = Slots.begin( ); k != Slots.end( ); ++k )
							{
								if( (*k).GetColour( ) == j )
									(*k).SetTeam( i );
							}
						}

						PlayerMask >>= 1;
					}

					getline( ISS, GarbageString, '\0' );	// team name
				}

				// the bot only cares about the following options: melee, fixed player settings, custom forces
				// let's not confuse the user by displaying erroneous map options so zero them out now

				MapOptions = RawMapFlags & ( MAPOPT_MELEE | MAPOPT_FIXEDPLAYERSETTINGS | MAPOPT_CUSTOMFORCES );
				CONSOLE_Print( "[MAP] calculated map_options = " + UTIL_ToString( MapOptions ) );
				MapWidth = UTIL_CreateByteArray( (uint16_t)RawMapWidth, false );
				CONSOLE_Print( "[MAP] calculated map_width = " + UTIL_ByteArrayToDecString( MapWidth ) );
				MapHeight = UTIL_CreateByteArray( (uint16_t)RawMapHeight, false );
				CONSOLE_Print( "[MAP] calculated map_height = " + UTIL_ByteArrayToDecString( MapHeight ) );
				MapNumPlayers = RawMapNumPlayers - ClosedSlots;
				CONSOLE_Print( "[MAP] calculated map_numplayers = " + UTIL_ToString( MapNumPlayers ) );
				MapNumTeams = RawMapNumTeams;
				CONSOLE_Print( "[MAP] calculated map_numteams = " + UTIL_ToString( MapNumTeams ) );

				uint32_t SlotNum = 1;

				for( vector<CGameSlot> :: iterator i = Slots.begin( ); i != Slots.end( ); ++i )
				{
					CONSOLE_Print( "[MAP] calculated map_slot" + UTIL_ToString( SlotNum ) + " = " + UTIL_ByteArrayToDecString( (*i).GetByteArray( ) ) );
					++SlotNum;
				}

				if( MapOptions & MAPOPT_MELEE )
				{
					CONSOLE_Print( "[MAP] found melee map, initializing slots" );

					// give each slot a different team and set the race to random

					unsigned char Team = 0;

					for( vector<CGameSlot> :: iterator i = Slots.begin( ); i != Slots.end( ); ++i )
					{
						(*i).SetTeam( Team++ );
						(*i).SetRace( SLOTRACE_RANDOM );
					}

					MapFilterType = MAPFILTER_TYPE_MELEE;
				}

				if( !( MapOptions & MAPOPT_FIXEDPLAYERSETTINGS ) )
				{
					// make races selectable

					for( vector<CGameSlot> :: iterator i = Slots.begin( ); i != Slots.end( ); ++i )
						(*i).SetRace( (*i).GetRace( ) | SLOTRACE_SELECTABLE );
				}
			}
		}
		else
			CONSOLE_Print( "[MAP] unable to calculate map_options, map_width, map_height, map_slot<x>, map_numplayers, map_numteams - unable to extract war3map.w3i from MPQ file" );

		delete [] SubFileData;
	}

	SFileCloseFile( SubFile );
}
и ещё есть тоже самое, но я переделывал под 1.31 (надо поискать у себя)
0
27
5 лет назад
Отредактирован MpW
0
файл хороший, его зарелизили в отдельную статью тут? релизьте уже
я не могу точно обещать. к тому смущает меня кол-во дыр в информации (у меня) и неточностей, и перевод не полный. как это может потянуть на статью. у меня нет никаких навыков программирования =), могу даже что то не так перевести или понять. хотя это желание разобраться и перевести возникает не всегда, от альтруизма и пр. но с картинками и прочее понятнее
0
5
5 лет назад
0
Hodor:
это с гитхаба украл:
это на крестах? exe скомпилировать сможешь? чтобы запускать типа "Hodor.exe map.w3x" с экспортом в txt, а то он там в CONSOLE_Print печатает. это чтобы этим скриптом попользоваться, надо устанавливать C
1
18
5 лет назад
1
vasya1,
нуууу, это не совсем скрипт, это считай кусок кода из хостбота
Экспорт в .txt можно сделать, но не раньше чем завтра (мб к вечеру освобожусь)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.