Показать сообщение отдельно
Старый 15.08.2005, 08:56   #232
Vam

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

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

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