Disco (порт симулятора дискотеки с J2ME)
|
|
Томахомэ | Дата: Понедельник, 19.02.2024, 17:04 | Сообщение # 1 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Начал пока с малого - с переоформления титульника и стартового меню "Ангелов Секса" плюс небольших правок в информацию об игре.
|
|
| |
SegaMark | Дата: Понедельник, 19.02.2024, 19:23 | Сообщение # 2 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Отлично вышло. Я сегодня занимался деобфускацией кода. Получилось понять для чего нужен каждый класс, пока точно не уверен на 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 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| То есть, по логике вещей, в случае необходимости вывода какого-нибудь текстового сообщения, игра просто должна дать номер нужной строки внутри lang-файла?
|
|
| |
SegaMark | Дата: Вторник, 20.02.2024, 06:13 | Сообщение # 4 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Да именно так
|
|
| |
SegaMark | Дата: Вторник, 20.02.2024, 06:16 | Сообщение # 5 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Я до этого в BEX не работал, Можешь подсказать возможно ли там реализовать анимацию и чтение из файлов?
|
|
| |
Томахомэ | Дата: Вторник, 20.02.2024, 08:11 | Сообщение # 6 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Набросал для выщипывания данных из 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 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Я немного поизучал bex. Судя по всему нельзя присваивать label переменной. Если написать напрямую reload English, то все будет работать
|
|
| |
Томахомэ | Дата: Вторник, 20.02.2024, 12:33 | Сообщение # 8 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Вот как выглядит сейчас:
Код 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 Однако результат, мягко говоря, неожиданный (см. прикреплённый скриншот). В целом сорс здесь.
|
|
| |
SegaMark | Дата: Вторник, 20.02.2024, 15:23 | Сообщение # 9 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Вот Исправленный код:
Код 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 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Подпрограмма вывела почему-то только первую букву 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 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| Попробуй передать первый аргумент 53
|
|
| |
Томахомэ | Дата: Вторник, 20.02.2024, 17:07 | Сообщение # 12 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Эээээм... Передать? В смысле?...
|
|
| |
SegaMark | Дата: Вторник, 20.02.2024, 17:14 | Сообщение # 13 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| вот так пропиши ShowMsg 53,14,10,13,1 по итогу должно получиться так как на скриншоте
Сообщение отредактировал SegaMark - Вторник, 20.02.2024, 17:15 |
|
| |
Томахомэ | Дата: Вторник, 20.02.2024, 17:17 | Сообщение # 14 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| Вроде оно у меня именно так прописано изначально и было...
Код 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 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 530
Статус: Оффлайн
| А перешли тогда, пожалуйста, свой bex-файл!
|
|
| |