|
Re: Уроки скриптологии
* *4. Капитан приглашает команду на корабль перед отплытием на Ирдорат.
Файл B_CaptainCallsAllOnBoard.d
// ************************************************** ************** // Капитан приглашает команду на корабль перед отплытием на Ирдорат // ************************************************** ************** // Аргумент: Captain - капитан
func void B_CaptainCallsAllOnBoard(var C_NPC Captain) { * * *// ГГ отдает капитану "Морскую карту к острову Ирдорат" * *B_GiveInvItems(hero,Captain,ItWr_Seamap_Irdorath, 1); * *// в инвентаре капитана появляется "Ключ от каюты капитана" * *CreateInvItems(Captain,ItKe_Ship_Levelchange_MIS, 1); * *// капитан передает ключ ГГ (other в диалоге) * *B_GiveInvItems(Captain,other,ItKe_Ship_Levelchang e_MIS,1); * *// капитан идет на корабль * *B_StartOtherRoutine(Captain,"AllOnBoard"); * *// если Ли завербован, он идет на корабль * *if(Lee_IsOnBoard == LOG_SUCCESS) * * * *{B_StartOtherRoutine(Lee,"Ship");}; * *// если Мильтон завербован, он идет на корабль * *if(MiltenNW_IsOnBoard == LOG_SUCCESS) * {B_StartOtherRoutine(MiltenNW,"Ship");}; * *// если Лестер завербован, он идет на корабль * *if(Lester_IsOnBoard == LOG_SUCCESS) * * {B_StartOtherRoutine(Lester,"Ship");}; * *// если Горн завербован, он идет на корабль * *if(Gorn_IsOnBoard == LOG_SUCCESS) * * * {B_StartOtherRoutine(GornNW_nach_DJG,"Ship");}; * *// если Марио завербован, он идет на корабль * *if(Mario_IsOnBoard == LOG_SUCCESS) * * *{B_StartOtherRoutine(Mario,"Ship");}; * *// если Вольф завербован, он идет на корабль * *if(Wolf_IsOnBoard == LOG_SUCCESS) * * * {B_StartOtherRoutine(SLD_Wolf,"Ship");}; * *// если Ларес завербован, он идет на корабль * *if(Lares_IsOnBoard == LOG_SUCCESS) * * *{B_StartOtherRoutine(Lares,"Ship");}; * *// если Беннет завербован, он идет на корабль * *if(Bennet_IsOnBoard == LOG_SUCCESS) * * {B_StartOtherRoutine(Bennet,"Ship");}; * *// если Диего завербован, он идет на корабль * *if(Diego_IsOnBoard == LOG_SUCCESS) * * *{B_StartOtherRoutine(DiegoNW,"Ship");}; * *// если Бифф завербован, он идет на корабль * *if(Biff_IsOnBoard == LOG_SUCCESS) * * * {B_StartOtherRoutine(Biff_NW,"Ship");}; * *// если Ватрас завербован, он идет на корабль * *if(Vatras_IsOnBoard == LOG_SUCCESS) * * {B_StartOtherRoutine(Vatras,"Ship");}; * *// если Кор Ангар завербован, он идет на корабль * *if(Angar_IsOnBoard == LOG_SUCCESS) * * *{B_StartOtherRoutine(Angar_NW,"Ship");}; * *// если Гирион завербован, он идет на корабль * *if(Girion_IsOnBoard == LOG_SUCCESS) * * {B_StartOtherRoutine(Girion,"Ship");}; * *// флаг начала 6 главы * *MIS_ReadyforChapter6 = TRUE; };
* *5. Всё ли готово для отплытия на Ирдорат?
Файл B_CaptainConditions.d
// ************************************************** ************** // Всё ли готово для отплытия на Ирдорат? // ************************************************** ************** // Аргумент: Captain - капитан // ---------------------------------------------------------------- // Возвращаемое значение: TRUE - да, FALSE - нет
func int B_CaptainConditions(var C_NPC Captain) { * *// если Глава 5 * *if (Kapitel == 5) * *// и капитан найден * *&& (SCGotCaptain == TRUE) * *// и ГГ имеет "Морскую карту к острову Ирдорат" * *&& (Npc_HasItems(hero,ItWr_Seamap_Irdorath)) * *// и кол-во завербованных для похода >= 5 * *&& (crewmember_Count >= Min_Crew) * *// и капитан находится не далее 20м от корабля * *&& (Npc_GetDistToWP(Captain,"NW_WAITFOR_SHIP_CAPTAIN" ) < 2000) * *// и команда может подниматься на корабль или охрана корабля убита (2 охранника) * *&& ((MIS_ShipIsFree == TRUE) ¦¦ ((Npc_IsDead(Schiffswache_212)) && (Npc_IsDead(Schiffswache_213)))) * * * * * *{ * * * *// установка флага команда может подниматься на корабль * * * *MIS_ShipIsFree = TRUE; * * * *return TRUE; * *}; * *return FALSE; };
* *6. Функции квеста по зачистке каньона от Расчленителей.
Файл B_CountCanyonRazor.d
// Все ли Расчленители в каньоне убиты? // ---------------------------------------------------------------- // Возвращаемое значение: TRUE - да, FALSE - нет
func int C_AllCanyonRazorDead() { * *// если Грег вернулся в Яркендар * *if (GregIsBack == TRUE) * *// и 10 Расчленителей убито * *&& Npc_IsDead(CanyonRazor01) * *&& Npc_IsDead(CanyonRazor02) * *&& Npc_IsDead(CanyonRazor03) * *&& Npc_IsDead(CanyonRazor04) * *&& Npc_IsDead(CanyonRazor05) * *&& Npc_IsDead(CanyonRazor06) * *&& Npc_IsDead(CanyonRazor07) * *&& Npc_IsDead(CanyonRazor08 ) * *&& Npc_IsDead(CanyonRazor09) * *&& Npc_IsDead(CanyonRazor10) * *{ * * * *return TRUE; * *} * *return FALSE; };
// Действительно ли убит Расчленитель из каньона? // ---------------------------------------------------------------- // Аргумент: slf - убитый НПС // Возвращаемое значение: TRUE - да, FALSE - нет
func int C_IAmCanyonRazor(var C_NPC slf) { * *// получить ссылки на Расчленителей из каньона * *var C_NPC RAZ01; * *RAZ01 = Hlp_GetNpc(CANYONRAZOR01); * *var C_NPC RAZ02; * *RAZ02 = Hlp_GetNpc(CANYONRAZOR02); * *var C_NPC RAZ03; * *RAZ03 = Hlp_GetNpc(CANYONRAZOR03); * *var C_NPC RAZ04; * *RAZ04 = Hlp_GetNpc(CANYONRAZOR04); * *var C_NPC RAZ05; * *RAZ05 = Hlp_GetNpc(CANYONRAZOR05); * *var C_NPC RAZ06; * *RAZ06 = Hlp_GetNpc(CANYONRAZOR06); * *var C_NPC RAZ07; * *RAZ07 = Hlp_GetNpc(CANYONRAZOR07); * *var C_NPC RAZ08; * *RAZ08 = Hlp_GetNpc(CANYONRAZOR08 ); * *var C_NPC RAZ09; * *RAZ09 = Hlp_GetNpc(CANYONRAZOR09); * *var C_NPC RAZ10; * *RAZ10 = Hlp_GetNpc(CANYONRAZOR10); * *// если убитый НПС является одним из Расчленителей каньона * *if ((Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ01)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ02)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ03)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ04)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ05)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ06)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ07)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ08 )) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ09)) * *¦¦ *(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(RAZ10))) * *{ * * * *return TRUE; * *} * *return FALSE; };
// Вывод информации об убитых Расчленителях func void B_CountCanyonRazor() { * *var string CanyonRazorText; * *var string CanyonRazorLeft; * *// "10 - кол-во убитых Расчленителей" * *CanyonRazorLeft = IntToString(10 - CanyonRazorBodyCount); * *// CanyonRazorLeft + "глорх(-а, -ов) осталось" * *CanyonRazorText = ConcatStrings(CanyonRazorLeft,PRINT_Addon_CanyonRa zorsLeft); * *// вывод строки на экран * *AI_PrintScreen(CanyonRazorText,-1,YPOS_GOLDGIVEN,FONT_ScreenSmall,2); };
* *7. Функция подсчета убитых драконов.
Файл B_DragonKillCounter.d
// ************************************************** ************** // Функция подсчета убитых драконов (вообще-то действия выполняемые после убийства НПС) // ************************************************** ************** // Аргумент: current_dragon - убитый НПС // ---------------------------------------------------------------- // Возвращаемое значение: нет, тип функции должен быть исправлен на void
var int SwapDragnIsDead; var int RckDragnIsDead; var int FreDragnIsDead; * * var int IcDragnIsDead; *
func int B_DragonKillCounter(var C_NPC current_dragon) { * *var C_NPC Ravn; * *// получить ссылку на Равена * *Ravn = Hlp_GetNpc(BDT_1090_Addon_Raven); * *// если Равен убит * *if((Hlp_GetInstanceID(current_dragon)) == (Hlp_GetInstanceID(Ravn))) * *{ * * * *// если флаг убийства Равена не установлен * * * *if(RavenIsDead == FALSE) * * * *{ * * * * * *// видео "Смерть Равена" * * * * * *PlayVideoEx("EXTRO_RAVEN.BIK",TRUE,FALSE); * * * * * *// установить флаг * * * * * *RavenIsDead = TRUE; * * * * * *// убрать Миксира из Яркендара * * * * * *B_RemoveNpc(Myxir_ADW); * * * *}; * *}; * *// если убит дракон * *if(current_dragon.guild == GIL_DRAGON) * * *{ * * * *// получить ссылки на 4 драконов Миненталя * * * *var C_NPC SwapDragn; * *SwapDragn * = Hlp_GetNpc(Dragon_Swamp); * * * *var C_NPC RckDragn; * * RckDragn * *= Hlp_GetNpc(Dragon_Rock); * * * *var C_NPC FreDragn; * * FreDragn * *= Hlp_GetNpc(Dragon_Fire); * * * *var C_NPC IcDragn; * * *IcDragn * * = Hlp_GetNpc(Dragon_Ice); * * * * *// если убит Болотный дракон и флаг его убийства не установлен * * * *if((Hlp_GetInstanceID(current_dragon) == Hlp_GetInstanceID(SwapDragn)) && (SwapDragnIsDead == FALSE)) * * * *{ * * * * * *// счетчик убитых драконов ++ * * * * * *MIS_KilledDragons = (MIS_KilledDragons + 1); * * * * * *// установит флаг убийства дракона * * * * * *SwapDragnIsDead = TRUE; * * * *}; * * * *// Каменный дракон * * * *if((Hlp_GetInstanceID(current_dragon) == Hlp_GetInstanceID (RckDragn)) && (RckDragnIsDead == FALSE)) * * * *{ * * * * * *MIS_KilledDragons = (MIS_KilledDragons + 1); * * * * * *RckDragnIsDead = TRUE; * * * *}; * * * *// Огненный дракон * * * *if((Hlp_GetInstanceID(current_dragon) == Hlp_GetInstanceID (FreDragn)) && (FreDragnIsDead == FALSE)) * * * *{ * * * * * *MIS_KilledDragons = (MIS_KilledDragons + 1); * * * * * *FreDragnIsDead = TRUE; * * * *}; * * * *// Ледяной дракон * * * *if((Hlp_GetInstanceID (current_dragon) == Hlp_GetInstanceID (IcDragn)) && (IcDragnIsDead == FALSE)) * * * *{ * * * * * *MIS_KilledDragons = (MIS_KilledDragons + 1); * * * * * *IcDragnIsDead = TRUE; * * * *}; * *}; * *// если убито 4 дракона * *if(MIS_KilledDragons == 4) * *{ * * * *// установит флаг - ГГ убил всех драконов * * * *MIS_AllDragonsDead = TRUE; * * * *// если Бифф член партии ГГ и Бифф жив * * * *if((DJG_BiffParty == TRUE) && (Npc_IsDead(Biff) == FALSE)) * * * *{ * * * * * *// установить флаг - Бифф поощряет ГГ за убийство драконов * * * * * *DJG_BiffSurvivedLastDragon = TRUE; * * * *}; * *}; * *// если убит Дракон нежить * *if(current_dragon.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD) * *{ * * * *// установить флаг убийства последнего дракона * * * *UndeadDragonIsDead = TRUE; * * * *// создать в дневнике тему "Назад к кораблю" * * * *Log_CreateTopic(TOPIC_BackToShip,LOG_MISSION); * * * *// установить статус темы - выполнение * * * *Log_SetTopicStatus(TOPIC_BackToShip,LOG_RUNNING); * * * *// запись в теме "Враг побежден и теперь я больше не буду гнить под скалами. Я ухожу отсюда обратно на корабль." * * * *B_LogEntry(TOPIC_BackToShip,PRINT_DragKillCount); * * * *// телепортация ГГ на корабль * * * *AI_Teleport(hero,"UNDEAD_ENDTELEPORT"); * * * * *// если ГГ Милиционер или Паладин * * * *if((hero.guild == GIL_MIL) ¦¦ (hero.guild == GIL_PAL)) * * * *{ * * * * * *// ролик убийства дракона Паладином * * * * * *PlayVideoEx ("EXTRO_PAL.BIK",TRUE,FALSE); * * * *} * * * *// если ГГ Наемник или Охотник на драконов * * * *else if((hero.guild == GIL_SLD) ¦¦ (hero.guild == GIL_DJG)) * * * *{ * * * * * *// ролик убийства дракона Охотником на драконов * * * * * *PlayVideoEx("EXTRO_DJG.BIK",TRUE,FALSE); * * * *} * * * *else // ГГ Маг Огня * * * *{ * * * * * *// ролик убийства дракона Магом Огня * * * * * *PlayVideoEx ("EXTRO_KDF.BIK",TRUE,FALSE); * * * *}; * *}; };
* *8. Финальное видео (конец игры).
Файл B_ExtroAVI.d
// ************************************************** ************** // Финальное видео (конец игры) // ************************************************** **************
func void B_Extro_Avi() { * *// если Диего жив и Горн жив * *if((Npc_IsDead(PC_Thief_DI) == FALSE) && (Npc_IsDead(PC_Fighter_DI) == FALSE)) * *{ * * * *// установить флаг - друзья живы * * * *DiegAndGornAreOnboard = TRUE; * *}; * *// серия финальных роликов * *PlayVideo("Extro_Xardas.BIK"); * * *PlayVideo("Credits_Extro.BIK"); * *PlayVideo("Credits2.BIK"); * * *// если друзья живы * *if(DiegAndGornAreOnboard == TRUE) * *{ * * * *// ещё один ролик * * * *PlayVideo("Extro_AllesWirdGut.BIK"); * * * *}; * *// GAME OVER * *ExitSession(); };
|