Новые сообщения · Участники · Поиск · Вход

  • Страница 1 из 1
  • 1
Архив - только для чтения
Создание спутника часть 2 (для продвинутых)(Old version)
Donor (В тени)
Совершенный
ВЕЛИКИЙ МАГИСТР
Сообщений: 1156
Дата: 04.12.2010, 17:20 | Сообщение # 1

Авторы: DA TOOLSET WIKI
Перевод: Kelamor

Создание спутника для продвинутых

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

- автолевел по уникальному шаблону;

- выбор класса и специализации посредством скрипта;

- выбор начального статуса спутника (в активной партии или нет);

- возможность указания стартового и минимального уровней спутника;

- задание очков специализации;

- возможность установки флагов в Plot-файле при найме.

Подготовка ресурсов

Создайте сущность, локацию выбора персов и m2DA-файлы как указано в предыдущем уроке.

Создание Plot-файла
_________________________________________________________________________________________________________
* Plot-файл, файл, в котором с использованием флагов(True/False) хранится информация о текущем состоянии заданий, квестов, отношений и т.п. Я его называю файл-схема - kelamor
_________________________________________________________________________________________________________

Использование файл-схем не обязательно, но очень удобно. В данном случае мы будем сохранять в файл-схеме информацию о том, находится ли наш спутник в активной партии или в лагере. Это позволит сделать диалоги более интерактивными, а также позволит регулировать некоторые аспекты игры, например появление на рынке Денерима конкретного NPC только в случае наличии в активной партии нашего нового спутника.

Создайте файл-схему (Plot) с подходящими флагами. Не надо что-либо вводить в поле текста журнала:

PARTY_MIERA_IN_PARTY - флаг, указывающий находится ли наш спутник в активной партии PARTY_MIERA_JOINED - флаг, указывающий вступил ли спутник в наш отряд

Смотрите FAQ для получения информации об альтернативных способах в случае наличия в партии более трёх потенциальных спутников.

Изменения в скрипт модуля, связанные с применениям файл-схемы

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

Code
#include "utility_h"
#include "wrappers_h"
#include "plt_bc_create_party"   //make sure you include your own plot, not mine
           
void main()
{
         event ev = GetCurrentEvent();
         int nEventType = GetEventType(ev);
         switch(nEventType)
         {
           
             case EVENT_TYPE_MODULE_GETCHARSTAGE:
             {
             // Overlay the existing stage with my stage
             // "my_char_stage" is the resource name of the overlay area
             // "partypicker" is the name of the default GDA
             SetPartyPickerStage("my_char_stage", "partypicker");
             break;
             }
           
             case EVENT_TYPE_PARTYMEMBER_ADDED:
             {
                 object oFollower = GetEventObject(ev, 0);
                 SetLocalInt(oFollower, CREATURE_REWARD_FLAGS, 0);
                 SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE);
           
                 AddCommand(oFollower, CommandJumpToLocation(GetLocation(GetHero())));   //Ensures follower appears at PC's location.
           
                 if (GetTag(oFollower) == "bc_party_miera") {               //You must explicitly test for your follower's tag.
                     WR_SetPlotFlag(PLT_BC_CREATE_PARTY, PARTY_MIERA_IN_PARTY, TRUE);     //Make sure you use your own flags!
                 }
           
                 break;
             }       
           
             case EVENT_TYPE_PARTYMEMBER_DROPPED:                         
             {
                   object oFollower = GetEventObject(ev, 0);      
           
                   if (GetTag(oFollower) == "bc_party_miera") {      
                     WR_SetPlotFlag(PLT_BC_CREATE_PARTY, PARTY_MIERA_IN_PARTY, FALSE);     //As above, but set false.
                   }
           
             }
           
         }
}

С русскими комментами:

Code
#include "utility_h"
#include "wrappers_h"
#include "plt_bc_create_party"   //Убедитесь, что указан ваш файл-схема. Префикс "plt_" обязателен и указывает игре, что это файл схема (Plot-файл)
           
void main()
{
         event ev = GetCurrentEvent();
         int nEventType = GetEventType(ev);
         switch(nEventType)
         {
           
             case EVENT_TYPE_MODULE_GETCHARSTAGE:
             {
             // Применение расширенной локации выбора персов
             // "my_char_stage" имя созданной вами локации выбора персов
             // "partypicker" название дефолтного GDA-файла
             SetPartyPickerStage("my_char_stage", "partypicker");
             break;
             }
           
             case EVENT_TYPE_PARTYMEMBER_ADDED:
             {
                 object oFollower = GetEventObject(ev, 0);
                 SetLocalInt(oFollower, CREATURE_REWARD_FLAGS, 0);
                 SetFollowerState(oFollower, FOLLOWER_STATE_ACTIVE);
           
                 AddCommand(oFollower, CommandJumpToLocation(GetLocation(GetHero())));   //Обеспечивает появление спутника в локации, в которой находится ГГ
           
                 if (GetTag(oFollower) == "bc_party_miera") {               //Проверяет по тэгу, рядом ли новый спутник
                     WR_SetPlotFlag(PLT_BC_CREATE_PARTY, PARTY_MIERA_IN_PARTY, TRUE);     //Если спутник рядом, то устанавливаем флаг. Убедитесь, что вы указали свои значения!
                 }
           
                 break;
             }       
           
             case EVENT_TYPE_PARTYMEMBER_DROPPED:                         
             {
                   object oFollower = GetEventObject(ev, 0);      
           
                   if (GetTag(oFollower) == "bc_party_miera") {      
                     WR_SetPlotFlag(PLT_BC_CREATE_PARTY, PARTY_MIERA_IN_PARTY, FALSE);     //Если не берём спутника в партию, то сбрасываем флаг.
                   }
           
             }
           
         }
}

Создание шаблона автолевела

Вы можете пропустить этот шаг, если вы будете использовать только дефолтные шаблоны разбойника, мага или воина, но я не рекомендую это. Лучше сделайте свой шаблон и подгоните его под свои нужды, так как дефолтные расходуют очки, по правде говоря, коряво.

Идите в папку «Папка установки Dragon Age\tools\Source\2DA». Здесь вы найдёте файлы типа ALCharacter.xls (такие как ALAlistair.xls, ALLeliana.xls, ALRogue_Default.xls и т.д.). Это и есть шаблоны автолевела.

Откройте шаблон наиболее близкого для вашего спутника характера, например Морриган или Винн для мага, Лелиана или Зевран для разбойника и т.д. Сохраните копию этого файла как ALYourcharacter.xls в той директории, где вы ранее проводили компиляцию в GDA-файл. Не забудьте переименовать файл (в моём случае это ALMiera.xls с листом, поименованным также ALMiera).

Вы увидите следующую картинку:

В столбцах B и C перечислены умения/заклинания, доступные для этого персонажа. Не изменяйте их.

В столбцах F и G перечислены таланты, доступные для этого персонажа. Не изменяйте их.

Оставшиеся столбцы мы можем поредактировать:
_______________________________________________________________________________________
* Я так думаю, что всё же изменять столбцы B, C, F, G можно, главное не напартачить - kelamor
_______________________________________________________________________________________

Порядок распределения очков по характеристикам

Столбец J определяет, как примерно при автоповышении уровня будут повышаться характеристики персонажа. Так, если Ловкость (Dexterity) установлена в 1.5, а Интеллект (Intelligence) в 1, то в игре на каждые 2 очка Хитрости (Cunning), вы увидите 3 очка Ловкости (обратите внимание, что «Интеллект» в тулсете, это та же самая «Хитрость» в игре).

Отредактируйте столбец J по вашему разумению. Мы же делаем волшебника, и в данном случае, если у вас включено автоповышение уровня, у вас будет расти только магия:

Georg Zoeller, который из Биоварей, по этому поводу пишет, «Данное значение определяет весомость каждой характеристики. Значение 1.0 повышает характеристику на 1 пункт на уровень, 0.5 – на 1 пункт на два уровня, и т.д.

В базовых шаблонах имеется ещё столбец L, называемый «AttInit.», правда изменение его значений не влияет на спутников, использующих эти шаблоны.

Приоритеты по умениям/заклинаниям

Столбцы D и E, это умения/заклинания, которые приобретает персонаж при повышении уровня, начиная сверху вниз.

Столбцы H и I, это таланты персонажа, которые приобретаются им по тому же принципу что и умения/заклинания.

Изменения вносятся тупо, копипастом, то есть из столбца, где указаны нужные нам умения/заклинания/таланты, которые доступны данному персу, копируем ячейки, содержащие ID и само название умения/заклинания/таланта, и вставляем в столбец назначения. Таким образом мы формируем столбцы D и E, H и I.

Смотрим по нижеприведённым скринам:

Среди доступных заклинаний находим Flame Blast и копируем обе ячейки (B и C).

Теперь в столбцах D и E выбираем ячейки, которые надо заменить и заменяем их.

Таким образом сформируйте список приоритетов по вашему желанию. Приоритетных умения/заклинаний/талантов должно быть не меньше чем у персонажа, шаблон которого вы скопировали, так как в случае, если их не будет хватать, очки опыта будут тупо теряться.

Отнеситесь к этому шагу ответственно, не забывайте о том, если в правом столбце вы пропишете способность специализации, которой не будет у вашего перса, она (способность) всё-равно будет добавлена, что не есть айс.

M2DA-файлы

Игре надо помочь найти ваши шаблоны, а для этого нам надо расширить M2DA_base.gda.

Создайте таблицу MS Excel. Название таблицы и листа на ней сделайте таким - M2DA_base_ваш суффикс.
_______________________________________________________________________
* Я в качестве суффикса всегда выбираю аббревиатуру своего мода - kelamor
_______________________________________________________________________

Создайте столбцы и поля в соответствии со скрином и вашими потребностями:

Этот GDA-файл является расширением 2DA_base. Столбец Worksheet – название созданного нами ранее шаблона.

Не забывайте про то, что ID должен быть уникальным.

PackageIDForAI оставьте равным 0, так как для спутника он бесполезен.

Когда закончите, скомпилируйте описанным ранее способом обе таблицы и поместите появившиеся на выходе файлы GDA в папку «module/override» вашего модуля.

РАБОТА АВТОЛЕВЕЛА ПОСЛЕ ТОГО, КАК СПУТНИК ПРИЗВАН В ПАРТИЮ:

Откройте файл packages.xls. В этом файле есть столбец LevelupTable, посредством которого и происходит связь с шаблоном автолевела после призыва. Например строка Лелианы под номером 81. Столбец LevelupTable в этой строке имеет значение 258. Если теперь проверить файл 2DA_base, то вы увидите, что строка 258 указывает на шаблон Лелианы (ALLeliana) (в принципе можно покопать и packages_base.gda).

Этот GDA-файл является расширением 2DA_base. Столбец Worksheet – название созданного нами ранее шаблона.

Не забывайте про то, что ID должен быть уникальным.

PackageIDForAI оставьте равным 0, так как для спутника он бесполезен.

Когда закончите, скомпилируйте описанным ранее способом обе таблицы и поместите появившиеся на выходе файлы GDA в папку «module/override» вашего модуля.

Новая подключаемая функция системы найма персов

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

Создайте новый скрипт. Я назвал его hireCustomFollower_h.

скрипт hireCustomFollower_h

Да, я конечно понимаю, что это «много букав», но всё же он работает.
_____________________________
* Я проверил - kelamor
_____________________________

При необходимости вы можете подкорректировать этот скрипт под ваши нужды.

Функция GetCustomFollowerALTable()

В приведённом выше скрипте, вам необходимо изменить функцию GetCustomFollowerALTable().

Эта функция определяет ID шаблона автолевела в M2DA_base.

Найдите эту функцию в скрипте и введите ваши данные, точнее данные спутника:

Code
int GetCustomFollowerALTable(object oFollower) {
       int nTable = _GetTableToUseForAL(oFollower);
       
       if (GetTag(oFollower) == "bc_party_miera") {   // Тэг спутника               
           nTable = 50143;   // ID таблицы шаблона в M2DA_base_
       }      
       
       return nTable;       
       
}

Сохраните и экспортируйте. Игнорируйте сообщение об ошибке об отсутствии главной функции (void main()).
_________________________________________________________________________________________________________
* Я эту функцию (void main()) прописываю, компилирую, если всё нормально, то комментирую её и потом экспортирую скрипт - kelamor
_________________________________________________________________________________________________________

Новый скрипт найма перса и завершение второй части

Старый скрипт вызывал функцию UT_HireFollower(), переделаем его:

Code
#include "plt_bc_create_party"   //Make sure you include your party handling plot
#include "hireCustomFollower_h"  // And include the function script - which will in turn include a bunch of stuff
       
void main() {
       
                       //Initialising my objects, not super-relevant to the example    
       
                       object oHero = GetHero();
                       object oMiera = CreateObject(OBJECT_TYPE_CREATURE, R"bc_party_miera.utc", GetLocation(oHero));
                       object oJysavin = CreateObject(OBJECT_TYPE_CREATURE, R"bc_party_jysavin.utc", GetLocation(oHero));
                       object oBraghon = CreateObject(OBJECT_TYPE_CREATURE, R"bc_party_braghon.utc", GetLocation(oHero));
                       object oSpider = CreateObject(OBJECT_TYPE_CREATURE, R"bc_party_geldual.utc", GetLocation(oHero));
       
                       //Simplest hire call - adds to the party as a wizard.  Class is currently compulsory due to a bug.
                       hireCustomFollower(oMiera, CLASS_WIZARD);
       
                       //Add to the party and set joining plot flags
                       hireCustomFollower(oJysavin, CLASS_WARRIOR, PLT_BC_CREATE_PARTY, PARTY_JYSAVIN_JOINED);
       
                       //Add to the party, set plot flags, force a specialisation
                       hireCustomFollower(oBraghon, CLASS_ROGUE, PLT_BC_CREATE_PARTY, PARTY_BRAGHON_JOINED, ABILITY_TALENT_HIDDEN_ASSASSIN);
       
                       //More complex example - Follower added as a unique class (Dog), not granted a specialisation or spec point.     
                       //Note unique classes must have an ALTable passed here or specified in GetCustomFollowerALTable() or they won't work
                       hireCustomFollower(oSpider, CLASS_DOG, PLT_BC_CREATE_PARTY, PARTY_GELDUAL_JOINED, 0, 0, FALSE, FOLLOWER_STATE_AVAILABLE, "", 0, 0, FALSE);
       
                       //Show the party picker to let the player choose from their new companions!
                       SetPartyPickerGUIStatus(2);
                       ShowPartyPickerGUI();                      
}

Пример показывает несколько простых способов вызова hireCustomFollower(). Описание других способов смотрите в начале скрипта hireCustomFollower_h.

Например:

hireCustomFollower(oFollower, CLASS, PLOT, PLOT_FLAG, SPECIALISATION). Так вы наймёте спутника, установите флаг, что он нанят, укажете его специализацию(если она прописана в шаблоне автолевела).

hireCustomFollower(oFollower, CLASS, PLOT, PLOT_FLAG, SPECIALISATION, 0, TRUE). Так вы дополнительно укажете ID шаблона автолевела и укажете, что необходимо вызвать локацию выбора персонажей(party_picker).

Константы специализаций также указаны в начале скрипта hireCustomFollower_h.

Итак, если всё нормально, то в результате наших трудов вы увидите следующее:


Прикрепления: hireCustomFollo.docx (18.5 Kb)





  • Страница 1 из 1
  • 1
Поиск: