|
Re: Уроки скриптологии
// ******************************************* // Выбор НПС оружия соответствующего цели // *******************************************
// ====================================== // Аргументы: // -------------------------------------- // slf *- НПС агрессор // oth *- НПС цель // ======================================
func void B_SelectWeapon(var C_NPC slf,var C_NPC oth) { * *// если агрессор падает или плывет или ныряет * *if(C_BodyStateContains(slf,BS_FALL)) ¦¦ (C_BodyStateContains(slf,BS_SWIM)) ¦¦ (C_BodyStateContains(slf,BS_DIVE)) * *{ * * * *return; * *}; * *// если агрессор выбрал для использования магию * *if(B_SelectSpell(slf,oth)) * *{ * * * *return; * *}; * *// если агрессор находится в режиме сражения магией * *if(Npc_IsInFightMode(slf,FMODE_MAGIC)) * *{ * * * *// если агрессор находится в боевом режиме (Примечание: не мой взгляд этот блок лишний, была проверка, что НПС использует магию) * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE)) * * * *{ * * * * * *// агрессор прячет оружие * * * * * *AI_RemoveWeapon(slf); * * * *}; * * * *// подготовка оружия ближнего радиуса поражения к бою * * * *AI_ReadyMeleeWeapon (slf); * * * *return; * *}; * *// если агрессор находится в режиме сражения оружием дальнего радиуса поражения * *if(Npc_IsInFightMode(slf,FMODE_FAR)) * *{ * * * *// если расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения или агрессор не экипирован оружием ближнего радиуса поражения * * * *if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) ¦¦ (!Npc_HasEquippedMeleeWeapon(slf)) * * * *{ * * * * * *return; * * * *}; * *}; * *// если агрессор находится в режиме сражения оружием ближнего радиуса поражения * *if(Npc_IsInFightMode(slf,FMODE_MELEE)) * *{ * * * *// если расстояние от агрессора до цели > дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения или агрессор не экипирован оружием дальнего радиуса поражения * * * *if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) ¦¦ (!Npc_HasEquippedRangedWeapon(slf)) * * * *{ * * * * * *return; * * * *}; * *}; * *// если агрессор экипирован оружием ближнего радиуса поражения и расстояние от агрессора до цели <= дистанции, дальше которой НПС выбирает оружие дальнего радиуса поражения * *if(Npc_HasEquippedMeleeWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_RANGED_OUTER) * *{ * * * *// если агрессор находится в боевом режиме * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE)) * * * *{ * * * * * *// агрессор прячет оружие * * * * * *AI_RemoveWeapon(slf); * * * *}; * * * *// подготовка оружия ближнего радиуса поражения к бою * * * *AI_ReadyMeleeWeapon (slf); * * * *return; * *}; * *// если агрессор экипирован оружием дальнего радиуса поражения и расстояние от агрессора до цели > дистанции, ближе которой НПС выбирает оружие ближнего радиуса поражения и причина атаки агрессора - убийство жертвы * *if(Npc_HasEquippedRangedWeapon(slf)) && (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_RANGED_INNER) && (C_NpcHasAttackReasonToKill(slf)) * *{ * * * *// если агрессор находится в боевом режиме * * * *if(!Npc_IsInFightMode(slf,FMODE_NONE)) * * * *{ * * * * * *// агрессор прячет оружие * * * * * *AI_RemoveWeapon(slf); * * * *}; * * * *// подготовка оружия дальнего радиуса поражения к бою * * * *AI_ReadyRangedWeapon(slf); * * * *return; * *}; * *// если агрессор не в боевом режиме * *if(Npc_IsInFightMode(slf,FMODE_NONE)) * *{ * * * *// если агрессор экипирован оружием ближнего радиуса поражения * * * *if(Npc_HasEquippedMeleeWeapon(slf)) * * * *{ * * * * * *// подготовка оружия к бою * * * * * *AI_ReadyMeleeWeapon(slf); * * * * * *return; * * * *}; * * * *// если агрессор экипирован оружием дальнего радиуса поражения * * * *if(Npc_HasEquippedRangedWeapon(slf)) * * * *{ * * * * * *// подготовка оружия к бою * * * * * *AI_ReadyRangedWeapon(slf); * * * * * *return; * * * *}; * * * *// подготовка к бою кулаками * * * *AI_ReadyMeleeWeapon(slf); * * * *return; * *}; * *return; };
... еще файл // ********************************* // Устанавливает отношение НПС к ГГ // *********************************
// ====================================== // Аргументы: // -------------------------------------- // slf *- НПС // att *- отношение // ======================================
func void B_SetAttitude(var C_NPC slf,var int att) { * *// установить временное отношение НПС к ГГ * *Npc_SetAttitude(slf,att); * *// установить постояное отношение НПС к ГГ * *Npc_SetTempAttitude(slf,att); };
... и ещё // ******************************************** // Инициализация переменной other для НПС self // ********************************************
func void B_ValidateOther() { * *// если other отсутсвует (загрузка игры) * *if(!Hlp_IsValidNpc(other)) * *{ * * * * *// other = последней цели НПС * * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]); * * * *// для НПС установить цель other * * * *Npc_SetTarget(self,other); * * * *// установить флаг загрузки игры * * * *self.aivar[AIV_LOADGAME] = TRUE; * *} * *else // иначе (other существует) * *{ * * * * *// повторно инициализировать other целью * * * *Npc_GetTarget(self); * * * *// сохранить последнюю цель * * * *self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID(other); * * * *// сброс флага загрузки игры * * * *self.aivar[AIV_LOADGAME] = FALSE; * *}; }; Добавление от 03/26/05, в 09:56:59
Криминал ГГ // ******************************* // Запоминание новостей // *******************************
// ====================================== // Аргументы: // -------------------------------------- // slf - НПС, запоминающий новость // taeter - НПС преступник // crime - криминальная новость // ======================================
func void B_MemorizePlayerCrime(var C_NPC slf,var C_NPC taeter,var int crime) { // если преступник не ГГ if(!Npc_IsPlayer(taeter)) { return; }; // если НПС черный маг if(slf.guild == GIL_DMT) { return; }; // если новость более значима чем предыдущие новости if(crime > B_GetPlayerCrime(slf)) { // удалить предыдущую новость B_DeletePetzCrime(slf); // добавить новость B_AddPetzCrime(slf,crime); }; // если новость одного порядка с предыдущей новостью (Примечание: можно оставить ==, > было ранее) if(crime >= B_GetPlayerCrime(slf)) { // НПС запоминает новость slf.aivar[AIV_NpcSawPlayerCommit] = crime; // НПС запоминает день преступления slf.aivar[AIV_NpcSawPlayerCommitDay] = Wld_GetDay(); // НПС запоминает уровень криминала ГГ slf.aivar[AIV_CrimeAbsolutionLevel] = B_GetCurrentAbsolutionLevel(slf); }; };
... и ещё файл // ************************************************** ********** // Получить последнюю новость, запомненную НПС о криминале ГГ // ************************************************** **********
// ====================================== // Аргументы: // -------------------------------------- // slf - НПС имеющий новость // -------------------------------------- // Возвращаемое значение: последняя запомненная новость // ======================================
func int B_GetPlayerCrime(var C_NPC slf) { // если уровень криминала ГГ меньше воровства if(slf.aivar[AIV_NpcSawPlayerCommit] <= CRIME_ATTACK) { // если с момента запоминания новости прошло более двух дней if(slf.aivar[AIV_NpcSawPlayerCommitDay] < (Wld_GetDay()-2)) { // криминала не было return CRIME_NONE; }; }; // если уровень криминала, запомненный НПС, < уровня криминала ГГ по локациям if(slf.aivar[AIV_CrimeAbsolutionLevel] < B_GetCurrentAbsolutionLevel(slf)) { // криминала не было return CRIME_NONE; }; // последний запомненный криминал return slf.aivar[AIV_NpcSawPlayerCommit]; };
... и ещё // ************************************************** // Добавить новость для соответствующей локации // **************************************************
// ====================================== // Аргументы: // -------------------------------------- // slf - НПС свидетель, проживающий в локации // crime - криминальная новость // ======================================
func void B_AddPetzCrime(var C_NPC slf,var int crime) { // если НПС из Миненталя if(C_NpcBelongsToOldCamp(slf)) { // если убийство if(crime == CRIME_MURDER) { // увеличить счетчик убийств PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder + 1; }; // если воровство if(crime == CRIME_THEFT) { // увеличить счетчик воровства PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft + 1; }; // если нападение if(crime == CRIME_ATTACK) { // увеличить счетчик нападений PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack + 1; }; // если убийство овец if(crime == CRIME_SHEEPKILLER) { // увеличить счетчик убитых овец PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller + 1; }; }; // если НПС из Хориниса if(C_NpcBelongsToCity(slf)) { if(crime == CRIME_MURDER) { PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder + 1; }; if(crime == CRIME_THEFT) { PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft + 1; }; if(crime == CRIME_ATTACK) { PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack + 1; }; if(crime == CRIME_SHEEPKILLER) { PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller + 1; }; }; // если НПС из Монастыря if(C_NpcBelongsToMonastery(slf)) { if(crime == CRIME_MURDER) { PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder + 1; }; if(crime == CRIME_THEFT) { PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft + 1; }; if(crime == CRIME_ATTACK) { PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack + 1; }; if(crime == CRIME_SHEEPKILLER) { PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller + 1; }; }; // если НПС с Фермы наемников if(C_NpcBelongsToFarm(slf)) { if(crime == CRIME_MURDER) { PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder + 1; }; if(crime == CRIME_THEFT) { PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft + 1; }; if(crime == CRIME_ATTACK) { PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack + 1; }; if(crime == CRIME_SHEEPKILLER) { PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller + 1; }; }; // если НПС из Лагеря бандитов if(C_NpcBelongsToBL(slf)) { if(crime == CRIME_MURDER) { PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder + 1; }; if(crime == CRIME_THEFT) { PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft + 1; }; if(crime == CRIME_ATTACK) { PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack + 1; }; }; };
... и ещё // ************************************************** *********** // Удалить новость для соответствующей локации // ************************************************** ***********
// ====================================== // Аргументы: // -------------------------------------- // slf - НПС свидетель, проживающий в локации // ======================================
func void B_DeletePetzCrime(var C_NPC slf) { // если НПС из Миненталя if(C_NpcBelongsToOldCamp(slf)) { // если последняя запомненная новость - убийство if(B_GetPlayerCrime(slf) == CRIME_MURDER) { // уменьшить счетчик убийств PETZCOUNTER_OldCamp_Murder = PETZCOUNTER_OldCamp_Murder - 1; }; // если последняя запомненная новость - воровство if(B_GetPlayerCrime(slf) == CRIME_THEFT) { // уменьшить счетчик воровства PETZCOUNTER_OldCamp_Theft = PETZCOUNTER_OldCamp_Theft - 1; }; // если последняя запомненная новость - нападение if(B_GetPlayerCrime(slf) == CRIME_ATTACK) { // уменьшить счетчик нападений PETZCOUNTER_OldCamp_Attack = PETZCOUNTER_OldCamp_Attack - 1; }; // если последняя запомненная новость - убийство овец if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER) { // уменьшить счетчик убитых овец PETZCOUNTER_OldCamp_Sheepkiller = PETZCOUNTER_OldCamp_Sheepkiller - 1; }; }; // если НПС из Хориниса if(C_NpcBelongsToCity(slf)) { if(B_GetPlayerCrime(slf) == CRIME_MURDER) { PETZCOUNTER_City_Murder = PETZCOUNTER_City_Murder - 1; }; if(B_GetPlayerCrime(slf) == CRIME_THEFT) { PETZCOUNTER_City_Theft = PETZCOUNTER_City_Theft - 1; }; if(B_GetPlayerCrime(slf) == CRIME_ATTACK) { PETZCOUNTER_City_Attack = PETZCOUNTER_City_Attack - 1; }; if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER) { PETZCOUNTER_City_Sheepkiller = PETZCOUNTER_City_Sheepkiller - 1; }; }; // если НПС из Монастыря if(C_NpcBelongsToMonastery(slf)) { if(B_GetPlayerCrime(slf) == CRIME_MURDER) { PETZCOUNTER_Monastery_Murder = PETZCOUNTER_Monastery_Murder - 1; }; if(B_GetPlayerCrime(slf) == CRIME_THEFT) { PETZCOUNTER_Monastery_Theft = PETZCOUNTER_Monastery_Theft - 1; }; if(B_GetPlayerCrime(slf) == CRIME_ATTACK) { PETZCOUNTER_Monastery_Attack = PETZCOUNTER_Monastery_Attack - 1; }; if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER) { PETZCOUNTER_Monastery_Sheepkiller = PETZCOUNTER_Monastery_Sheepkiller - 1; }; }; // если НПС с Фермы наемников if(C_NpcBelongsToFarm(slf)) { if(B_GetPlayerCrime(slf) == CRIME_MURDER) { PETZCOUNTER_Farm_Murder = PETZCOUNTER_Farm_Murder - 1; }; if(B_GetPlayerCrime(slf) == CRIME_THEFT) { PETZCOUNTER_Farm_Theft = PETZCOUNTER_Farm_Theft - 1; }; if(B_GetPlayerCrime(slf) == CRIME_ATTACK) { PETZCOUNTER_Farm_Attack = PETZCOUNTER_Farm_Attack - 1; }; if(B_GetPlayerCrime(slf) == CRIME_SHEEPKILLER) { PETZCOUNTER_Farm_Sheepkiller = PETZCOUNTER_Farm_Sheepkiller - 1; }; }; // если НПС из Лагеря бандитов if(C_NpcBelongsToBL(slf)) { if(B_GetPlayerCrime(slf) == CRIME_MURDER) { PETZCOUNTER_BL_Murder = PETZCOUNTER_BL_Murder - 1; }; if(B_GetPlayerCrime(slf) == CRIME_THEFT) { PETZCOUNTER_BL_Theft = PETZCOUNTER_BL_Theft - 1; }; if(B_GetPlayerCrime(slf) == CRIME_ATTACK) { PETZCOUNTER_BL_Attack = PETZCOUNTER_BL_Attack - 1; }; }; }; Добавление от 03/26/05, в 10:01:09 2DimaD:
время между склейкой теперь 20 минут
|
Не вводи народ в заблуждение, новый пост отредактировать не удалось, исправляйте ошибки сами, если найдете. Предыдущее предложение по вставке разделителей (прослоек) остается. Всем привет!
|