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 4 von 4
  1. Beiträge anzeigen #1 Zitieren
    Halbgott Avatar von axon
    Registriert seit
    Feb 2008
    Beiträge
    9.530
     
    axon ist offline

    Erster MAX-Lerndialog wird auf Lernpunktzähler angerechnet

    Ich habe versucht anhand der Scripte von G2 Classic eine Lernpunktkostensteigerung anhand der erlernten Attribute einzubauen.
    Schien auch auf den ersten Blick zu funktionieren. Es tritt eben ein Probem auf, auf das ich mir keinen rechten Reim machen kann.
    Bei dem ersten Attribut, wo ein Lehrer mir verkündet sein Maximum erreicht zu haben, werden mit die angestrebten Attributspunkte - die ich aber eben nicht erlernen konnte - auf den Zähler angerechnet.
    Also ganz konkret: die Lernpunktkostensteigerung sollte im Normalfall bei 30 erlernten Attributspunkten erfolgen. Wenn jedoch der erste Lehrer, der mir bei 30 vorliegenden Attributspunkten meldet - also bei 20 gelernten - sein Maximum erreicht zu haben, ein Stärkelehrer ist, muss ich anschließend schon ab 25 gelernten Attributspunkte beim charakter helper mehr blechen. Und wenn es ein Lehrer für Geschicklichkeit war, dann bei 25 erlernten Geschicklichkeitspunkten. Aber beim jeweils 2ten Lehrer für ein anderers Attribut, der mir das meldet, hat das dann keinen Einfluss mehr auf die Lernpunktkosten.

    Hier die ensprechenden Skrpte der B_TeachAttributePoints.d:

    Spoiler:(zum lesen bitte Text markieren)
    func int B_TeachAttributePoints(var C_Npc slf,var C_Npc oth,var int attrib,var int points,var int teacherMAX)
    {
    var string concatText;
    var int kosten;
    var int realAttribute;
    kosten = B_GetLearnCostAttribute(oth,attrib) * points;
    if((attrib != ATR_STRENGTH) && (attrib != ATR_DEXTERITY) && (attrib != ATR_MANA_MAX))
    {
    Print("*** ERROR: Wrong Parameter ***");
    return FALSE;
    };
    if(attrib == ATR_STRENGTH)
    && (oth.lp >= kosten)
    && (realAttribute < teacherMAX)
    && ((realAttribute + points) <= teacherMAX)
    {
    realAttribute = oth.attribute[ATR_STRENGTH];
    Str_gelernt = Str_gelernt + points;
    }
    else if(attrib == ATR_STRENGTH)
    {
    realAttribute = oth.attribute[ATR_STRENGTH];
    }
    else if(attrib == ATR_DEXTERITY)
    && (oth.lp >= kosten)
    && (realAttribute < teacherMAX)
    && ((realAttribute + points) <= teacherMAX)
    {
    realAttribute = oth.attribute[ATR_DEXTERITY];
    Dex_gelernt = Dex_gelernt + points;
    }
    else if(attrib == ATR_DEXTERITY)
    {
    realAttribute = oth.attribute[ATR_DEXTERITY];
    }
    else if(attrib == ATR_MANA_MAX)
    && (oth.lp >= kosten)
    && (realAttribute < teacherMAX)
    && ((realAttribute + points) <= teacherMAX)
    {
    realAttribute = oth.attribute[ATR_MANA_MAX];
    Mana_gelernt = Mana_gelernt + points;
    }
    else if(attrib == ATR_MANA_MAX)
    {
    realAttribute = oth.attribute[ATR_MANA_MAX];
    };
    if(realAttribute >= teacherMAX)
    {
    concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
    PrintScreen(concatText,-1,-1,FONT_Screen,2);
    B_Say(slf,oth,"$NOLEARNYOUREBETTER");
    return FALSE;
    };
    if((realAttribute + points) > teacherMAX)
    {
    concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX));
    PrintScreen(concatText,-1,-1,FONT_Screen,2);
    B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
    return FALSE;
    };
    if(oth.lp < kosten)
    {
    PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_Screen,2);
    B_Say(slf,oth,"$NOLEARNNOPOINTS");
    return FALSE;
    };
    oth.lp = oth.lp - kosten;
    B_RaiseAttribute(oth,attrib,points);
    return TRUE;
    };


    Ich hoffe ich habe mich nicht zu ungelenk ausgedrückt... .
    Mitgewirkt an:
    Das Korsarennest (Tester, Sprecher), Dunkle Geheminisse (Übersetzer), Odyssee (Sprecher), X in 1 Mod (Tester), Xeres‘ Rückkehr (Storywriter, Tester, Sprecher)

  2. Beiträge anzeigen #2 Zitieren
    Halbgott Avatar von axon
    Registriert seit
    Feb 2008
    Beiträge
    9.530
     
    axon ist offline
    Ok, ich habe es jetzt einfach mal so geregelt, dass über eine if-Abfrage Punkte beim Zähler wieder abgezogen werden.
    Sonst kam ich hier irgendwie nicht weiter... .
    Mitgewirkt an:
    Das Korsarennest (Tester, Sprecher), Dunkle Geheminisse (Übersetzer), Odyssee (Sprecher), X in 1 Mod (Tester), Xeres‘ Rückkehr (Storywriter, Tester, Sprecher)

  3. Beiträge anzeigen #3 Zitieren
    Auserwählter Avatar von Nincompoop
    Registriert seit
    Aug 2006
    Ort
    Berlin
    Beiträge
    6.346
     
    Nincompoop ist offline
    Hallo,
    Ich habe mir mal erlaubt, deinen Code etwas lesbarer zu gestalten und ein paar Kleinigkeiten zu optimieren:

    - Die Variable "realAttribute" wird in jeder der ersten Verzweigungen gesetzt und zwar jeweils mit Hilfe des Werts, der in "attrib" drin steht.
    Die Zuweisung lässt sich daher rausziehen und dadurch fallen u.a. die "else"-Fälle weg.
    - Das Gleiche gilt für die Abfrage "oth.lp >= kosten".
    - Die Abfrage "realAttribute < teacherMAX" ist in diesen Verzweigungen überflüssig aufgrund der anschließenden Abfrage "realAttribute + points <= teacherMax". Außer "points" ist 0, was man aber eher vorher überprüfen sollte.
    - Die Bedingungen am Ende sollten ebenfalls nach Oben gezogen (oder sogar in eine separate Funktion gesteckt) werden, dadurch kann auch die Abfrage "realAttribute + points <= teacherMax" eingespart werden und es bleibt nur noch die Abfrage "attrib == ATR_XYZ".


    Dabei ist mir auch aufgefallen, dass du die Variable "realAttribute" in den If-Abfragen benutzt, vorher aber gar keinen Wert reinschreibst. Ich habe jetzt lange nichts mehr mit Gothic gemacht, daher weiß ich nicht, wie sich die Variable bei wiederholten Aufrufen der Funktion verhält. Falls sie nicht jedes Mal neu erstellt/zurückgesetzt wird, könnte das schon eine Fehlerquelle sein.

    Beim ersten Aufruf wäre die Variable dann z.B. 0, obwohl der Charakter 25 Stärke hat. Dann kommt die erste Verzweigung und prüft, ob diese 0 + die investierten Lernpunkte (z.B. 10) größer sind als das Maximum des Lehrers (z.B. 30). Dies ist natürlich nicht der Fall. Nun wird bereits "Str_gelernt" um die 10 Lernpunkte erhöht und vor allem wird "realAttribute" nun auf die korrekten 25 des Charakters gesetzt.

    Anschließend kommt noch mal die Abfrage "(realAttribute >= teacherMAX)", um zu bestimmen, ob der Lehrer etwas sagt und den Lernprozess abbricht. Nur wird dieses mal nicht mit 0, sondern eben mit 25 gerechnet. Was hier noch gut geht, bei der nächsten Abfrage, bei der dann die Lernpunkte hinzukommen aber nicht mehr. Damit bricht der Prozess ab und die beiden Schritte "oth.lp = oth.lp - kosten;" und "B_RaiseAttribute(oth,attrib,points);" werden nicht ausgeführt. Der Schritt, der zur Kostenerhöhung führte war da aber schon passiert.
    Das klingt doch sehr nach deinem Problem.

    Hier der umstrukturierte Code: Bis auf die kleine Fehlerverbesserung sollte er genau das Gleiche machen wie vorher. Nur etwas lesbarer.
    Code:
    func int B_TeachAttributePoints(var C_Npc slf,var C_Npc oth,var int attrib,var int points,var int teacherMAX)
    {    
        if((attrib != ATR_STRENGTH) && (attrib != ATR_DEXTERITY) && (attrib != ATR_MANA_MAX))
        {
            Print("*** ERROR: Wrong Parameter ***");
            return FALSE;
        };
        
        var int B_GetLearnCostAttribute(oth,attrib) * points;
        var int realAttribute = oth.attribute[attrib];
        
        if(realAttribute >= teacherMAX)
        {
            PrintScreen(ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX)),-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNYOUREBETTER");
            return FALSE;
        };
        if((realAttribute + points) > teacherMAX)
        {
            PrintScreen(ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToString(teacherMAX)),-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
            return FALSE;
        };
        if(oth.lp < kosten)
        {
            PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_Screen,2);
            B_Say(slf,oth,"$NOLEARNNOPOINTS");
            return FALSE;
        };    
        
        
        if(attrib == ATR_STRENGTH)
        {
            Str_gelernt = Str_gelernt + points;
        }
        else if(attrib == ATR_DEXTERITY)
        {
            Dex_gelernt = Dex_gelernt + points;
        }
        else if(attrib == ATR_MANA_MAX)
        {
            Mana_gelernt = Mana_gelernt + points;
        }
        
        oth.lp = oth.lp - kosten;
        B_RaiseAttribute(oth,attrib,points);
        return TRUE;
    };
    Achso, eins noch: Die Funktion ist als "func int" definiert, gibt aber TRUE/FALSE zurück. Ist das so richtig? Wie gesagt, war lange nicht mehr in der Gothic Welt unterwegs.
    Frohes Neues!

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Habe in den Code nicht reingeschaut, aber: Auch lokale Variablen sind in Gothic "global" (aber scoped, d.h. nur in der Funktion verfügbar). Sie haben bei der zweiten Ausführung noch den Wert, der als letztes hineingeschrieben wurde.

    TRUE/FALSE sind in Gothic (wie in C) als 1/0 definiert. Den Datentyp bool gibt es in Gothic nicht.

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