|
Re: Уроки скриптологии
13. Вспомогательные С_ функции для людей (compare функции).
Все С_ функции расположены в директории ..\AI\Human\С_Human\
Следующие два файла можно удалить по причине их бесполезности C_BanditAttackBandit.d и C_BanditHelpsStoryBandit.d
// ************************************************** ****************** // Проверка состояния тела НПС // -------------------------------------------------------------------- // Примечание автора: Никогда не используйте встроенную функцию Npc_GetBodyState // напрямую, т.к. сравнение всегда будет ложно, если установлены дополнительные // флаги состояния тела. Все запросы на состояние тела выполняйте только // через эту функцию. // ************************************************** ******************
// ================================================== ================== // Аргументы: // -------------------------------------------------------------------- // slf - НПС, состояние тела которого проверяется // bodystate - проверяемое состояние тела // -------------------------------------------------------------------- // Возвращаемое значение: // TRUE - состояние тела НПС совпадает с проверяемым, FALSE - не совпадает // ================================================== ==================
func int C_BodyStateContains(var C_NPC slf,var int bodystate) { * *// Примечание автора: Руки прочь от этой формулы!!! Я знаю точно что я делаю! (Мое примечание: с точки зрения логического анализа формула неправильна). * *// если фактическое состояние тела НПС без учета допфлагов равно запрошенному состоянию без учета допфлагов * *if((Npc_GetBodyState(slf)&(BS_MAX¦BS_FLAG_INTERRU PTABLE¦BS_FLAG_FREEHA NDS)) == (bodystate&(BS_MAX¦BS_FLAG_INTERRUPTABLE¦BS_FLAG_F REEHANDS))) * *{ * * * *return TRUE; * *}; * *return FALSE; };
... ещё файл
// ************************************************** ****************************** // Убивается ли НПС по окончании жизни или переводится в бессознательное состояние // ************************************************** ******************************
// ================================================== ================== // self - проверяемый НПС // other - преступник, убивающий НПС // -------------------------------------------------------------------- // Возвращаемое значение: // TRUE - НПС не убивается преступником, FALSE - убивается. // ================================================== ==================
func int C_DropUnconscious() { * *// если преступник монстр или Черный маг (Ищущий) или бандит или преступнику разрешено убить НПС * *if(other.guild > GIL_SEPERATOR_HUM) ¦¦ (other.guild == GIL_DMT) ¦¦ (other.guild == GIL_BDT) ¦¦ (other.aivar[AIV_DropDeadAndKill] == TRUE) * *{ * * * *// НПС будет убит * * * *return FALSE; * *}; * *// если НПС человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// если НПС не Черный маг и не бандит и его не разрешено убивать преступнику * * * *if(self.guild != GIL_DMT) && (self.guild != GIL_BDT) && (self.aivar[AIV_DropDeadAndKill] == FALSE) * * * *{ * * * * * *// НПС будет безсознания * * * * * *return TRUE; * * * *}; * *}; * *// НПС будет убит * *return FALSE; };
... и ещё
// ************************************************** *************** // Может ли быть взят предмет, принадлежащий одному НПС, другим НПС // ************************************************** ***************
// ================================================== ================== // Аргументы: // -------------------------------------------------------------------- // slf - НПС, которому может принадлежать предмет // oth - НПС берущий предмет (ГГ) // itm - предмет // -------------------------------------------------------------------- // Возвращаемое значение: // TRUE - предмет взять нельзя, FALSE - взять можно. // ================================================== ==================
func int C_IsTakenItemMyPossession(var C_NPC slf,var C_NPC oth,var C_ITEM itm) { * *var int portalguild; * *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит) * *portalguild = Wld_GetPlayerPortalGuild(); * *// Моё примечание: предыдущие две строки лишние и могут быть удалены. * *// если предмет принадлежит НПС владельцу * *if(Npc_OwnedByNpc(itm,slf)) * *{ * * * *// если предмет Святой молот * * * *if(Hlp_IsItem(itm,Holy_Hammer_MIS)) * * * *{ * * * * * *// Святой молот взят * * * * * *Hammer_Taken = TRUE; * * * *}; * * * *// брать нельзя * * * *return TRUE; * *}; * *// если предмет выброшен (просто валяется) * *if((itm.flags & ITEM_DROPPED) == ITEM_DROPPED) * *{ * * * *// брать можно * * * *return FALSE; * *}; * *// если ГГ находится в помещении, принадлежащем НПС или помещение публично * *// Моё примечание: правильнее вместо self написать slf, а то в некоторых случаях может быть ошибка. * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC) * *{ * * * *// брать нельзя * * * *return TRUE; * *}; * * *// если отношения между гильдиями НПС и гильдией, владеющей предметом, дружественные * *if(Wld_GetGuildAttitude(slf.guild,itm.ownerguild) == ATT_FRIENDLY) * *{ * * * *// брать нельзя * * * *return TRUE; * *}; * *// брать можно * *return FALSE; };
... и ещё
// ************************************************** ************** // Можно ли импользовать MOB, принадлежащий одному НПС, другим НПС // ************************************************** **************
// ================================================== ================== // Аргументы: // -------------------------------------------------------------------- // slf - НПС, которому может принадлежать MOB // oth - НПС использующий MOB (ГГ) // -------------------------------------------------------------------- // Возвращаемое значение: // TRUE - MOB использовать нельзя, FALSE - можно. // ================================================== ==================
func int C_IsUsedMobMyPossession(var C_NPC slf,var C_NPC oth) { * *// Моё примечание: правильнее вместо self и other внутри функции написать slf и oth, а то в некоторых случаях может быть ошибка. * *// если MOB, используемый ГГ, принадлежит НПС * *if(Npc_IsDetectedMobOwnedByNpc(other,self)) * *{ * * * *// нельзя * * * *return TRUE; * *}; * *// если ГГ находится в помещении, принадлежащем НПС или помещение публично * *if(C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (Wld_GetPlayerPortalGuild() == GIL_PUBLIC) * *{ * * * *// нельзя * * * *return TRUE; * *}; * * *// можно * *return FALSE; };
|