Показать сообщение отдельно
Старый 14.07.2005, 12:04   #216
Vam

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

По умолчанию 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();
};

Ответить с цитированием