Krisss, покажи текст, что неясно, а мы прокомментируем. Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
Ну в твоем файле все не так же как у крома. У тебя нет строчки с указанием кол-во строк в файле, а она нужна чтобы заранее определить размер динамического массива. Ну и разделитель у тебя не не ":", а "=".
Выдрано из кода KaM Remake. Чтение LibX файла с локализацией:
Code
{LIBX files consist of lines. Each line has an index and a text. Lines without index are skipped} procedure TTextLibrary.LoadLIBXFile(FilePath: string; aFirstIndex: Word; var aArray: TAnsiStringArray; aOverwrite: Boolean); var aStringList: TStringList; I: Integer; s: AnsiString; firstDelimiter: Integer; ID, MaxID: Integer; begin if not FileExists(FilePath) then Exit;
//First line is empty or comment and could have first 3 bytes Unicode Byte-Order Mark (BOM) s := aStringList[1]; if Copy(s, 1, 6) <> 'MaxID:' then Exit;
firstDelimiter := Pos(':', s); if not TryStrToInt(RightStr(s, Length(s) - firstDelimiter), MaxID) then Exit;
if not aOverwrite then SetLength(aArray, aFirstIndex + MaxID + 1);
for I := 0 to aStringList.Count - 1 do begin s := aStringList[I];
//Get string index and skip erroneous lines firstDelimiter := Pos(':', s); if firstDelimiter = 0 then Continue; if not TryStrToInt(TrimLeft(LeftStr(s, firstDelimiter - 1)), ID) then Continue; if ID > MaxID then Continue;
s := RightStr(s, Length(s) - firstDelimiter); //Required characters that can't be stored in plain text s := StringReplace(s, '\n', eol, [rfReplaceAll, rfIgnoreCase]); //EOL s := StringReplace(s, '\\', '\', [rfReplaceAll, rfIgnoreCase]); //Slash if not aOverwrite or (s <> '') then aArray[aFirstIndex + ID] := s; end;
aStringList.Free; //Must free at last to avoid memory-leaks end;
Вывод будет в aArray. В твоем случае нужно добавить хоть какую-то инфу о кол-ве строк, и либо у себя изменить разделитель либо в коде (: или =) «Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
Сообщение отредактировал Jery - Воскресенье, 02.12.2012, 21:43
Кто занимается КАМом? Ремейк делают наши люди с этого форума, или зарубежные люди?
/index/kam_remake/0-33 - читай krom - русский, который следит за нашим форумом lewin - иностранец skype: dimask468 - добавляйтесь для совместных игр в KaM Remake
lil_scorpi, ремейком занимаемся мы с Левиным. Если что - пиши!) Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
дай угадаю! ты должно быть думал, что Кром американец, который не знает русского, а сюда пишет через гугл транслейтор.. я прав? я прав же? skype: dimask468 - добавляйтесь для совместных игр в KaM Remake
interface uses Classes, SysUtils,unit3, Math, StrUtils; type TTextLibrary = class private fLocale: AnsiString; fFallbackLocale: AnsiString; procedure LoadLIBXFile(FilePath: string; aFirstIndex: Word; var aArray: TAnsiStringArray; aOverwrite: Boolean); public end; implementation uses unit1; {AE5_TEXT files consist of lines. Each line has an index and a text. Lines without index are skipped} procedure TTextLibrary.LoadLIBXFile(FilePath: string; aFirstIndex: Word; var aArray: TAnsiStringArray; aOverwrite: Boolean); var aStringList: TStringList; I: Integer; s: AnsiString; firstDelimiter: Integer; ID, MaxID: Integer; begin if not FileExists(FilePath) then Exit;
//First line is empty or comment and could have first 3 bytes Unicode Byte-Order Mark (BOM) s := aStringList[1]; if Copy(s, 1, 6) <> 'MaxID:' then Exit;
firstDelimiter := Pos(':', s); if not TryStrToInt(RightStr(s, Length(s) - firstDelimiter), MaxID) then Exit;
if not aOverwrite then SetLength(aArray, aFirstIndex + MaxID + 1);
for I := 0 to aStringList.Count - 1 do begin s := aStringList[I];
//Get string index and skip erroneous lines firstDelimiter := Pos('=', s); if firstDelimiter = 0 then Continue; if not TryStrToInt(TrimLeft(LeftStr(s, firstDelimiter - 1)), ID) then Continue; if ID > MaxID then Continue;
s := RightStr(s, Length(s) - firstDelimiter); //Required characters that can't be stored in plain text s := StringReplace(s, '\n', eol, [rfReplaceAll, rfIgnoreCase]); //EOL s := StringReplace(s, '\\', '\', [rfReplaceAll, rfIgnoreCase]); //Slash if not aOverwrite or (s <> '') then aArray[aFirstIndex + ID] := s; end;
aStringList.Free; //Must free at last to avoid memory-leaks end;
end.
Как можно запустить процедуру TTextLibrary.LoadLIBXFile.
Krisss, тебе нужно создать экземпляр класса и вызвать у него этот метод
var L: TTextLibrary; begin L := TTextLibrary.Create; L.LoadLIBXFile; L.Free; //и освободить его после использования end; Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
interface uses Classes, SysUtils,unit3, Math, StrUtils; type TTextLibrary = class procedure LoadLIBXFile(FilePath: string; aFirstIndex: Word; var aArray: TAnsiStringArray; aOverwrite: Boolean); private fLocale: AnsiString; fFallbackLocale: AnsiString; public end; implementation uses unit1; {AE5_TEXT files consist of lines. Each line has an index and a text. Lines without index are skipped} procedure TTextLibrary.LoadLIBXFile(FilePath: string; aFirstIndex: Word; var aArray: TAnsiStringArray; aOverwrite: Boolean); var aStringList: TStringList; I: Integer; s: AnsiString; firstDelimiter: Integer; ID, MaxID: Integer; begin if not FileExists(FilePath) then Exit;
//First line is empty or comment and could have first 3 bytes Unicode Byte-Order Mark (BOM) s := aStringList[1]; if Copy(s, 1, 6) <> 'MaxID=' then Exit;
firstDelimiter := Pos('=', s); if not TryStrToInt(RightStr(s, Length(s) - firstDelimiter), MaxID) then Exit;
if not aOverwrite then SetLength(aArray, aFirstIndex + MaxID + 1);
for I := 0 to aStringList.Count - 1 do begin s := aStringList[I];
//Get string index and skip erroneous lines firstDelimiter := Pos('=', s); if firstDelimiter = 0 then Continue; if not TryStrToInt(TrimLeft(LeftStr(s, firstDelimiter - 1)), ID) then Continue; if ID > MaxID then Continue;
s := RightStr(s, Length(s) - firstDelimiter); //Required characters that can't be stored in plain text s := StringReplace(s, '\n', eol, [rfReplaceAll, rfIgnoreCase]); //EOL s := StringReplace(s, '\\', '\', [rfReplaceAll, rfIgnoreCase]); //Slash if not aOverwrite or (s <> '') then aArray[aFirstIndex + ID] := s; end;
aStringList.Free; //Must free at last to avoid memory-leaks end;
Krisss, на вид все так, видно у тебя содержимое файла, не совсем то, что TTextLibrary.LoadLIBXFile ожидает (формат)?
Мелкое замечание: progdir := ExtractFilePath(Application.ExeName); if (progdir[Length(progdir)] <> '\') then progdir := progdir + '\TEXT_GAMES.AE5_TEXT';
ты проверяешь есть ли конце \ (а он там есть) и если его нет (а т.к. он есть) условие не выполняется и ты путь к файлу не дописываешь. Надо так: progdir := ExtractFilePath(Application.ExeName); if (progdir[Length(progdir)] <> '\') then progdir := progdir + '\';
progdir := progdir + 'TEXT_GAMES.AE5_TEXT';
или правильнее всего - вот так: progdir := ExtractFilePath(Application.ExeName) + 'TEXT_GAMES.AE5_TEXT'; //ExtractFilePath отдает путь с \ на конце Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.