russian ROMhacking
[ Новые сообщения · Участники · Правила форума · Поиск ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Форум ромхакеров » Около темы » Геймдев » Disco (порт симулятора дискотеки с J2ME) (в работе...)
Disco (порт симулятора дискотеки с J2ME)
ТомахомэДата: Понедельник, 19.02.2024, 17:04 | Сообщение # 1
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Начал пока с малого - с переоформления титульника и стартового меню "Ангелов Секса" плюс небольших правок в информацию об игре.
 
SegaMarkДата: Понедельник, 19.02.2024, 19:23 | Сообщение # 2
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Отлично вышло.
Я сегодня занимался деобфускацией кода. Получилось понять для чего нужен каждый класс, пока точно не уверен на 100% что все правильно, но на данный момент ситуация выглядит так:

a=SoundController
b=DiscoDancerGameEngine
с=LanguageLoader
d=DiscoController
e=DiscoCanvas

Самое главное получилось разгадать как текст выводиться на экран. Алгоритм такой:

Начиная от офсета 0x0 до 0xFF записаны адреса начала строк, по 2 байта каждый(short), начиная от 0x100 и до конца файла 0x128F, находиться ASCII текст. В начале каждой строки содержится размер строки длинной 2 байта, после этого идет уже сама строка. Так же в файле содержатся некоторые заменители «%xU», где x это либо пустая строка, либо значения от 0 до 1, которые заменяются в функции LanguageLoader.loadLanguage(int offset, String[] replacements) (c.a(int paramInt, String[] paramArrayOfString)).


Сообщение отредактировал SegaMark - Понедельник, 19.02.2024, 19:25
 
ТомахомэДата: Вторник, 20.02.2024, 06:12 | Сообщение # 3
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
То есть, по логике вещей, в случае необходимости вывода какого-нибудь текстового сообщения, игра просто должна дать номер нужной строки внутри lang-файла?
 
SegaMarkДата: Вторник, 20.02.2024, 06:13 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Да именно так
 
SegaMarkДата: Вторник, 20.02.2024, 06:16 | Сообщение # 5
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Я до этого в BEX не работал, Можешь подсказать возможно ли там реализовать анимацию и чтение из файлов?
 
ТомахомэДата: Вторник, 20.02.2024, 08:11 | Сообщение # 6
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Набросал для выщипывания данных из lang-файлов вот такую подпрограмку:
Код
Declare Sub ShowMsg(stringID,TextboxX,TextBoxY,TextboxWidth,TextboxHeight)
    CursorX=0
    CursorY=0
    if Language=0 then Lang=English
    if Language=1 then Lang=French
    if Language=2 then Lang=German
    if Language=3 then Lang=Italian
    if Language=4 then Lang=Turkish
    reload Lang
    for i=0 to StringID
  readint StringAddr
    Next
    Lang+=StringAddr
    reload Lang
    readint StringLenght
    for i=0 to StringLenght
  read Symbol
  locate TextboxY+CursorY,TextboxX+CursorX: print Symbol
  CursorX++
  If CursorX>TextboxWidth then
   CursorX=0
   CursorY++
  endif
    Next
    Exit Sub
End Sub
<-------------------------------------------------------------------------------------------->
English:  datafile    lang.xx,bin
French:  datafile    lang.fr,bin
German:  datafile    lang.de,bin
Italian:  datafile    lang.it,bin
Turkish:  datafile    lang.tr-TR,bin


Однако при попытке компиляции BEX пишет, что Label (конкретно - Lang) does not exist. Вопрос к TLT - есть ли способ получше представить текущий языковой label как более абстрактный Lang?


Сообщение отредактировал Томахомэ - Вторник, 20.02.2024, 08:14
 
SegaMarkДата: Вторник, 20.02.2024, 11:04 | Сообщение # 7
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Я немного поизучал bex. Судя по всему нельзя присваивать label переменной. Если написать напрямую reload English, то все будет работать
 
ТомахомэДата: Вторник, 20.02.2024, 12:33 | Сообщение # 8
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Вот как выглядит сейчас:
Код
Declare Sub ShowMsg(stringID,TextboxX,TextBoxY,TextboxWidth,TextboxHeight)
    CursorX=0
    CursorY=0
    if Language=0 then reload English
    if Language=1 then reload French
    if Language=2 then reload German
    if Language=3 then reload Italian
    if Language=4 then reload Turkish
    for i=0 to StringID
  readint StringAddr
    Next
    if Language=0 then
  English+=StringAddr
  reload English
    endif
    if Language=1 then
  French+=StringAddr
  reload French
    endif
    if Language=2 then
  German+=StringAddr
  reload German
    endif
    if Language=3 then
  Italian+=StringAddr
  reload Italian
    endif
    if Language=4 then
  Turkish+=StringAddr
  reload Turkish
    endif
    readint StringLenght
    for i=0 to StringLenght
  read Symbol
  locate TextboxY+CursorY,TextboxX+CursorX: print Symbol
  CursorX++
  If CursorX>TextboxWidth then
   CursorX=0
   CursorY++
  endif
    Next
    Exit Sub
End Sub

Первый и пока единственный вызов:
Код
If Draw=2 Then
  Lang=Language
  GoSub cls6
  Ink 2

  If Language=0 Then
   'locate 10,14: print "New game"
   ShowMsg 53,14,10,13,1
   locate 12,14: print "Settings"
   locate 14,14: print "Instructions"
   locate 16,14: print "Information"
   locate 18,14: print "Reset"
  EndIf
  If Language=1 Then
   locate 10,15: print "Новая игра"
   locate 12,15: print "Настройки"
   locate 14,15: print "Инструкция"
   locate 16,15: print "Информация"
   locate 18,15: print "Сброс"
  EndIf
  If Language=2 Then
   locate 10,13: print "Neues Spiel"
   locate 12,13: print "Einstellungen"
   locate 14,13: print "Anleitung"
   locate 16,13: print "Ьber das Spiel"
   locate 18,13: print "Zurьcksetzen"
  EndIf

  Draw=9
    EndIf

Однако результат, мягко говоря, неожиданный (см. прикреплённый скриншот). В целом сорс здесь.
Прикрепления: 3797983.png (6.7 Kb)
 
SegaMarkДата: Вторник, 20.02.2024, 15:23 | Сообщение # 9
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Вот Исправленный код:
Код

Declare Sub ShowMsg(stringID,TextboxX,TextBoxY,TextboxWidth,TextboxHeight)
    CursorX=0
    CursorY=0
    if Language=0 then reload English
    if Language=1 then reload French
    if Language=2 then reload German
    if Language=3 then reload Italian
    if Language=4 then reload Turkish
    
    DataPtr&+=StringID * 2
    readint StartTextOffset
  
    DataPtr&+=StartTextOffset - (StringID * 2) - 1
    read StringLength    
    
    for i=0 to StringLength
  read Symbol
  locate TextboxY+CursorY,TextboxX+CursorX: print Chr$(Symbol)
  CursorX++
  If CursorX>TextboxWidth then
   CursorX=0
   CursorY++
  endif
    Next
    Exit Sub
End Sub

что было сделано:
1) убран reload English в условии, он загружает данные и ставит каретку в начало файлов, так что English+=StringAddr не дает никакого результата, так как всё сбрасывается на начало
2) English+=StringAddr не перемещает каретку. Для перемещения каретки нужно использовать DataPtr&
3) Переименовал переменные, так как они у меня переименованы в деобфусцированных файлах, что бы не путаться
4) Добавил формулу StartTextOffset - (StringID * 2) - 1 из деобфусцированного кода для вычисления положения StringLength. она немного изменена от оригинала, вместо "-2" используется "-1", так как есть какой-то странный баг в BEX, первый считываемый байт не должен быть равен 00, так что у нас максимальный размер символов может быть только 256 символов вместо 65535, но я пока не увидел строк превышающих 256 символов, так что возможно этого вполне хватит.
5) байты НЕ конвертируются автоматически в char, при использовании функции print, для этого нужно использовать функцию Chr$


Сообщение отредактировал SegaMark - Вторник, 20.02.2024, 15:27
 
ТомахомэДата: Вторник, 20.02.2024, 16:22 | Сообщение # 10
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Подпрограмма вывела почему-то только первую букву N из строчки New Game. Мы что-то упустили?
Код
Declare Sub ShowMsg(stringID,TextboxX,TextBoxY,TextboxWidth,TextboxHeight)
    CursorX=0
    CursorY=0
    if Language=0 then reload English
    if Language=1 then reload French
    if Language=2 then reload German
    if Language=3 then reload Italian
    if Language=4 then reload Turkish
    DataPtr&+=StringID * 2
    readint StartTextOffset
    DataPtr&+=StartTextOffset - (StringID * 2) - 1
    read StringLength
    for i=0 to StringLenght
  read Symbol
  locate TextboxY+CursorY,TextboxX+CursorX: print Chr$(Symbol)
  CursorX++
  If CursorX>TextboxWidth then
   CursorX=0
   CursorY++
  endif
    Next
    Exit Sub
End Sub
 
SegaMarkДата: Вторник, 20.02.2024, 16:31 | Сообщение # 11
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
Попробуй передать первый аргумент 53
 
ТомахомэДата: Вторник, 20.02.2024, 17:07 | Сообщение # 12
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Эээээм... Передать? В смысле?...
 
SegaMarkДата: Вторник, 20.02.2024, 17:14 | Сообщение # 13
Сержант
Группа: Проверенные
Сообщений: 23
Статус: Оффлайн
вот так пропиши ShowMsg 53,14,10,13,1
по итогу должно получиться так как на скриншоте
Прикрепления: basic_000.bmp (840.1 Kb)


Сообщение отредактировал SegaMark - Вторник, 20.02.2024, 17:15
 
ТомахомэДата: Вторник, 20.02.2024, 17:17 | Сообщение # 14
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
Вроде оно у меня именно так прописано изначально и было...

Код
If Language=0 Then
   'locate 10,14: print "New game"
   ShowMsg 53,14,10,13,1
   locate 12,14: print "Settings"
   locate 14,14: print "Instructions"
   locate 16,14: print "Information"
   locate 18,14: print "Reset"
  EndIf


Сообщение отредактировал Томахомэ - Вторник, 20.02.2024, 17:21
 
ТомахомэДата: Вторник, 20.02.2024, 17:26 | Сообщение # 15
Генерал-майор
Группа: Проверенные
Сообщений: 487
Статус: Оффлайн
А перешли тогда, пожалуйста, свой bex-файл!
 
Форум ромхакеров » Около темы » Геймдев » Disco (порт симулятора дискотеки с J2ME) (в работе...)
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: