|
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; * *}; };
|