|
Re: Уроки скриптологии
* *18. Функция инициализации новой главы.
Файл B_Kapitelwechsel.d
// ************************************************** ************** // Функция инициализации новой главы // ************************************************** ************** // Аргументы: neues_Kapitel - новая глава, aktuelles_Level_Zen - индекс области игрового мира
func void B_Kapitelwechsel(var int neues_Kapitel,var int aktuelles_Level_Zen) { * *// текущая глава = новой главе * *Kapitel = neues_Kapitel; * *// если глава 1 * *if(neues_Kapitel == 1) * *{ * * * *// вывод заставки * * * *IntroduceChapter(KapWechsel_1,KapWechsel_1_Text," chapter1.tga"," chapter_01.wav",6000); * *} * *// если глава 2 * *else if(neues_Kapitel == 2) * *{ * * * *// сброс флагов Секоба и Бенгара * * * *Sekob.flags = 0; * * * *Bengar.flags = 0; * * * *// вывод заставки * * * *IntroduceChapter(KapWechsel_2,KapWechsel_2_Text," chapter2.tga"," chapter_01.wav",6000); * *} * *// если глава 3 (пусто, можно удалить) * *else if(neues_Kapitel == 3) * *{ * * *} * *// если глава 4 * *else if(neues_Kapitel == 4) * *{ * * * *// ГГ умеет заряжать Глаз Инноса (можно удалить, должен обучить Пирокар) * * * *PLAYER_TALENT_ALCHEMY[CHARGE_Innoseye] = TRUE; * *} * *// если глава 5 * *else if(neues_Kapitel == 5) * *{ * * * *// ГГ умеет заряжать Глаз Инноса (можно удалить, должен обучить Пирокар) * * * *PLAYER_TALENT_ALCHEMY[CHARGE_Innoseye] = TRUE; * *} * *// если глава 6 * *else if(neues_Kapitel == 6) * *{ * * * *// ГГ умеет заряжать Глаз Инноса (можно удалить, должен обучить Пирокар) * * * *PLAYER_TALENT_ALCHEMY[CHARGE_Innoseye] *= TRUE; * *}; * *// закрыть в дневнике завершенные квесты * *B_CheckLog(); * *// если Миненталь * *if(aktuelles_Level_Zen == OLDWORLD_ZEN) * *{ * * * *// вход в Миненталь * * * *B_ENTER_OLDWORLD(); * *}; * *// если Новый мир * *if(aktuelles_Level_Zen == NEWWORLD_ZEN) * *{ * * * *// вход в Новый мир * * * *B_ENTER_NEWWORLD(); * *}; * *// в зависимости от главы задать экспу по умолчанию * *if(Kapitel == 1) { XP_Ambient = XP_AmbientKap1; }; *// 50 * *if(Kapitel == 2) { XP_Ambient = XP_AmbientKap2; }; *// 100 * *if(Kapitel == 3) { XP_Ambient = XP_AmbientKap3; }; *// 150 * *if(Kapitel == 4) { XP_Ambient = XP_AmbientKap4; }; *// 200 * *if(Kapitel == 5) { XP_Ambient = XP_AmbientKap5; }; *// 250 * *if(Kapitel == 6) { XP_Ambient = XP_AmbientKap6; }; *// 300 };
* *19. Убить НПС.
Файл B_KillNPC.d
// ************************************************** ************** // Убить НПС // ************************************************** ************** // Аргументы: npcInstance - ссылка на НПС
// Внимание: аргумент npcInstance является переопределенным типом (C_NPC -> int)
func void B_KillNpc(var int npcInstance) { * *var C_NPC npc; * *// получить НПС * *npc = Hlp_GetNpc(npcInstance); * *// если НПС существует и жив * *if(Hlp_IsValidNpc(npc) && !Npc_IsDead(npc)) * *{ * * * *// сброс флагов * * * *npc.flags = 0; * * * *// создать в инвентаре Старинную монету * * * *CreateInvItem(npc,ItMi_OldCoin); * * * *// фактическая смерть * * * *Npc_ChangeAttribute(npc,ATR_HITPOINTS,-npc.attribute[ATR_HITPOINTS_MAX]); * *}; };
* *20. Создать в дневнике новую тему.
Файл B_LogEntry.d
// ************************************************** ************** // Создать в дневнике новую тему // ************************************************** ************** // Аргументы: topic - тема, entry - первая запись темы
func void B_LogEntry(var string topic,var string entry) { * *// добавить тему в дневник * *Log_AddEntry(topic,entry); * *// вывод текста: "Ваш дневник дополнен" * *PrintScreen(PRINT_NewLogEntry,-1,YPOS_LOGENTRY,FONT_ScreenSmall,2); * *// музычка * *Snd_Play("LogEntry"); };
* *21. ГГ находит тайник Агона.
Файл B_MageCaveTrigger.d
// ************************************************** ************** // ГГ находит тайник Агона // Примечание: Триггерная функция - задана Спейсером // ************************************************** **************
func void B_MAGECAVETRIGGER() * { * *// если Магический голем жив и выполняется квест "Испытание огня" * *if((Npc_IsDead(MagicGolem) == FALSE) && (MIS_SCHNITZELJAGD == LOG_RUNNING)) * *{ * * * *// если Агон существует и жив * * * *if(Hlp_IsValidNpc(AGON) && !Npc_IsDead(AGON)) * * * *{ * * * * * *// телепортация Агона к тайнику * * * * * *AI_Teleport(AGON,"NW_TROLLAREA_PATH_02"); * * * * * *// задать новый распорядок дня Агона * * * * * *Npc_ExchangeRoutine(Agon,"GOLEMLIVES"); * * * * * *// начать его выполнять * * * * * *AI_ContinueRoutine(AGON); * * * *}; * *}; };
* *22. Подготовка НПС для перехода из одной области мира в другую.
Файл B_NPC_IsAliveCheck.d
// если НПС готов к переходу, то в соответствующую переменную записывается TRUE var int SLD_Bullco_is_alive; * *// Буллко var int SLD_Rod_is_alive; * * * // Род var int SLD_Cipher_is_alive; * *// Сайфер var int SLD_Gorn_is_alive; * * *// Горн var int SLD_Sylvio_is_alive; * *// Сильвио var int GornDJG_is_alive; * * * // Горн var int DJG_Angar_is_alive; * * // Ангар var int DiegoOW_is_alive; * * * // Диего (не используется) var int GornOw_is_alive; * * * *// Горн *(не используется) var int Vino_isAlive_Kap3; * * *// Вино var int Malak_isAlive_Kap3; * * // Малак
// ************************************************** ************** // Подготовка НПС для перехода из одной области мира в другую // ************************************************** ************** // Аргументы: Zen - область мира
func void B_NPC_IsAliveCheck(var int Zen) { * *// новый мир * *if(Zen == NEWWORLD_ZEN) * *{ * * * *// если все квесты ГГ для перехода в главу 4 выполнены * * * *if(MIS_ReadyforChapter4 == TRUE) * * * *{ * * * * * *// подготовка к переходу Охотников на драконов в Миненталь * * * * * *var C_NPC SLD_Bullco_OWCheck; * * * * * *// получить ссылку на Буллко * * * * * *SLD_Bullco_OWCheck *= Hlp_GetNpc(SLD_807_Bullco); * * * * * *// если Буллко мертв * * * * * *if(Npc_IsDead(SLD_Bullco_OWCheck)) * * * * * *{ * * * * * * * *// сбросить флаг * * * * * * * *SLD_Bullco_is_alive = FALSE; * * * * * *} * * * * * *else // жив * * * * * *{ * * * * * * * *// установить флаг * * * * * * * *SLD_Bullco_is_alive = TRUE; * * * * * * * *// удалить Буллко * * * * * * * *B_RemoveNpc(SLD_Bullco_OWCheck); * * * * * *}; * * * * * * *// Род * * * * * *var C_NPC SLD_Rod_OWCheck; * * * * * *SLD_Rod_OWCheck = Hlp_GetNpc(SLD_804_Rod); * * * * * *if(Npc_IsDead(SLD_Rod_OWCheck)) * * * * * *{ * * * * * * * *SLD_Rod_is_alive = FALSE; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *SLD_Rod_is_alive = TRUE; * * * * * * * *B_RemoveNpc(SLD_Rod_OWCheck); * * * * * *}; * * * * * * *var C_NPC Sld_821; * * * * * *// товарищ, с которым болтает Род на ферме Секоба * * * * * *Sld_821 = Hlp_GetNpc(Sld_821_Soeldner); * * * * * *// сменить распорядок дня из отсутствия Рода * * * * * *Npc_ExchangeRoutine(Sld_821,"RODWEG"); * * * * * *// Сайфер * * * * * * *var C_NPC SLD_Cipher_OWCheck; * * * * * *SLD_Cipher_OWCheck = Hlp_GetNpc(SLD_803_Cipher); * * * * * *if(Npc_IsDead(SLD_Cipher_OWCheck)) * * * * * *{ * * * * * * * *SLD_Cipher_is_alive = FALSE; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *SLD_Cipher_is_alive = TRUE; * * * * * * * *B_RemoveNpc(SLD_Cipher_OWCheck); * * * * * *}; * * * * * *// Горн * * * * * *var C_NPC SLD_Gorn_OWCheck; * * * * * *SLD_Gorn_OWCheck = Hlp_GetNpc(PC_Fighter_NW_vor_DJG); * * * * * *if(Npc_IsDead(SLD_Gorn_OWCheck)) * * * * * *{ * * * * * * * *SLD_Gorn_is_alive = FALSE; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *SLD_Gorn_is_alive = TRUE; * * * * * * * *B_RemoveNpc(SLD_Gorn_OWCheck); * * * * * *}; * * * * * * *// Сильвио * * * * * *var C_NPC SLD_Sylvio_OWCheck; * * * * * *SLD_Sylvio_OWCheck = Hlp_GetNpc(SLD_806_Sylvio); * * * * * *if(Npc_IsDead(SLD_Sylvio_OWCheck)) * * * * * *{ * * * * * * * *SLD_Sylvio_is_alive = FALSE; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *SLD_Sylvio_is_alive = TRUE; * * * * * * * *B_RemoveNpc(SLD_Sylvio_OWCheck); * * * * * *}; * * * * *}; * *}; * *// Миненталь * *if(Zen == OLDWORLD_ZEN ) * *{ * * * *// если глава 4 и выше * * * *if(Kapitel >= 4) * * * *{ * * * * * *// подготовка к возвращению Охотников на драконов в Новый мир * * * * * *// Горн * * * * * *var C_NPC GornDJG_NWCheck; * * * * * *GornDJG_NWCheck = Hlp_GetNpc(GornDJG); * * * * * *if(Npc_IsDead(GornDJG)) * * * * * *{ * * * * * * * *GornDJG_is_alive = FALSE; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *GornDJG_is_alive = TRUE; * * * * * * * *B_RemoveNpc(GornDJG_NWCheck); * * * * * *}; * * * * * *// Ангар * * * * * *var C_NPC DJG_Angar_NWCheck; * * * * * *DJG_Angar_NWCheck = Hlp_GetNpc(DJG_Angar); * * * * * *if(Npc_IsDead(DJG_Angar)) * * * * * *{ * * * * * * * *DJG_Angar_is_alive = FALSE;} * * * * * *else * * * * * *{ * * * * * * * *DJG_Angar_is_alive = TRUE; * * * * * * * *B_RemoveNpc(DJG_Angar_NWCheck); * * * * * *}; * * * *}; * *}; };
* *23. Функции изменения аттрибутов НПС.
Файл B_RaiseAttribute.d
// ************************************************** ************** // Функции изменения атрибутов НПС // ************************************************** **************
// Повышение реальных атрибутов НПС // Аргументы: oth - НПС, attribut - атрибут, points - пункты изменения func void B_RaiseRealAttributeLearnCounter(var C_NPC oth,var int attrib,var int points) { * *// сила * *if(attrib == ATR_STRENGTH) * *{ * * * *oth.aivar[REAL_STRENGTH] = oth.aivar[REAL_STRENGTH] + points; * *} * *// ловкость * *else if(attrib == ATR_DEXTERITY) * *{ * * * *oth.aivar[REAL_DEXTERITY] = oth.aivar[REAL_DEXTERITY] + points; * *} * *// макс. мана * *else if(attrib == ATR_MANA_MAX) * *{ * * * *oth.aivar[REAL_MANA_MAX] = oth.aivar[REAL_MANA_MAX] + points; * *}; };
// Повышение атрибутов НПС // Аргументы: oth - НПС, attribut - атрибут, points - пункты изменения func void B_RaiseAttribute(var C_NPC oth,var int attrib,var int points) { * *var string concatText; * *// сила * *if(attrib == ATR_STRENGTH) * * * * * * *{ * * * *// повысить силу * * * *oth.attribute[ATR_STRENGTH] = oth.attribute[ATR_STRENGTH] + points; * * * *// вывод текста: "Сила + " + points * * * *concatText = ConcatStrings(PRINT_LearnSTR,IntToString(points)); * * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2); * *}; * *// ловкость * *if(attrib == ATR_DEXTERITY) * * * * * *{ * * * * *// повысить ловкость * * * *oth.attribute[ATR_DEXTERITY] = oth.attribute[ATR_DEXTERITY] + points; * * * *// если ловкость >= 90 и НПС не владеет акробатикой * * * *if(oth.attribute[ATR_DEXTERITY] >= 90) && (Npc_GetTalentSkill(oth,NPC_TALENT_ACROBAT) == 0) * * * *{ * * * * * *// научить акробатике * * * * * *Npc_SetTalentSkill(oth,NPC_TALENT_ACROBAT,1); * * * * * *// вывод текста: "Акробатика-Бонус!" * * * * * *PrintScreen(PRINT_Addon_AcrobatBonus,-1,55,FONT_Screen,2); * * * *}; * * * *// вывод текста: "Ловкость + " + points * * * *concatText = ConcatStrings(PRINT_LearnDEX,IntToString(points)); * * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2); * *}; * *// макс. мана * *if(attrib == ATR_MANA_MAX) * * * * * * *{ * * * *// повысить макс. ману * * * *oth.attribute[ATR_MANA_MAX] = oth.attribute[ATR_MANA_MAX] + points; * * * *// вывод текста: "Мана + " + points * * * *concatText = ConcatStrings(PRINT_LearnMANA_MAX,IntToString(poin ts)); * * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2); * *}; * *// макс. жизнь * *if(attrib == ATR_HITPOINTS_MAX) * * * * * *{ * * * * *// повысить макс. жизнь * * * *oth.attribute[ATR_HITPOINTS_MAX] = oth.attribute[ATR_HITPOINTS_MAX] + points; * * * *// вывод текста: "Жизнь + " + points * * * *concatText = ConcatStrings(PRINT_Learnhitpoints_MAX,IntToString (points)); * * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2); * *}; * *// повысить реальный атрибут * *B_RaiseRealAttributeLearnCounter(oth,attrib,point s); };
* *24. Функции изменения боевых навыков НПС.
Файл B_RaiseFightTalent.d
// ************************************************** ************** // Функции изменения боевых навыков НПС // ************************************************** **************
// Повышение реальных боевых навыков НПС // Аргументы: oth - НПС, talent - навык, percent - пункты изменения func void B_RaiseRealFightTalentPercent(var C_NPC oth,var int talent,var int percent) { * *// владение одноручником * *if(talent == NPC_TALENT_1H) * *{ * * * *oth.aivar[REAL_TALENT_1H] = oth.aivar[REAL_TALENT_1H] + percent; * *} * *// владение двуручником * *else if(talent == NPC_TALENT_2H) * *{ * * * *oth.aivar[REAL_TALENT_2H] = oth.aivar[REAL_TALENT_2H] + percent; * *} * *// владение луком * *else if(talent == NPC_TALENT_BOW) * *{ * * * *oth.aivar[REAL_TALENT_BOW] = oth.aivar[REAL_TALENT_BOW] + percent; * *} * *// владение арбалетом * *else if(talent == NPC_TALENT_CROSSBOW) * *{ * * * *oth.aivar[REAL_TALENT_CROSSBOW] = oth.aivar[REAL_TALENT_CROSSBOW] + percent; * *}; };
// Повышение боевых навыков НПС // Аргументы: oth - НПС, talent - навык, percent - пункты изменения func void B_RaiseFightTalent(var C_NPC oth,var int talent,var int percent) { * *// повысить реальный навык * *B_RaiseRealFightTalentPercent(oth,talent,percent) ; * *// задать уровень владения оружием * *B_AddFightSkill(oth,talent,percent); };
* *25. Удалить НПС из игры.
Файл B_RemoveNpc.d
// ************************************************** ************** // Удалить НПС из игры // ************************************************** ************** // Аргументы: npcInstance - ссылка на НПС
// Внимание: аргумент npcInstance является переопределенным типом (C_NPC -> int)
func void B_RemoveNpc(var int npcInstance) { * *var C_NPC npc; * *// получить НПС * *npc = Hlp_GetNpc(npcInstance); * *// если НПС существует и жив * *if(Hlp_IsValidNpc(npc) && !Npc_IsDead(npc)) * *{ * * * * *// сброс флагов * * * *npc.flags = 0; * * * *// телепортировать НПС на кладбище * * * *AI_Teleport(npc,"TOT"); * * * *// задать распорядок дня загробной жизни * * * *B_StartOtherRoutine(npc,"TOT"); * * * *// убить НПС * * * *Npc_ChangeAttribute(npc,ATR_HITPOINTS,-npc.attribute[ATR_HITPOINTS_MAX]); * * * *// и для надежности ещё раз послать на кладбище * * * *AI_Teleport(npc,"TOT"); * *}; };
* *26. Функция изменения распорядка дня НПС.
Файл B_StartOtherRoutine.d
// ************************************************** ************** // Функция изменения распорядка дня НПС // ************************************************** ************** // Аргументы: slf - НПС, newRoutine - сокращенное имя функции нового распорядка дня
// self - глобальная переменная, текущий инициализированный НПС
func void B_StartOtherRoutine(var C_NPC slf,var string newRoutine) { * *// встать * *AI_StandUp(slf); * *// если НПС не self * *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(slf)) * *{ * * * *// если НПС существует и жив * * * *if(Hlp_IsValidNpc(slf) && !Npc_IsDead(slf)) * * * *{ * * * * * *// изменить распорядок дня * * * * * *Npc_ExchangeRoutine(slf,newRoutine); * * * * * *// начать выполнение * * * * * *AI_ContinueRoutine(slf); * * * *}; * * *} * *else // иначе (self) * *{ * * * *// изменить распорядок дня * * * *Npc_ExchangeRoutine(slf,newRoutine); * *}; };
|