[NWN1] Skrypty, buildy i coś jeszcze

Lionel,

Chyba uważnie nie przeczytałeś mojej wiadomości, jak byk widnieje, że najlepszym sposobem byłby OnEnter, HB pozostawiłem jako alternatywę. Zatem proszę, jeszcze raz przeczytaj to, co napisałem, dopiero dziel się mądrościami. A co do samej żarłoczności...

Chyba żartujesz!

Nawet i Commodora 64 nie potrafiłoby to obciążyć, to jest funkcja typowo logiczna - tak; nie - 1; 0. Najlżejsza funkcja w całym NWScript, a ty mówisz, że dając do do HB obciążysz komputery? Więc co powiesz na to:

#include "nw_i0_generic"<br />
void main()<br />
{<br />
    if (GetAILevel() == AI_LEVEL_VERY_LOW) return;<br />
    if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY))<br />
    {<br />
        if(TalentAdvancedBuff(40.0))<br />
        {<br />
            SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE);<br />
            return;<br />
        }<br />
    }<br />
    if(GetHasEffect(EFFECT_TYPE_SLEEP))<br />
    {<br />
        if(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT))<br />
        {<br />
            effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);<br />
            if(d10() > 6)<br />
            {<br />
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);<br />
            }<br />
        }<br />
    }<br />
    else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) )<br />
    {<br />
        WalkWayPoints();<br />
    }<br />
    else if ( !GetIsObjectValid(GetAttemptedAttackTarget())<br />
          && !GetIsObjectValid(GetAttemptedSpellTarget())<br />
          && !GetIsObjectValid(GetNearestSeenEnemy()))<br />
    {<br />
        if (GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) || GetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE) ||<br />
            GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE))<br />
        {<br />
            DetermineSpecialBehavior();<br />
        }<br />
        else if (!IsInConversation(OBJECT_SELF))<br />
        {<br />
            if (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)<br />
                || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)<br />
                || GetIsEncounterCreature())<br />
            {<br />
                PlayMobileAmbientAnimations();<br />
            }<br />
            else if (GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS))<br />
            {<br />
                PlayImmobileAmbientAnimations();<br />
            }<br />
        }<br />
    }<br />
    if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))<br />
    {<br />
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_HEARTBEAT));<br />
    }<br />
}


Jest to oryginalny skrypt Heartbeat stworów bez komentarzy i zbędnych spacji. Wiem, wiem, zaraz mi powiesz, że fragment:

if (GetAILevel() == AI_LEVEL_VERY_LOW) return;


Wszystko załatwia, ale powiedz, kiedy sztuczna inteligencja stworów jest 'bardzo niska'? Kiedy gracza nie ma na obszarze, tak więc sprawdź, ile żarłocznych funkcji się odpali co każde 6 sekund życia potworów, a jak wiesz, niekiedy jest ich naprawdę dużo, zwłaszcza goblinów, a jak wiadomo ciężkość skryptu nie zależy od wielkości kreatury. Czemu więc gra nadal w wielu przypadkach chodzi płynnie niczym woda? Bo może te wszystkie zabiegi nie obciążają aż tak twojego biednego Commodora.

Powiem ci, co tak naprawdę obciąża komputer. Jak słusznie zauważyłeś - animacje, wszyscy wiemy z życia, że czasem gra zatrzymuje się na ułamek sekundy, by wczytać wszystkie efekty wizualne czarów, które rzucił na siebie czarodziej, którego nie dostrzegaliśmy, kule ognia też są - nie wiedzieć czemu - nieprawdopodobnie ciężkie, ale pominąłeś rzecz kluczową. Co jest prawdziwym pogromcą energii? Zdarzenie OnUserDefined. Zauważyłeś może jak cięzki jest moduł demonstracyjny gobliny przeciw koboldy? A dlaczego? Bo każdy z tych stworów ma napisany skrypt właśnie w tym zdarzeniu. Nie mów mi, że powtarzające się co całe 6 sekund sprawdzanie, czy jest noc, czy jej nie ma dorówna temu gigantowi.

Teraz ci pokażę jak jeszcze bardziej zmniejszyć 'wagę':

void main()<br />
{<br />
    if(!GetIsNight()) return;<br />
}


Nic lżejszego trafić się nie może.

Pozdrawiam.
Odpowiedz
← Neverwinter Nights

Skrypty, buildy i coś jeszcze - Odpowiedź

Wczytywanie...