Skalowanie zaklęć 2614 6

O temacie

Autor WayneBlack

Zaczęty 7.06.2016 roku

Wyświetleń 2614

Odpowiedzi 6

WayneBlack

WayneBlack

Użytkownicy
posty30
Propsy6
ProfesjaSkrypter
  • Użytkownicy
Dobry! To znowu ja. W swej zabawie ze skryptami zawsze mi mało i ostatnio wpadłem na pomysł, by zrobić coś, by zaklęcia skalowały się (rosły w siłę) wraz z poziomem many, bądź kręgami magii.

Jedno i drugie kompletnie mi nie wychodzi - chociaż stworzyłem funkcję, która zakładała - dla przykładu, że Kula Ognia co krąg magii dostaje dodatkowe 5 obrażeń (bazowa wartość to 50, na VI kręgu byłoby to 80) - i skrypty działały, nie wyskoczył mi żaden błąd, to jednak efekt nie działał - testowana Kula Ognia zawsze zadawała 50 obrażeń, niezależnie od kręgu magii rzucającego.

Co do prób przeliczników od maksymalnej many nawet się nie wypowiem, bo jedyne, co widziałem, to błąd za błędem w zSpy, więc...

Ma ktoś jakiś pomysł, jak to można rozwiązać?

Podpowiem, że ktoś na tym forum podawał kiedyś skrypt na mikstury skalujące się z maks życiem i maks maną - więc da się wyciągnąć procenty. Tylko ja najwyraźniej nie umiem... hueh.
 

FOgidel

FOgidel

Użytkownicy
posty60
Propsy100
ProfesjaSkrypter
  • Użytkownicy
Dodaj do B_Asses_Magic, czy jakoś tak. Musi działać.
Musisz dodać np. B_MagicHurtNPC (różne w różnych częściach)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Potrzebujesz pliku C_CanNpcCollideWithSpell.d. Musisz ustawić swój skrypt zaraz na początku, przed jakimkolwiek return.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

WayneBlack

WayneBlack

Użytkownicy
posty30
Propsy6
ProfesjaSkrypter
  • Użytkownicy
Nie za bardzo zrozumiałem ^-^

Który skrypt miałbym gdzie wstawić? Zwróćcie uwagę, że podałem dwa rodzaje skalowania.

I chciałbym jakąś podpowiedź, JAK miałby ten kod wyglądać, by miał sens.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
To może tak, jeśli nie wiesz, jak napisać ten skrypt, odłóż to na potem jak już będziesz ogarniał jak co pisać. Nie ma sensu męczyć się z czymś czego nie rozumiesz. Poznaj Gothicowe skrypty, a odpowiedź zjawi się sama.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

WayneBlack

WayneBlack

Użytkownicy
posty30
Propsy6
ProfesjaSkrypter
  • Użytkownicy

WayneBlack

Skalowanie zaklęć
#5 2016-06-07, 18:19(Ostatnia zmiana: 2016-06-08, 11:55)
Mówisz do człowieka, który od paru lat bawi się skryptami. Po prostu chciałem spróbować czegoś innego - dlatego warto byłoby pomóc, prawda?

EDIT.: Teraz jeszcze zauważyłem, że źle przeczytałem pierwszą odpowiedź w temacie... muszę sobie zapisać, by nie brać się za skrypty, jak padam na ryj.

Post połączony: 2016-06-08, 11:50
Spędziłem większość wczorajszego dnia i godzinę dzisiejszego... ale w końcu mi wyszło. Nie były mi potrzebne żadne z plików, jakie podaliście - chociaż w nich też się bawiłem.

Niestety, skalowanie tylko na podstawie kręgu magii... ale to i tak już coś, mi się to podoba. Wstawię kod tej przykładowej Kuli Ognia, jakby ktoś był zainteresowany.

const int SPL_Cost_InstantFireball = 15;
const int SPL_Damage_InstantFireball = 60;



INSTANCE Spell_InstantFireball (C_Spell_Proto)
{
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 0)
{
SPL_Damage_InstantFireball = 60;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 1)
{
SPL_Damage_InstantFireball = 65;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 2)
{
SPL_Damage_InstantFireball = 70;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 3)
{
SPL_Damage_InstantFireball = 75;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 4)
{
SPL_Damage_InstantFireball = 80;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 5)
{
SPL_Damage_InstantFireball = 85;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
}
if (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 6)
{
SPL_Damage_InstantFireball = 90;
time_per_mana = 0;
damage_per_level = SPL_Damage_InstantFireball;
damageType = DAM_MAGIC|DAM_FIRE;
};
// war vorher DAM_FIRE
};

func int Spell_Logic_InstantFireball (var int manaInvested)
{
if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_InstantFireball))
{
return SPL_SENDCAST;
}
else if (self.attribute[ATR_MANA] >= SPL_Cost_InstantFireball)
{
return SPL_SENDCAST;
}
else //nicht genug Mana
{
return SPL_SENDSTOP;
};
};


func void Spell_Cast_InstantFireball()
{
if (Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_InstantFireball;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_InstantFireball;
};

self.aivar[AIV_SelectSpell] += 1;
};

PS.: Moja Kula Ognia ma ustawione dwojakie obrażenia - magia i ogień (DAM_MAGIC|DAM_FIRE), co oznacza, że po trafieniu w cel podpali i zacznie zadawać obrażenia od ognia co sekundę - podstawowo obrażenia te wynoszą 50/sek przez 6 sekund... więc przesadnie dużo. Poradzić mogę dwie rzeczy: 1 - prostsze - ustawcie tylko DAM_MAGIC, usuńcie to DAM_FIRE. 2 - zostawcie obrażenia od ognia, spoko... tylko w pliku content/_intern/constants trzeba zmienić:
CONST INT NPC_BURN_DAMAGE_POINTS_PER_INTERVALL = 50 ;... na jakąś rozsądną wartość. Ja mam ustawione 8. Wtedy trzeba też uwzględnić przedmioty (zbroje/ubrania, amulety, pierścienie, pasy) dające ochronę przed ogniem - bo każdy 1 punkt ochrony to 1 punkt obrażeń mniej. Tak tylko mówię, ja się z tym bawiłem nieźle i nie żałuję.

PS.2: Zwróćcie uwagę na koszt many przy używaniu zwoju - już kiedyś to pisałem, że ustawiłem u siebie tak, by użycie zwoju kosztowało tyle samo many, co użycie runy.

PS.3: Pierwsze podane obrażenia Kuli Ognia (linijka: const int SPL_Damage_InstantFireball          = 60;) może dotyczyć tylko NPC... jeśli tak jest, to ustawcie tę wartość na jakąś rozsądną dla ogółu.

PS.4: KAŻDA postać ma ustawione podstawowo, że jej krąg magii wynosi 6, dlatego - jeśli jednak ta liczba z PS.3 nie odnosi się do NPC, a warunek kręgu magii już tak... to w sumie to ok, ale każda postać magiczna, jaką spotkacie, będzie was bić za maksymalne obrażenia, podczas gdy wy musicie dojść do szóstego kręgu, by to osiągnąć.

Dziękuję za "pomoc" osobie, której jedynym celem było nabicie postów na forum i próba obrażenia mnie. Źle się czułem, do tej pory nie jest ze mną dobrze, więc pomyślałem, że zwrócę się o pomoc, że ktoś mi chociaż trochę ułatwi zadanie. No ale... widać, średnio z tym u niektórych.
 

WayneBlack

WayneBlack

Użytkownicy
posty30
Propsy6
ProfesjaSkrypter
  • Użytkownicy
Hejo! Znów ja, mam dla kogoś pewną ciekawostkę, jakby chciał się pobawić jeszcze skalowaniem zaklęć.

Otóż, najtrudniej było mi zrobić coś, by skalowaniu uległy zaklęcia przywoływania... zrobienie tak, by było to w miarę wyważone i ciekawe, a jednocześnie jakoś fabularnie pasujące do realiów gry, było trudne - nie tyle wykonanie, co pomysł.

Ale ostatecznie udało mi się wpaść na coś. Wchodzimy do: content/AI/monster/RNT_monster/ZS_MM_RTN_Summoned - i tam bawimy się opcjami dotyczącymi przywołanych stworów. Ja mam ustawione tak:
func void B_SummonedAssessTalk()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, 0);
};

func void ZS_MM_Rtn_Summoned ()
{
Npc_SetPercTime (self, 1);
Npc_PercEnable (self, PERC_ASSESSPLAYER, B_MM_AssessPlayer);
Npc_PercEnable (self, PERC_ASSESSENEMY, B_MM_AssessEnemy);

Npc_PercEnable (self, PERC_ASSESSMAGIC,  B_AssessMagic);
Npc_PercEnable (self, PERC_ASSESSDAMAGE, B_MM_AssessDamage);
Npc_PercEnable (self,  PERC_ASSESSFIGHTSOUND, B_MM_AssessOthersDamage);

if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector))
{
Npc_PercEnable (self, PERC_ASSESSTALK, B_AssessTalk);
}
else
{
Npc_PercEnable (self, PERC_ASSESSTALK, B_SummonedAssessTalk);
};

// FUNC

B_SetAttitude (self, ATT_FRIENDLY);
self.aivar[AIV_PARTYMEMBER] = TRUE;

AI_StandUp (self);
AI_SetWalkmode (self, NPC_RUN);
};

func int ZS_MM_Rtn_Summoned_Loop()
{
// ------ beim Spieler bleiben ------
   B_MM_WispDetect ();
   if (Npc_GetDistToNpc (self, hero) > 800)
   {
AI_GotoNpc (self, hero);
   }
   else //<= 500
   {
if (Npc_GetStateTime(self) >= 1)
{
// ------ zum Spieler drehen ------
if (!Npc_CanSeeNpc(self, hero))
{
AI_TurnToNpc (self, hero);
};

// ------ Summon Time -------
self.aivar[AIV_SummonTime] = (self.aivar[AIV_SummonTime] + Npc_GetStateTime(self));

if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 0)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -5);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 1)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -3);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 2)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -2);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 3)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -1);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 4)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, 0);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 5)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, +1);
}
if (self.aivar[AIV_SummonTime] >= 1)
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) == 6)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, +2);
};

Npc_SetStateTime (self, 0);
};
};

self.wp = Npc_GetNearestWP (self);
return LOOP_CONTINUE;
};

Co to wszystko oznacza? Po kolei:
- potwory, do których się odzywamy, nie umierają
 - w odpowiednim pliku (content/AI/Monster/B_Monster/B_IniMonsterAttitudes) ustawiłem reagowanie przywołanych potworów na siebie na wzajem, na ludzi, oraz reagowanie ludzi na przywołane potwory - by były to reakcje neutralne - dzięki temu możecie cieszyć się obecnością pupila, póki nie umrze, a NPC nie zaatakują go bez powodu, tak samo jak i on nie zaatakuje nikogo, póki nie zrobicie tego wy sami, bądź nie będzie musiał was bronić
- potwory nie mają czasu przywołania - odchodzą dopiero, gdy ich życie spadnie do 0 - jednak w odpowiednim miejscu (content/AI/AI_intern/AI_cinstants) znajdujecie linijkę:
const int MONSTER_SUMMON_TIME = 60... i zmieniacie z bazowego 60, na jakąś niebotyczną, niemożliwą do osiągnięcia liczbę (jak na przykład 9999999999999) - dzięki temu życie przywołanej istoty będzie wynosiło tę ilość sekund
- normalnie potwory umierały po tym czasie, jednak teraz - zależnie od kręgu:
0 krąg - przywołany potwór traci 5 punktów zdrowia co sekundę
1 krąg - przywołany potwór traci 3 punkty zdrowia co sekundę
2 krąg - przywołany potwór traci 2 punkty zdrowia co sekundę
3 krąg - przywołany potwór traci 1 punkt zdrowia co sekundę
4 krąg - przywołany potwór nie traci/nie zyskuje zdrowia
5 krąg - przywołany potwór odnawia 1 punkt zdrowia co sekundę
6 krąg - przywołany potwór odnawia 2 punkty zdrowia co sekundę

Oczywiście, liczby można zmieniać wedle uznania!

 


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