Wiggles debug mode

Startprobleme? Du kommst nicht mehr weiter?
Antworten
SkyNet
Raupe
Raupe
Beiträge: 36
Registriert: Mi 4. Dez 2013, 17:57

Wiggles debug mode

Beitrag 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.
In Discord as: SkyNet#9744
Benutzeravatar
cech12
Zwerg
Zwerg
Beiträge: 242
Registriert: Di 9. Jun 2015, 12:18
Kontaktdaten:

Re: Wiggles debug mode

Beitrag 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! :D

Viele Grüße
Chris
Benutzeravatar
Arthur
Zwerg
Zwerg
Beiträge: 197
Registriert: So 1. Mai 2011, 16:10

Re: Wiggles debug mode

Beitrag 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
zed2000
Hamster
Hamster
Beiträge: 52
Registriert: Mi 25. Feb 2015, 02:02

Re: Wiggles debug mode

Beitrag 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

Code: Alles auswählen

callnc
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.
zed2000
Hamster
Hamster
Beiträge: 52
Registriert: Mi 25. Feb 2015, 02:02

Logging einschalten

Beitrag 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

Code: Alles auswählen

proc log {text} {
}
Dann einfach in der Console

Code: Alles auswählen

callnc scripts/enable_log.tcl
ausführen. Um das Logging zu deaktivieren, einfach

Code: Alles auswählen

callnc scripts/disable_log.tcl
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.
Antworten