Mefistotel Чтобы сделать плагин, который здесь действительно нужен, надо чтобы была более-менее составлена полная таблица с кодами.
Здесь же даже алфавит не весь собран.
Чтобы правильно определить коды нужно точно определить начало и конец всех блоков с текстами и их указателей, тогда появится возможность удалить указатели и смотреть на чистый текст.
Полное количество блоков мне не известно, т.к. табличкой указатели на них не представлены, но их довольно много.
Шрифт
Моноширинная гадость в которой запятая сразу поставляется с пробелом.
Тут в разделе подготовка, довольно подробно описано как искать коды. Для трансхелл редактора, возможно, свои особенности, но вроде как Joker-символы в нём сделали возможность выставлять.
Прилепил кусок с указателями и текстами + слегка начатая экселька(2010) для определения всего нужного.
Возможный вид плагина, наверняка не полный, вероятно потребуется дописать то чего не будет хватать в кейсы и к илям в параллель.
Спойлер (Отобразить)
CODE:library MMBN;
uses
ShareMem,
Needs;
{$E .kpl}
resourcestring
SKPLDescription = 'MegaMan_BN';
Var
ROM: PBytes = NIL;
RomSize: Integer = 0;
EndsRoot: PTableItem = NIL;
MaxCodes: Integer = 0;
Align: Integer = 1;
Function Description: String; stdcall;
begin
Result := SKPLDescription
end;
Function NeedEnd: Boolean; stdcall;
begin
Result := False
end;
Function GetMethod: TMethod; stdcall;
begin
Result := tmNone
end;
Procedure SetVariables(X: PBytes; Sz: Integer; ER: PTableItem; MC, AL: Integer); stdcall;
begin
ROM := X;
RomSize := Sz;
EndsRoot := ER;
MaxCodes := MC;
Align := AL
end;
Function GetData(TextStrings: PTextStrings): AnsiString; stdcall;
var
R: PTextString;
begin
Result := '';
If TextStrings = NIL then Exit;
With TextStrings^ do
begin
R := Root;
While R <> NIL do
begin
Result := Result + R^.Str;
R := R^.Next
end
end
end;
Function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
var
P: PByte; PC: PChar absolute P;
Len: Integer; Code: Byte;
begin
New(Result, Init);
with Result.Add^ do
begin
P := Addr(ROM[X]);
while P^ <> $E4 do //Символ которого нет (надеюсь, что нет его)
begin
Len := 0;
if (P^ = $00) or (P^ = $E5) or (P^ = $E7)
or (P^ = $E9) or (P^ = $EC) or (P^ = $EE) or (P^ = $ED)
or (P^ = $F2)
or (P^ = $F4) or (P^ = $F5) or (P^ = $F8) or (P^ = $FB)
or (P^ = $FC) or (P^ = $FF)
then begin // Считать 1 байт в строку
Code := P^;
Str := Str + PC^;
Inc(P);
case Code of
$E5,
$EE,
$F2,
$F5,
$F8,
$FC: Len := 1;
$E7,
$E9,
$EC,
$FF: Len := 2;
$ED,
$FB: Len := 3;
$F4: Len := 5;
$00: case P^ of
$00: begin Str := Str + PC^; break //Конец строки и цикла while
end;
else Len := 0
end;
end;
X := Length(Str);
SetLength(Str, X + Len);
Move(P^, Str[X + 1], Len);
Inc(P, Len);
end else
begin
Str := Str + PC^;
Inc(P)
end
end
end
end;
exports
GetMethod,
SetVariables,
GetData,
GetStrings,
DisposeStrings,
NeedEnd,
Description;
end.
Text_2_broken
Text_3_broken
+
тест