Показать сообщение отдельно
Старый 17.08.2005, 14:49   #235
Vam

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

По умолчанию Re: Уроки скриптологии

* *35. Функции обучения Ищущего огонька.

Файл B_TeachPlayerTalentWispDetector.d

// ************************************************** **************
// Функции обучения Ищущего огонька
// ************************************************** **************

// Эффекты при обучении
// -----------------------------------------------------------------
// Аргументы: Teacher - учитель
func void B_WISPDETECTOR_LearnEffect(var C_NPC Teacher)
{
* *AI_PlayAni(Teacher,"T_PRACTICEMAGIC5");
* *Wld_PlayEffect("spellFX_HealShrine",hero,hero,0,0 ,0,FALSE);
* *Wld_PlayEffect("spellFX_INCOVATION_BLUE",hero,her o,0,0,0,FALSE);
* *Snd_Play("WSP_Dead_A1");
};

// Обучение Ищущего огонька
// -----------------------------------------------------------------
// Аргументы: slf - учитель, oth - обучаемый, WispSkill - умение поиска
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно
func int B_TeachPlayerTalentWispDetector(var C_NPC slf,var C_NPC oth,var int WispSkill)
{
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = B_GetLearnCostTalent(oth, NPC_TALENT_WISPDETECTOR, WispSkill);
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLearnPoints,-1,-1,FONT_ScreenSmall,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// создать в дневнике тему "Ищущий Огонек"
* *Log_CreateTopic(TOPIC_WispDetector,LOG_NOTE);
* *// сделать запись "Мой Огонек может искать для меня следующие вещи:"
* *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned);
* *// выучить соответствующее умение
* *if(WispSkill == WISPSKILL_FF)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FF] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Оружие дальнего боя и амуниция"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_FF);
* *};
* *if(WispSkill == WISPSKILL_NONE)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_NONE] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Золото, ключи и предметы обихода"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_NONE);
* *};
* *if(WispSkill == WISPSKILL_RUNE)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_RUNE] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Руны и свитки"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_RUNE);
* *};
* *if(WispSkill == WISPSKILL_MAGIC)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_MAGIC] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Кольца и амулеты"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_MAGIC);
* *};
* *if(WispSkill == WISPSKILL_FOOD)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FOOD] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Еда и растения"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_FOOD);
* *};
* *if(WispSkill == WISPSKILL_POTIONS)
* *{
* * * *PLAYER_TALENT_WISPDETECTOR[WISPSKILL_POTIONS] = TRUE;
* * * *B_WISPDETECTOR_LearnEffect(slf);
* * * *// "Магические и другие напитки"
* * * *B_LogEntry(TOPIC_WispDetector,LogText_Addon_WispL earned_POTIONS);
* *};
* *// вывод текста: "Огонек научился"
* *PrintScreen(PRINT_LearnWispDetector,-1,-1,FONT_Screen,2);
* *// отобразить в окне характеристик
* *Npc_SetTalentSkill(oth,NPC_TALENT_WISPDETECTOR,1) ;
* *return TRUE;
};


* *36. Функция обучения воровству, отмычкам, подкрадаванию и акробатике.

Файл B_TeachThiefTalent.d

// ************************************************** **************
// Функция обучения воровству, отмычкам, подкрадаванию и акробатике
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый, talent - умение
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachThiefTalent(var C_NPC slf,var C_NPC oth,var int talent)
{
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = B_GetLearnCostTalent(oth,talent,1);
* *// если не правильный навык
* *if(talent != NPC_TALENT_PICKLOCK) && (talent != NPC_TALENT_SNEAK)
* * * *&& (talent != NPC_TALENT_ACROBAT) && (talent != NPC_TALENT_PICKPOCKET)
* *{
* * * *Print("*** ERROR: Wrong Parameter ***");
* * * *return FALSE;
* *};
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLearnPoints,-1,-1,FONT_ScreenSmall,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// отмычки
* *if(talent == NPC_TALENT_PICKLOCK)
* *{
* * * *// отобразить в окне характеристик
* * * *Npc_SetTalentSkill(oth,NPC_TALENT_PICKLOCK,1);
* * * *// вывод текста: "Обучение: Вскрытие замков"
* * * *PrintScreen(PRINT_LearnPicklock,-1,-1,FONT_Screen,2);
* *};
* *// подкрадывание
* *else if(talent == NPC_TALENT_SNEAK)
* *{
* * * *Npc_SetTalentSkill(oth,NPC_TALENT_SNEAK,1);
* * * *// вывод текста: "Обучение: Подкрадывание"
* * * *PrintScreen(PRINT_LearnSneak,-1,-1,FONT_Screen,2);
* *};
* *// акробатика
* *else if(talent == NPC_TALENT_ACROBAT)
* *{
* * * *Npc_SetTalentSkill(oth,NPC_TALENT_ACROBAT,1);
* * * *// вывод текста: "Учится: акробатика"
* * * *PrintScreen(PRINT_LearnAcrobat,-1,-1,FONT_Screen,2);
* *};
* *// карманная кража
* *else if(talent == NPC_TALENT_PICKPOCKET)
* *{
* * * *Npc_SetTalentSkill(oth,NPC_TALENT_PICKPOCKET,1);
* * * *// вывод текста: "Обучение: Карманная кража"
* * * *PrintScreen(PRINT_LearnPickpocket,-1,-1,FONT_Screen,2);
* *};
* *return TRUE;
};


* *37. Функция чтения писем или записок при передаче.

Файл B_UseFakeScroll.d

// ************************************************** **************
// Функция чтения писем или записок при передаче
// ************************************************** **************
// self - НПС получивший записку
// hero - как всегда ГГ

func void B_UseFakeScroll()
{
* *// если НПС сидит
* *if(C_BodystateContains(self,BS_SIT))
* *{
* * * *// встает
* * * *AI_StandUp(self);
* * * *// поворачивается к ГГ
* * * *B_TurnToNpc(self,hero);
* *};
* *// прячет оружие
* *AI_RemoveWeapon(self);
* *// создается в инвентаре НПС записка
* *CreateInvItem(self,Fakescroll);
* *var C_NPC target;
* *// инициализировать target = hero
* *target = Npc_GetLookAtTarget(self);
* *// если target существует
* *if(Hlp_IsValidNpc(target))
* *{
* * * *// НПС перестает смотреть на ГГ
* * * *B_StopLookAt(self);
* * * *// читает записку
* * * *AI_UseItemToState(self,Fakescroll,1);
* * * *// таймаут
* * * *AI_Wait(self,1);
* * * *// закончить чтение
* * * *AI_UseItemToState(self,Fakescroll,-1);
* * * *// смотреть на ГГ
* * * *B_LookAtNpc(self,hero);
* *}
* *else // если ГГ отсутствует
* *{
* * * *// просто прочитать записку
* * * *AI_UseItemToState(self,Fakescroll,1);
* * * *AI_Wait(self,1);
* * * *AI_UseItemToState(self, Fakescroll,-1);
* *};
};


* *38. Функция использования предмета.

Файл B_UseItem.d

// ************************************************** **************
// Функция использования предмета
// ************************************************** **************
// Аргументы: slf - НПС, использующий предмет, itmInstance - предмет

// Внимание: аргумент itemInstance является переопределенным типом (C_Item -> int)

func void B_UseItem(var C_NPC slf,var int itmInstance)
{
* *// если НПС сидит
* *if(C_BodyStateContains(slf,BS_SIT))
* *{
* * * *return;
* *};
* *var C_NPC target;
* *// получить target (НПС, на которого смотрит наш НПС)
* *target = Npc_GetLookAtTarget(slf);
* *// если target существует
* *if(Hlp_IsValidNpc(target))
* *{
* * * *// перестать смотреть на цель
* * * *B_StopLookAt(slf);
* * * *// использовать предмет
* * * *AI_UseItem(slf,itmInstance);
* * * *// смотреть на цель
* * * *B_LookAtNpc(slf,target);
* *}
* *else // цель отсутствует
* *{
* * * *// просто использовать предмет
* * * *AI_UseItem(slf,itmInstance);
* *};
};


* *39. Проверка, как далеко находится ГГ от конкретной точки.

Файл C_DiegoTooFar.d

// ************************************************** **************
// Проверка, как далеко находится ГГ от конкретной точки
// ************************************************** **************
// Аргументы: tolerance - коэффициент удаления
// Возвращаемое значение: FALSE - далеко, или индекс конкретной точки

// индексы точек
const int LOC_ANGAR * * * * = 1;
const int LOC_ICE * * * * * = 2;
const int LOC_SWAMP * * * * = 4;
const int LOC_FIRE * * * * *= 3;
const int LOC_LAKE * * * * *= 5;
const int LOC_XARDAS * * * *= 6;
const int LOC_FAJETHMINE * *= 7;
const int LOC_SILVESTROMINE = 8;
const int LOC_GRIMESMINE * *= 9;
const int LOC_BURG * * * * *= 10;
const int LOC_ORCBARRIER * *= 11;
const int LOC_ORCBARRIER_FAR = 12;

func int C_DiegoTooFar(var int tolerance)
{
* *// если ГГ находится от указанной точки не далее заданного значения
* *if(Npc_GetDistToWP(hero,"SPAWN_OW_SHADOWBEAST_10_ 01") < (4000 + tolerance))
* *{
* * * *// возвращается индекс точки
* * * *return LOC_ANGAR;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_ICEREGION_ENTRANCE_01" ) < (3000 + tolerance))
* *{
* * * *return LOC_ICE;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_PATH_046") < (1800 + tolerance))
* *{
* * * *return LOC_SWAMP;
* *}
* *else if(Npc_GetDistToWP(hero,"CASTLE_5") < (1500 + tolerance))
* *{
* * * *return LOC_FIRE;
* *}
* *else if(Npc_GetDistToWP(hero,"MT16") < (6500 + tolerance))
* *¦¦ (Npc_GetDistToWP(hero,"MT13") < (5500 + tolerance))
* *{
* * * *return LOC_LAKE;
* *}
* *else if(Npc_GetDistToWP(hero,"DT_MAINGATE") < (500 + tolerance))
* *¦¦ (Wld_GetPlayerPortalGuild() == GIL_DMT)
* *¦¦ ((Npc_GetDistToWP(hero,"DT_E3_03") < 1000) && (Npc_GetHeightToNpc(self,hero) > 1000))
* *{
* * * *return LOC_XARDAS;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_NEWMINE_03") < (2500 + tolerance))
* *¦¦ (Npc_GetDistToWP(hero,"OW_NEWMINE_03_B") < (2500 + tolerance))
* *{
* * * *return LOC_FAJETHMINE;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_MINE3_OUT") < (1200 + tolerance))
* *{
* * * *return LOC_SILVESTROMINE;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_PATH_266") < (3000 + tolerance))
* *{
* * * *return LOC_GRIMESMINE;
* *}
* *else if(Npc_GetDistToWP(hero,"OC_CENTER_02") < (12000 + tolerance))
* *¦¦ (Npc_GetDistToWP(hero,"OC_CENTER_05") < (12000 + tolerance))
* *{
* * * *return LOC_BURG;
* *}
* *else if(Npc_GetDistToWP(hero,"OC_ORCBARRIER_08") < (5000 + tolerance))
* *¦¦ (Npc_GetDistToWP(hero,"PATH_OC_PSI_01") < (5000 + tolerance))
* *{
* * * *return LOC_ORCBARRIER;
* *}
* *else if(Npc_GetDistToWP(hero,"OW_PATH_BLOODFLY01_SPAWN0 1") < (5000 + tolerance))
* *{
* * * *return LOC_ORCBARRIER_FAR;
* *};
* *// далеко от любой точки
* *return FALSE;
};


* *40. Функции проверяющие положение НПС в Хоринисе.

Файл C_NpcIsInQuarter.d

// ************************************************** **************
// Функции проверяющие положение НПС в Хоринисе
// ************************************************** **************

// Получить расстояние от НПС до центра квартала города
// ----------------------------------------------------------------
// Аргументы: slf - НПС, quarter - квартал города
// Возвращаемое значение: расстояние
func int C_GetDistToCenter(var C_NPC slf,var int quarter)
{
* *var int dist;
* *// казармы
* *if(quarter == Q_KASERNE)
* *{
* * * *// выдать расстояние до ближайшей точки казарм
* * * *if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CEN TRE_03") < Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP") )
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_KASERN_CENTRE_ 03");
* * * *}
* * * *else
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_KASERN_ARMORY_SHARP") ;
* * * *};
* *}
* *// виселица
* *else if(quarter == Q_GALGEN)
* *{
* * * *// расстояние до виселицы
* * * *dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_33_B");
* * * *// предел
* * * *if(dist > 1900)
* * * *{
* * * * * *dist = 100000;
* * * *};
* *}
* *// рынок
* *else if (quarter == Q_MARKT)
* *{
* * * *dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_PATH_36");
* * * *if(dist > 2300)
* * * *{
* * * * * *dist = 100000;
* * * *};
* *}
* *// храм
* *else if(quarter == Q_TEMPEL)
* *{
* * * *dist = Npc_GetDistToWP(slf,"NW_CITY_MERCHANT_TEMPLE_FRONT ");
* *}
* *// нижний город
* *else if (quarter == Q_UNTERSTADT)
* *{
* * * *dist = Npc_GetDistToWP(slf,"NW_CITY_MAINSTREET_05");
* *}
* *// гавань
* *else if (quarter == Q_HAFEN)
* *{
* * * *if(Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_ PATH_07") < Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02") )
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_POOR_AREA_PATH _07");
* * * *}
* * * *else
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_HABOUR_SMALLTALK_02") ;
* * * *};
* *}
* *// верхний город
* *else if (quarter == Q_OBERSTADT)
* *{
* * * *if(Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16"))
* * * *&& (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18"))
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04");
* * * *};
* *
* * * *if(Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04"))
* * * *&& (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18"))
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16");
* * * *};
* * * *
* * * *if(Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_04"))
* * * *&& (Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18") < Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_16"))
* * * *{
* * * * * *dist = Npc_GetDistToWP(slf,"NW_CITY_UPTOWN_PATH_18");
* * * *};
* *}
* *return dist;
};

// Является ли расстояние от НПС до указанного квартала наименьшим
// ----------------------------------------------------------------
// Аргументы: slf - НПС, quarter - квартал города
// Возвращаемое значение: TRUE - да, FALSE - нет
func int C_IsQuarterNearest(var C_NPC slf,var int quart)
{
* *var int quartDist;
* *// расстояние от НПС до нужного квартала
* *quartDist = C_GetDistToCenter(slf,quart);
* *// если оно наименьшее, то возвращаем TRUE
* *if (quartDist <= C_GetDistToCenter(slf,Q_KASERNE))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_GALGEN))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_MARKT))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_TEMPEL))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_UNTERSTADT))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_HAFEN))
* *&& (quartDist <= C_GetDistToCenter(slf,Q_OBERSTADT))
* *{
* * * *return TRUE;
* *}
* *return FALSE;
};

// Получить наиближайший к НПС квартал города
// ----------------------------------------------------------------
// Аргументы: slf - НПС
// Возвращаемое значение: квартал
func int C_NpcIsInQuarter (var C_NPC slf)
{
* *// казармы
* *if(C_IsQuarterNearest(slf,Q_KASERNE))
* *{
* * * *return Q_KASERNE;
* *};
* *// виселица
* *if(C_IsQuarterNearest(slf,Q_GALGEN))
* *{
* * * *return Q_GALGEN;
* *};
* *// рынок
* *if(C_IsQuarterNearest(slf,Q_MARKT))
* *{
* * * *return Q_MARKT;
* *};
* *// храм
* *if(C_IsQuarterNearest(slf,Q_TEMPEL))
* *{
* * * *return Q_TEMPEL;
* *};
* *// нижний город
* *if(C_IsQuarterNearest(slf,Q_UNTERSTADT))
* *{
* * * *return Q_UNTERSTADT;
* *};
* *// гавань
* *if(C_IsQuarterNearest(slf,Q_HAFEN))
* *{
* * * *return Q_HAFEN;
* *};
* *// верхний город
* *if(C_IsQuarterNearest(slf,Q_OBERSTADT))
* *{
* * * *return Q_OBERSTADT;
* *};
};

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