![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]() ![]()
Сообщение
#1
|
|
Пушкин ![]() Класс: Обыватель Характер: Chaotic Neutral Раса: Гигант NWN: Тексты ![]() |
Всем привет. Я написал несколько скриптов, связанных с одним и тем же классом - некромантом. Хочется, чтобы мастера скриптового дела поглядели на них. В следующее мое появление здесь я их размещу и буду добавлять мало-помалу. Сам я не специализируюсь на скриптах, к тому же у меня нет возможности их протестировать, да и вообще поиграть в НВН2 - компьютер слишком слаб для него. То, что написано, ориентировано на первую часть НВН и Аврору, поэтому и понадобятся коррективы. Может показаться странным, что я что-то делаю для игры, которую сам не в состоянии запустить, но меня увлекает создание контента. Главное - ставить достижимые цели.
Еще (и здесь уже я полный профан) может понадобиться человек, хорошо знакомый с AI хенчменов. Есть идея сделать для некроманта хенчмена-гуля (я нашел интересное заклинание в Wizard Spell Compendium для AD&D). За мной в этом случае будет диалог или диалоги, но я не берусь перевести в код странные привычки, каких, вы понимаете, от гуля можно ждать. Заинтересовавшихся спецов прошу отметиться здесь. Айван, Лекс, а не сделать ли это очередным конкурсом? Назовите его "Лучший AI для необычного хенчмена" или как-то так, и в качестве хенчмена, чтобы был фокус, назначить именно спутника-гуля. Тогда мы получили бы несколько работ и взяли бы лучшее из них. Этот замысел с гулем и скриптами для некроманта - не для моего личного пользования. Я не планирую ввести их в какой-нибудь свой модуль. Наоборот, я хочу сделать некий полезный набор, упругий пакет, достаточно соблазнительный и полный, чтобы приманить распорядителей шардов. Пусть они посмотрят на дополненного и исправленного некроманта и скажут себе "Эй, а ведь наш-то некромант - скучнее, просто hack-n-slash... Возьмем этого". Сообщение отредактировал Chimeric - Aug 18 2009, 13:14 |
![]() |
![]()
Сообщение
#2
|
|
Пушкин ![]() Класс: Обыватель Характер: Chaotic Neutral Раса: Гигант NWN: Тексты ![]() |
Neverwinter Script void LeafThroughCorpses(object oCorpse, int nHecatomb) { oCorpse = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF)); nHecatomb = GetLocalInt(oCorpse, "hecatomb") + nHecatomb; while (GetIsObjectValid(oCorpse) & GetIsDead(oCorpse) == TRUE) { SetLocalInt(OBJECT_SELF, "hecatomb", nHecatomb); } oCorpse = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF)); } } void main() { location lSelf = GetLocation(OBJECT_SELF); SetLocalInt(OBJECT_SELF, "hecatomb", GetHitDice(OBJECT_SELF)); LeafThroughCorpses; DelayCommand(5.0, DeleteLocalInt(OBJECT_SELF, "hecatomb")); if (nHecatomb =>50) { if (nHecatomb < 70) { CreateObject(OBJECT_TYPE_TRIGGER, "hecatomb_small", lSelf, FALSE); } else if (nHecatomb < 100) { CreateObject(OBJECT_TYPE_TRIGGER, "hecatomb_medium", lSelf, FALSE); } else { CreateObject(OBJECT_TYPE_TRIGGER, "hecatomb_great", lSelf, FALSE); } SetLocalInt(GetNearestObject(OBJECT_TYPE_TRIGGER, OBJECT_SELF), "hecatomb_worth", nHecatomb); DeleteLocalInt(OBJECT_SELF, "hecatomb"); } } Это один скрипт, понятный. Вот скрипт заклинания - попытка. Neverwinter Script void SpellExpired() { DeleteLocalInt(oTarget, "seeking_hecatomb")); DeleteLocalInt(oTarget, "health")); if (GetIsDead(oTarget) != TRUE) { ClearAllActions(oTarget); if ((GetObjectSeen(OBJECT_SELF), oTarget) == TRUE) { SetIsTemporaryEnemy(OBJECT_SELF, oTarget, TRUE, fHateLasts); /// нападает на мага, если видит его тут же DetermineCombatRound(); } else { AssignCommand, (oTarget, ActionMoveToLocation(lSelf, TRUE, 0.0f)); /// иначе бегом назад } } } void SeekHecatombHolocaust() { location lSelf = GetLocation(oTarget); object oHecatomb = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, lSelf, FALSE, OBJECT_TYPE_TRIGGER); /// ищем в огромном радиусе триггер. так как требуется лишь один, я обошелся без функции while и GetNextObjectInShape. int nDuration = GetCasterLevel(OBJECT_SELF) * 5; /// длительность int nMetaMagic = GetMetaMagicFeat(OBJECT_SELF); /// вдвое больше с метамагией int nHealth = GetCurrentHitPoints(oTarget); float fHateLasts = GetIntelligence(oTarget) * 20; ///умный ненавидит за это дольше SetLocalVariable(oTarget, "health", nHealth); if (nMetaMagic == METAMAGIC_EXTEND) { nDuration = nDuration * 2; } if (WillSave(oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_EVIL, OBJECT_SELF) == 0 && ResistSpell(OBJECT_SELF, oTarget) != 1) /// типы спасброска имеют значение? можно ли указать два типа сразу для одного броска, например, TYPE_EVIL и TYPE_NEGATIVE? { if (oHecatomb != OBJECT_INVALID && (GetTag(oHecatomb) == "hecatomb_small" | GetTag(oHecatomb) == "hecatomb_medium" | GetTag(oHecatomb) == "hecatomb_great") && (GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD) && (GetDistanceBetween(oHecatomb, oTarget) <= 100.0)) /// я не уверен, ставить ли && или &. смысл: "если объект с одним из трех тегов найден, И если oTarget - не нежить, И если oTarget в пределах ста метров от объекта с тегом"... { AssignCommand(oTarget, ActionMoveToObject(oHecatomb, 0.0f))); /// oTarget идет к триггеру так, чтобы зайти на него. SetLocalInt(oTarget, "seeking_hecatomb", 1); DelayCommand(IntToFloat(nDuration), SpellExpired()); /// когда срок вышел, то... while (GetLocalInt(oTarget, "seeking_hecatomb") == 1) { if (nHealth < GetLocalVariable(oTarget, "health")) { ClearAllActions(oTarget); SetLocalVariable(oTarget, "health", nHealth); DelayCommand(IntToFloat(nDuration), DeleteLocalInt(oTarget, "seeking_hecatomb")); /// пока идет к триггеру, любая рана отменяет эффект } } } } else if ((GetObjectSeen(OBJECT_SELF), oTarget) == TRUE) { SetIsTemporaryEnemy(OBJECT_SELF, oTarget, TRUE, fHateLasts); /// при неудачной попытке нападает на мага DetermineCombatRound(); } } void main() /// как я понимаю, void main() выполняется раньше всех функций { int nSpell = GetSpellId(); object oTarget = GetSpellTargetObject(); effect eDark = EffectVisualEffect(VFX_DUR_BLINDVISION, FALSE); int nMetaMagic = GetMetaMagicFeat(); if(nSpell == 5002) /// куда вписывать эти значения? в spells.2da? { SignalEvent(oTarget, EventSpellCastAt(oTarget, SPELL_RAVENS_FEAST, FALSE)); /// а константы? ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDark, oTarget, 1.0); /// затемнение AdjustAlignment(OBJECT_SELF, 5, -5); /// правильно указал сдвиг ко злу? SeekHecatombHolocaust(); } } Теперь говорите, что не так. |
![]() ![]() |
Текстовая версия | Сейчас: 13th June 2025 - 15:02 |