Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Таблицы кодировки

 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Фев 04, 2009 12:32 am    Заголовок сообщения: Таблицы кодировки Ответить с цитатой

Решил я здесь продублировать свой пост из блога consolgames, ибо кажется мне, что там не будет даже камментов Smile Итак, ...

Тружусь я потихоньку над новым движком для обработки текстов (работа с таблицами кодировки, выимка текста, вставка, графическое отображение окон и текста и т.д. и т.п.). Так вот, понял я в этот раз, что стандартный формат таблиц кодировки чуть менее чем полностью неполноценен. В связи с этим, решил я разработать свой формат. Так сказать, для себя. Текущий результат вполне себя оправдал - цели были достигнуты, но по мере надобности ставлю я перед собой ещё более высокие цели. Собственно, что особенного у моего формата таблиц и текстового движка в данный момент:


    - Полная поддержка общепринятого формата.
    - Теперь текст у меня юникодовый.
    - Есть поддержка форматных строк, для этого есть директивы .format и .normal. Пример:
    Код:
    C292=(
    .format
    C69711=\n--\n
    C698=\n{AUTO}
    .normal
    C699={B:A}

    - Перенос строки отныне ничем не отличается от обычного символа.
    - Символ возврата каретки всегда игнорируется.
    - Имеется поддержка инклюдов. Пример:
    Код:
    8227=Ю
    8228=Я
    .include big.tbl

    * Символ конца строки обозначается через "!=", пример: 00!=\0
    * etc...


В итоге, допустим, скрипт Chrono Trigger'а превращается вот в такую красоту (приведён отдельный диалог):
Цитата:
Man: Oh, is this your first visit?
Welcome to the Arena of the Ages!
-
This coliseum hosts battles between monsters
from all across time. Unfortunately, we're doing
some maintenance now. The facilities are closed.
-
Things should be back to normal before too long,
so why don't you take care of any other business
you have in the meantime and check back later?


Вынудили меня обстоятельства задуматься и о написании рекомпилятора скриптов (очень пригодится в переводе Mario & Luigi - Superstar Saga, где скрипт и текст есть одно целое). И как бы вы думали? Да, я планирую вживить эту возможность в мой формат таблиц. Как? Да вот так: задаётся маска инструкции и маски значений - вот и всё. А ещё будет возможность добавления текстовых перечислений. А теперь всё человеческим языком:
Будет несколько вариантов написания "скриптовых" записей в таблице. А точнее, пока надумал два. Основу первого предложил Djinn.
Код:
AB??={size=%d}

Примерно так это и будет выглядеть. Что мы имеем? Если мы встретим два байта и первый из них будет AB, то на выходе получим указанную строку с подставленным значением байта. Например, AB0F будет у нас {size=15}. Но что делать, если параметров несколько или значения не представляют собой байты или полубайты? А вот тут то и нужен второй способ записи. Его я ещё не придумал, есть только задумки. Например, ту же запись можно сделать и вот так:
Код:
FF00?AB00:00FF={size=%d}

Да-да, похоже на тернарную операцию на сях, но зато привычно Smile Пока более удобного способа я не придумал. Итак, это означает буквально следующее:
1. Берём маску FF00.
2. AND'им с ней пару байт.
3. Сравниваем полученное с AB00.
4. Если сошлось - берём маску 00FF, эндим, получаем значение.
5. Подставляем значение в строку.

Но это ещё не всё. Надо же ещё учитывать порядок байт и т.д. и т.п. Т.е. всё-таки как-то это придётся обозначать. А ещё я введу перечисления. Наверное, сразу меня никто не поймёт, но сейчас покажу на примере возможный способ записи:
Код:
FF0000?AB0000:00FF00,0000FF=ShowMessage(size: %d, color: %{red,blue,white,black});

При цепочке байт AB0802 мы получим на выходе ShowMessage(size: 8, color: white);
Надеюсь, объяснил более-менее понятно.
Так вот, в чём же смысл данного поста? А вот в чём: будут ли у кого-нибудь дельные предложения по моим идеям? Замечания, критика, более разумные способы и т.п. и т.д. Пока это всё только в теории - не поздно что-либо менять Smile
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Ср Фев 04, 2009 10:01 am    Заголовок сообщения: Ответить с цитатой

Как-то заумно это выглядит. Surprised Но если удастся облегчить работу с играми, где скрипт событий объединён с текстом, будет весьма полезно. Может быть, кто-то даже переведёт наконец-то Captain Tsubasa 2. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Фев 04, 2009 10:07 am    Заголовок сообщения: Ответить с цитатой

Да вот сам в шоке, но проще - никак Smile
У меня для маски несуществующего байта что-то подобное написано, но на порядок упрощённое. Т.е. задаёшь, например, "{%2x}", и он байты в обе стороны гоняет.
А вообще - надоело писать что-то вроде:
AB00={S=0}
AB01={S=1}
AB02={S=2}
AB03={S=3}
...
ABnn={S=n}
Если можно просто:
AB??={S=%d}
или
FF00?AB00:00FF={S=%d}
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
_AntZ_



Зарегистрирован: 09.05.2008
Сообщения: 90
Откуда: Vladivostok, Russia

СообщениеДобавлено: Ср Фев 04, 2009 12:34 pm    Заголовок сообщения: Ответить с цитатой

Мне это регулярные выражения напоминает.

При одновременном использовании обоих вариантов не стоит использовать знак вопроса и там, и там - это затрудняет чтение и может доставить неудобства при парсинге таблицы.

Код:
FF0000?AB0000:00FF00,0000FF=ShowMessage(size: %d, color: %{red,blue,white,black});
Может, лучше так:
AB{??}{??} : {size}{color = [red,blue,white,black]} = "ShowMessage(size: $size, color: $color);"
либо ещё проще, если не enum,
AB{??}{??} = "ShowMessage(size: $1, color: $2);"
если всё-таки нужен enum,
AB{??}{??} : {}{[red,blue,white,black]} = "ShowMessage(size: $1, color: $2);"
Если нет выравнивания по полубайтам, то можно написать так:
AB{-1\5}C : {size} = "SetSize($size)"
-1 значит, что для соответствия с 0xAB используются только 7 бит (потому что 7 = 8 - 1), а в size помещается 5 бит (1 бит с конца первого байта, 4 бита с начала второго).

В принципе, {??} - другое обозначение {0\8} или просто - {8}, т.е.
AB{??}{??} : {}{[red,blue,white,black]} = "ShowMessage(size: $1, color: $2);"
эквивалентно
AB{8}{8} : {}{[red,blue,white,black]} = "ShowMessage(size: $1, color: $2);"
ну и диапазоны добавить
{13..2D} : {'A'..'Z'} = "$1"
или просто
{13..2D} = {'A'..'Z'}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Фев 04, 2009 3:06 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
При одновременном использовании обоих вариантов не стоит использовать знак вопроса и там, и там - это затрудняет чтение и может доставить неудобства при парсинге таблицы.

Двоеточие во втором варианте обязательно, путаницы не будет. И, извиняюсь, какой нахрен парсинг? Тут простая построчная загрузка шаблонных строк.

Цитата:
AB{??}{??} : {size}{color = [red,blue,white,black]} = "ShowMessage(size: $size, color: $color);"

И зачем фигурные скобки и лишние пробелы? К тому же, переменные здесь явно лишние, а кавычки - особенно.

Цитата:
AB{??}{??} = "ShowMessage(size: $1, color: $2);"

Какой тип переменных $1 и $2 (как и в первом случае)? Потом ведь обратно не прочитаешь. К тому же printf/scanf (format в Дельфи) многим привычны и очень удобны. Да и движок для них я уже написал.

Цитата:
AB{??}{??} : {}{[red,blue,white,black]} = "ShowMessage(size: $1, color: $2);"

Опять же тонны лишнего.

Цитата:
AB{-1\5}C : {size} = "SetSize($size)"

Извиняюсь, но это п***ц %) Чем тебя маски не устраивают? Просто, эффективно, и понятно.

Цитата:
ну и диапазоны добавить
{13..2D} : {'A'..'Z'} = "$1"
или просто
{13..2D} = {'A'..'Z'}

Енамы в диапазонах не считаются, а для символов есть %c. Тут разве что стоит подумать над возможностью инкремента. А вообще - добавить в таблицу возможность инициализации диапазона символов - мысль здравая.
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
_AntZ_



Зарегистрирован: 09.05.2008
Сообщения: 90
Откуда: Vladivostok, Russia

СообщениеДобавлено: Ср Фев 04, 2009 3:36 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Извиняюсь, но это п***ц %) Чем тебя маски не устраивают? Просто, эффективно, и понятно.
Ну, не знаю, мне лично такое - FF0000?AB0000:00FF00,0000FF понять намного сложней Smile
Цитата:
Енамы в диапазонах не считаются
В фигурных скобочках - это не энамы, а образец, определяющий множество символов, удовлетворящх некоторым условиям. Так, например, {?} - любые четрые бита; и, соответственно, {13..2D} - любой байт, имеющий значение от 0x13 до 0x2D.
Цитата:
И зачем фигурные скобки и лишние пробелы?
Да, немного громоздко. Можно сократить, выкинув пробелы и заменив фигурные скобочки на знак '|', например. В самом коротком варианте это можно было бы сделать так:
AB|??|??="ShowMessage(size: $1, color: @2[red,blue,white,black]);" Хотя, это почти твой вариант с вопросительными знаками Smile, только добавлена нумерация извлекаемых значений. Обычное "AB????" плохо тем, что ты не можешь определить откуда извлекать первое значение, а откуда второе. Кроме того, нумерация позволит легко менять местами значения в выходном тексте. Например, можно написать наоборот: "ShowMessage(color: @2[red,blue,white,black], size: $1);", хотя реально в коде сначала будет идти размер, потом цвет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Фев 04, 2009 3:53 pm    Заголовок сообщения: Ответить с цитатой

AB?? - это упрощённый вариант записи, когда есть лишь одно значение. А нумеровать переменные отпадает необходимость при использовании масок. К тому же, твой способ бесполезен, когда значение раскидано по несколько байтам, а маски тут - самое то.

Цитата:
Ну, не знаю, мне лично такое - FF0000?AB0000:00FF00,0000FF понять намного сложней

Это, как раз, грамотная запись. Описать в спецификации - и поймёт любой. Да и так догадаться можно по полной строке.
Грубо говоря: OpcodeMask=FF0000?OpcodeID=AB0000:ValueMask=00FF00,ValueMask=0000FF.
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Чт Фев 05, 2009 12:39 am    Заголовок сообщения: Ответить с цитатой

Сегодня дописал функцию обработки скриптовых строк. Есть ещё пара моментов:
Сделал возможность добавления "пробельных" символов (или как их назвать). Сделал я их обозначение как "%[...]".
Например:
Код:
AB??=%[ ]<Color:%{red,white}>

Допустим, вышло у нас
Код:
<Color:red>

А если мы запишем так:
Код:
<Color : red>

то всё равно прочитается, т.к. символ пробела присутствует в квадратных скобках и будет проигрнорирован.
Также, enum'ы записываются эквивалентно сям, например:
Код:
AB??=<%{fast=10,slow=20}>

При значении 10 мы получим <fast>, при 20 - <slow>. При остальных будет выведено непосредственно значение, так же, как и при %d. То же самое и при обратной конвертации - ничего не мешает заменить <fast> на <10>.
А ещё имеется чувствительность к регистру и всем символам. Т.е. при записи <%{fast, slow}> у нас получится "fast" и " slow" (с пробелом). Это необходимость, ибо служебные символы служебными символами, а всё-таки не код это, а текст.

А вот пока надуманный список возможных записей:
XX=... - обычный "символ"*
XX!=... - конец строки
XX^=... - перенос строки (ничем не отличается от обычного "символа", но пригодится для наглядности или экспорта таблицы в таблицу отображаемых символов при графическом отображении текста).
XX~=... - переход на новый экран.
XX>=... - big endian, только в скриптовых записях.
XX<=... - little endian (по умолчанию).

* под символом подразумеваю любую последовательность символов Smile
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Чт Дек 03, 2009 4:19 pm    Заголовок сообщения: Ответить с цитатой

На днях обзор программок "чтоб текст как в игре был" от JurraskPark'а побудил меня снова взяться за обдумывания дополнительных возможностей моего формата, которые позволят в одной таблице описать и коды символов, и параметры визуализации. Во время сего действия я с ужасом поймал себя на том, что начал забывать особенности собственного же формата. Ну и решил настрочить спецификацию, дабы такого больше не повторялось, заодно излив туда свои мысли на тему настроек визуализации.
Если кто-то всё же разберётся в моей писанине и будет готов предложить новые идеи - с удовольствием выслушаю.
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Базовый ромхакинг Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group