Jr13San
Модостроитель
- Регистрация
- 1 Апр 2010
- Сообщения
- 449
- Благодарности
- 266
- Баллы
- 230
Часть 1 - Работа с проектом в Visual Studio.
Итак, для начала определимся с вариантом оформления текста подсказки, полностью не умещающимся на экране. Да, такое может быть на низких разрешениях экрана.
Вариант 1 - Перелистывание текста по одной строке:
Вариант 2 - Перелистывание текста страницами:
Скачать оба варианта в одном архиве: Source code.zipВ обоих случаях текст перелистывается с помощью колёсика мыши, а также других функциональных клавиш (подробнее см. примечание 3). Для малогабаритных подсказок обе системы работают схоже.
2) Выбираем наиболее понравившийся вариант и распаковываем файл в папку с рабочим проектом плагина версии 003, как показано на рисунке:
3) Открываем свой проект в Visual Studio и добавляем в него новый файл, как показано на рисунках:
4) В этом коде используются закрытые элементы класса “zCViewText”.
Для того, чтобы успешно скомпилировать проект, нам необходимо открыть публичный доступ к ним. Здесь либо через поиск (Ctrl+F) находим любое определение данного класса в коде и дальше через “Переход к определению класса” (клавиша F12) входим в нужный заголовочный файл:
Либо можете воспользоваться другим способом.
В окне “Обозреватель решений”, в поисковой строке, пишем “zcviewtext”, затем выбираем найденное определение класса.
Переносим строку “public:” в самое начало класса, как показано на рисунке:
Сохраняем файл "zCView.h" (Ctrl+S) и закрываем, он нам больше не понадобится.
5) Очищаем строку поиска, выставляем конфигурацию решения “Release”, как показано на рисунке:
8) Затем в меню выбираем ПРОЕКТ → Свойства. Прописываем название библиотеки “LoadScreens”, и нажимаем ОК, как показано на рисунке:
9) Компилируем проект с помощью клавиши “F7”. После компиляции, в выходном каталоге находим наш плагин и копируем его в папку “System” или подпапку “System\Plugins” с игрой (выходной каталог обозначен на рисунке):
Для автоматизации процесса компиляции можете ознакомиться с некоторыми настройками проекта в этом уроке, в частности с 10-го по 13-ый пункты:
https://worldofplayers.ru/threads/40207/
https://worldofplayers.ru/threads/40207/
Часть 2 - Работа в скриптах
Переходим к скриптам. Открываем свой рабочий проект и находим в нём место для определения некоторых констант. К примеру, открываем “Constants.d” и вставляем в него следующий код, можно в самый конец скрипта:
Daedalus:
//*********************************************************
// Различные данные для случайных заставок и их подсказок
//*********************************************************
// Шрифт основного текста подсказки
const string Hint1_Font = "Font_GOSTTypeBU_30.tga";
// Шрифт вспомогательного текста подсказки
const string Hint2_Font = "Font_MonotypeCorsiva_26.tga";
// Тексты основных подсказок
const string Hint1_TextArray[8] =
{
/* Loading0 */ "Отправляясь в поход, бери с собой только способную долго храниться провизию.",
/* Loading1 */ "Оказавшись в портовом городе, внимательно следи за своим кошельком и избегай тёмных переулков.",
/* Loading2 */ "Если тебе в лесу встретился одуванчик, отнеси его алхимику.",
/* Loading3 */ "Нечем заняться? Сходи в кузницу...",
/* Loading4 */ "Будте осторожны, некоторые трансформы могут быть опасны для жизни.",
/* Loading5 */ "Жареное мясо вкусней сырого...",
/* Loading6 */ "Пришёл в кузницу? Заточи оружие...",
/* Loading7 */ " Долгие годы правил король Робар народом Миртаны. Год за годом, урожаи были добрыми, а шахты давали медь, железо и руду. Не было в те времена нуждающихся. Священники служили богам, а те даровали им великую силу и были благосклонны к людям. Величайшим среди богов считался Иннос, бог солнца и закона. Его почитали как первого и высшего бога, а священников, поклонявшихся ему, именовали магами круга огня. Священники-служители Аданоса, хранителя равновесия между добром и злом, звались магами круга воды. И не было тех, кто бы служил Бельджару, богу смерти, ибо суть его была абсолютная тьма. Процветающие города стали центрами знаний, где преподавали и изучали магию, астрономию, географию и прочие науки.\n\n Но радость и мир скоро обратились в нужду и взаимное недоверие. Процветание Миртаны вызвало зависть соседних государств, которые захотели отнять сокровища королей и разорить богатые земли королевства. Варант выступил против Миртаны. Огромные армии собрались на холмах пред стенами столицы Варанта, а на горизонте показался невиданный доселе флот. Корабли черного дерева шли под боевыми стягами. Король Робар собрал армию Миртаны, дабы защитить то, что все считали своей родиной.\n\n И была война.\n\n Королевский флот топил суда Варанта один за другим, но и сам он нес чудовищные потери. На суше же армии Миртаны поначалу сопутствовала удача, но вскоре все изменилось… Несмотря на то, что Миртана выиграла многие битвы, тяжелая кавалерия и гобхары Варанта (тяжелая бронированная пехота) продвигались вглубь страны. Война, которая, как полагал Робар, будет короткой, продолжалась уже долгие годы, стычка за стычкой, битва за битвой. И те, кто хотел прославиться на войне, сколотить состояние или просто защитить свою родину, уже давно тлели на полях сражений. Тысячами они шли на войну, десятками тысяч они умирали. Король Робар бился за каждый клочок земли: за каждую деревню и каждое поле. То, что армия Миртаны не могла защитить, предавалось огню…\n\n Война длилась уже 4 года, и не было ей конца. Но стратегические умения генералов Робара и союз магии и силы оружия переломил ход войны. И вот однажды, прекрасным весенним утром, армия Миртаны стоял у врат столицы Варанта. Жители Варанта, увидев, какая армия располагается у их стен, сложили оружие. Врата были открыты, оружие пало наземь, и король Робар со своими славными рыцарями въезжал в город как победитель. Город не был разграблен, жители не были угнаны в рабство, ибо милость короля Робара не знала границ. Однако же владыка Варанта был казнен по приказу короля, а вместо него был назначен регент и регентский совет, которым отныне и надлежало править империей Варанта. Сам же король вернулся на родину. Он выиграл войну, но цена была слишком высокой.\n\n Отцы, сыновья, братья — слишком много людей отдало свои жизни за Миртану. Более того, зима уже приближалась, а продовольствия в стране катастрофически не хватало. По всему королевству начался голод и нужда. В эту зиму, ослабший от многочисленных ран, полученных во время войны, скончался славный король Робар I.\n\n Его сын, Робар II, взошел на трон без коронации. Он призвал к себе своих священников, советников и мудрецов. Вместе они разработали план восстановления былого могущества Миртаны. И хотя ужасная зима была позади, на горизонте показалась угроза, по сравнению с которой война с Варантом была просто увеселительным мероприятием. Оркские орды с севера перешли границу и опустошили и без того бедные поместья. Король вновь отправил свою армию на границу для защиты своих подданных. Бесконечные сражения отняли еще большее количество жизней у искалеченной земли. И это была всего лишь прелюдия к настоящей войне.\n\n Король Робар знал, что орки стали достаточно сильными, чтобы вести войну против Миртаны. Его же войска были измотаны и плохо вооружены, сказывались долгие годы изнурительной войны с Варантом. А потому, чтобы вооружить свою армию, королю срочно требовалось огромное количество руды, непростой руды, а магической руды. Положение в стране было ужасным, хуже дела обстояли только в шахтах и шахтерских городках. Повсюду бродили шайки воров и дезертиров, множество заключенных бежало с каторжных работ в рудниках. Хоринис, один из основных поставщиков руды, был слишком важен для короля, и он не мог не действовать, ибо от руды, добываемой в копях Хориниса, зависела судьба его государства, каторжники добывали там особую руду, магическую руду. Эта руда при правильной переплавке делала клинок меча крепким как кулак тролля и острым как рог мракориса, так что ни один доспех не мог устоять под ударом такого клинка.\n\n Король призвал 12 самых могущественных магов Миртаны: 6 магов круга огня и 6 магов круга воды, чтобы они создали магический барьер вокруг рудников Хориниса, который бы не позволил заключенным бежать, барьер, который бы впускал живые существа вовнутрь и не выпускал никого живого. Вместе эти 12 магов написали могущественное заклинание для сотворения барьера. Когда заклинание было написано, они под руководством мастера Ксардаса с помощью 5 магических юниторов объединили свою магическую силу и произнесли слова этого заклятья. Сквозь развернутые небеса и грохот грома явился барьер, как огромный купол, накрывший огромное пространство.\n\n Но что-то нарушило привычный ход заклинания, и сами маги стали пленниками своего творения. Все рудники Хориниса оказались во власти каторжан, которые убили всех стражников и завладели арсеналом. Маги не присоединились к заключенным, так как боялись их необузданности и оружия; каторжники же вскоре осознали, что без магов им не удастся выбраться из магического плена.\n\n В старом замке собрались все восставшие узники и именно там они избрали себе предводителя, Гомеза. Но радость от победы скоро сменилась тревогой, потому что они осознавали, что без пищи и оружия им не удастся выжить. Каторжники знали, что они зависят от поставок еды, посуды, оружия и одежды из внешнего мира, но с другой стороны, королю была необходима руда. И поэтому стороны заключили взаимовыгодное соглашение: король получал руду, а каторжники получали взамен пищу и разные товары.\n\n Но не все узники были заинтересованы в сотрудничестве с королем. Одним из них был Ли. Он оставил Старый Лагерь, и многие последовали за ним. Они основали Новый Лагерь, неподалеку от другой шахты. Маги Круга Воды присоединились к Ли. Они пытались найти способ, как разрушить барьер. Для своих магических исследований им была нужна руда из Свободной шахты. Маги Круга Огня остались в Старом Лагере у Гомеза. Поставки из внешнего мира давали каторжникам шанс на выживание. Лучших из рудокопов Гомез зачислил в свою личную охрану. Вскоре он правил всеми Западными Полями под Барьером. И хотя все они были заключенными, Гомез отправил часть из них на работы в шахту, а сам продолжал требовать у короля все больше и больше драгоценностей, оружия и продовольствия.\n\n Спустя несколько лет один из рудокопов стал рассказывать всем, что ему являются видения о свободе. Он называл себя Ю'Берион Освященный. Его слова были убедительными и проникновенными, а потому он увлек за собой многих поверивших ему на болота, чтобы основать Болотный Лагерь, магия и заклятья были им неизвестны. И их лагерь процветал. Вся жизнь лагеря строилась на продаже болотника, курение которого вызывало у людей галлюцинации. Они продавали эту траву Старому Лагерю, и вскоре их лагерь невиданно разбогател.\n\n Миртана медленно оправлялась от полученных ран. Пшеница росла на полях, были проложены новые торговые маршруты. И только Барьер напоминал о войне.\n\n А затем пришли орки. Как ураган пронеслись они по земле Миртаны, уничтожая армию за армией и каждого, кто пытался им противостоять. Робар II призвал всех, кто был способен носить оружие, в свою последнюю армию и отправил ее на защиту границ. И каторжники Миртаны платили за это высокую цену, и каждый, кто был повинен в преступлении, неважно сколь серьезным оно было, искупал свою вину в железных рудниках Хориниса. Огонь плавильных печей горел все дни напролет, молоты кузнецов стучали по наковальням изо дня в день.\n\n Обычный каторжник, которого привели к скале на краю долины. Он не знал, что ждет его впереди. Пусть боги будут милосердны к вам…"
};
// Текст вспомогательной подсказки
const string Hint2_Text = "Для продолжения нажмите любую клавишу";
Здесь не сложно разобраться.
При добавлении новой подсказки, необходимо создать новую запись в массиве, не забыв изменить число элементов массива. А также добавить в проект подходящую текстуру с номером индекса на конце названия. Для удобства, названия текстур написаны в комментарии слева от текста подсказок. Подсказок может быть сколько угодно много.
Примечание: Имена скриптовых констант: "Hint1_Font", "Hint2_Font", "Hint1_TextArray", "Hint2_Text" используются в коде обоих плагинов.
На этом всё. Компилируем скрипты, собираем проект, прописываем мод и плагин “LoadScreend.dll” в своём рабочем ini-файле.
Скачать готовую сборку: LoadScreens_Mod.zip
Оба плагина в комплекте, и для удобства скомпилированы под разными именами: “LoadScreens1.dll” и “LoadScreens2.dll”.
Также в комплекте присутствует плагин "MainWindowsFix.dll", позволяющий сворачивать окно (для тестов).
Тестовые скриншоты:
Некоторые скриншоты для теста были взяты из этой темы: https://worldofplayers.ru/threads/35903/
Текст про Робара для теста взят от сюда: http://www.myrtana.ru/gothic/
В дополнении к статье хотелось бы выразить благодарность за содействие в разработке ребятам под никами: hell9999, Дикарь, Rendal.
Некоторые примечания
1) Объём текста в подсказке не должен быть слишком большим, например, в несколько десятков или сотен тысяч символов. Потому что, во-первых, время обработки текста и выделения под него памяти может затянуться на долго, а во-вторых читать это почти никто не станет. То есть всё должно быть в разумных пределах.
А разбивка текста на страницы или включение скролла текста – это лишь защитная мера.
2) Все текстуры и пользовательские данные (в скриптах, и в плагине) можно менять на своё усмотрение.
Вот немного информации об используемых в проекте текстурах:
HINT_BORDERTEX-C.TEX - текстура слоя линий
HINT_BACKTEX-C.TEX – текстура заднего плана подсказки
HINT_BOTTOMARROW-C.TEX – нижняя стрелка скролла
HINT_TOPARROW-C.TEX - верхняя стрелка скролла
Исправленные текстуры переходов:
LOADING_ADDONWORLD-C.TEX
LOADING_DRAGONISLAND-C.TEX
LOADING_NEWWORLD-C.TEX
LOADING_OLDWORLD-C.TEX
LOADING-C.TEX - исправленная текстура загрузки
TXTLOADING-C.TEX – текстура с нарисованным словом "ЗАГРУЗКА"
FONT_GOSTTYPEBU_30-C.TEX – текстура основного шрифта
Font_GOSTTypeBU_30.FNT – границы символов основного шрифта
Font_MonotypeCorsiva_26.FNT – границы символов вспомогательного шрифта
FONT_MONOTYPECORSIVA_26-C.TEX - текстура вспомогательного шрифта
LOADING0-C.TEX – LOADING7-C.TEX - текстуры заставок
Скачать исходные текстуры в формате TGA: Source textures.zip
3) Во время загрузки скролл текста запрещён. После загрузки доступно следующее управление:
Колёсико мыши от себя, стрелка вверх ↑, кнопка Page Up – прокрутка текста или страницы назад.
Колёсико мыши на себя, стрелка вниз ↓, кнопка Page Down – прокрутка текста или страницы вперёд.
Кнопка Home, SHIFT+Колёсико мыши от себя – быстрое перемещение в начало текста.
Кнопка End, SHIFT+Колёсико мыши на себя – быстрое перемещение в конец текста.
Нейтрализованные кнопки во время паузы:
Print Screen, Pause Break, Insert, Delete, Escape, Tab, Left/Right Win, Left/Right Alt, Left/Right Control, Left/Right Shift, Left/Right Arrow, Caps/Num/Scroll Lock, Context menu.
4) Если шрифты для подсказок не указаны или не найдены в скриптах, то используются объявленные в плагине шрифты по умолчанию:
C++:
static const zSTRING MainFont_DefaultName = "FONT_OLD_20_WHITE.TGA";
static const zSTRING SecondaryFont_DefaultName = "FONT_OLD_10_WHITE.TGA";
5) Если вместо шрифта будет указана какая-нибудь неподходящая текстура, то результат может быть примерно таким:
6) Если текст вспомогательной подсказки не указан или не найден в скриптах, то используется текстовая константа плагина:
C++:
static const zSTRING SecondaryText_Default = "Press any key to continue...";
7) Если массив подсказок не найден, то подсказки не выводятся. При этом используется заставка по умолчанию.
8) Коррекция цвета выглядит следующим образом:
C++:
// Коррекция цвета основного текста подсказки (R,G,B,A)
static zCOLOR MainFont_Color = zCOLOR(0, 188, 106, 170);
// Коррекция цвета вспомогательного текста подсказки (R,G,B,A)
static zCOLOR SecondaryFont_Color = zCOLOR(188, 177, 0, 128);
9) Интервалы.
Интервалы над текстом и под текстом вспомогательной подсказки задаются по умолчанию в плагине. Равны по 10 пикселей каждый.
C++:
static const int SecondaryText_TopInterval = 10;
static const int SecondaryText_BottomInterval = 10;
InsideInterval рассчитывается по программе в зависимости от высоты шрифта второстепенной подсказки, а также её надстрочного и подстрочного интервала, о которых говорилось ранее, а также с учётом наибольшей высоты текстуры стрелки.
Во втором варианте, со страницами, ко внутреннему интервалу вместо высоты стрелки добавляется отступ, равный высоте одной строки основного шрифта.
Изменение внешнего интервала (OutsideInterval) приводит к сужению слоя подсказки равномерно по всем сторонам. Например:
C++:
static const int OutsideInterval = 1800;
А на разрешении 1280х1024 результат будет таким:
Этот интервал нужен для небольшого отступа от краёв вьюпорта. Так что будьте внимательны, редактируя это значение.
10) Как работает перенос строки.
Если в тексте основной подсказки встречается индикатор переноса “\n”, то следом идущий текст начинается с новой строки (см. пример на скриншоте про Робара). Если переносов несколько, то текст будет смещаться согласно их числу.
11) Чтобы второстепенная подсказка полностью умещалась на экране, необходимо начать подбирать шрифт на минимальном разрешении экрана, а это 800х600 для Г2а.
12) Если шрифт основной подсказки очень большой и из-за него вырастают такие же большие внутренние интервалы. В результате у основной подсказки не умещается ни одна строка текста.
При использовании второго варианта оформления результат может быть таким:
Но такие шрифты маловероятно кто будет использовать, поэтому эта защита служит лишь напоминанием, что здесь что-то не так.
Тест огромного шрифта на первом варианте оформления:
Как видим, здесь умещается хотя бы одна строка текста основной подсказки.
13) При переходе на другую локацию - подсказки не предусмотрены.
Исправлены текстуры переходов. На них зачищена надпись "ЗАГРУЗКА", чтобы каждый раз не накладывать в редакторе эту надпись вручную, а также чтобы всё было в одном стиле.
14) Для наилучшего качества, размеры заставок должны быть кратны степени двойки (4, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096). Нужно ещё учитывать пропорции изображения, чтобы оно не было сильно растянутым или сжатым. В итоге, средним вариантом, будет использование изображения размером 1760х1140, растянутым в размеры 2048х1024.
15) Что значит “Последний номер в сессии не должен повторяться с первым в новой сессии”?
Например, существует 4 заставки с индексами: 0, 1, 2, 3.
Тогда по очереди случайно выводятся: 0231 2013 2310 2310 3210 1230 1203 1230 2310.
Полная или завершённая сессия – это когда все заставки были показаны. Сессии разделены пробелами.
16) Если будете использовать оригинальные шрифты от Г2а, то в них отсутствуют буквы: "Ё","ё" для русского алфавита. Её необходимо не только дорисовать в текстуре шрифта, но и исправить “fnt” файл с границами этой буквы. Будьте внимательны.
17) При разблокировке паузы исчезает надпись второстепенной подсказки, также если есть стрелки, они становятся неактивными, запрещая пользоваться скроллом текста.
18) Изменение параметра: bEnablePause = false, приведёт к беспрерывной загрузке сохранения.