Garett (http://forum.noxworld.ru/profile/?u=518) по каким-то неизвестным мне причинам не мог выложить этот пост, но видимо считает что время не терпит)
Как бы то не было, мы можем видеть результат отличной и кропотливой работы. Спасибо Garett'у (http://forum.noxworld.ru/profile/?u=518).
Справка.
Для тех, кому не нравятся существующие шрифты в игре.
В Nox-е используется предположительно три файла шрифтов large.fnt, number.fnt и small.fnt.
Будет рассмотрено как получить и изменить (если необходимо) изображения символов. На примере самого маленького файла.
Содержание файла number.fnt в шестнадцатиричном виде или в виде набора байт с их значениями (по две цифры на байт).
00000000: 0A 00 02 00 06 00 01 00 00 00 00 00 30 00 39 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000040: 00 00 00 00 00 00 00 00 0D 00 00 00 05 70 00 D8
00000050: 00 D8 00 D8 00 D8 00 70 00 03 60 00 E0 00 60 00
00000060: 60 00 60 00 60 00 05 70 00 D8 00 18 00 70 00 C0
00000070: 00 F8 00 05 70 00 D8 00 30 00 18 00 D8 00 70 00
00000080: 05 30 00 70 00 70 00 F0 00 F8 00 30 00 05 F8 00
00000090: C0 00 F0 00 18 00 D8 00 70 00 05 70 00 C0 00 F0
000000A0: 00 D8 00 D8 00 70 00 05 F8 00 18 00 30 00 60 00
000000B0: 60 00 60 00 05 70 00 D8 00 70 00 D8 00 D8 00 70
000000C0: 00 05 70 00 D8 00 D8 00 78 00 18 00 70 00
Предположительно в этом файле должны содержаться изображения цифр (арабских). Всего их 10 штук: "0","1","2","3","4","5","6","7","8","9".
Визуальный анализ позволяет выделить в файле две части, разделенные строками нулей.
Первая часть:
00000000: 0A 00 02 00 06 00 01 00 00 00 00 00 30 00 39 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000040: 00 00 00 00 00 00 00 00 0D 00 00 00
Вторая часть:
00000040: 05 70 00 D8
00000050: 00 D8 00 D8 00 D8 00 70 00 03 60 00 E0 00 60 00
00000060: 60 00 60 00 60 00 05 70 00 D8 00 18 00 70 00 C0
00000070: 00 F8 00 05 70 00 D8 00 30 00 18 00 D8 00 70 00
00000080: 05 30 00 70 00 70 00 F0 00 F8 00 30 00 05 F8 00
00000090: C0 00 F0 00 18 00 D8 00 70 00 05 70 00 C0 00 F0
000000A0: 00 D8 00 D8 00 70 00 05 F8 00 18 00 30 00 60 00
000000B0: 60 00 60 00 05 70 00 D8 00 70 00 D8 00 D8 00 70
000000C0: 00 05 70 00 D8 00 D8 00 78 00 18 00 70 00
Первая чать не интересна (одни нули), во второй, вероятно как раз содержится информаци о изображениях символов.
Всего символов 10 штук. Смотрим вторую часть и считаем количества различных значений байтов. В теории, для каждого символа должна быть отдельное изображение, эти картинки должны быть как-то отделены друг от друга. Вероятнее всего этим разделителем является байт со значением "05" - их ровно 9 штук и распределены равномерно (за исключение одного, первого, но если взять еще одно значение разделителя "03" - все начинает сходиться).
Соответственно перестроим вторую часть, перенося строки по байту "05" ("03"):
05 70 00 D8 00 D8 00 D8 00 D8 00 70 00
03 60 00 E0 00 60 00 60 00 60 00 60 00
05 70 00 D8 00 18 00 70 00 C0 00 F8 00
05 70 00 D8 00 30 00 18 00 D8 00 70 00
05 30 00 70 00 70 00 F0 00 F8 00 30 00
05 F8 00 C0 00 F0 00 18 00 D8 00 70 00
05 70 00 C0 00 F0 00 D8 00 D8 00 70 00
05 F8 00 18 00 30 00 60 00 60 00 60 00
05 70 00 D8 00 70 00 D8 00 D8 00 70 00
05 70 00 D8 00 D8 00 78 00 18 00 70 00
Теперь, как перевести эти строки в изображения. Сначала вынесем из каждой строки первый байт ("05" и "03") на отдельную строку, а всю остальную часть разделим на короткие строки по два байта. Далее нужно перевести все в двоичный вид.
05
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
03
60 00 -> 01100000 00000000
E0 00 -> 11100000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
05
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
18 00 -> 00011000 00000000
70 00 -> 01110000 00000000
C0 00 -> 11000000 00000000
F8 00 -> 11111000 00000000
05
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
30 00 -> 00110000 00000000
18 00 -> 00011000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
05
30 00 -> 00110000 00000000
70 00 -> 01110000 00000000
70 00 -> 01110000 00000000
F0 00 -> 11110000 00000000
F8 00 -> 11111000 00000000
30 00 -> 00110000 00000000
05
F8 00 -> 11111000 00000000
C0 00 -> 11000000 00000000
F0 00 -> 11110000 00000000
18 00 -> 00011000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
05
70 00 -> 01110000 00000000
C0 00 -> 11000000 00000000
F0 00 -> 11110000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
05
F8 00 -> 11111000 00000000
18 00 -> 00011000 00000000
30 00 -> 00110000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
05
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
70 00 -> 01110000 00000000
05
70 00 -> 01110000 00000000
D8 00 -> 11011000 00000000
D8 00 -> 11011000 00000000
78 00 -> 01111000 00000000
18 00 -> 00011000 00000000
70 00 -> 01110000 00000000
Становится понятно, что означают байты "05" и "03" - это относительная ширина изображения символа.
Соответственно, измение значения некоторых байт, можно изменить отображение этих символов в самой игре. Но где конкретно используются именно цифры из файла number.fnt, я не проверял.
Остальные файлы шрифтов default.fnt, large.fnt и small.fnt анализируются подобным образом (default.fnt по умолчанию совпадает со small.fnt).
Некоторые данные из файла:
00000150: .. 04 60 00 90 00 90 00 90 00 90 00 90
00000160: 00 60 00 00 00 00 00 02 40 00 C0 00 40 00 40 00
00000170: 40 00 40 00 40 00 00 00 00 00 04 60 00 90 00 10
00000180: 00 20 00 40 00 80 00 F0 00 00 00 00 00 04 60 00
00000190: 90 00 10 00 20 00 10 00 90 00 60 00 00 00 00 00
000001A0: 04 20 00 60 00 60 00 A0 00 F0 00 20 00 20 00 00
000001B0: 00 00 00 04 F0 00 80 00 E0 00 90 00 10 00 90 00
000001C0: 60 00 00 00 00 00 04 60 00 90 00 80 00 E0 00 90
000001D0: 00 90 00 60 00 00 00 00 00 04 F0 00 10 00 20 00
000001E0: 20 00 40 00 40 00 40 00 00 00 00 00 04 60 00 90
000001F0: 00 90 00 60 00 90 00 90 00 60 00 00 00 00 00 04
00000200: 60 00 90 00 90 00 70 00 10 00 90 00 60 00 00 00
00000210: 00 00 ..
В удобном виде:
..
04 60 00 90 00 90 00 90 00 90 00 90 00 60 00 00 00 00 00
02 40 00 C0 00 40 00 40 00 40 00 40 00 40 00 00 00 00 00
04 60 00 90 00 10 00 20 00 40 00 80 00 F0 00 00 00 00 00
04 60 00 90 00 10 00 20 00 10 00 90 00 60 00 00 00 00 00
04 20 00 60 00 60 00 A0 00 F0 00 20 00 20 00 00 00 00 00
04 F0 00 80 00 E0 00 90 00 10 00 90 00 60 00 00 00 00 00
04 60 00 90 00 80 00 E0 00 90 00 90 00 60 00 00 00 00 00
04 F0 00 10 00 20 00 20 00 40 00 40 00 40 00 00 00 00 00
04 60 00 90 00 90 00 60 00 90 00 90 00 60 00 00 00 00 00
04 60 00 90 00 90 00 70 00 10 00 90 00 60 00 00 00 00 00
..
Двоичный вид, изображение:
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
02
40 00 -> 01000000 00000000
C0 00 -> 11000000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
10 00 -> 00010000 00000000
20 00 -> 00100000 00000000
40 00 -> 01000000 00000000
80 00 -> 10000000 00000000
F0 00 -> 11110000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
10 00 -> 00010000 00000000
20 00 -> 00100000 00000000
10 00 -> 00010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
20 00 -> 00100000 00000000
60 00 -> 01100000 00000000
60 00 -> 01100000 00000000
A0 00 -> 10100000 00000000
F0 00 -> 11110000 00000000
20 00 -> 00100000 00000000
20 00 -> 00100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
F0 00 -> 11110000 00000000
80 00 -> 10000000 00000000
E0 00 -> 11100000 00000000
90 00 -> 10010000 00000000
10 00 -> 00010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
80 00 -> 10000000 00000000
E0 00 -> 11100000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
F0 00 -> 11110000 00000000
10 00 -> 00010000 00000000
20 00 -> 00100000 00000000
20 00 -> 00100000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
40 00 -> 01000000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
04
60 00 -> 01100000 00000000
90 00 -> 10010000 00000000
90 00 -> 10010000 00000000
70 00 -> 01110000 00000000
10 00 -> 00010000 00000000
90 00 -> 10010000 00000000
60 00 -> 01100000 00000000
00 00 -> 00000000 00000000
00 00 -> 00000000 00000000
Пример использования:
(http://s019.radikal.ru/i604/1203/30/d967fbfe6578.png) (http://www.radikal.ru)
Некоторые данные из файла:
00000360: 04 00 00 00 00 00 00 10 00 00 70 00 00 F0 00 00
00000370: 30 00 00 30 00 00 30 00 00 30 00 00 30 00 00 30
00000380: 00 00 30 00 00 00 00 00 00 00 00 00 00 00 09 00
00000390: 00 00 1E 00 00 3F 00 00 63 00 00 63 00 00 26 00
000003A0: 00 0E 00 00 0C 00 00 18 00 00 30 00 00 7F 80 00
000003B0: FF 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00
000003C0: 7E 00 00 FE 00 00 0C 00 00 1C 00 00 18 00 00 3C
000003D0: 00 00 0E 00 00 06 00 00 06 00 00 FC 00 00 78 00
000003E0: 00 00 00 00 00 00 00 00 00 00 08 ..
...
000011C0: 04 00 00 00 00 00 00 00 00 00 А0 00 00 90 00 00
000011D0: 90 00 00 90 00 00 90 00 00 90 00 00 90 00 00 90
000011E0: 00 00 F0 00 00 00 00 00 00 00 00 00 00 00 05 00
000011F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001200: 00 00 00 00 00 00 00 38 00 00 38 00 00 30 00 00
00001210: 30 00 00 60 00 00 C0 00 00 00 00 00 07 00 00 00
00001220: 1E 00 00 32 00 00 30 00 00 F8 00 00 60 00 00 60
00001230: 00 00 60 00 00 60 00 00 40 00 00 C0 00 00 C0 00
00001240: 00 00 00 00 00 00 00 00 00 00 07 ..
...
00002300: 06 00 00 00 18 00 00 30 00 00 00 00 00 78 00 00
00002310: 7С 00 00 0С 00 00 7С 00 00 СС 00 00 СС 00 00 FC
00002320: 00 00 7C 00 00 00 00 00 00 00 00 00 00 00 06 00
00002330: 00 00 30 00 00 48 00 00 00 00 00 78 00 00 7C 00
00002340: 00 0C 00 00 7C 00 00 CC 00 00 CC 00 00 FC 00 00
00002350: 7C 00 00 00 00 00 00 00 00 00 00 00 06 ..
В удобном виде:
04 00 00 00 00 00 00 10 00 00 70 00 00 F0 00 00 30 00 00 30 00 00 30 00 00 30 00 00 30 00 00 30 00 00 30 00 00 00 00 00 00 00 00 00 00 00
09 00 00 00 1E 00 00 3F 00 00 63 00 00 63 00 00 26 00 00 0E 00 00 0C 00 00 18 00 00 30 00 00 7F 80 00 FF 00 00 00 00 00 00 00 00 00 00 00
07 00 00 00 7E 00 00 FE 00 00 0C 00 00 1C 00 00 18 00 00 3C 00 00 0E 00 00 06 00 00 06 00 00 FC 00 00 78 00 00 00 00 00 00 00 00 00 00 00
08 ..
...
04 00 00 00 00 00 00 00 00 00 А0 00 00 90 00 00 90 00 00 90 00 00 90 00 00 90 00 00 90 00 00 90 00 00 F0 00 00 00 00 00 00 00 00 00 00 00
05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 00 00 38 00 00 30 00 00 30 00 00 60 00 00 C0 00 00 00 00 00
07 00 00 00 1E 00 00 32 00 00 30 00 00 F8 00 00 60 00 00 60 00 00 60 00 00 60 00 00 40 00 00 C0 00 00 C0 00 00 00 00 00 00 00 00 00 00 00
07 ..
...
06 00 00 00 18 00 00 30 00 00 00 00 00 78 00 00 7С 00 00 0С 00 00 7С 00 00 СС 00 00 СС 00 00 FC 00 00 7C 00 00 00 00 00 00 00 00 00 00 00
06 00 00 00 30 00 00 48 00 00 00 00 00 78 00 00 7C 00 00 0C 00 00 7C 00 00 CC 00 00 CC 00 00 FC 00 00 7C 00 00 00 00 00 00 00 00 00 00 00
06 ..
Двоичный вид, изображение:
04
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
10 00 00 -> 00010000 00000000 00000000
70 00 00 -> 01110000 00000000 00000000
F0 00 00 -> 11110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
09
00 00 00 -> 00000000 00000000 00000000
1E 00 00 -> 00011110 00000000 00000000
3F 00 00 -> 00111111 00000000 00000000
63 00 00 -> 01100011 00000000 00000000
63 00 00 -> 01100011 00000000 00000000
26 00 00 -> 00100110 00000000 00000000
0E 00 00 -> 00001110 00000000 00000000
0C 00 00 -> 00001100 00000000 00000000
18 00 00 -> 00011000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
7F 80 00 -> 01111111 10000000 00000000
FF 00 00 -> 11111111 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
07
00 00 00 -> 00000000 00000000 00000000
7E 00 00 -> 01111110 00000000 00000000
FE 00 00 -> 11111110 00000000 00000000
0C 00 00 -> 00001100 00000000 00000000
1C 00 00 -> 00011100 00000000 00000000
18 00 00 -> 00011000 00000000 00000000
3C 00 00 -> 00111100 00000000 00000000
0E 00 00 -> 00001110 00000000 00000000
06 00 00 -> 00000110 00000000 00000000
06 00 00 -> 00000110 00000000 00000000
FC 00 00 -> 11111100 00000000 00000000
78 00 00 -> 01111000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
08 ..
...
04
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
А0 00 00 -> 10100000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
90 00 00 -> 10010000 00000000 00000000
F0 00 00 -> 11110000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
05
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
38 00 00 -> 00111000 00000000 00000000
38 00 00 -> 00111000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
60 00 00 -> 01100000 00000000 00000000
C0 00 00 -> 11000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
07
00 00 00 -> 00000000 00000000 00000000
1E 00 00 -> 00011110 00000000 00000000
32 00 00 -> 00110010 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
F8 00 00 -> 11111000 00000000 00000000
60 00 00 -> 01100000 00000000 00000000
60 00 00 -> 01100000 00000000 00000000
60 00 00 -> 01100000 00000000 00000000
60 00 00 -> 01100000 00000000 00000000
40 00 00 -> 01000000 00000000 00000000
C0 00 00 -> 11000000 00000000 00000000
C0 00 00 -> 11000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
07 ..
...
06
00 00 00 -> 00000000 00000000 00000000
18 00 00 -> 00011000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
78 00 00 -> 01111000 00000000 00000000
7С 00 00 -> 01111100 00000000 00000000
0С 00 00 -> 00001100 00000000 00000000
7С 00 00 -> 01111100 00000000 00000000
СС 00 00 -> 11001100 00000000 00000000
СС 00 00 -> 11001100 00000000 00000000
FC 00 00 -> 11111100 00000000 00000000
7C 00 00 -> 01111100 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
06
00 00 00 -> 00000000 00000000 00000000
30 00 00 -> 00110000 00000000 00000000
48 00 00 -> 01001000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
78 00 00 -> 01111000 00000000 00000000
7C 00 00 -> 01111100 00000000 00000000
0C 00 00 -> 00001100 00000000 00000000
7C 00 00 -> 01111100 00000000 00000000
CC 00 00 -> 11001100 00000000 00000000
CC 00 00 -> 11001100 00000000 00000000
FC 00 00 -> 11111100 00000000 00000000
7C 00 00 -> 01111100 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
00 00 00 -> 00000000 00000000 00000000
06 ..
Практичекое применение в приложенном файле шрифта. В нем я заменил арабские цифры на изображения китайских чисел от 0 до 9.
Важно, файл шрифта изменен для английской локализации, русский текст будет отображаться некорректно.
Garett (c)
Perfect: предыстория (http://forum.noxworld.ru/kartostroenie-skripting-modding/shrifty-v-nokse/).
Пока так. Может кто-то что-то предложит по визуализации или функционалу.
(http://saveimg.ru/pictures/20-11-12/f29343ea9fffa7f46c9930b53810c2bb.jpg)
Кроме редактирования добавил функции импорта/экспорта символа. Единственное условие - размер символов должен совпадать.
Вообщем, coming soon...
Проект был приостановлен, но вновь ожил. Скрин текущей версии моего редактора шрифтов прилагаю.
(http://noxmapsz.do.am/evyl_Images/NFEscr.png)