| Автор |
Сообщение |
Саша Слободянюк
Кутузов

Зарегистрирован: 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 раз |
|
    |
 |
Саша Слободянюк
Кутузов

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


Зарегистрирован: 29.01.2009
Сообщения: 773
|
Добавлено:
Пт Июн 05, 2009 7:18 am |
  |
Саша Слободянюк
Ну для начала я вскрыл код игры. Наверно скажу тебе новость но танчики блютус у вас с открытым кодом...
1)Конечно сидеть и вручную искать функцию я не дебил. Я до этого(перед редактором) писал программу которая удобным образом сканирует все декомпилированные классы в игре. И уже её я просто в в поиске ввел.map по логике . Нашел код. Сохранил. Тоже самое и из 5 танчиков. Посмотрел сравнил. Да плюнул.
2)Попросил Амира конвертнуть пару карт и дать мне. Там карты были из одного спрайта что бы четко увидить её границы в байт коде.
Ну карту я открываю winxeh. Сравниваю новую и старую по байтно. И уже так я добился более менее результатов. Имя бы легко найти. Оно первое. Потом размер карты. Он был 15 на 15 и я поэтому тоже просто нашел. Потом настройки все вподряд записанные. Потом зачемто 15 FF. Ну а дальше однотипные спрайты. И описание карты.
3) А вот с кодировкой я помучался И я всё вручную переводил Потом добавил поддержку русского. Потом дико долго делал сохранение о открытие ё Ё ь Ь... Пока не дошло что их игры вообще не знает. А так пришлось забудрить функции конверта...
4)И наконец 2 дня провозился с бонусами. В vb6 нет операторов которые использовались для чтения контрольного байта бонусов... Да и почему то код не работал даже когда я его перевел. Он по случайности заработал.
Ну примерно так. И конечно без мозгов, прямых рук и множество чесов не обошлось
Кстати вот прога которой я код в танчиках искал http://upwww.ru/index.php?id=2709 |
|
|
  |
 |
Саша Слободянюк
Кутузов

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


Зарегистрирован: 29.01.2009
Сообщения: 773
|
Добавлено:
Пт Июн 05, 2009 12:14 pm |
  |
Саша Слободянюк
Да. Спасибо. Сегодня мож подправлю свой редактор. Правдо он не выйдет раньше ваших танков  |
|
|
  |
 |
LegolaS
WEB-Master


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


Зарегистрирован: 22.03.2009
Сообщения: 703
Откуда: Россия , Тольятти
|
Добавлено:
Пт Июн 05, 2009 10:53 pm |
  |
|
Саша Слободянюк, спасибо ! |
|
|
    |
 |
Dиmasиk
Генерал-майор


Зарегистрирован: 26.09.2008
Сообщения: 1024
|
Добавлено:
Пт Июн 05, 2009 11:35 pm |
  |
KingManiya
Большая работа! Молодец...
Саша Слободянюк
И вам спасибо, но мне наверное не пригодиться...  |
|
|
   |
 |
KingManiya
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 раз |
|
    |
 |
Саша Слободянюк
Кутузов

Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва
|
Добавлено:
Сб Июн 06, 2009 10:40 pm |
  |
|
KingManiya, кстати, обрати внимание, что в блоке дынных из 56 байт появился номер музыкального трека в уровне. |
|
|
    |
 |
KingManiya
MODMAKER


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

Зарегистрирован: 10.04.2007
Сообщения: 215
Откуда: Москва
|
Добавлено:
Вс Июн 07, 2009 3:56 am |
  |
Shift+click — это как пипетка в графическом редакторе. Чтобы взять клетку из-под курсора и потом ею рисовать.
Пальма ставится также как и здания. А в игре под клеткой пальмы будет находиться такой-же тайл, как справа от неё (стена, или земля).
По самой же клетке можно будет проезжать — дорогу она не заслоняет и клетку не занимает. Только прикрывает пушки, находящиеся под ней
Надеюсь, понятно объяснил. Это такая как-бы замена слоёв, потому что настоящие слои в игре сначала не были предусмотрены. |
|
|
    |
 |
KingManiya
MODMAKER


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