Funktionsaufruf - wie läuft das ab?

#1
Ich habe ja die Funktionsweise von Funktionen nie so richtig durchstiegen, aber jetzt komme ich an einen Punkt, da ich vermutlich nicht mehr (sinnvoll) ohne auskomme. Darum die Frage, ob mir das bitte jemand erklären kann.
Mein Beispiel: Wertepaarung.

DialogID3 liest in der Funktion processtext Werte ein und ruft dann aus einer for-Schleife heraus eine Funktion "ergebnis(wert)" zur Berechnung des dazugehörigen Ergebnisses auf. Diese Funktion ist in DialogID2 definiert. Meine Erwartung ist jetzt, dass nach Aufruf der Funktion in die for-Schleife direkt mit dem Ergebnis zurückgekehrt wird. Tatsächlich aber beginnt der DialogID3 wieder von vorn.

Liegt das daran, dass nach der in 2 definierten Ergebnis-Funktion eine function forward() mit return 3; ist? DialogID2 wird von einem Gegenstand aufgerufen. Gleich vom Gegenstand auf DialogID3 verweisen funktioniert ja auch nicht, weil dann die Funktion ergebnis noch nicht definiert und damit unbekannt ist. Die function forward() aus 2 wegzulassen geht auch nicht, weil dann der (empty) Dialog abbricht, auch mit

Mir leuchtet das nicht ein. Wo liegt der Fehler?
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#2
Häng am besten mal die ids direkt hier an. Dann kann man selber damit rumspielen.

Hast Du mal probiert, die funktion in id3 nochmal zu definieren. Ich bin mir nicht 100% sicher, ob man die Funktion in späteren ids abrufen kann (glaube aber schon).
Hast Du in id2 eventuell versehentlich die function forward mit in den Klammern der Funktion, so dass das bei Funktionsaufruf mit ausgeführt wird?

#3
Danke für die Antwort!
Ich habe ein wenig getestet, und obwohl es aussieht, als wenn die Dialoge mehrfach durchlaufen werden, funktioniert im wesentlichen alles wie es soll. Ich möchte noch nicht zu viel verraten, deswegen hatte ich noch keinen Code hier hin geschrieben. Ich mach das mal bis zu proof-of-concept fertig, und dann würde ich mich riesig freuen, wenn wir da noch mal drauf schauen und optimieren :-)
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#4
[quote='Yuan DeLazar','index.php?page=Thread&postID=118882#post118882']Ich mach das mal bis zu proof-of-concept fertig, und dann würde ich mich riesig freuen, wenn wir da noch mal drauf schauen und optimieren :-)[/quote]
gerne.

#5
So, meine Freunde des gepflegten DSA4.1-Steigerungssystems. Es ist soweit. Es ist mir eine besondere Freude Euch meinen Beweis-des-Konzepts vorzustellen. Es ist explizit noch keine fertige Version - es fehlen noch die Komfort-Features. Aber in der Form kann die Mod leicht erweitert werden und auch für die Helden-"Generierung" aufgebohrt werden. Sogar die Umsetzung von einigen Vor- und Nachteilen ist damit denkbar (aber nicht geplant). Die Steigerung kann in der Testversion jederzeit (außer im Kampf) gestartet werden und unterliegt keiner weiteren Einschränkung als die bisher gesammelten AP. Gestartet wird die Steigerung über das *Schuhwerk*! ("aufsteigen", haha. Wissenschon, Wortwitz).

[s]Falls jemand helfen möchte: Ich bräuchte eine Liste mit allen Gegenständen und Effekten, die die Eigenschaften bzw. Talente beeinflussen - am besten gleich mit ID und textID der Eigenschaft[/s] (oder an die technisch Versierten: Eine Möglichkeit die "Basiswerte" auszulesen).
Erledigt.

@ Craftys: Ein Möglichkeit explizit den PA- und AT-Wert anzusprechen wäre noch der i-Punkt. Wäre super, wenn das im nächsten Patch möglich wäre.

@Mordbrenner: Den Funktionsaufruf "Kosten" findest du in DialogID 11. Fügt man da einen debugLog ein, wird der mehrfach geschrieben, weswegen ich glaube, dass auch die gesamten Dialoge mehrfach durchlaufen werden, ohne dass ich erkennen kann warum.

Die aktuelle Version gibt es hier.
Zuletzt geändert von Yuan DeLazar am 29. Okt 2015, 12:27, insgesamt 1-mal geändert.
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#6
[quote='Yuan DeLazar','index.php?page=Thread&postID=118943#post118943']Falls jemand helfen möchte: Ich bräuchte eine Liste mit allen Gegenständen und Effekten, die die Eigenschaften bzw. Talente beeinflussen - am besten gleich mit ID und textID der Eigenschaft (oder an die technisch Versierten: Eine Möglichkeit die "Basiswerte" auszulesen).[/quote]Oh, ja, das ist kniffelig. Eine Liste der items und Effekte ist leider ja auch nicht ideal, da es sich dann mit jeglichen anderen Mods, die items oder Effekte verändern, beißen würde. Hmpf! Allerdings fällt mir auf die Schnelle auch keine Möglichkeit ein, den Grundwert auszulesen. Ich denk aber mal drüber nach...

Hmmm, eine Idee wäre: Effekte auslesen (getCharEffects), variable mit den Effekten schreiben. Effekte Löschen. Alle items unequippen in ein itemset. DANN getCharAttribute und dann die Effekte wieder setzen und die items wieder ausrüsten. Etwas umständlich und vermutlich gibt es da Probleme mit der Effekt-Dauer, aber das mal so als erste Idee. Alternativ könnte man auch zu allen Effekten Anti-Effekte setzen und diese dann wieder aufheben. Dann hat man das Problem mit der Dauer nicht (dafür dann aber mit anderen Mods).
[quote='Yuan DeLazar','index.php?page=Thread&postID=118943#post118943']@Mordbrenner: Den Funktionsaufruf "Kosten" findest du in DialogID 11. Fügt man da einen debugLog ein, wird der mehrfach geschrieben, weswegen ich glaube, dass auch die gesamten Dialoge mehrfach durchlaufen werden, ohne dass ich erkennen kann warum.[/quote]schau ich mir mal an...

#7
[quote='Yuan DeLazar','index.php?page=Thread&postID=118943#post118943']@Mordbrenner: Den Funktionsaufruf "Kosten" findest du in DialogID 11. Fügt man da einen debugLog ein, wird der mehrfach geschrieben, weswegen ich glaube, dass auch die gesamten Dialoge mehrfach durchlaufen werden, ohne dass ich erkennen kann warum.[/quote]
Nur mal so ins Blaue: Du hast eine functionforward, die nur 255 oder nichts zurückliefert und hast dann trotzdem noch die responses. Kannst Du die functionforward nicht in eine separate id auslagern, wo Du dann return 255 machst oder return 11 und in id11 entfällt die functionforward dann.

#8
[quote='Yuan DeLazar','index.php?page=Thread&postID=118943#post118943']Ich bräuchte eine Liste mit allen Gegenständen und Effekten, die die Eigenschaften bzw. Talente beeinflussen...[/quote]
Vielleicht hilft dir dabei auch die Komplettlösung. Im Anhang gibt es Gegenstandslisten und bei jedem Gegenstand steht ja dabei, ob es was kann, und wenn ja, was. Zudem steht auch immer die Item-ID zu Beginn des Gegenstandes.

#9
Danke für Eure Antworten!

@Mordbrenner:
Die function forward in DialogID11 ist auskommentiert, also deaktiviert. Die hatte ich getestet, um damit aus der function processtext auszubrechen in eine andere DialogID rein, hat aber nicht geklappt. Ich werfe das in der nächsten Version raus.

Zu den Listen von Effekten und Gegenständen:
Hab ich fertig - ging doch deutlich schneller als erwartet. Ich habe "Anti-Gegenstände" und "Anti-Effekte" drauf gemacht (mit dem Nachteil der fehlenden Modkombatibilität) und teilweise die Steigerung nicht erlaubt bis der Effekt weg ist (Krankheiten, Drogen, tot, Kampf).

Steigerungsvereinfachungen durch die Magieschule sind jetzt auch berücksichtigt, die stufengebundene Steigerung vollständig deaktiviert. Es gibt Maximalwerte für die Haupteigenschaften in Abhängigkeit von ihren Startwerten und Maximalwerte für Kampftalente (GE oder KK +3). Schlechte Eigenschaften können bis 0 gesenkt werden. Alle übrigen Talente und Zauber können ersteinmal bis 18 gesteigert werden. Als nächstes kommt noch die Möglichkeit, die AP-Kosten prozentual einzustellen, damit jeder selbst den Schwierigkeitgrad des Spiels und seine Heldenentwicklung anpassen kann. Die freien AP für die erste Stufe werden mit [s]2xProzentsatz[/s] 200 angesetzt.
Zuletzt geändert von Yuan DeLazar am 29. Okt 2015, 11:51, insgesamt 1-mal geändert.
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#10
[quote='Yuan DeLazar','index.php?page=Thread&postID=118951#post118951']Die function forward in DialogID11 ist auskommentiert, also deaktiviert. Die hatte ich getestet, um damit aus der function processtext auszubrechen in eine andere DialogID rein, hat aber nicht geklappt.[/quote]
Ah, ok, hatte ich übersehen...
Wo genau hattest Du den den debuglog, der mehrfch ausgeführt wurde?

#11
Ich hatte gerade noch einen Gedanken:
modifyCharAttribute dürfte doch eigentlich nur den Grundwert verändern, oder? Also danach müssten doch Effekte/items direkt wieder wirken.

Beispiel. Ich hab nen KK-Gürtel mit KK+3 und nen Attributo-Effekt mit KK+2, macht KK+5. Grundwert KK ist 10.
getCharAttribute liefert ja 15 zurück (oder nicht?)
wenn ich dann modifyCharAttribute("KK",i,15) mache, müsste danach der Held doch KK=20 haben, weil zusätzlich zum Wert dann ja wieder Effekt und item wirken, oder nicht?

Dann könnte man doch

Code: Alles auswählen

a=getCharAttribute("KK",i);
setCharAttribute("KK",i,a);
b=getCharAttribute("KK",i);
aktuellerBonus=b-a;
Grundwert=a-aktuellerBonus;
setCharAttribute("KK",i,Grundwert);
machen und hat in der variable Grundwert den unmodifizierten Wert.
Oder funktioniert das so nicht?

#12
[quote='lunatic','index.php?page=Thread&postID=118958#post118958']Nur mal als kurzer Hinweis: modifyCharAttribute setzt nicht den neuen Wert, sondern verändert um das übergebene Delta.
Und setCharAttribute gibt es gar nicht.[/quote]
Mist. Mein Denkfehler. Schade, dann klappt das so wohl doch nicht...

#13
De Debuglog ist jetzt raus. Kannst aber an praktisch jeder beliebigen Stelle einsetzen, sagen wir z.B. bei der Variablendeklaration von ID11 debugLog("just passed here");. Der wird dann mehrfach in die Konsole geschrieben.

Zum modifyCharAttribute: Stimmt, das ändert um einen Modifikator, schreibt den Wert nicht neu. Das klappt ja auch ganz gut soweit, nur sind die AP-Kosten abhängig davon, was als getCharAttribute eingelesen wird. Und eingelesen wird der aktuelle Wert mit Boni/Mali. Die Steigerung selbst ist davon unberührt - wenn man von der Abfrage der erlaubten Maximalwerte absieht: Jemand, der mit KK 14 das Spiel beginnt, dürfte bis 21 steigern. Hat er den Kraftgürtel an, kommt er aber effektiv nicht über 18 hinaus, bezahlt aber schon fleißig die höheren Steigerungen. Daher habe ich eine Prüfung auf Eigenschaftsverändernde Gegenstände eingebaut, die dann solche Boni/Mali wieder rausrechnet. Funktioniert natürlich nicht so gut, wenn diese Gegenstände durch eine Mod verändert werden. Kann man aber in einer solchen Mod über ein abgesprochenes specialState makieren, das kann ich dann für die Steigerung einlesen.
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#14
[quote='Yuan DeLazar','index.php?page=Thread&postID=118968#post118968']De Debuglog ist jetzt raus. Kannst aber an praktisch jeder beliebigen Stelle einsetzen, sagen wir z.B. bei der Variablendeklaration von ID11 debugLog("just passed here");. Der wird dann mehrfach in die Konsole geschrieben.[/quote]
Ich hab mal testweise durchnummerierte debug-logs reingeschrieben. Interessanter Weise wird nur das innerhalb der processtext mehrfach wiederholt.
Eventuell wird das processtext einfach mehrfach ausgeführt, für jede Variable, die ersetzt wird. Oder für jeden Textkey (inkl. responses).
Alternativ könnte auch irgendwo ein Klammerfehler sein. Mein Editor zeigt mir irgendwie die Klammer-Zugehörigkeit der äußersten Klammer von processtext nicht an. Vielleicht ist das Programm aber auch nur mit der Vielzahl der Klammern überfordert...

#15
So, hier noch eine Idee bezüglich der Grundwerte:
Innerhalb von Effects gibt es getEffect und setEffect
Du müsstest damit einen Effekt machen können, den Du in z.B. id1 der Steigerung setzt. Der Effekt hat onAdd dann ein getEffect/setEffect und setzt entsprechend den Effekt so, dass getEffect=0 wird.
Am Ende der Steigerung nimmst Du den Effekt dann einfach wieder runter und hast dann wieder die veränderten Werte.

Beispiel:

Code: Alles auswählen

function OnAdd() {
while (getEffect("KK")>0) {
setEffect("KK",-1);

}

#16
Hmm, mit dem Effect hatte ich leider kein Erfolg. Ich habe es auch zusätzlich damit probiert, was ja dasselbe sein sollte:

Code: Alles auswählen

function OnAdd() {
	var mod = getEffect("KK");
	setEffect("KK",-mod);
}
Da passiert mit beiden Varianten nix. Der Effekt wird als aktiv auf dem KK-Gürtel tragenden Charakter angezeigt, aber die KK ändert sich nicht. setEffect("KK",-1); geht wiederum, woraus ich schließe, dass es mit dem getEffect nicht klappt. Ich habe das getEffect auch nur bei Krankheiten gefunden, damit sieht es für mich aus, als ist das selbstreferenziert: Also wenn der Effekt selbst die KK geändert hat, dann ist das mit getEffect zu finden.

Klammerfehler glaube ich nicht. Da achte ich inzwischen sehr drauf, alles vorbildlich eingerückt, Notepad++ zeigt das ziemlich gut an und wenn eine Klammer fehlt, heult das Spiel. Die äußerste Klammer von der function processtext ( which, text ) der DiaID11 endet kurz vor Ende der DiaID11, nach return text;.
Wenn eine Klammer aber an einer falschen Stelle hockt, dann schmiert, wenn das Script überhaupt gestartet werden kann, meistens das Programm ab. Dass es da (fast) so läuft, wie es soll, halte ich für unwahrscheinlich.

Warum es für Responses oder gar Textkeys mehrfach durchläuft, verstehe ich nicht. Gerade bei den Textkeys gibt es ja knapp 100 - so oft rauscht es da nicht durch. Ich glaube es ist 8 oder 10x, die die Funktion abgefahren wird.
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#17
Off topic: Juan in deiner Signatur fehlt die Angabe von dem "Modifizierten magischen Kräuterbeutel" als Mod an neunter Stelle.
Ich will vernünftig (möglichst bugfrei :D ) spielen. Gewinnen ist auf Dauer doch irgendwie schöner als (ständig) verlieren. ;)

#18
Ja, mit Absicht. Ich weiß nicht, ob lunatic das so lustig findet, weil es ja ursprünglich seine Mod ist. Deswegen wollte ich die nicht direkt bewerben. Auf der anderen Seite ist lunatics Kräuterbeutel ja jetzt Teil vom Basisspiel, womit sie in keiner Konkurrenz mehr stehen. Na ja, nicht so wild (hoffentlich).
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?

#19
[quote='Yuan DeLazar','index.php?page=Thread&postID=118985#post118985']Da passiert mit beiden Varianten nix. Der Effekt wird als aktiv auf dem KK-Gürtel tragenden Charakter angezeigt, aber die KK ändert sich nicht. setEffect("KK",-1); geht wiederum, woraus ich schließe, dass es mit dem getEffect nicht klappt. Ich habe das getEffect auch nur bei Krankheiten gefunden, damit sieht es für mich aus, als ist das selbstreferenziert: Also wenn der Effekt selbst die KK geändert hat, dann ist das mit getEffect zu finden.[/quote]
Ah, Mist, ja, dass kann sein, dass das getEffect/setEffect quasi nur den Mod durch diesen Effekt ausliest/schreibt. Schade, wieder nichts...

#20
Ich sehe, was du schreibt, aber verstehe nicht, was du sagst :-)
Erst einmal vielen Dank für die Erklärung! Ich verstehe jetzt, *dass* processtext mehrfach ausgeführt wird (der "request+responses"-Anzahl entsprechend) und dass man mit if (which == x) das eindämmen kann. Und du schreibst, dass man mit den Mehrfachdurchläufen Platzhalter der responses austauschen könne. Das widerspricht aber meinen Versuchen, weil ich das nicht geschafft habe (siehe (A) (B) (C) usw.). Auch ist mir nicht klar, wieso es dafür mehrere Durchläufe bräuchte, weil in meinem Kopf ein Platzhalter schon beim ersten Funktionsdurchlauf ersetzt werden würde.
Spiel verbessern? Fehler gefunden? Etwas unklar? Bitte beachten!

Mod-Datenbank SchickHD
Meine SchickHD-Mods *klick*
Meine SchweifHD-Mods *klick*
Probleme mit Mods?
Antworten

Zurück zu „Mod-Talk“