|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 12:23 pm Заголовок сообщения: Проблема с DUNE |
|
|
Занялся я переводом Dune The Battle For Arrakis(это моя любимая игра
на сеге). Проблемы начились при переводе TUTORIAL. Я нашел как загружаются шрифты,как они выводятся из VDP (RLE), но если я изменяю что-нибудь(удлинняю строки, добаляю еще одни) -игра повисает.
Меня смущают байты, стоящие перед началом сообщения
"DESCRIPTIONS OF TERRAIN":
85 00 99 7F 00 00 30 03 A2
И в конце:
60 8D 89 48 (Адрес $ 32472h )
Я не знаю, что они обозначают( по идее это должны быть
координаты вывода сообщений на экран), но я не вижу в них
никакого алгоритма.
Помогите, please! Бьюсь уже который день.Может быть кто знаком с этой проблемой? |
|
Вернуться к началу |
|
|
Chaos Смотрящий в ночи
Зарегистрирован: 08.11.2003 Сообщения: 587 Откуда: Первозданный Хаос
|
Добавлено: Пт Июл 07, 2006 12:50 pm Заголовок сообщения: |
|
|
Если не ошибаюсь, человек, который ломал эту игру для нашего перевода давно отошёл от дел, так что мало кто поможет _________________ Homo sum; humani nibil a me alienum puto. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 1:14 pm Заголовок сообщения: |
|
|
Не понял. Я впервые захожу на форум за все полгода, что занимался ромхакингом.Первый еще раз столкнулся с проблемой(даже во FLASHBACK,графику которого я думал нереально перевести,не было проблем).Не знаю за кого вы меня принимаете.
Последний раз редактировалось: PEREVODчик (Пн Июл 04, 2011 4:27 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
tmax
Зарегистрирован: 24.12.2003 Сообщения: 53
|
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 1:56 pm Заголовок сообщения: |
|
|
Знаю, что она переведена. У вас много, что переведено.
Перевод приставочных игр- это моё хобби. На первом месте у меня
перевод моих любимых игр. Да и раз уж начал переводить-надо закончить.
Поэтому и прошу вас помочь. Я не прошу помощи из-за пустяка,
сначала пытаюсь разобраться сам, но здесь все иначе.Перепробовал
все известные мне методы, но безрезультатно. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пт Июл 07, 2006 3:02 pm Заголовок сообщения: |
|
|
Что-то в последнее время многие начали ломать запаковку методами коррупторов (подстановка своих значений и анализ результата). Если в случае с RLE/LZ это ещё как-то оправдано, то с Хаффманом такие заигрывания не пройдут. Аморфус, насколько помнится, ломал всё по-честному - с помощью дебаггера Gens находил код распаковки и писал запаковщик согласно увиденному алгоритму. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 3:39 pm Заголовок сообщения: |
|
|
Пытался и дебажить-тоже не вышло.(Много вариантов было перепробовано-не идет загрузка).Может кто объяснит функции
этих "заголовков"? |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 4:20 pm Заголовок сообщения: |
|
|
Ладно, можете дать ссылки на ПОДРОБНОЕ объяснение алгоритма
Хаффмана.Может быть разберусь
Хотя, на первый взгляд алгоритм уж слишком навороченный |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Пт Июл 07, 2006 5:09 pm Заголовок сообщения: |
|
|
PEREVODчик писал(а): | Пытался и дебажить-тоже не вышло.(Много вариантов было перепробовано-не идет загрузка).Может кто объяснит функции этих "заголовков"? |
Наверное, плохо пытался. Вот Аморфус придёт, если вспомнит - объяснит. А про Хаффмана это я вообще говорил, Дюну я сам не смотрел. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пт Июл 07, 2006 5:29 pm Заголовок сообщения: |
|
|
То-то я в недоумении-думаю-какой Хаффман,когда очевидно,
что RLE.
И хорошо,что не Хаффман-с этим алгоритмом дела еще не имел,а
почитал первую попавшуюся доку про него-ничего не понял.На такую
побитную распаковку ушла бы не одна неделя. |
|
Вернуться к началу |
|
|
Djinn RRC2008
Зарегистрирован: 16.03.2004 Сообщения: 633 Откуда: Москва
|
Добавлено: Сб Июл 08, 2006 7:39 am Заголовок сообщения: |
|
|
PEREVODчик писал(а): |
Хотя, на первый взгляд алгоритм уж слишком навороченный |
По мне Хаффман проще, чем LZ |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Сб Июл 08, 2006 8:33 am Заголовок сообщения: |
|
|
Пока не видел ничего не могу сказать. Если попадется в какой нибудь игре Хаффман-что же делать-придется разбираться. |
|
Вернуться к началу |
|
|
Аморфоусу лень логиницца Гость
|
Добавлено: Пн Июл 10, 2006 6:54 pm Заголовок сообщения: |
|
|
Насчет алгоритма не скажу ничего - не помню. :)
В туториалке используется дважды упакованная карта тайлов. Сначала используется "свой" алгоритм, а потом общий.
После двух распаковок у тебя должен получиться набор "экранов".
Где-то у меня сырцы упаковщиков/распаковщиков валяются... Могу найти, если надо.[/code] |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пн Июл 10, 2006 8:04 pm Заголовок сообщения: |
|
|
Они бы мне ооооооооооочень помогли!!!
Заранее спасибо! |
|
Вернуться к началу |
|
|
Amorpho[US] БесФорменный
Зарегистрирован: 16.12.2003 Сообщения: 161 Откуда: Воронеж
|
Добавлено: Пн Июл 10, 2006 10:37 pm Заголовок сообщения: |
|
|
Распаковка "обычная".
Код: | .386
.model flat
public unpack
public mod_name
.data
modstring db "Dune: The Battle for Arrakis",0
.data?
out_buf dd ?
in_buf dd ?
opt dd ?
read_len dd ?
.code
_start@12:
mov al,1
ret 12
;int unpack(char* pIn, char* pOut, int option, int* rLen);
unpack proc
pop eax
pop in_buf
pop out_buf
pop opt
pop read_len
push eax
push ebx
push ebp
push esi
push edi
mov ebx,in_buf
mov edi,out_buf
main_loop:
xor ecx,ecx
xor edx,edx
mov cl,byte ptr [ebx]
inc ebx
cmp cl,0
jns cl_positive
test cl,40h
jz sixth_bit_clear
cmp cl,-2
je cl_eq_FE
cmp cl,-1
je cl_eq_FF
and cl,3Fh
mov dx,word ptr [ebx]
add ebx,2
add cx,3
mov esi,out_buf
add esi,edx
jmp loc_0_C96
cl_eq_FF:
mov cx,word ptr [ebx]
mov dx,word ptr [ebx+2]
add ebx,4
mov esi,out_buf
add esi,edx
jmp loc_0_C96
cl_positive:
mov dh,cl
mov dl,byte ptr [ebx]
and dx,0FFFh
inc ebx
shr cx,4
add cx,3
mov esi,edi
sub esi,edx
loc_0_C96:
rep movsb
jmp main_loop
sixth_bit_clear:
cmp cl,80h
je exit_sub
and cl,3Fh
mov esi,ebx
add ebx,ecx
jmp loc_0_C96
cl_eq_FE:
mov cx,word ptr [ebx]
mov al,byte ptr [ebx+2]
add ebx,3
rep stosb
jmp main_loop
exit_sub:
sub ebx,in_buf
mov ebp,read_len
mov [ebp],ebx
mov eax,edi
sub eax,out_buf
pop edi
pop esi
pop ebp
pop ebx
ret
unpack endp
mod_name proc
mov eax,offset modstring
ret
mod_name endp
end _start@12 |
Распаковка для туториала
Код: | .386
.model flat
public unpack
public mod_name
.data
modstring db "Dune Tutorial Text",0
.data?
out_buf dd ?
in_buf dd ?
opt dd ?
read_len dd ?
out_buf2 dd ?
in_buf2 dd ?
opt2 dd ?
read_len2 dd ?
buf_temp dd 20000h dup(?)
.code
_start@12:
mov al,1
ret 12
;int unpack(char* pIn, char* pOut, int option, int* rLen);
unpack proc
pop eax
pop in_buf
pop out_buf
pop opt
pop read_len
push eax
push ebx
push ebp
push esi
push edi
;---------------------------------------
push read_len
push 0
push offset buf_temp
push in_buf
call preprocess
;---------------------------------------
mov esi,offset buf_temp
mov edi,out_buf
xor eax,eax
lodsw
begin:
cmp ax,-1
jz exit
xchg ah,al
mov bx,ax
mmain_loop:
xor ecx,ecx
mov cl,[esi]
inc esi
cmp cl,80h
jz cl_eq_80
jns cl_gt_80
sub bx,2
lodsw
rep stosw
jmp next_screen
cl_gt_80:
and cl,7Fh
sub bx,cx
sub bx,cx
rep movsw
jmp next_screen
cl_eq_80:
xor eax,eax
lodsb
shl ax,1
mov cx,ax
push esi
mov esi,edi
sub esi,8C0h
rep movsb
pop esi
dec bx
next_screen:
dec bx
jnz mmain_loop
lodsw
cmp ax,-1
jnz begin
exit:
mov eax,edi
sub eax,out_buf
pop edi
pop esi
pop ebp
pop ebx
ret
unpack endp
;int preprocess(char* pIn, char* pOut, int option, int* rLen);
preprocess proc
pop eax
pop in_buf2
pop out_buf2
pop opt2
pop read_len2
push eax
push ebx
push ebp
push esi
push edi
mov ebx,in_buf2
mov edi,out_buf2
main_loop:
xor ecx,ecx
xor edx,edx
mov cl,byte ptr [ebx]
inc ebx
cmp cl,0
jns cl_positive
test cl,40h
jz sixth_bit_clear
cmp cl,-2
je cl_eq_FE
cmp cl,-1
je cl_eq_FF
and cl,3Fh
mov dx,word ptr [ebx]
add ebx,2
add cx,3
mov esi,out_buf2
add esi,edx
jmp loc_0_C96
cl_eq_FF:
mov cx,word ptr [ebx]
mov dx,word ptr [ebx+2]
add ebx,4
mov esi,out_buf2
add esi,edx
jmp loc_0_C96
cl_positive:
mov dh,cl
mov dl,byte ptr [ebx]
and dx,0FFFh
inc ebx
shr cx,4
add cx,3
mov esi,edi
sub esi,edx
loc_0_C96:
rep movsb
jmp main_loop
sixth_bit_clear:
cmp cl,80h
je exit_sub
and cl,3Fh
mov esi,ebx
add ebx,ecx
jmp loc_0_C96
cl_eq_FE:
mov cx,word ptr [ebx]
mov al,byte ptr [ebx+2]
add ebx,3
rep stosb
jmp main_loop
exit_sub:
sub ebx,in_buf
mov ebp,read_len2
mov [ebp],ebx
mov eax,edi
sub eax,out_buf2
pop edi
pop esi
pop ebp
pop ebx
ret
preprocess endp
mod_name proc
mov eax,offset modstring
ret
mod_name endp
end _start@12 |
_________________ Я вернулся!!! ...ну почти. |
|
Вернуться к началу |
|
|
Amorpho[US] БесФорменный
Зарегистрирован: 16.12.2003 Сообщения: 161 Откуда: Воронеж
|
Добавлено: Пн Июл 10, 2006 10:45 pm Заголовок сообщения: |
|
|
А это чисто посмеяцца. Упаковка "обычная".
Код: | //---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
char nun[0x3F];
int obytes;
int out;
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE, DWORD, LPVOID)
{
return true;
}
//---------------------------------------------------------------------------
char* __stdcall __export mod_name()
{
return "Dune: The Battle for Arrakis";
}
//---------------------------------------------------------------------------
void Flush(char* pO)
{
if(!obytes) return;
pO[out] = obytes | 0x80;
out++;
for(int j = 0; j < obytes; j++)
pO[out + j] = nun[j];
out += obytes;
obytes = 0;
}
//---------------------------------------------------------------------------
int __stdcall __export pack(char* pIn, char* pOut, int option, int* rLen)
{
int in = 0;
int n;
int n2;
int maxN;
int maxN2;
int maxIn;
int in2;
obytes = 0;
out = 0;
while(in < option)
{
maxN = 0;
maxN2 = 0;
maxIn = 0;
for(in2 = 0; in2 < in; in2++)
{
for(n = 0; pIn[in2 + n] == pIn[in + n] && in + n < option; n++);
if(in - in2 < 0x1000 && n < 0xB) n2 = n - 2;
else if(n < 0x43) n2 = n - 3;
else n2 = n - 5;
if(n2 > maxN2) { maxN2 = n2; maxN = n; maxIn = in2; }
}
for(n = 1; pIn[in + n - 1] == pIn[in + n] && in + n - 1 < option; n++);
n2 = n - 4;
if(n2 > maxN2) { maxN2 = n2; maxN = n; maxIn = in; }
if(maxN2 >= 0 && maxN > 2)
{
if(in == maxIn)
{
Flush(pOut);
pOut[out] = 0xFE;
*(WORD*)(pOut + out + 1) = maxN;
pOut[out + 3] = pIn[in];
out += 4;
in += maxN;
}
else if(in - maxIn < 0x1000 && maxN < 0xB)
{
Flush(pOut);
pOut[out] = (maxN - 3) << 4 | (in - maxIn) >> 8;
pOut[out + 1] = (BYTE)(in - maxIn);
out += 2;
in += maxN;
}
else if(maxN < 0x43)
{
Flush(pOut);
pOut[out] = 0xC0 | (maxN - 3);
*(WORD*)(pOut + out + 1) = maxIn;
out += 3;
in += maxN;
}
else
{
Flush(pOut);
pOut[out] = 0xFF;
*(WORD*)(pOut + out + 1) = maxN;
*(WORD*)(pOut + out + 3) = maxIn;
out += 5;
in += maxN;
}
}
else
{
nun[obytes] = pIn[in];
obytes++;
if(obytes == 0x3F) Flush(pOut);
in++;
}
}
Flush(pOut);
pOut[out] = 0x80;
out++;
*rLen = option;
return out;
}
//--------------------------------------------------------------------------- |
Упаковка для туториала. Файл первый.
Код: | //---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
USEUNIT("p_dttext2.cpp"); // Тут должно быть имя второго файла
//---------------------------------------------------------------------------
int i;
int n;
int n2;
int in;
int out;
int size;
WORD* locIn;
char* locOut;
WORD nun[0x7F];
int owords;
int final(char* pIn, char* pOut, int option, int* rLen);
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE, DWORD, LPVOID)
{
return true;
}
//---------------------------------------------------------------------------
char* __stdcall __export mod_name()
{
return "Dune Tutorial Text";
}
//---------------------------------------------------------------------------
void Flush()
{
if(!owords) return;
locOut[out] = owords | 0x80;
out++;
for(int j = 0; j < owords; j++)
*(WORD*)(locOut + out + j * 2) = nun[j];
out += owords * 2;
owords = 0;
}
//---------------------------------------------------------------------------
int __stdcall __export pack(char* pIn, char* pOut, int option, int* rLen)
{
out = 0;
owords = 0;
locIn = (WORD*)pIn;
locOut = new char[0x10000];
for(i = 0; i < option / 0x8C0; i++)
{
size = out;
out += 2;
in = 0;
while(in < 0x460)
{
n2 = 0;
for(n = 1; (locIn[in + n - 1] == locIn[in + n]) && ((in + n) < 0x460); n++);
if(i) for(n2 = 0; locIn[in + n2] == locIn[in + n2 - 0x460] && in + n2 < 0x460; n2++);
if(n > 1 || n2 > 1)
{
if(n > 0x7F) n = 0x7F;
if(n2 > 0xFF) n2 = 0xFF;
if(n > n2)
{
Flush();
locOut[out] = n;
*(WORD*)(locOut + out + 1) = locIn[in];
out += 3;
in += n;
}
else
{
Flush();
locOut[out] = 0x80;
locOut[out + 1] = n2;
out += 2;
in += n2;
}
}
else
{
nun[owords] = locIn[in];
owords++;
if(owords == 0x7F) Flush();
in++;
}
}
Flush();
locIn += 0x460;
*(WORD*)(locOut + size) = (WORD)(out - size - 2) << 8 | (WORD)(out - size - 2) >> 8;
}
*(WORD*)(locOut + out) = -1;
out += 2;
out = final(locOut, pOut, out, rLen);
*rLen = option;
delete[] locOut;
return out;
}
//--------------------------------------------------------------------------- |
Файл второй (у меня назывался p_dttext2.cpp).
Код: | //---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
char nun2[0x3F];
int obytes;
int out2;
//---------------------------------------------------------------------------
void Flush(char* pO)
{
if(!obytes) return;
pO[out2] = obytes | 0x80;
out2++;
for(int j = 0; j < obytes; j++)
pO[out2 + j] = nun2[j];
out2 += obytes;
obytes = 0;
}
//---------------------------------------------------------------------------
int final(char* pIn, char* pOut, int option, int* rLen)
{
int in = 0;
int n;
int n2;
int maxN;
int maxN2;
int maxIn;
int in2;
obytes = 0;
out2 = 0;
while(in < option)
{
maxN = 0;
maxN2 = 0;
maxIn = 0;
for(in2 = 0; in2 < in; in2++)
{
for(n = 0; pIn[in2 + n] == pIn[in + n] && in + n < option; n++);
if(in - in2 < 0x1000 && n < 0xB) n2 = n - 2;
else if(n < 0x43) n2 = n - 3;
else n2 = n - 5;
if(n2 > maxN2) { maxN2 = n2; maxN = n; maxIn = in2; }
}
for(n = 1; pIn[in + n - 1] == pIn[in + n] && in + n - 1 < option; n++);
n2 = n - 4;
if(n2 > maxN2) { maxN2 = n2; maxN = n; maxIn = in; }
if(maxN2 >= 0 && maxN > 2)
{
if(in == maxIn)
{
Flush(pOut);
pOut[out2] = 0xFE;
*(WORD*)(pOut + out2 + 1) = maxN;
pOut[out2 + 3] = pIn[in];
out2 += 4;
in += maxN;
}
else if(in - maxIn < 0x1000 && maxN < 0xB)
{
Flush(pOut);
pOut[out2] = (maxN - 3) << 4 | (in - maxIn) >> 8;
pOut[out2 + 1] = (BYTE)(in - maxIn);
out2 += 2;
in += maxN;
}
else if(maxN < 0x43)
{
Flush(pOut);
pOut[out2] = 0xC0 | (maxN - 3);
*(WORD*)(pOut + out2 + 1) = maxIn;
out2 += 3;
in += maxN;
}
else
{
Flush(pOut);
pOut[out2] = 0xFF;
*(WORD*)(pOut + out2 + 1) = maxN;
*(WORD*)(pOut + out2 + 3) = maxIn;
out2 += 5;
in += maxN;
}
}
else
{
nun2[obytes] = pIn[in];
obytes++;
if(obytes == 0x3F) Flush(pOut);
in++;
}
}
Flush(pOut);
pOut[out2] = 0x80;
out2++;
*rLen = option;
return out2;
}
//--------------------------------------------------------------------------- |
_________________ Я вернулся!!! ...ну почти. |
|
Вернуться к началу |
|
|
Amorpho[US] БесФорменный
Зарегистрирован: 16.12.2003 Сообщения: 161 Откуда: Воронеж
|
Добавлено: Пн Июл 10, 2006 10:50 pm Заголовок сообщения: |
|
|
Компилилось все это в виде дээлэльки-плагина к моей проге. Тебе это нафик не надо, переделаешь в экзешники.
Если, конечно, поймешь хоть что-нибудь в этой писанине. Особенно в сишной. _________________ Я вернулся!!! ...ну почти. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Пн Июл 10, 2006 10:57 pm Заголовок сообщения: |
|
|
Amorpho[US] писал(а): | переделаешь в экзешники. |
Задаю идиотский вопрос-как? |
|
Вернуться к началу |
|
|
Amorpho[US] БесФорменный
Зарегистрирован: 16.12.2003 Сообщения: 161 Откуда: Воронеж
|
Добавлено: Пн Июл 10, 2006 11:40 pm Заголовок сообщения: |
|
|
А каковы познания в асме?
Может проще будет готовые дллки с прогой дать? _________________ Я вернулся!!! ...ну почти. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Вт Июл 11, 2006 8:49 am Заголовок сообщения: |
|
|
Amorpho[US] писал(а): | А каковы познания в асме? |
Познания в асме пока оставляют желать лучшего
Amorpho[US] писал(а): | Может проще будет готовые дллки с прогой дать? |
Если дашь, то попробую разобраться. |
|
Вернуться к началу |
|
|
Amorpho[US] БесФорменный
Зарегистрирован: 16.12.2003 Сообщения: 161 Откуда: Воронеж
|
Добавлено: Вт Июл 11, 2006 6:11 pm Заголовок сообщения: |
|
|
Отправил на мыло. _________________ Я вернулся!!! ...ну почти. |
|
Вернуться к началу |
|
|
PEREVODчик
Зарегистрирован: 07.07.2006 Сообщения: 105 Откуда: Kirov
|
Добавлено: Вт Июл 11, 2006 7:48 pm Заголовок сообщения: |
|
|
Amorpho[US] писал(а): | Отправил на мыло. |
Получил.Спасибо!! |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|