У кого-нибудь остался генератор шрифтов от Нила?
Вообще-то такие вещи надо на иддкд держать на постоянной основе.
Я нашел только исходники на гите.
Датируются 2014-м годом. (25.08.2014) У кого есть Визуал Студио (для C++), тот сможет скомпилировать.
https://github.com/Dethernal/NilDoomFontGen (кнопочка Code -> Download ZIP)
У меня на кампуктере только VS C#, скомпилировать не могу.
VVL Благодарю, это та самая версия, которую я использовал для создания шрифтов. Непонятно только, где там в шрифте указано, что он в кодировке ANSI или уникоде, т.к. для русского надо выбрать Russian_Charset в опции кодовой страницы. А в какой она кодировке хз.
Может, потому что я не знаю, как и чем готовить language.csv?
если проблема в этом, то легко решается, рассказываю механизм (сам так делаю сейчас):
1) создаешь файл LANGUAGE в своем моде
2) пишешь туда следующее:
Скрытый текст:
default,Identifier,ru
english test text ,STRING_NAME,русский тестовый текст
важно: этот файл надо писать в юникоде
3) если надо заюзать эту строку в декорейте (в зскрипте, если не ошибаюсь, логика та же, но пока не пробовал), то юзается она так:
Скрытый текст:
Tag "$STRING_NAME"
или так
Скрытый текст:
TNT1 A 0 A_Log("$STRING_NAME")
т.е. ставишь символ доллара в начало строки, при условии, что строку все равно в кавычки берешь (доллар ставится после первой кавычки)
4) если надо заюзать эту строку в ACS, то делаешь вот так:
Скрытый текст:
printbold(l:"STRING_NAME");
в ACS не нужно символ доллара ставить, но нужно вместо s: писать l: , иначе вместо текста напишется имя переменной
5) Небольшой лайфхак на случай, если сами тексты в файл LANGUAGE тебе удобнее набирать в ANSI режиме:
Скрытый текст:
1) рядом с файлом LANGUAGE создаешь файл LANG_ANSI
2) качаешь прогу iconv.exe
3) рядом с фалом LANGUAGE создаешь батник UTF8_LANGUAGE.BAT с текстом:
"путь\iconv.exe" -f CP1251 -t UTF-8 LANG_ANSI>LANGUAGE
4) каждый раз, когда хочешь добавлять новые строки (или редактировать старые), редактируешь файл LANG_ANSI, сохраняешь его и запускаешь батник (он тебе сделает из LANG_ANSI юникодный файл LANGUAGE )
При такой схеме, какой язык юзер выберет в интерфейсе гздума, на таком и будут отображаться эти строки
theleo_ua Благодарю за подробную инструкцию, думаю, не только мне она пригодится здесь
Но остались еще вопросы:
1) Собственно сам шрифт все равно нужно делать отдельно - либо .fon2, либо как-то иначе. Т.к. высота букв, начертание и т.п. зависит от шрифта.
Соответственно в скрипте SetFont("Имя_шрифта"); все равно нужно.
2) В скриптах я вывожу тексты через HudMessage или HudMessageBold. Там тот же синтаксис? (вместо s: указываем l: и далее в кавычках имя строки
3) Что делать, если текст занимает несколько строк, и при этом технически он помечен как одна строка (номер строки в hudMessage)? Как тогда текст в language разбивать? тоже на строки со знаком переноса /n ?
4) Tag "$STRING_NAME" к какому месту декорэйта относится? Например, мне надо написать строку hitobituary или строку при подбирании вещи.
Собственно сам шрифт все равно нужно делать отдельно - либо .fon2, либо как-то иначе.
Посмотри как это реализовано в актуальной версии gzdoom в файлах gzdoom.pk3 и game_support.pk3
Начни с game_support.pk3, папка filter\doom.id\fonts (открывать слейдом, так как шрифты там в lmp)
По такой же аналогии сделай свои шрифты (если я не ошибаюсь, логика там такая, что каждый символ юникода сохраняется отдельным файлом картинкой с именем XXXX.lmp, где XXXX - число в 16ричной системе, соответствующее позиции данного символа в юникодной таблице (например в ANSI это было бы число от 0 до 255 или от 00 до FF в 16ричной) )
Соответственно в скрипте SetFont("Имя_шрифта"); все равно нужно.
Да, если в скрипте тебе надо не шрифт по умолчанию, а переключать его сетфонтом, то юзается сетфонт и он должен работать. Достоинство моего метода в том, что все англ и рус строки:
1) записаны в одном файле
2) переключаются с англ на рус (и обратно) самим гздумом, ты об этом не паришься
3) записаны в юникоде и ты не паришься с нюансами кодировок, так как всегда юзаешь юникод и он всегда работает
3) Что делать, если текст занимает несколько строк, и при этом технически он помечен как одна строка (номер строки в hudMessage)? Как тогда текст в language разбивать? тоже на строки со знаком переноса /n ?
/n должно сработать
в language.csv будет выглядеть примерно так:
english test 1 /n english test 2,OB_MULTISTRINGTEST,русский тест 1 /n русский тест 2
theleo_ua Благодарю, попробую.
Плюс твоего метода вижу в том, что не надо прописывать переменную языка и менять ее каждый раз в скриптах. А также легкость в создании рус-англ. сообщений для декорэйта.
Небольшой минус - нужно точно знать, сколько текста помещается на 1 строку и где ставить перенос. Когда текст пишется в скрипте карты, то легко поправить и протестить, не выходя из дум билдера. Когда во внешнем файле csv - надо выйти из карты, поменять текст в ксв, пересоздать pk3-архив, запустить карту.
У меня большинство текстов большие, занимают по 7-12 строк, так что их подгонка точно потребует немало времени.
Добавлено спустя 25 минут 44 секунды:
Попробовал на декорэйте.
Создал эксель файл, в нем записал (подряд, без учета ячеек эксель)
default,Identifier,ru
Тестируется английский текст,STRING_TEXT1,Тестируется русский текст
Сохранил файл как CSV UTF-8 (разделитель запятая)
В описание актора в декорэйте записал следующее:
inventory.pickupmessage "$STRING_TEXT1"
Результат: при подборе актора пишется STRING_TEXT1 вместо соответствующей англ. или русской фразы.
Что я сделал не так?
Небольшой минус - нужно точно знать, сколько текста помещается на 1 строку и где ставить перенос.
ты про то, что раньше в редакторе у тебя было несколько строк, а теперь одна, и ее неудобно читать (т.е. ты в редакторе не видишь, как она отображается у игрока на экране), и чтобы увидеть, что верхняя строка намного длиннее нижней, надо запустить карту на тестинг?
Да, вот пример
https://dropmefiles.com/yM7Zn Запусти мап01 дум2, в консоли summon PCrystalVial, пусть зомби в начале выстрелят в игрока, потом подбери флян - будет некорректная надпись.
На этот раз я сперва создал файл language в блокноте, потом сохранил как csv, но при открытии эксель вместо русских букв показал кракозябры. Потому пересохранил еще раз из экселя в формат CSV UTF-8 (русскую фразу пришлось переписать).
Может, что то с форматами файла не то?
раньше в редакторе у тебя было несколько строк, а теперь одна, и ее неудобно читать (т.е. ты в редакторе не видишь, как она отображается у игрока на экране), и чтобы увидеть, что верхняя строка намного длиннее нижней, надо запустить карту на тестинг?
Именно. Т.к. я по нескольку раз редактирую тексты, добиваясь лучшей стилистики и выразительности, а при замене слов или целых фраз надо править и отступы по строкам. В редакторе это все удобно делать. Понимаю, что csv-формат удобнее для переводчиков, которым не надо вычленять тексты из скриптов, но и после перевода текст все равно придется подгонять по длине строк, а значит, опять прогонять в игре по нескольку раз.
Вот для декорэйта language - штука безусловно удобная, т.к. там тексты короткие, используется стандартный консольный шрифт и достаточно записать лишь русс. и англ. фразы.
Прошу прощения, что влезаю в ваш разговор (причём ещё и не совсем по теме), но отступы можно расставлять и автоматически, например, с помощью "относительно недавно" появившейся функции SetHudWrapWidth, а в этом вашем ZScript есть и более мощный метод Font.BreakLines. Такие средства способны сильно уменьшить временные затраты на подобные вопросы.
Да, вот пример
https://dropmefiles.com/yM7Zn Запусти мап01 дум2, в консоли summon PCrystalVial, пусть зомби в начале выстрелят в игрока, потом подбери флян - будет некорректная надпись.
На этот раз я сперва создал файл language в блокноте, потом сохранил как csv, но при открытии эксель вместо русских букв показал кракозябры. Потому пересохранил еще раз из экселя в формат CSV UTF-8 (русскую фразу пришлось переписать).
Может, что то с форматами файла не то?
2) Если ты проделал пункт 1 (т.е. вместо создания своего, редактируешь мой), но все равно какая-то лабуда получилась - значит скорее всего тот софт, которым ты редактируешь, что-то делает не так. Решение простое: я тебе в пак (по ссылке выше) кинул еще и следующие файлы:
Скрытый текст:
_ANSI_TO_UTF8
UTF8_LANGUAGE.BAT
LANG_ANSI
LANGUAGE
Соответственно, для гарантированного 100%-ного результата, ты можешь открыть файл LANG_ANSI любым ANSI редактором (хоть фаром, хоть блокнотом, кодировку в нем юзай 1251), и пиши в нем весь текст в ANSI кодировке. Потом сохраняй этот файл и запускай UTF8_LANGUAGE.BAT, который создаст тебе файл LANGUAGE в корректной юникодной кодировке, которая работает
Но - как я понимаю, предыдущий абзац (тобишь пункт 2) не обязателен, т.е. это крайний вариант на случай, если твой софт не сможет сразу редактировать юникодный LANGUAGE как надо. Я юзаю пункт 2 только по причине, что мне так удобно (мне удобнее в ANSI редактировать)
Прошу прощения, что влезаю в ваш разговор (причём ещё и не совсем по теме), но отступы можно расставлять и автоматически, например, с помощью "относительно недавно" появившейся функции SetHudWrapWidth, а в этом вашем ZScript есть и более мощный метод Font.BreakLines. Такие средства способны сильно уменьшить временные затраты на подобные вопросы.
на самом деле сообщение полезное, но я не совсем понял, как это поможет в том случае, который описал shadowman. Как я понимаю, его проблема не в отступах, а в количестве текста. Например, текст выглядит вот так:
и чтобы заметить эту проблему, раньше ему достаточно было в текстовом редкторе увидеть что текст выглядит криво, а теперь ему придется запускать гздум, соответственно после каждой правки заново гздум запускать
Возможно, я неправильно выразил свою мысль, но Shadowman употребил слово "отступы".
Если "как понравится" — это просто фиксированная ширина, например, чтобы текст по горизонтали не вылезал с книжного листа или какой-нибудь области для сообщений, то эти методы — как раз то, что нужно. Например, для этих целей они используются в ещё разрабатываемой третьей части Blade of Agony (не могу сказать про первые две — просто не помню), и весьма успешно, на мой взгляд.
Спасибо!
А все же интересно - какой же прогой ты создаешь LANGUAGe, что он корректно работает? Раз эксель и блокнот не дают 100% гарантии.
Кстати, в архиве language не распознается по типу файла - потому я могу его открыть и редактировать, только если открыть весь пк3 слэйдом, что не очень удобно. В BOA, как показывал N00b2015, использовался обычный эксель файл.
Делит текст на строки так, чтобы длина каждой из строк, записанной выбранным шрифтом, не превышала заданную.
А как он будет делить слова фразы, если длина строки превысит заданную? Механически разделит слово и перенесет оставшуюся часть на следующую строку, не считаясь с правилами переноса?
В таком случае все равно надо вручную прогонять тексты в игре, чтобы понять, правильно ли перенесены слова или нет.
Если шрифт не моноширинный, то длина строки не равна количеству символов в строке, т.к. одни символы занимают больше места (типа букв Щ, Щ), а другие - меньше (i, точки и запятые). Это вечная проблема при определении переносов в гздум-текстах, потому каждый раз она решается на глазок, ориентируясь на примерную длину "стандартной" для данной области строки.