Список форумов tanchiki.ru
 
FAQ  •   Поиск  •   Пользователи  •   Группы
Регистрация  •   Профиль  •   Войти и проверить личные сообщения  •   Вход
 
   
   
  Следить за нами на Twitter: DaSuppaStudios
Проблемы на сервере онлайн меню Танчики Про
   
 Структура формата карт для Танчиков 4 .map Следующая тема
Предыдущая тема
Автор Сообщение
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Чт Июн 04, 2009 7:06 pm Ответить с цитатойВернуться к началу
Товарищи, я вижу, у многих есть свои идеи по созданию карт и редакторов. Например, онлайн-редактор, доступный из браузера, или, может кому-то придёт идея сделать редактор, который автоматически генерирует карты (мы даже поможем в этом).

Поэтому, чтобы облегчить всем участь создателя редактора, пожалуй, опубликую формат карт, чтобы вы сами могли делать свои редакторы.

Итак, самая новая версия карт на сегодняшний день — номер 5.

Цитата:
1 байт — всегда $FF;
1 байт — версия карты (текущая версия = 5);
1 байт — длина названия карты в байтах (1 символ занимает 2 байта);
N байт — название карты в Unicode (UCS-2 Big Endian);

1 байт — версия редактора (совпадает с версией карты, тоже 5);
1 байт — ширина карты;
1 байт — высота карты;
56 байт — данные карты (кол-во врагов и т.п.);

1 байт — резервный (в пятой версии = 0);
N байт — X*Y байт — данные о самой карте;

2 байта — длина брифинга в байтах (1 символ занимает 2 байта), сначала старший байт длины, затем младший;
N байт — сам брифинг в Unicode (UCS-2 Big Endian);

2 байта — длина дебрифинга в байтах (1 символ занимает 2 байта);
N байт — дебрифинг в Unicode (UCS-2 Big Endian);


Код:

Список данных, которые идут в 56 байтах информации о карте:
Enemy limit (1..20)
Enemy 1 light
Enemy 2 light
Enemy 3 light
Enemy 4 kamikaze
Enemy 5 heavy
Enemy 6 heavy
Enemy 7 siege
Enemy 8 boss
Ally limit (1..20)
Ally 1 light
Ally 2 light
Ally 3 light
Ally 4 kamikaze
Ally 5 heavy
Ally 6 heavy
Ally 7 siege
Ally 8 boss
Def. turret type enm (1..10)
Def. turret type ally (1..10)
Turret Height (0..1)
Turret Distance (1..20)
Transparency mode (1..3)
Level Difficulty (1..5)
Tanks AI Type (0..5)
Victory Condition (1..66)
Air support 1x
Air support 1y
Air support 2x
Air support 2y
Air support 3x
Air support 3y
Spawn 1 queue
Spawn 2 queue
Spawn 3 queue
Spawn 4 queue
Spawn 1 tanks
Spawn 2 tanks
Spawn 3 tanks
Spawn 4 tanks
Spawn 1 AI (0..5)
Spawn 2 AI
Spawn 3 AI
Spawn 4 AI
Crate 1 weapon (0..18)
Crate 2 weapon
Crate 3 weapon
Radar HP
Nuclear HP
Music Track Num
Здесь 50 байт, а оставшиеся байты (6 штук) заполняем значениями $FF.

Что означает каждая переменная — можно посмотреть в нашем официальном редакторе.

И, друзья, вот вам пример кода — процедура сохранения карты, написанная на Delphi, фактически, такая, какая она и есть в нашем редакторе:
Код:
procedure TfrmMain.SaveMap(filename: string);
var
  f: file of byte;
  b: byte;
  w: word;
  i, j: integer;
  iLen: integer;
  byte1, byte2: byte;
  x, y: integer;

  WideChars: array[0..4000] of WideChar;
  WideArray: array[0..8000] of byte;
  WideArrayLength: integer;

  ResultString: WideString;

  wByte: WideChar;
  wsName: WideString;
  wsBrief: WideString;
  wsDebrief: WideString;

begin
  // Сохраняем карту
  AssignFile(f, FileName);
  Rewrite(f);
  try
    // (1) Первый байт — всегда $FF
    b := 255;
    write(f, b);
    // (2) Второй байт — номер версии
    b := CURRENT_VERSION;
    write(f, b);


    // Название карты
    if length(edtName.Text) = 0 then
      edtName.Text := 'T';
    wsName := edtName.Text;
    iLen := length(wsName);

    WideArrayLength:=0;

    // Подготавливаем название карты в Unicode
    for i:=1 to iLen do
    begin
      wByte:=wsName[i];
      if wByte<>#0 then
      begin
        w := Word(wByte);
        WideArray[WideArrayLength]:=(w shr 8) and $FF;
        WideArray[WideArrayLength+1]:= w and $FF;
        inc(WideArrayLength, 2);
      end;
    end;


    // (3) Записываем длину названия карты
    b := WideArrayLength;
    write(f, b);

    // (4) Записываем само название карты
    for i := 0 to WideArrayLength-1 do
      write(f, WideArray[i]);

    // (5) Записываем версию карты
    lstParams.Cells[1,1] := IntToStr(CURRENT_VERSION);
    b := StrToInt(lstParams.Cells[1,1]); write(f,b);

    // (6) Записываем размер карты (два байта — X и Y)
    b := fMapSize.X; write(f, b);
    b := fMapSize.Y; write(f, b);


    // (7) Записываем 56 байт данных (количество врагов и т.п.)
    for i := 1 to 56 do
    begin
      if i+1 <= lstParams.Strings.Count then
        b := StrToInt(lstParams.Cells[1, i+1])
      else
        // Если байт не используется (оставили его на будущее), то записываем 255
        b := 255;

      write(f, b);
    end;


    // (8) Один байт (резервный) — в первой версии Танчиков записывалась переменная,
    // зависящая от размера карты, в текущей версии можно писать сюда 0
    b := (fMapSize.Y * fMapSize.X) and $FF;
    write(f, b);


    // (9) Записываем X*Y байт — данные самой карты
    for i := 0 to fMapSize.Y — 1 do
    for j := 0 to fMapSize.X — 1 do
      begin
        b := fMap[j,i];
        write(f, b);
      end;


    // Брифинг
    wsBrief:='';
    wsBrief:= itmBrief.Text;

    // Очищаем строку от сдвоенных пробелов
    while pos('  ', wsBrief) <> 0 do
      delete(wsBrief, pos('  ', wsBrief), 1);

    // Копируем брифинг из строки в байтовый массив
    WideArrayLength := 0;
    iLen := length(wsBrief);
    for i:=1 to iLen do
    begin
      wByte:=wsBrief[i];
      if wByte<>#0 then
      begin
        w := Word(wByte);
        WideArray[WideArrayLength]:=(w shr 8) and $FF;
        WideArray[WideArrayLength+1]:= w and $FF;
        inc(WideArrayLength, 2);
      end;
    end;

    // (10) 2 байта — длина брифинга
    i := WideArrayLength;
    byte2 := WideArrayLength and $FF;
    byte1 := (WideArrayLength shr 8) and $FF;
    write(f, byte1);
    write(f, byte2);

    // (11) Сохраняем сам брифинг
    for i := 0 to WideArrayLength-1 do
      write(f, WideArray[i]);

    // Дебрифинг
    wsDebrief:= itmDebrief.Text;

    // Очищаем строку от сдвоенных пробелов
    while pos('  ', wsDebrief) <> 0 do
      delete(wsDebrief, pos('  ', wsDebrief), 1);

    // Копируем дебрифинг из строки в байтовый массив
    WideArrayLength:=0;
    iLen:=length(wsDebrief);
    for i:=1 to iLen do
    begin
      wByte:=wsDebrief[i];
      // отсеиваем пустышки
      if wByte<>#0 then
      begin
        w := Word(wByte);
        WideArray[WideArrayLength]:=(w shr 8) and $FF;
        WideArray[WideArrayLength+1]:= w and $FF;
        inc(WideArrayLength, 2);
      end;
    end;

    // (12) 2 байта — длина дебрифинга
    i:=WideArrayLength;
    byte2 := WideArrayLength and $FF;
    byte1 := (WideArrayLength shr 8) and $FF;
    write(f, byte1);
    write(f, byte2);

    // (13) Сохраняем сам дебрифинг
    for i := 0 to WideArrayLength-1 do
      write(f, WideArray[i]);

  finally
    CloseFile(f);
    WasChanges:=false;
  end;
end;


Точно также карта и читается.
Со временем мы эту рубрику планируем пополнять, и по вашей просьбе готовы выкладывать различные алгоритмы, используищиеся в Танчиках, если это пойдет на благо отечества.


Последний раз редактировалось: Саша Слободянюк (Пт Июн 05, 2009 8:26 am), всего редактировалось 1 раз
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Пт Июн 05, 2009 1:28 am Ответить с цитатойВернуться к началу
Кстати, KingManiya, расскажи, пожалуйста, как ты сам вручную смог разобрать формат карт, какие программы использовал для этого. Думаю, многим было бы интересно поучиться и узнать, как такое делается.
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
KingManiya
MODMAKER
MODMAKER


Зарегистрирован: 29.01.2009
Сообщения: 773

СообщениеДобавлено: Пт Июн 05, 2009 7:18 am Ответить с цитатойВернуться к началу
Саша Слободянюк
Ну для начала я вскрыл код игры. Наверно скажу тебе новость но танчики блютус у вас с открытым кодом...
1)Конечно сидеть и вручную искать функцию я не дебил. Я до этого(перед редактором) писал программу которая удобным образом сканирует все декомпилированные классы в игре. И уже её я просто в в поиске ввел.map по логике Idea. Нашел код. Сохранил. Тоже самое и из 5 танчиков. Посмотрел сравнил. Да плюнул.
2)Попросил Амира конвертнуть пару карт и дать мне. Там карты были из одного спрайта что бы четко увидить её границы в байт коде.
Ну карту я открываю winxeh. Сравниваю новую и старую по байтно. И уже так я добился более менее результатов. Имя бы легко найти. Оно первое. Потом размер карты. Он был 15 на 15 и я поэтому тоже просто нашел. Потом настройки все вподряд записанные. Потом зачемто 15 FF. Ну а дальше однотипные спрайты. И описание карты.
3) А вот с кодировкой я помучался Sad И я всё вручную переводил Sad Потом добавил поддержку русского. Потом дико долго делал сохранение о открытие ё Ё ь Ь... Пока не дошло что их игры вообще не знает. А так пришлось забудрить функции конверта...
4)И наконец 2 дня провозился с бонусами. В vb6 нет операторов которые использовались для чтения контрольного байта бонусов... Да и почему то код не работал даже когда я его перевел. Он по случайности заработал. Very Happy

Ну примерно так. И конечно без мозгов, прямых рук и множество чесов не обошлось Smile
Кстати вот прога которой я код в танчиках искал http://upwww.ru/index.php?id=2709
Посмотреть профильОтправить личное сообщение
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Пт Июн 05, 2009 8:29 am Ответить с цитатойВернуться к началу
Достойно похвалы! Видимо, понадобилось много терпения.
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
KingManiya
MODMAKER
MODMAKER


Зарегистрирован: 29.01.2009
Сообщения: 773

СообщениеДобавлено: Пт Июн 05, 2009 12:14 pm Ответить с цитатойВернуться к началу
Саша Слободянюк
Да. Спасибо. Сегодня мож подправлю свой редактор. Правдо он не выйдет раньше ваших танков Smile
Посмотреть профильОтправить личное сообщение
LegolaS
WEB-Master
WEB-Master


Зарегистрирован: 18.02.2008
Сообщения: 654
Откуда: Кемерово

СообщениеДобавлено: Пт Июн 05, 2009 12:50 pm Ответить с цитатойВернуться к началу
Саша Слободянюк, KingManiya,
огромное вам спасибо за помощь! Мне особенно пригодится в разработке онлайн-редактора процедура сохранения карты на Delphi, т.к. с этим языком программирования я достаточно хорошо знаком Smile Буду разбираться Wink
Посмотреть профильОтправить личное сообщениеОтправить e-mailICQ Number
NaruTREY
Генерал
Генерал


Зарегистрирован: 22.03.2009
Сообщения: 703
Откуда: Россия , Тольятти

СообщениеДобавлено: Пт Июн 05, 2009 10:53 pm Ответить с цитатойВернуться к началу
Саша Слободянюк, спасибо !
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
Dиmasиk
Генерал-майор
Генерал-майор


Зарегистрирован: 26.09.2008
Сообщения: 1024

СообщениеДобавлено: Пт Июн 05, 2009 11:35 pm Ответить с цитатойВернуться к началу
KingManiya
Большая работа! Молодец...
Саша Слободянюк
И вам спасибо, но мне наверное не пригодиться... Very Happy
Посмотреть профильОтправить личное сообщениеICQ Number
KingManiya
MODMAKER
MODMAKER


Зарегистрирован: 29.01.2009
Сообщения: 773

СообщениеДобавлено: Сб Июн 06, 2009 1:28 pm Ответить с цитатойВернуться к началу
Саша Слободянюк
И так я попытался сделать карту нового формата. Если у вас будет время не могли бы вы её проверить и открыть вашем редактором.
Вот что должно быть
1)Название Name
2)Размер 15 на 15
3)Настройки карты идут 1 2 3 4...8 9 1 2 3....несколько раз....8 9 1 2 3 4 5
4)Описание до карты
5)Описание после карты

Сама карта состоит из 4 квадратов сделанных из деревянных кубиков
Посмотреть профильОтправить личное сообщение
Амир
Связной
Связной


Зарегистрирован: 06.07.2008
Сообщения: 1443
Откуда: Йошкар-Ола

СообщениеДобавлено: Сб Июн 06, 2009 8:55 pm Ответить с цитатойВернуться к началу
KingManiya
ошибка ввода-вывода!
Посмотреть профильОтправить личное сообщение
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Сб Июн 06, 2009 10:39 pm Ответить с цитатойВернуться к началу
Амир, Кингмания просит проверить карту в новом редакторе (а я все еще не прислал новый редактор тебе — по мелочам доделываем же)
А карта открывается правильно, всё ок, вот, ниже картинка.
Тексты до и после уровня тоже верно отображаются.


Последний раз редактировалось: Саша Слободянюк (Сб Июн 06, 2009 10:42 pm), всего редактировалось 1 раз
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Сб Июн 06, 2009 10:40 pm Ответить с цитатойВернуться к началу
KingManiya, кстати, обрати внимание, что в блоке дынных из 56 байт появился номер музыкального трека в уровне.
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
KingManiya
MODMAKER
MODMAKER


Зарегистрирован: 29.01.2009
Сообщения: 773

СообщениеДобавлено: Вс Июн 07, 2009 3:42 am Ответить с цитатойВернуться к началу
Саша Слободянюк
Обрадывал Smile Smile
А ты можешь сей-час рассказать что означает
Shift+click ---- get title under the cursor
И почему пальма на черном фоне? Или это пока еще не доделанно?
Или же появилось некое подобие слоев?
Посмотреть профильОтправить личное сообщение
Саша Слободянюк
Кутузов


Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва

СообщениеДобавлено: Вс Июн 07, 2009 3:56 am Ответить с цитатойВернуться к началу
Shift+click — это как пипетка в графическом редакторе. Чтобы взять клетку из-под курсора и потом ею рисовать.

Пальма ставится также как и здания. А в игре под клеткой пальмы будет находиться такой-же тайл, как справа от неё (стена, или земля).
По самой же клетке можно будет проезжать — дорогу она не заслоняет и клетку не занимает. Только прикрывает пушки, находящиеся под ней Smile

Надеюсь, понятно объяснил. Это такая как-бы замена слоёв, потому что настоящие слои в игре сначала не были предусмотрены.
Посмотреть профильОтправить личное сообщениеПосетить сайт автораICQ Number
KingManiya
MODMAKER
MODMAKER


Зарегистрирован: 29.01.2009
Сообщения: 773

СообщениеДобавлено: Вс Июн 07, 2009 7:43 am Ответить с цитатойВернуться к началу
Тоесть она будет как бы занимать 4 клетки, но можно будет ездить под пальмой.
Класно!
Посмотреть профильОтправить личное сообщение

Ответить на тему



Powered by phpBB © 2001/3 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3
Русская поддержка phpBB
 
     
             
     

DaSuppaStudios © 2008 - 2010