Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

Редактор карт в DelphiX   Найти похожие ветки 

 
Аццкий_рыцарь:)   (2006-01-24 01:15) [0]

я наверное уже задолбал вас со своими тупыми и ламерскими вопросами :)

вот вопрос :)

Расскажите мне плиз как создавать редактор карт в DelphiX. Тоесть, как делается так что потом карта сохраняется в отдельный файл, а потом загружается?


 
Shirson ©   (2006-01-24 05:50) [1]

Это вопрос не столько по DelphiX, сколько по программированию.
У тебя карта матричная? Всмысле может быть представлена прямоугольным массивом? Если да - задачка для начинающих "как сохранить массив в файл".


 
Аццкий_рыцарь:)   (2006-01-27 00:06) [2]

Я карту создавал через semapsize(x,y)

А можно поподробней про массив?

Например как сделать чтоб когда загружаешь карту, то создавалась не просто как Bitmap карта... Например там есть объекты с которыми взаимодействует игрок. А это отдельные спрайты.

Я тут думал... А нельзя просто чтоб редактор карт сохранял координаты каждого объекта? а потом делфи читал строки и по ним создавал там что-то?

например я в редакторе карт создал камень в координатах 100, 130 и сохранил. В блокноте создается строка типа r1 100, 130. А делфи смотрит если строка начинается с r1, то надо создать камень в таких координатах.


 
Unsigned ©   (2006-01-27 00:21) [3]

Делай так. Игровое поле представляешь в виде прямоугольной матрицы N*M.
То есть что-то типа Map : array[0..n-1,0..m-1] of byte. Каждому коду в соответствие ставишь какой-то объект, например 0-трава, 1 - камень.
Потом можешь эту матрицу сохранять\загружать. Загружаешь и в соответствии с кодами в ячейках создаешь объекты. Их координаты можно найти так:
Х:=i*MapObject.Width,Y:=j*Object.Height, где i,j - координаты объекта в матрице.


 
PAVIA ©   (2006-01-27 00:45) [4]

Аццкий_рыцарь
Так и сохрони объекты.
Весч элементарная.
Все просто если объект храняться как матрицу. Так и сохрани ее.
А если хранишь как спрайты так и сохрани их.
for i:=0 to DXSpriteEngine^.Engine.Count-1 do
begin
Spr_Tmp:=DXSpriteEngine^.Engine.Items[i];
//тут уже твоя фантазия как хранить.
end;


 
Аццкий_рыцарь:)   (2006-01-27 01:39) [5]

Эх! счас сяду делать редактор :)


 
Cash ©   (2006-01-27 08:47) [6]

А я ведь не зря про формат файла говорил!
У тебя есть HEX редактор или FAR накрайняк.
Возми игруху, любую, главное с открытыми ресурсами.
Карты там обычно под *.map/*.m* расширениями файлов валяются.
Открой карту и посмотри в HEX виде. Там текст встречается очень редко,
чаще это диалоги или скрипты или описание карты. А все остальное - в
бинарном виде. Сделай как нибудь так:

Формат файла:
- Заголовок:
 Сигнатура (если надо)
(какая нибудь последовательность байтов, символизирующая, что это тот
самый формат. Обычно сюда пихают 3-4 байта, куда записывают само
расширение файла. Типа в C&C Generals карта - *.map файл, и сигнатура
у него тоже "MAPF")
 Ширина карты
 Высота Карты
 Количество Объектов на карте
(это, чтобы дать проге понять сколько еще читать этот файл)
 Описание карты (если надо)
- Тело карты
(сюда надо бы перенести масив индексов карты, они там Integer типа,
так что размер масива вроде 4*MapWidth*MapHeight)
- Тело объектов карты
 Сигнатура (если надо или охота)
 тело первого объекта
 тело второго объекта
 ------
 тело n-го объекта
eof.

Организовать это в файловом потоке достаточно просто.


 
Аццкий_рыцарь:)   (2006-01-27 16:21) [7]

ЭЭээээ.... ГГ... Я чета седня какой-то немного с будунца :) Ты не мог бы кинуть ссылочку на статью по этому? Чтоб там все внятно написано было без всяких типа: "синхронизовать интерполяцию частиц частей карты достаточно просто" :)


 
Кефир87 ©   (2006-01-27 16:42) [8]

Какие статьи?! Как организовать файл своего формата? Неее... врядли такие есть. Тут подумать надо. А научиться работать с файлами нужно было раньше чем заниматься разработкой игр 8)


 
Cash ©   (2006-01-27 17:20) [9]

Если надо, напишу статью прямо здесь.


 
Аццкий_рыцарь:)   (2006-01-27 17:47) [10]

НАПИШИ ПЛИЗ! :)


 
Кефир87 ©   (2006-01-27 19:18) [11]


> Если надо, напишу статью прямо здесь.

Ты уже написал все что нужно в [6] 8)


 
Cash ©   (2006-01-27 20:08) [12]

Кефир87 ©   (27.01.06 19:18) [11]:
... Все, что нужно знающему и рулящему в файловых потоках чуваку,
а не любому другому человеку!
Для любого другого - подготовлю статейку и выложу,
через некоторое время.


 
Кефир87 ©   (2006-01-27 20:53) [13]


> Все, что нужно знающему и рулящему в файловых потоках чуваку,
>
> а не любому другому человеку!

Любому другому человеку нефиг (или рано) заниматься геймдевом 8)


 
Cash ©   (2006-01-28 11:04) [14]

Аццкий_рыцарь:)   (27.01.06 17:47) [10]:
Для начала надо научиться работать с файловыми потоками "FileSteram".
Для этого есть класс TFileStream = class(TStream);

Открыть или создать файл через поток можно так:
var
 f: TStream;
begin
 f := TFileSteam.Create("c:\temp\text.txt",fOpenParam);
 // далее работаем с файлом через его поток
 f.free;
end;

fOpenParam - это параметр, который говорит как файл открывать.
Это может быть:
fmCreate - просто создать пустой файл
fmOpenRead - открыть файл для чтения
fmOpenWrite - открыть файл для записи
fmOpenAppend - открыть файл для дозаписи
fmOpenReadWrite - открыть файл для чтения и записи

Работа с потоком идет очень просто.
Размер файла можно узнать из свойства Size.
Позицию точки чтения/записи узнают из Position.
Запись любых параметров происходит из:
Write(buffer; buffersize);
WriteBuffer(buffer; buffersize);
buffer - то, что надо записать, buffersize - сколько байт надо записать.
Читают из потока с помощью:
Read(var buffer; buffersize);
ReadBuffer(var buffer; buffersize);
Тут параметры теже самые.

Теперь смотри. К примеру нам надо записать занчение Word поля
в файл. Для этого надо сделать следующее:

var
  f: TFileSteram;
  b: word;
begin
  b:=628;
  f:=TFileStream.Create("c:\temp\data.bin",fmCreate);
  f.Write(b,2);  // т. к. Word занимает два байта
  f.free;
edn;

Ну, хорошо, записали! А что мы записали? Хвиг его откровенно знает! :)
Можно через любой HEX редактор посмотреть то, что там записано.
А вот сказать своей проге читеть можно так:

var
  f: TFileStream;
  b: word;
begin
  f:=TFileStream.Cerate("c:\temp\data.bin",fmOpenRead);
  f.Read(b,2);
  f.free;
  ShowMessage(Inttostr(b));
end;

Вот, вприципе так все и работает. С записями "Record" также, только запись
для записи в файл надо сделать неразрывной, то есть тип назвать так:
"Packed Record". И можно писать и читать прямо целые блоки данных.

Теперь применительно к карте. Положи DxSpriteEngine в редактор и в него
создавай свои препятствия и всякие штуки (бонусы там или точки
респаунов у монстряков). Потом, нужен TBackgroundSprite для хранения
самой карты. Начинку редактора делай сам. Тут я из вредности не помогу ;).
А вот для сохранения карты (и для загрузки тоже) надо еще один класс
сделать. Создай класс наследник от TComponent. и у него впиши два
поля: Sprites: TDxSpriteEngine; и Map: TBackgoundSprite;.
Теперь сама процедура сохранения:
<coe>
Type
  TSaveContainer = class(TComponent)
    Public
      Sprites: TDxSpriteEngine;
      Map: TBackgroundSprite;
  end;

Procedure SaveToStream(var Stream: TStream);
var
  Cont: TSaveContainer;
begin
  Cont:=TSaveContainer.Create(nil);
  Cont.Sprites:=DxSpriteEngine1;
  Cont.Map:=GlobalEditedMap;
  Stream.WriteComponentRes("MyMapAndObjects");
  Cont.free;
end;


Теперь сам подумай, как сохранить не в поток, а в файл, да при этом время
кодерское экономить!

А вся загрузка делается так:

var
  Cont: TSaveContainer;
begin
  Cont:=TSaveContainer.Create(nil);
  Cont.Sprites:=DxSpriteEngine;
  Cont.Map:=GlobalEditedMap;
  Stream.ReadComponentRes(Cont);
  Cont.free;
end;


вот в общем и все!
Это без формата. так вроде быстрее и проще, формат уже за тебя сделан.
:))) Когда подростешь, научу форматы делать! :)))

На заметку: Учи англиский по справке Delphi :)))


 
Аццкий_рыцарь:)   (2006-01-29 00:18) [15]

Сча попытаюсь понемногу разобраться...

вот смотри, например, я хочу по клику мыши создать файл data1.bin в директории D:\ и записать туда число 655...:



unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
 ImgList;

type
 TForm1 = class(TDXForm)
   DXDraw1: TDXDraw;
   DXImageList1: TDXImageList;
   DXInput1: TDXInput;
   DXSpriteEngine1: TDXSpriteEngine;
   DXTimer1: TDXTimer;
   Button1: TButton;
          procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
       procedure Button1Click(Sender: TObject);
 private

   { Private declarations }
 public
   { Public declarations }
 end;

  TFileStream = class(TStream);

var
                 

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

 var
 f: TFileStream;
 b: word;
begin
 b:=655;
 f:=TFileStream.Create("D:\data1.bin",fmCreate);
 f.Write(b,2);
 f.free;
end;

end.


и делфи ругается на строку f:=TFileStream.Create("D:\data1.bin",fmCreate);
и говорит что too many actual parameters


 
Аццкий_рыцарь:)   (2006-01-29 00:18) [16]

Сча попытаюсь понемногу разобраться...

вот смотри, например, я хочу по клику мыши создать файл data1.bin в директории D:\ и записать туда число 655...:



unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
 ImgList;

type
 TForm1 = class(TDXForm)
   DXDraw1: TDXDraw;
   DXImageList1: TDXImageList;
   DXInput1: TDXInput;
   DXSpriteEngine1: TDXSpriteEngine;
   DXTimer1: TDXTimer;
   Button1: TButton;
          procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
       procedure Button1Click(Sender: TObject);
 private

   { Private declarations }
 public
   { Public declarations }
 end;

  TFileStream = class(TStream);

var
                 

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

 var
 f: TFileStream;
 b: word;
begin
 b:=655;
 f:=TFileStream.Create("D:\data1.bin",fmCreate);
 f.Write(b,2);
 f.free;
end;

end.


и делфи ругается на строку f:=TFileStream.Create("D:\data1.bin",fmCreate);
и говорит что too many actual parameters


 
Аццкий_рыцарь:)   (2006-01-29 00:19) [17]

ой, у мну тут проблемы с инетом, извеняюсь за 2 одинаковых топа


 
Аццкий_рыцарь:)   (2006-01-29 02:00) [18]

Эээ.... я, конечно извеняюсь за оффтоп, но я в шоке! Делфи не запускается! я уже его и переустанавливал 10 раз и НИФИГА! А ПАНИКА!

выскакивает окно с названием Registry Delphi и в нем пишется:

borland license information was found, but it is not valid for Delphi.

You can not run delphi without this information

Click the Exit button to exit Delphi

exit

и все! никаких кнопок типа enter new registration code ! ЧЕ ДЕЛАТЬ!?


 
Аццкий_рыцарь:)   (2006-01-29 02:07) [19]

Ой виноват! :) только что разобрался. С такой пираткой я еще не сталкивался! :) столько примочек всяких! но, СЛАВА БОГУ ВСЕ НОРМАЛЬНО!

еще раз извеняюсь за оффтоп, прошу модера удалить лишние посты, а мастеров не смотреть на них :)


 
Unsigned ©   (2006-01-29 04:24) [20]


>  public
>    { Public declarations }
>  end;
>
>   TFileStream = class(TStream);
>
> var
>        

Тебе не нужно объявлять этот класс. Это стандартный класс и он описан в модуле classes.pas.


 
Unsigned ©   (2006-01-29 04:26) [21]

Убери эту строку и все должно заработать.


 
Аццкий_рыцарь:)   (2006-01-29 05:41) [22]

Получилось число записать :) сенк, Unsigned!

тэкс! я тут пытался записать спрайты в файл и угадайте вышло это у меня или нет :)

вот мой неработающий код



unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, DIB, ExtCtrls,
 ImgList;

type
 TForm1 = class(TDXForm)
   DXDraw1: TDXDraw;
   DXImageList1: TDXImageList;
   DXInput1: TDXInput;
   DXSpriteEngine1: TDXSpriteEngine;
   DXTimer1: TDXTimer;
   Button1: TButton;
      procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
   procedure FormCreate(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure Button1Click(Sender: TObject);
 private

   { Private declarations }
 public
   { Public declarations }
 end;

  Type
 TSaveContainer = class(TComponent)
   Public
     Sprites: TDxSpriteEngine;
     Map: TBackgroundsprite;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 Cont: TSaveContainer;
 f: TFileStream;

begin
 Cont:=TSaveContainer.Create(nil);
 Cont.Sprites:=DxSpriteEngine1;
 Cont.Map:=grass;
 f:=TFileStream.Create("d:\data12321.bin",fmCreate);
 f.Write(cont.Sprites,7836);
 f.free;
 Cont.free;
end;



файл-то создается, но его размер = 0 байт :( я ж написал сколько должно быть, а почему создался пустой файл? кстати как мне узнать размер буфера? а то 7836 - я приплюсовал вес картинок спрайтов, и мне кажется, это неправильно :(


 
Cash ©   (2006-01-29 09:21) [23]

Аццкий_рыцарь:):
Ты сколько программированием занимаешься???
Уж больно ошибки глуповатые! :(((
Это чесно говоря не радует! :(((

[22]:
Потаму, что ты пытаешся адрес записать, точнее даже не адрес,
чтото среднее между указателем и объектом этого указателя.

Я же написал:
f.WriteComponentRes("Чё_Нибудь_Там",Cont);

Там ошибочка была, вот здесь правильно.


 
Аццкий_рыцарь:)   (2006-01-29 12:03) [24]

Лана, записал :) А когда считываю вылазит вообще левая ошибка! :



procedure TForm1.Button3Click(Sender: TObject);

var
 Cont: TSaveContainer;
 f: TFileStream;

begin
 Cont:=TSaveContainer.Create(nil);
 Cont.Sprites:=DxSpriteEngine1;
   f:=TFileStream.Create("d:\data12321.bin",fmOpenRead);
 f.ReadComponentRes(cont);

  f.free;
 Cont.free;
end;



ошибка Project Project1.exe raised exception class EReadError with message "Property DXDraw does not exist" . И че ему в этом DXDraw не понравилось !?


 
Домовенок ©   (2006-01-29 12:52) [25]

>> Это без формата. так вроде быстрее и проще, формат уже за тебя сделан.
>> :))) Когда подростешь, научу форматы делать! :)))


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


 
Cash ©   (2006-01-29 13:26) [26]

Домовенок ©   (29.01.06 12:52) [25]:
http://www.extractor.ru :)))

Аццкий_рыцарь:)   (29.01.06 12:03) [24]:
А вот это уже хреново! :(
Я впринципе на этот результат рассчитывал, но не надеялся.
Придется всетаки формат делать. Лады, чуть погодя прдумаю,
как осуществить формат, но мне надо знать: что за препятсятвия
ты запихать в файл хочешь? И еще: если там несколько классов
этих препятсятвий - какие между ними различия, и не лучше ли
их в один объединить?


 
Аццкий_рыцарь:)   (2006-01-29 14:23) [27]

Cash у меня только один клас для препятствий. Этот клас - TObjectdo:=class(TImagesprite). В нем изменяются только картинка (ну, типа камень или домик),  координаты, и пару переменных класса integer.


 
Cash ©   (2006-01-29 14:28) [28]

Как это где то написанно было, перефразирую под ситуяцию:
"Вечером перечитывал орешник...., мното думал!" :D :D :D
Вот, нашел, на мой взгляд ничего:
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=12 // 3-я снизу запись
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=13 // 1-я и 2-я тоже снизу

Аццкий_рыцарь:)   (29.01.06 12:03) [24]:
А когда exception вылезает именно?
И где дебаггер ставит останов, внутри кода загрузки или где нибудь еще?


 
Аццкий_рыцарь:)   (2006-01-29 14:38) [29]

Cash, а не легче будет просто в редакторе и в игре создать массив, объявить в нем несколько переменных. Например я создаю в редакторе домик в координатах 100, 100, с картинкой domik1  он непроходимый, и при столкновении с ним не происходит никаких событий в 1 ячейку массива пишу xobj:=100, yobj:=100, blockobj:=true, eventsobj:=false, imageobj:=1;Потом этот массив записать в файл. В игре его загрузить. допустим j - это номер ячейки массива, а их там например 100 :


for j:=1 to 100 do begin

with tobject.create(dxspriteengine1.engine) do begin

x:=xobj;
y:=yobj;
block:=blockobj;
events:=eventsobj;
if image=1 then image:=form1.dximagelist1.items.find("domik1");
end;
end;


ты не подскажешь как такой массив записать в файл, а потом загрузить?


 
Cash ©   (2006-01-29 14:41) [30]

Аццкий_рыцарь:)   (29.01.06 14:23) [27]:
Это хорошо. Ничего усложнять не надо, но для начала
просмотри под дебагом всю процедуру загрузки карты
и удели внимание свойству DxDraw у DxSpriteEngine1.
Нужны ответы на вопросы из [28]:

P. S.: Во нашел самый крутой орех! Самая последняя запись.
http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=2


 
Аццкий_рыцарь:)   (2006-01-29 14:41) [31]

Cash, это тонкий намек на мое ламерство? :) но кликать мышью я умею :)


 
Cash ©   (2006-01-29 14:44) [32]

Аццкий_рыцарь:)   (29.01.06 14:38) [29]:
Ты же на модеме! Только отпишу, смотрую твой пост вперед встал! :)))

В общем именно так для данного случая и длается.
Так действительно проще будет.


 
Cash ©   (2006-01-29 14:45) [33]

Аццкий_рыцарь:)   (29.01.06 14:41) [31]:
Не, это просто для разрядки обстановки,
нашел прикольные штуки и решил поделиться!


 
Аццкий_рыцарь:)   (2006-01-29 14:47) [34]

Ответы на 28

exception вылазит когда кликаю на кнопки, но что обидно,что дебаггер не показывает на конкретную строку в коде, а останавливается на application.run


 
Аццкий_рыцарь:)   (2006-01-29 14:52) [35]

Cash, я-то на модеме, но родителей же нету дома, так что вишу сколько влезет :)

Насчет массива, ты бы не мог показать как массив этот в файл записать а потом считать?


 
Cash ©   (2006-01-29 14:53) [36]

Аццкий_рыцарь:)   (29.01.06 14:38) [29]:
На счет сохранения:
Возьми запись, примерно такую:

TObjRec = packed record
  .... // сюда впиши нужные поля
end;

Потом сделай масив из этих эаписей.
Размер масива будет <к-во элементов>*Sizeof(TObjRec)
и потом используй цыкл с такой конструкцией:
f.write(ObjArray[i],SizeOf(TObjRec));
Для того, чтобы эти записи удачно считать надо сперва записать
сколько всего этих записей.


 
Аццкий_рыцарь:)   (2006-01-29 14:56) [37]

тэкс, сча попытаю счастья :) авось заработает :)


 
Cash ©   (2006-01-29 15:00) [38]

Аццкий_рыцарь:)   (29.01.06 14:47) [34]:
А ты поставь BreakePoint (F5) на самой первой строчке процедуры загрузки и
потом проследи (с помощью F8) вся ли она без эксепов (exception) проходит.
А еще возми и через Ctrl+F5 добавь в просмотр свойство DxDraw у
DxSpriteEngine. У меня закралось сомнение, что надо в самом конце просо
сделать DxSpriteEngine1.DxDraw:=DxDraw1;


 
Cash ©   (2006-01-29 18:57) [39]

Видать предки пришли! :)))))))


 
Кефир87 ©   (2006-01-29 20:55) [40]


> Cash ©   (29.01.06 14:28) [28]
>
> Как это где то написанно было, перефразирую под ситуяцию:
>
> "Вечером перечитывал орешник...., мното думал!" :D :D :D
> Вот, нашел, на мой взгляд ничего:
> http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=12
> // 3-я снизу запись
> http://www.delphimaster.ru/cgi-bin/nuts.pl?&showpage=13
> // 1-я и 2-я тоже снизу
>
> Аццкий_рыцарь:)   (29.01.06 12:03) [24]:
> А когда exception вылезает именно?
> И где дебаггер ставит останов, внутри кода загрузки или
> где нибудь еще?

Пора признать, что одна из этих записей пренадлежит мне, только 3 или 4 года назад 8)) Хотя и нифига не стыдно!



Страницы: 1 2 3 вся ветка

Форум: "Игры";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.041 c
15-1165809964
Slider007
2006-12-11 07:06
2006.12.31
С днем рождения ! 11 декабря


1-1163143909
integeri
2006-11-10 10:31
2006.12.31
Как встроить в свою програму переводчик Pragma


15-1165864472
Витян
2006-12-11 22:14
2006.12.31
Как поставить программиста в тупик?


2-1165731561
ZeroXor
2006-12-10 09:19
2006.12.31
Вставка Flash ролика в ячейку StringGrid


10-1118908565
lionson
2005-06-16 11:56
2006.12.31
CORBA - клиент не видит сервер в другой подсетке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский