[GIINK] Ilość kontrolowanych przyzywańców zależna od poziomu postaci 2578 0

O temacie

Autor Czudak

Zaczęty 10.10.2018 roku

Wyświetleń 2578

Odpowiedzi 0

Czudak

Czudak

Użytkownicy
posty144
Propsy61
ProfesjaSkrypter
  • Użytkownicy

Czy kiedykolwiek zdarzyło ci się przystanąć i zastanowić jak to jest, że nawet niskopoziomowy mag ognia potrafi stworzyć dziesięć szkieletów, które wesoło rozsmarują każdego przeciwnika na ścianie, a to wszystko weryfikowane właściwie tylko ilością dostępnej czarownikowi Many?

No właśnie. Nawet w starożytnym AD&D ilość przyzywańców które dało się ujarzmić naraz była zależna od poziomu sprowadzającego, który z grubsza określał jego ogólną potęgę i zaawansowanie w sztukach magicznych.

Na własne potrzeby stworzyłem system, w którym nie da się przyzywać i tworzyć popleczników bez końca, bo jest to kontrolowane poziomem doświadczenia, a który odpowiada za to jak wiele poczwar jednocześnie będzie się swojego "szefa" słuchać.



Założenia wstępne:
- po przekroczeniu limitu (którym jest własny poziom doświadczenia), wszystkie osobiście przyzwane i stworzone potwory atakują gracza, co ma wyrażać ich grupową awersję do bycia kontrolowanymi
- omówiony system nie dotyczy szkieletowych magów, którzy są jedynymi NPCami oprócz gracza potrafiącymi tworzyć sprzymierzeńców (wrodzona władza nad nieumarłymi i takie tam; jak ktoś chce to sobie podepnie pod ich skrypty)
- nie zmieniałem nic we wstępnych nastawieniach przyzywańców, bo system rewiduje czy pora na oklep funkcją B_MM_AssessEnemy, która działa niezależnie od innych zmiennych
- podopiecznych wciąż można wysłać na zieloną trawkę, próbując z nimi rozmawiać, gdy nie są związani walką, tak jak było
- brak ograniczeń dla szkieletów stworzonych zaklęciem "Armia Ciemności" (bo to najpotężniejsze zaklęcie przyzywające i runiczne opus magnum przyzywacza)



Skryptowy przepis:

1. Najpierw do (...)_WORK\DATA\SCRIPTS\CONTENT\STORY\STORY_GLOBALS.D dodaj zmienną var int SUMMONCOUNTER (albo jak chcesz ją sobie tam nazwać; tylko sobie gdzieś to zapisz, bo byłoby trochę głupio gdybyś zapomniał, a potem się frustrował, gdy skrypty się nie kompilują).

2. Potem w każdym z zaklęć przyzywających (...)_WORK\DATA\SCRIPTS\CONTENT\AI\MAGIC\SPELLS\SUMMON_***.D (jest ich siedem; patrz adnotacja na samym dole) wkomponuj odpowiednie wartości (arbitralnie określone; w segmencie Spell_Cast_***) dla swojego SUMMONCOUNTER. Wartości zostały wybrane na oko, posiłkując się faktem, że w normalnej rozgrywce w Noc Kruka można osiągnąć około 60 poziom doświadczenia bez super kombinowania, i tutaj zostały ustalone są na:
- przyzwany wilk: 5
- stworzony goblini szkielet: 7
- stworzony kamienny strażnik: 11
- stworzony szkielet: 13
- stworzony zombie: 15
- stworzony kamienny golem: 17
- przyzwany demon: 26

Jak widać dopiero powyżej 50 poziomu będzie można władać dwoma demonami albo trzema kamiennymi golemami równocześnie. Chyba nie myślałeś, iż demony będą sobie, ot tak, dziesiątkami służyć jakiemuś pacjentowi, tylko dlatego że nosi szatę maga i ma odpowiednią runę? Się cenią te pomioty. Naturalnie, wartości się dodają, więc 47 poziomowy mag może władać trzema przyzywanymi wilkami (5 x 3 = 15), jednym kamiennym strażnikiem (11), i pojedynczym zombie (15) naraz, nie ryzykując z nimi problemów (15 + 11 + 15 = 41, a 41 < 47). Mógłby nawet dodać jeszcze wilka ekstra do swej drużyny chwatów (41 + 5 = 46, a 46 < 47), a wciąż obyłoby się bez komplikacji.

Sam możesz sobie dobrać wartości takie jakie chcesz. Nieźle, nie?

3. Prawie zrobione! W funkcji (...)_WORK\DATA\SCRIPTS\CONTENT\AI\MONSTER\B_MONSTER\B_MM_ASSESSPLAYER.D dorzuć kod (i dokładnie w tym miejscu, bo inaczej ci nie pójdzie jak Nadji w deszcz):
Spoiler
if(self.aivar[AIV_PARTYMEMBER] == TRUE)
{
if((Npc_GetDistToNpc(self,hero) < 500) && !C_BodyStateContains(self,BS_STAND))
{
Npc_ClearAIQueue(self);
AI_Standup(self);
AI_TurnToNPC(self,hero);
};
if((SummonCounter > hero.level) && (self.guild > GIL_SEPERATOR_HUM))
{
B_MM_AssessEnemy();
return;
};
};

4. Na koniec, w funkcji (...)_WORK\DATA\SCRIPTS\CONTENT\STORY\B_STORY\B_GIVEDEATHINV.D (bardzo ważne, gdyż ta funkcja jest wykonywana tylko raz; inaczej pojawią się problemy z licznikiem SUMMONCOUNTER przy zapisywaniu/ładowaniu gry, i bałagan gotowy) wstaw to co poniżej (pamiętaj aby zmienić liczby i tutaj, jeśli zmieniłeś je też w punkcie nr 2 tego samouczka, na równoważne):

Spoiler
if(slf.aivar[AIV_DeathInvGiven] == TRUE)
{
return;
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONED_WOLF)
{
SummonCounter -= 5;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONED_GOBBO_SKELETON)
{
SummonCounter -= 7;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONEDGUARDIAN)
{
SummonCounter -= 11;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONED_SKELETON)
{
SummonCounter -= 13;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONEDZOMBIE)
{
SummonCounter -= 15;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONED_GOLEM)
{
SummonCounter -= 17;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};
if(slf.aivar[AIV_MM_REAL_ID] == ID_SUMMONED_DEMON)
{
SummonCounter -= 26;
if(SummonCounter < 0)
{
SummonCounter = 0;
};
};

I już. W tej chwili stałeś się wymoczkiem, który musi uważać na to ile nieumarłych i konstruktów jest pod jego pieczą, i czy może stworzyć jeszcze nowych do kompletu. Ktoś bardziej wymyślny mógłby dodatkowo wykreować jakąś książkę z wyszczególnionymi wartościami (czy nawet taką, która śledzi je na bieżąco), do umieszczenia w grze, ale ja preferuję doglądać i rachować samemu wszystko na bieżąco. Wiesz, żeby poćwiczyć sobie pamięć.

O czym my to mówiliśmy?



Zaklęcia to:
- SPELL_SUMMONDEMON.D
- SPELL_SUMMONGOBLINSKELETON.D
- SPELL_SUMMONGOLEM.D
- SPELL_SUMMONGUARDIAN.D
- SPELL_SUMMONSKELETON.D
- SPELL_SUMMONWOLF.D
- SPELL_SUMMONZOMBIE.D
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry