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:
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)
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.
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!
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.