Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Нужно проверить несколько скриптов, Также ищу специалиста по AI хенчменов
Chimeric
сообщение Aug 18 2009, 13:12
Сообщение #1


Пушкин
Иконки Групп

Класс: Обыватель
Характер: Chaotic Neutral
Раса: Гигант
NWN: Тексты



Всем привет. Я написал несколько скриптов, связанных с одним и тем же классом - некромантом. Хочется, чтобы мастера скриптового дела поглядели на них. В следующее мое появление здесь я их размещу и буду добавлять мало-помалу. Сам я не специализируюсь на скриптах, к тому же у меня нет возможности их протестировать, да и вообще поиграть в НВН2 - компьютер слишком слаб для него. То, что написано, ориентировано на первую часть НВН и Аврору, поэтому и понадобятся коррективы. Может показаться странным, что я что-то делаю для игры, которую сам не в состоянии запустить, но меня увлекает создание контента. Главное - ставить достижимые цели.

Еще (и здесь уже я полный профан) может понадобиться человек, хорошо знакомый с AI хенчменов. Есть идея сделать для некроманта хенчмена-гуля (я нашел интересное заклинание в Wizard Spell Compendium для AD&D). За мной в этом случае будет диалог или диалоги, но я не берусь перевести в код странные привычки, каких, вы понимаете, от гуля можно ждать. Заинтересовавшихся спецов прошу отметиться здесь.

Айван, Лекс, а не сделать ли это очередным конкурсом? Назовите его "Лучший AI для необычного хенчмена" или как-то так, и в качестве хенчмена, чтобы был фокус, назначить именно спутника-гуля. Тогда мы получили бы несколько работ и взяли бы лучшее из них. Этот замысел с гулем и скриптами для некроманта - не для моего личного пользования. Я не планирую ввести их в какой-нибудь свой модуль. Наоборот, я хочу сделать некий полезный набор, упругий пакет, достаточно соблазнительный и полный, чтобы приманить распорядителей шардов. Пусть они посмотрят на дополненного и исправленного некроманта и скажут себе "Эй, а ведь наш-то некромант - скучнее, просто hack-n-slash... Возьмем этого".

Сообщение отредактировал Chimeric - Aug 18 2009, 13:14
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Chimeric
сообщение Aug 18 2009, 16:49
Сообщение #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();



}

}


Теперь говорите, что не так.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 13th June 2025 - 15:02