Hi,
gibt es eine Art debug mode in Wiggles das mich auf Fehler im tcl code aufmerksam macht? Das würde mir das modden um einiges erleichtern.
Gravierende Fehler werden, nach absturz des Spiels, in der tclerrors.txt hinterlegt. Aber kleinere Fehler werden scheinbar vom Script ignoriert. Fehler wie zum Beispiel, wenn ein Wiggle an der Produktionsstätte steht, aber die Produktion nicht beginnen kann, beziehungsweise vollenden kann, weil in der jeweiligen tcl keine Produktionsmethode deklariert wurde, oder der Script nur einen Fehler enthält. Der Wiggle bricht dann einfach ab und die Konsole sagt mir nicht warum. Nur ein Beispiel.
Danke im im voraus.
Wiggles debug mode
Wiggles debug mode
In Discord as: SkyNet#9744
Re: Wiggles debug mode
Hey SkyNet,
ich habe vor einer Weile schon einmal nach debug-Möglichkeiten geschaut. Leider habe ich nur die ersten Zeilen in der Data/systeminit.tcl gefunden.
Leider haben Änderungen an diesen Zeilen keine sichtbaren Auswirkungen gehabt. Aber vielleicht findest du ja heraus, wie man debuggen kann.
Das wäre echt super!
Viele Grüße
Chris
ich habe vor einer Weile schon einmal nach debug-Möglichkeiten geschaut. Leider habe ich nur die ersten Zeilen in der Data/systeminit.tcl gefunden.
Code: Alles auswählen
# log_mask -* +system +tclerror +gui
;# logmod Tcl ;# print only Tcl logs
logdebug off
Das wäre echt super!
Viele Grüße
Chris
Re: Wiggles debug mode
Hi,
ich würde an deiner Stelle im Script genau für diese Fälle Nachrichten ausgeben (die siehst du dann in der Konsole).
Also wenn du im Script an einer Stelle abfragst, ob einem Zwerg etwas Notwendiges fehlt, dann gibst du eine Meldung in der Konsole aus.
Versuche dazu den puts Befehl.
LG Arthur
ich würde an deiner Stelle im Script genau für diese Fälle Nachrichten ausgeben (die siehst du dann in der Konsole).
Also wenn du im Script an einer Stelle abfragst, ob einem Zwerg etwas Notwendiges fehlt, dann gibst du eine Meldung in der Konsole aus.
Versuche dazu den puts Befehl.
LG Arthur
Re: Wiggles debug mode
Um ein bisschen schöner Entwickeln zu können, als nur die TCL Skripte mit print zu fluten benutze ich auch Folgendes:
Zum dynamischen Aufruf von Prozeduren benutze ich z.B. catch zusammen mit eval
Was mir zur Laufzeit die TCL-Fehlermeldung auf die Console ausgibt.
Für Skript-Reloading zur Laufzeit benutze ich die NoCache Variante von call.
Ein sehr schönes Hot-Reloading von Prozeduren (leider nicht Methoden) funktioniert mit:
Hiermit kann ich jede beliebige Prozedur im Objekt mit der ID id überschreiben, wenn ich sie in der Datei "data/scripts/classes/zwerg/my_detoured_functions.tcl" definiere.
Um wieder den Ausgangszustand herzustellen führt man dann die gleichen zwei Zeilen mit der Datei, die die Originalprozedur enthält aus.
Zum dynamischen Aufruf von Prozeduren benutze ich z.B. catch zusammen mit eval
Code: Alles auswählen
if { [catch { set evalresult [eval $command] } evalerrMsg ] } {
print "ERROR: $evalerrMsg"
print "code: " $command
}
Für Skript-Reloading zur Laufzeit benutze ich
Code: Alles auswählen
callnc
Ein sehr schönes Hot-Reloading von Prozeduren (leider nicht Methoden) funktioniert mit:
Code: Alles auswählen
set script [load_file "data/scripts/classes/zwerg/my_detoured_functions.tcl" 0]
obj_eval $id $script
Um wieder den Ausgangszustand herzustellen führt man dann die gleichen zwei Zeilen mit der Datei, die die Originalprozedur enthält aus.
Logging einschalten
Um das Logging bei den Zwergen einzuschalten, kann man die folgenden vier Dateien benutzen:
Data\Scripts\enable_log.tcl
Data\Scripts\disable_log.tcl
Data\Scripts\logging.tcl
Data\Scripts\nologging.tcl
Dann einfach in der Console
ausführen. Um das Logging zu deaktivieren, einfach
ausführen. Die Vorgehensweise ist so, dass die Funktion log einfach überschrieben wird.
Es wird für jeden Zwerg in eine eigene Datei geloggt. Man kann den Dateipfad in Data\Scripts\logging.tcl anpassen.
Data\Scripts\enable_log.tcl
Code: Alles auswählen
set loggingInjection [load_file "data/scripts/logging.tcl" 0]
set gnomeList [obj_query 0 -type gnome -owner [get_local_player]]
foreach gid $gnomeList {
if {![obj_valid $gid]} {
continue
}
#code injection
obj_eval $gid $loggingInjection
ref_set $gid event_log 1
ref_set $gid state_log 1
}
Code: Alles auswählen
set loggingInjection [load_file "data/scripts/nologging.tcl" 0]
set gnomeList [obj_query 0 -type gnome -owner [get_local_player]]
foreach gid $gnomeList {
if {![obj_valid $gid]} {
continue
}
#code injection
obj_eval $gid $loggingInjection
ref_set $gid event_log 0
ref_set $gid state_log 0
}
Code: Alles auswählen
proc log {text} {
set logFileID [open "data/[get_objname this].txt" "a"]
#print log $text
puts $logFileID "[gettime] $text"
close $logFileID
}
Code: Alles auswählen
proc log {text} {
}
Code: Alles auswählen
callnc scripts/enable_log.tcl
Code: Alles auswählen
callnc scripts/disable_log.tcl
Es wird für jeden Zwerg in eine eigene Datei geloggt. Man kann den Dateipfad in Data\Scripts\logging.tcl anpassen.