Hallo,
ich habe zwar die Suchfunktion verwendet, aber es sind mir absolut zu viele Treffer - daher stelle ich dennoch einmal kurz vor was ich mal vor einiger Zeit gemacht habe.
Viele Gothic 1 Spieler kennen das Problem - du hast z.B. Feuerregen oder Todesring (Uriziel Todeswelle / Massensterben) und willst diese casten.
Du beginnst den Cast - Mana wird verbraucht und dich hittet irgendetwas an - egal ob ein Monster oder z.B. ein NPC.
Du wirst unterbrochen - der Cast beginnt von vorne und deine verbrauchte Manapunkte sind futsch.
Das nervt gewaltig - das kennt jeder. Castzeiten kürzen etc. kenn ich bereits - aber ich wollte es eig. immer wie in G2 haben:
Cast beginnen, Mana direkt weg und Spell ist fertig.
Im folgenden Pfad findet man - "Gothic/_work/Data/Script/Magic/Spell_Logic_Firerain.d"
Code:
func int Spell_Logic_Firerain(var int manaInvested)
{
PrintDebugNpc(PD_MAGIC,"Spell_Logic_Firerain");
if(manaInvested == 0)
{
return SPL_NEXTLEVEL;
};
if(manaInvested >= SPL_SENDCAST_FIRERAIN)
{
return SPL_SENDCAST;
};
return SPL_RECEIVEINVEST;
};
Das sieht dann so aus.
Hier wird gesagt - "if(manaInvested == 0)" invenstiere Mana - welches 0 und springe nun zu "SPL_NEXTLEVEL".
Jetzt beginnt G1 damit den Manawert zu erfassen und abzuziehen "if(manaInvested >= SPL_SENDCAST_FIRERAIN)"
Wenn das erfolgt ist - dann gehe weiter und caste den Spell "SPL_SENDCAST".
Ist das Mana aber nicht ausreichend wird der Spell nicht unterbrochen, sondern solange Mana verbraucht bis es klappt oder du keines mehr hast.
In der nachfolgenden Datei - "Gothic/_work/Data/Script/Magic/spell_params.d" finden wir die anderen Werte:
Code:
const int SPL_SENDCAST_FIRERAIN = 15;
instance Spell_FireRain(C_Spell_Proto)
{
time_per_mana = 175;
damage_per_level = SPL_DAMAGE_FIRERAIN;
spellType = SPELL_BAD;
damagetype = DAM_FIRE;
targetCollectAlgo = TARGET_COLLECT_ALL_FALLBACK_NONE;
targetCollectRange = 1000;
targetCollectAzi = 360;
targetCollectElev = 60;
};
Hier wird gesagt mit "SPL_SENDCAST_FIRERAIN = 15" - dass wir 15 Mana benötigen, um den Feuerregen zu casten.
Wenn man dann "time_per_mana = 175" anschaut - brauchst du pro Mana 175 Gameticks - sprich knapp 3 Sekunden um den Feuerregen voll zu casten.
ABER! selbst wenn du die 175 auf 0 setzen solltest - wird deine Animation nicht sofort rausgebracht - sondern dennoch die 15 Mana erst berechnet
und erst DANN wird der Spell aktiviert.
Somit ist wieder das Problem da - wirst du getroffen, bekommst du einen Recast und beginnst von vorne mit dem Spell.
Woran liegt es also, dass wir den Cast nicht direkt raus bekommen? "return SPL_NEXTLEVEL;" hindert uns daran.
Es kommt erst eine schöne feuerrote Animation - diese kann immer unterbrochen werden, durch Treffer jeglicher Art.
Also muss der Script umgeschrieben werden. Ich bin allerdings kein Profi und habe sehr lange weder mit Turbo Pascal / C++ gearbeitet.
Daher kann es sein, dass man meinen Script ausbessern kann oder ggf. sogar kürzen. Aber mir geht es nur um die Idee,
welche funktioniert.
Code:
func int Spell_Logic_Firerain(var int manaInvested)
{
if(self.attribute[ATR_MANA] >= SPL_SENDCAST_FIRERAIN)
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_SENDCAST_FIRERAIN;
return SPL_SENDCAST;
}
else
{
return SPL_SENDSTOP;
};
return FALSE;
};
Hier legen wir einfach fest - dass das Mana der zu castenden Person genommen werden soll.
Code:
if(self.attribute[ATR_MANA] >= SPL_SENDCAST_FIRERAIN)
Wenn wir also 15 Mana haben - soll der Script weiterspringen und uns auch das Mana abziehen und direkt casten.
Code:
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_SENDCAST_FIRERAIN;
return SPL_SENDCAST;
Nun wird noch einmal überprüft, ob wir noch ausreichend Mana haben
Code:
if(self.attribute[ATR_MANA] <= SPL_SENDCAST_FIRERAIN)
Ist dies nicht mehr der Fall - soll er den Spell stoppen.
PS: Anders als in G2 - wo man 2 Manaberechnungen hat (für Spruchrollen und für Runen), habe ich leider noch keine Idee wie ich das in G1
umsetzen kann. Somit ist folglich das Problem da - du hast Feuerregenspruchrolle - aber du hast z.B. Mana auf 50 gesetzt - dann brauchst du
den gleichen Wert für die Rune und Spruchrolle. Das wurde erst in G2 getrennt behandelt.
Falls es bereits einen Thread wie diesen gibt, dann noch einmal Sorry.
Gruß Freddie R.