Seite 1 von 1
Wiggles debug mode
Verfasst: Mo 23. Jan 2017, 15:32
von SkyNet
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.
Re: Wiggles debug mode
Verfasst: Mo 23. Jan 2017, 16:33
von cech12
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.
Code: Alles auswählen
# log_mask -* +system +tclerror +gui
;# logmod Tcl ;# print only Tcl logs
logdebug off
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
Re: Wiggles debug mode
Verfasst: Mo 23. Jan 2017, 19:47
von Arthur
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
Re: Wiggles debug mode
Verfasst: Di 24. Jan 2017, 22:47
von zed2000
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
Code: Alles auswählen
if { [catch { set evalresult [eval $command] } evalerrMsg ] } {
print "ERROR: $evalerrMsg"
print "code: " $command
}
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:
Code: Alles auswählen
set script [load_file "data/scripts/classes/zwerg/my_detoured_functions.tcl" 0]
obj_eval $id $script
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.
Logging einschalten
Verfasst: Do 26. Jan 2017, 01:35
von zed2000
Um das Logging bei den Zwergen einzuschalten, kann man die folgenden vier Dateien benutzen:
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
}
Data\Scripts\disable_log.tcl
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
}
Data\Scripts\logging.tcl
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
}
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.