Показать сообщение отдельно
Старый 07.11.2011, 12:23   #2498
Dimus

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: М: Скриптинг в Готике

2Ultroman:
Вы что-нибудь знаете о языке Daedalus? Потому что все скрипты G1 и G2 написаны на нём. Названия GMDK, G2MDK, Spacer, Gothic Sourcer вам что-нибудь говорят? Если ответ будет положительным, тогда можно перейти к деталям.

Чтобы в процессе игры NPC выполнял набор действий, нужно прописать ему ежедневное расписание деятельности (daily routine), которое находится в скриптах Story\NPC\*.d. В качестве примера возьмём простейший скрипт идола Кадара из Болотного лагеря (Story\NPC\GUR_1208_BaalCadar.d):
Cпойлер(щелкните, чтобы прочесть):
instance GUR_1208_BaalCadar(Npc_Default)
{
* * *name[0] = "Идол Кадар";
* * *npcType = npctype_main;
* * *guild = GIL_GUR;
* * *level = 28;
* * *voice = 2;
* * *id = 1208;
* * *attribute[ATR_STRENGTH] = 70;
* * *attribute[ATR_DEXTERITY] = 55;
* * *attribute[ATR_MANA_MAX] = 50;
* * *attribute[ATR_MANA] = 50;
* * *attribute[ATR_HITPOINTS_MAX] = 376;
* * *attribute[ATR_HITPOINTS] = 376;
* * *Mdl_SetVisual(self,"HUMANS.MDS");
* * *Mdl_ApplyOverlayMds(self,"Humans_Mage.mds");
* * *Mdl_SetVisualBody(self,"hum_body_Naked0",1,1,"Hum _Head_Psionic",20,1,gur_armor_m);
* * *B_Scale(self);
* * *Mdl_SetModelFatness(self,-1);
* * *Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);
* * *CreateInvItem(self,ItArRuneWindfist);
* * *B_Give_BaalCadarChapter1Runes();
* * *fight_tactic = FAI_HUMAN_MAGE;
* * *daily_routine = Rtn_start_1208;
};


func void Rtn_start_1208()
{
* * *TA_Sleep(2,0,8,0,"PSI_23_HUT_IN");
* * *TA_Teaching(8,0,2,0,"PSI_TEACH_CADAR");
};

У него прописано ежедневное расписание
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_start_1208(): с 2:00 до 8:00 он спит в своей хижине (waypoint PSI_23_HUT_IN), а с 8:00 до 2:00 обучает послушников магии Спящего под тренировочной площадкой для храмовников (waypoint PSI_TEACH_CADAR)
. Например, пусть ночью он не спит, а тренируется в использовании магии на том же месте, что и днём - тогда заменяем ему функцию сна на другую:
Cпойлер(щелкните, чтобы прочесть):
TA_PracticeMagic(2,0,8,0,"PSI_TEACH_CADAR");
, компилируем скрипты, делаем резервную копию файлов _work\Data\Scripts\_compiled\GOTHIC.DAT и _work\Data\Scripts\Content\Cutscene\OU.BIN, затем заменяем эти файлы полученными после компиляции. Запускаем игру, через консоль устанавливаем время на 2 часа ночи (set time 2) и переходим к нему командой goto waypoint PSI_TEACH_CADAR.
Список задействованных в игре действий NPC задан в скрипте Story\ZS\Ta.d (G1) или AI\Human\TA.d (G2).

Учтите, что у некоторых NPC расписание жизнедеятельности в процессе игры может изменяться с помощью функции B_StartOtherRoutine(инстанция NPC, "новое расписание"). В качестве примера рассмотрим расписание Секоба (Story\NPC\BAU_930_Sekob.d):
Cпойлер(щелкните, чтобы прочесть):
instance BAU_930_Sekob(Npc_Default)
{
* * *name[0] = "Секоб";
* * *guild = GIL_OUT;
* * *id = 930;
* * *voice = 1;
* * *flags = NPC_FLAG_IMMORTAL;
* * *npcType = npctype_main;
* * *aivar[AIV_ToughGuy] = TRUE;
* * *B_SetAttributesToChapter(self,1);
* * *fight_tactic = FAI_HUMAN_COWARD;
* * *EquipItem(self,ItMw_1h_Bau_Mace);
* * *B_CreateAmbientInv(self);
* * *B_SetNpcVisual(self,MALE,"Hum_Head_Fatbald",Face_ P_OldMan_Gravo,BodyTex_P,ITAR_Vlk_H);
* * *Mdl_SetModelFatness(self,0);
* * *Mdl_ApplyOverlayMds(self,"Humans_Arrogance.mds");
* * *B_GiveNpcTalents(self);
* * *B_SetFightSkills(self,20);
* * *daily_routine = Rtn_Start_930;
};


func void Rtn_Start_930()
{
* * *TA_Sit_Throne(8,0,22,0,"NW_FARM4_SEKOB");
* * *TA_Sleep(22,0,8,0,"NW_FARM4_IN_BED");
};

func void Rtn_FleeDMT_930()
{
* * *TA_Stand_WP(8,0,22,0,"NW_BIGFARM_FARM4_PATH_01");
* * *TA_Stand_WP(22,0,8,0,"NW_BIGFARM_FARM4_PATH_01");
};

func void Rtn_Obsessed_930()
{
* * *TA_Stand_Guarding(8,0,22,0,"NW_FARM4_02");
* * *TA_Stand_Guarding(22,0,8,0,"NW_FARM4_02");
};

Его начальное расписание описано
Cпойлер(щелкните, чтобы прочесть):
в функции Rtn_Start_930(): с 8:00 до 22:00 сидит в кресле (NW_FARM4_SEKOB), а с 22:00 до 8:00 спит на кровати (NW_FARM4_IN_BED). Затем в 3-й главе, когда ищущие выгоняют его семью из дома, Секоб круглые сутки стоит на улице (функция Rtn_FleeDMT_930()) до тех пор, пока ГГ не уничтожит ищущих. А когда Секоб становится одержимым, тогда от него сбегают жена и сын, а сам он круглые сутки стоит на waypoint NW_FARM4_02 (функция Rtn_Obsessed_930()).


Внимание: Новое расписание должно ссылаться на функцию вида Rtn_Routine_xxx, но без префиксов "Rtn" и "xxx"! Т.е. Секоб в 3-й главе покидает свой дом по команде B_StartOtherRoutine(Sekob,"FleeDMT");, прописанной в скрипте Story\B_Story\B_Enter_NewWorld.d.
Ответить с цитированием