Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 3 von 3
  1. Beiträge anzeigen #1 Zitieren
    Abenteurer Avatar von Senlax
    Registriert seit
    Jan 2021
    Ort
    HH
    Beiträge
    92
     
    Senlax ist offline

    Gothic 1 - Magie casten ohne Unterbrechungen

    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.
    Geändert von Senlax (21.01.2021 um 00:30 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Held Avatar von Teron Gorefiend
    Registriert seit
    Nov 2006
    Ort
    im Alchemielabor
    Beiträge
    5.116
     
    Teron Gorefiend ist offline
    Wenn ich mich nicht irre, wird die Zauberanimation nur unterbrochen, wenn man Schaden nimmt. Bei ausreichend Rüstung (gut gibt immer einen Mindestschaden für den Helden) oder bei unsterblichkeit wird die Zauberanimation nicht beendet.

    Habe mal versucht dies so zu ändern, dass der Held unsterblich ist aber Bei Treffern Schaden im Sinne von NpcChanceAttribute erhält. Leider hab ich diesen Plan aufgegeben, da sich die Schadensberechnung in G2 leicht ändern lässt bei G1 aber zu allen möglichen Fehlern bei mir führte (Spielabsturz beim öffnen von Truhen, Rüstungswerte werden als negative Werte erkannt. etc.)

  3. Beiträge anzeigen #3 Zitieren
    Abenteurer Avatar von Senlax
    Registriert seit
    Jan 2021
    Ort
    HH
    Beiträge
    92
     
    Senlax ist offline
    Zitat Zitat von Teron Gorefiend Beitrag anzeigen
    Wenn ich mich nicht irre, wird die Zauberanimation nur unterbrochen, wenn man Schaden nimmt. Bei ausreichend Rüstung (gut gibt immer einen Mindestschaden für den Helden) oder bei unsterblichkeit wird die Zauberanimation nicht beendet.
    Das ist richtig.
    Sofern du bei dem alten Feuerregen Schaden bekommst, wirst du unterbrochen. Das allerdings schrieb ich ja bereits.
    Das liegt allerdings daran, dass dein Skill aufgeladen wird - mit Mana. Solange du also nicht das benötigte Mana
    investiert hast - solange wird der Cast immer und immer wieder unterbrochen - bis du es geschafft hast oder kein Mana mehr hast.

    Daher mein "neuer" Script - womit das Problem nicht mehr vorhanden ist.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide