|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Фев 04, 2009 12:32 am Заголовок сообщения: Таблицы кодировки |
|
|
Решил я здесь продублировать свой пост из блога consolgames, ибо кажется мне, что там не будет даже камментов Итак, ...
Тружусь я потихоньку над новым движком для обработки текстов (работа с таблицами кодировки, выимка текста, вставка, графическое отображение окон и текста и т.д. и т.п.). Так вот, понял я в этот раз, что стандартный формат таблиц кодировки чуть менее чем полностью неполноценен. В связи с этим, решил я разработать свой формат. Так сказать, для себя. Текущий результат вполне себя оправдал - цели были достигнуты, но по мере надобности ставлю я перед собой ещё более высокие цели. Собственно, что особенного у моего формата таблиц и текстового движка в данный момент:
- Полная поддержка общепринятого формата.
- Теперь текст у меня юникодовый.
- Есть поддержка форматных строк, для этого есть директивы .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, то на выходе получим указанную строку с подставленным значением байта. Например, AB0F будет у нас {size=15}. Но что делать, если параметров несколько или значения не представляют собой байты или полубайты? А вот тут то и нужен второй способ записи. Его я ещё не придумал, есть только задумки. Например, ту же запись можно сделать и вот так:
Код: | FF00?AB00:00FF={size=%d} |
Да-да, похоже на тернарную операцию на сях, но зато привычно Пока более удобного способа я не придумал. Итак, это означает буквально следующее:
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);
Надеюсь, объяснил более-менее понятно.
Так вот, в чём же смысл данного поста? А вот в чём: будут ли у кого-нибудь дельные предложения по моим идеям? Замечания, критика, более разумные способы и т.п. и т.д. Пока это всё только в теории - не поздно что-либо менять _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Ср Фев 04, 2009 10:01 am Заголовок сообщения: |
|
|
Как-то заумно это выглядит. Но если удастся облегчить работу с играми, где скрипт событий объединён с текстом, будет весьма полезно. Может быть, кто-то даже переведёт наконец-то Captain Tsubasa 2. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Фев 04, 2009 10:07 am Заголовок сообщения: |
|
|
Да вот сам в шоке, но проще - никак
У меня для маски несуществующего байта что-то подобное написано, но на порядок упрощённое. Т.е. задаёшь, например, "{%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 |
|
Вернуться к началу |
|
|
_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
Зарегистрирован: 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 |
|
Вернуться к началу |
|
|
_AntZ_
Зарегистрирован: 09.05.2008 Сообщения: 90 Откуда: Vladivostok, Russia
|
Добавлено: Ср Фев 04, 2009 3:36 pm Заголовок сообщения: |
|
|
Цитата: | Извиняюсь, но это п***ц %) Чем тебя маски не устраивают? Просто, эффективно, и понятно. | Ну, не знаю, мне лично такое - FF0000?AB0000:00FF00,0000FF понять намного сложней
Цитата: | Енамы в диапазонах не считаются | В фигурных скобочках - это не энамы, а образец, определяющий множество символов, удовлетворящх некоторым условиям. Так, например, {?} - любые четрые бита; и, соответственно, {13..2D} - любой байт, имеющий значение от 0x13 до 0x2D.
Цитата: | И зачем фигурные скобки и лишние пробелы? | Да, немного громоздко. Можно сократить, выкинув пробелы и заменив фигурные скобочки на знак '|', например. В самом коротком варианте это можно было бы сделать так:
AB|??|??="ShowMessage(size: $1, color: @2[red,blue,white,black]);" Хотя, это почти твой вариант с вопросительными знаками , только добавлена нумерация извлекаемых значений. Обычное "AB????" плохо тем, что ты не можешь определить откуда извлекать первое значение, а откуда второе. Кроме того, нумерация позволит легко менять местами значения в выходном тексте. Например, можно написать наоборот: "ShowMessage(color: @2[red,blue,white,black], size: $1);", хотя реально в коде сначала будет идти размер, потом цвет. |
|
Вернуться к началу |
|
|
HoRRoR 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 |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Фев 05, 2009 12:39 am Заголовок сообщения: |
|
|
Сегодня дописал функцию обработки скриптовых строк. Есть ещё пара моментов:
Сделал возможность добавления "пробельных" символов (или как их назвать). Сделал я их обозначение как "%[...]".
Например:
Код: | AB??=%[ ]<Color:%{red,white}> |
Допустим, вышло у нас
А если мы запишем так:
то всё равно прочитается, т.к. символ пробела присутствует в квадратных скобках и будет проигрнорирован.
Также, 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 (по умолчанию).
* под символом подразумеваю любую последовательность символов _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Дек 03, 2009 4:19 pm Заголовок сообщения: |
|
|
На днях обзор программок "чтоб текст как в игре был" от JurraskPark'а побудил меня снова взяться за обдумывания дополнительных возможностей моего формата, которые позволят в одной таблице описать и коды символов, и параметры визуализации. Во время сего действия я с ужасом поймал себя на том, что начал забывать особенности собственного же формата. Ну и решил настрочить спецификацию, дабы такого больше не повторялось, заодно излив туда свои мысли на тему настроек визуализации.
Если кто-то всё же разберётся в моей писанине и будет готов предложить новые идеи - с удовольствием выслушаю. _________________ Работаю за деньги
KILL ALL HUMANS!!!!!111 |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|