Texture variation

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

Texture variation

Beitrag von SkyNet »

Hey,
Ich habe seit einiger Zeit etwas mit den Texturen in Wiggles rumgebastelt und mir ist da etwas ins Auge gestochen: "set_texturevariation"

in der drache.tcl schaut das so aus:

Code: Alles auswählen

       	if {[get_info Drachenmama] == "true"} {
       		log "[get_objname this] : Ich bin die Drachenmama..."
       		set_texturevariation this 1
Das gleiche findet man in der brut.tcl:

Code: Alles auswählen

		if {$myclass=="Lavabrut"} {
			set is_lava 1
			set walk_animset 0
			set run_animset 1
			set scan_range 25
			set_texturevariation this 0 1
			set_texturevariation this 1 1
Ich vermute mal, das hier entschieden wird, welche der beiden Brut Texturvariationen zur verwendung kommt - Lava Brut oder Kristall Brut.
Die Frage is: Kann man das auch auf andere Objekte anwenden? Wie z.B Eisen? Da es leider nicht möglich ist neue Modelle zu implementieren, besteht vielleicht die Möglichkeit der umtexturierung. Da hab ich etwas rumgetüftelt, bekam aber schnell einen Tunnelblick. Jetzt bin ich ratlos, weil beim testen im Spiel ist mir aufgefallen, das die Textur des Eisens nicht angezeigt wird. Das Model ist aber da und wirft auch Schatten.

Das ist alles was ich verändert habe:

rohstoffe.tcl

Code: Alles auswählen

def_class Eisen metal material 0 {} {
	class_defaultanim eisen.standard
	call scripts/misc/animclassinit.tcl
	call scripts/classes/items/calls/resources.tcl
	method change_owner {new_owner} {
//		add_owner_attrib [get_owner this] [get_objclass this] -1
		set_owner this $new_owner
//		add_owner_attrib [get_owner this] [get_objclass this] 1
	}
	obj_init {
		call scripts/classes/items/calls/resources.tcl
		set_anim this eisen.standard 0 0
		set_viewinfog this 1
		set_storable this 1
		set_physic this 1
		set_hoverable this 1
		set_texturevariation this 1
	}
}
txtinit.tcl

Code: Alles auswählen

;#					texturname				variation#0						variation#1

def_texture			Struktur_Rohstoffe_c_256	Struktur_Rohstoffe_c_256.tga	brainposter.tga
Texturname - Findet man immer am Kopf der 3db files, wenn man diese mit einem texteditor öffnet.
variation#0 - Ist der Name der tga die die Original Textur beinhaltet.
variation#1 - Ist der Name der tga die ich in diesem fall zum testen benutzt habe.


Hab ich etwas Vergessen? Vielleicht hat da jemand mehr Ahnung als ich. :S
In Discord as: SkyNet#9744
zed2000
Hamster
Hamster
Beiträge: 52
Registriert: Mi 25. Feb 2015, 02:02

Re: Texture variation

Beitrag von zed2000 »

Hi

ich hab mal deine Schritte ausprobiert. Ich hab auch noch in texlevels.txt eine neue Textur mit Namen hi.tga erstellt. In Blender sieht zurzeit mein gewünschter Effekt so aus:
Clipboard02.jpg
Clipboard02.jpg (9.44 KiB) 15776 mal betrachtet
Im Spiel:
Clipboard03.jpg
Clipboard03.jpg (17.92 KiB) 15776 mal betrachtet
Einmal klappts :-D
Clipboard04.jpg
Clipboard04.jpg (1.81 KiB) 15776 mal betrachtet
Leider ist da wohl ein Zufallsfaktor bei der Texturposition noch dabei, der beim Exportieren nicht bedacht wurde :( .
Die Texture für Eisen lautet enviro_chrome

Code: Alles auswählen

def_texture		enviro_chrome	brainposter.tga	hi.tga
Ich kann mit

Code: Alles auswählen

set_texturevariation this 1
beliebig zwischen den Texturen hin und her wechseln:
SkyNet
Raupe
Raupe
Beiträge: 36
Registriert: Mi 4. Dez 2013, 17:57

Re: Texture variation

Beitrag von SkyNet »

Echt cool. Das mit der enviro_chrome Textur funktioniert bei mir auch. Ich kann jetzt beliebig viele Metalle erstellen. Den Zufallsfaktor gibt es glaub ich nur bei den enviro_ Texturen, was meiner Meinung nach auch Sinn macht.

Mal versucht eine Flüssigkeit zu verändern? Würd gerne Rohöl also neuen Rohstoff hinzufügen. Konnte allerdings noch keine passende tcl dafür finden.
In Discord as: SkyNet#9744
SkyNet
Raupe
Raupe
Beiträge: 36
Registriert: Mi 4. Dez 2013, 17:57

Re: Texture variation

Beitrag von SkyNet »

Was das ganze so interessant macht, ist das ich damit Modelle neu texturieren kann. Das gibt mir z.B. die Möglichkeit ganz neue Items zu erstellen. In meinem Beispiel habe ich neue Klassen erstellt für Kupfer und Kupfererz, bin da aber auf eine Grenze gestoßen, was die Erzbrocken betrifft. Ich kann scheinbar keine neue Klasse für meinen Kupfererzbrocken implementieren, da dessen Modell dann im Spiel nicht sichtbar ist. Was aber funktioniert hat, ist das umtexturieren des Eisenerzbrockens, wie hier im Bild gezeigt:

Bild




Irgendeine Idee wie ich das meistern kann? Bin nicht gerade der beste im tcl script. :/
In Discord as: SkyNet#9744
zed2000
Hamster
Hamster
Beiträge: 52
Registriert: Mi 25. Feb 2015, 02:02

Re: Texture variation

Beitrag von zed2000 »

Wenn man sich brocken.tcl anschaut, wird in Zeile 58

Code: Alles auswählen

set ani [string tolower [string map {brocken ""} [get_objclass this]]]
set_anim this "$ani\_00.standard" 0 0
ausgeführt. Ein Problem, was ich allein aus dem Quelltext sehe ist, dass wie folgt aufgelöst wird:
  • Kupfererzbrocken = [get_objclass this]
  • Kupfererz = [string map {brocken ""} Kupfererzbrocken]
  • kupfererz = [string tolower Kupfererz ]
  • set ani kupfererz

Code: Alles auswählen

ani = kupfererz
Das Mesh wird u.a. mit set_anim gesetzt:

Code: Alles auswählen

set_anim this "kupfererz\_00.standard" 0 0
Aber das Objekt kupfererz_00.standard existiert in der rohstoffe.3db nicht.
Mein Lösung wäre einfach alle call in deiner def_class mit den entsprechenden Dateiinhalten zu ersetzen und dann es mit

Code: Alles auswählen

set_anim this "stein\_00.standard" 0 0
es zu probieren. Man muss nur aufpassen, dass der Teil [in_class_def] unterhalb von def_class platziert wird und der andere Teil in obj_init wandert.

Achja zur Übersicht aus Blender:
  1. Stein_00 sind immer Brocken
  2. Stein_01 ist eine Variation eines einzelnen Steins
  3. Stein_02 ist eine Variation eines einzelnen Steins
  4. Stein_03 ist eine Variation eines einzelnen Steins
SkyNet
Raupe
Raupe
Beiträge: 36
Registriert: Mi 4. Dez 2013, 17:57

Re: Texture variation

Beitrag von SkyNet »

Auf das gleiche Ergebniss bin ich gestern Abend gekommen. :]

Leider darf ich die "call scripts/classes/items/calls/brocken.tcl" nicht ersetzen, da sonst mein Erzbrocken unbrauchbar wird und die Zwerge ihn dann nicht mehr ernten können. Ich hab mir eine kleine Ausnahme in der brocken.tcl geschrieben:

Code: Alles auswählen

	set ani [string tolower [string map {brocken ""} [get_objclass this]]]		
	if {$ani == "kupfererz"} {													
		set_anim this "eisenerz_00.standard" 0 0								
	} else {																	
		set_anim this "$ani\_00.standard" 0 0									
	}
Das gleiche dann noch unten, sonst wird der Brocken nicht kleiner beim ernten...

Code: Alles auswählen

		set ani [string tolower [string map {brocken ""} [get_objclass this]]]
		if {$ani == "kupfererz"} {
			set_anim this eisenerz_00.standard $aniph 0								
		} else {																	
			set_anim this $ani\_00.standard $aniph 0								
		}

Getestet und es funktioniert. Nur habe ich noch keine Lösung für das folgende Problem gefunden: Alle Produktionsstätten in Wiggles wissen welche Rohstoffe zur verfügung stehen, selbst wenn diese sich noch in Brockenform befinden. In meinem Fall wird der Kupfererzbrocken allerdings nicht erkannt. Die kleinen Erzklumpen hingegen schon.

Bild



PS: Ich frage mich ob man diese Ausnahme nicht besser machen kann, so dass der Script immer erst versucht durch set_anim this $ani die Modelle zu laden, wenn er aber merkt das es keine Treffer gibt, dann setzt er $ani automatisch auf eisenerz, stein, kohle... usw.
In Discord as: SkyNet#9744
Benutzeravatar
cech12
Zwerg
Zwerg
Beiträge: 242
Registriert: Di 9. Jun 2015, 12:18
Kontaktdaten:

Re: Texture variation

Beitrag von cech12 »

Hey SkyNet!

ich finde es super cool, was du und zed2000 herausgefunden habt. :) Wenn du/ihr eine Mod mit den neuen Items dafür schreiben willst/wollt , dann würde ich mich sehr freuen, wenn ihr den DigglesModManager dafür benutzt. :) Zum Testen und Code-Verändern kann man ihn auch super benutzen :D

In der Datei \Data\Scripts\classes\zwerg\z_procs.tcl Zeile 891 habe ich die Funktion mine_rep gefunden. Dort gibt es 2 Positionen, die die Brocken aufzählen. Ab Zeile 900:

Code: Alles auswählen

if {$itemclass=="Eisenerzbrocken"||$itemclass=="Golderzbrocken"} {
	set animname mann.buddeln_unten_metall
	set attr [hmin [get_attrib this exp_Metall] 0.4]
} else {
	set animname mann.buddeln_unten_stein
	set attr [hmin [get_attrib this exp_Stein] 0.4]
}
und ab Ziele 911:

Code: Alles auswählen

log [list [get_objname this] found: [obj_query this "-class \{Steinbrocken Kohlebrocken Eisenerzbrocken Golderzbrocken Kristallerzbrocken\} -range 10 -limit 1 -flagneg locked"]]
if {[get_remaining_sparetime this]<0.1&&[set nextbrock [obj_query this "-class \{Steinbrocken Kohlebrocken Eisenerzbrocken Golderzbrocken Kristallerzbrocken\} -range 10 -limit 1 -flagneg locked"]]} {
	tasklist_clear this
	tasklist_add this "mine $nextbrock [get_attrib $item PilzAge]"
	tasklist_add this "set_objworkicons this Spitzhacke [string map {brocken {}} [get_objclass $nextbrock]]"
	log "[get_objname this]: [state_get this] [tasklist_list this]"
	unlock_item
}
Das könnte vielleicht auch noch interessant sein für diese Thematik :)
SkyNet
Raupe
Raupe
Beiträge: 36
Registriert: Mi 4. Dez 2013, 17:57

Re: Texture variation

Beitrag von SkyNet »

Ohne den ModManager hätte ich wohl schnell die Lust am modden verlohren und die set_texturevariation Funktion nie entdeckt.

Ich hatte bereits einen Eintrag in der z_procs.tcl gemacht...

Code: Alles auswählen

if {$itemclass=="Eisenerzbrocken"||$itemclass=="Kupfererzbrocken"||$itemclass=="Golderzbrocken"} {
Und...

Code: Alles auswählen

log [list [get_objname this] found: [obj_query this "-class \{Steinbrocken Kohlebrocken Eisenerzbrocken Kupfererzbrocken Golderzbrocken Kristallerzbrocken\} -range 10 -limit 1 -flagneg locked"]]

Und außerdem... Hab ich Pilzsuppe gekocht. :3
Funktioniert wunderbar

Bild
In Discord as: SkyNet#9744
zed2000
Hamster
Hamster
Beiträge: 52
Registriert: Mi 25. Feb 2015, 02:02

Re: Texture variation

Beitrag von zed2000 »

SkyNet hat geschrieben: Leider darf ich die "call scripts/classes/items/calls/brocken.tcl" nicht ersetzen, da sonst mein Erzbrocken unbrauchbar wird und die Zwerge ihn dann nicht mehr ernten können.
Was meinst du mit kann man nicht ersetzen?
Ich habe einfach eine Scripts\classes\items\kupfererz.tcl erstellt. Die einzelne Datei wird auch noch automatisch geladen. Es wird jede Datei im Ordner geladen. Vllt leicher fürs Modden.

Code: Alles auswählen

def_class Kupfererzbrocken metall material 0 {} {
	call scripts/misc/animclassinit.tcl
	
	call scripts/classes/items/calls/resources.tcl
	call scripts/misc/aggr_events.tcl
	method mine {obj} {
		if {$content > 0} {
			incr content -1
			add_attrib this PilzAge -1
			set pos [get_pos $obj]
			set pos [vector_add $pos [vector_random 0.6 0 0.6]]
			sel /obj
			set ns [new Gold]
			set_pos $ns $pos
			set_owner $ns [get_owner this]
			eval "add_expattrib $obj $expincr"
			setanim
		}
		if {$content == 0} {
			del this
		}
	}
	method change_owner {new_owner} {
		add_owner_attrib [get_owner this] [get_objclass this] -1
		set_owner this $new_owner
		add_owner_attrib [get_owner this] [get_objclass this] 1
	}

	method Editor_Set_Info {ifo} {
		global info_string
		set info_string $ifo
		set ifo [lindex $ifo 0]
		set cnt [lindex $ifo 1]
		if { [string is integer $cnt] } {
			set content $cnt
			set_attrib this PilzAge $cnt
			setanim
		} else {
			log "[get_objname this]: Error content is not an integer: '$ifo'"
		}
		foreach entry $ifo {
			switch [lindex $entry 0] {
				"aggr" {set player_aggressivity [lindex $entry 1]}
				"aggrmax" {set aggr_max [lindex $entry 1]}
			}
		}
	}
	
	obj_init {
		call scripts/classes/items/calls/resources.tcl
		call scripts/misc/aggr_events.tcl
		set content 30
		set_attrib this PilzAge 30
		set info_string "\{inhalt 30\}"
		set ani stein
		set_anim this "$ani\_00.standard" 0 0
		set_viewinfog this 1
		set_storable this 1
		set_physic this 1
		set_attrib this weight 0.38
		set_hoverable this 1
		set_collision this 1

		proc setanim {} {
			global content
			//set aniph [hmax [expr 9 - int($content / 3)] 0]
			set aniph 0
			if 			{$content <= 2} {
				set aniph 9
			} elseif	{$content <= 3} {
				set aniph 8
			} elseif 	{$content <= 4} {
				set aniph 7
			} elseif 	{$content <= 5} {
				set aniph 6
			} elseif 	{$content <= 7} {
				set aniph 5
			} elseif 	{$content <= 10} {
				set aniph 4
			} elseif 	{$content <= 13} {
				set aniph 3
			} elseif 	{$content <= 16} {
				set aniph 2
			} elseif 	{$content <= 20} {
				set aniph 1
			}

			set ani stein
			set_anim this $ani\_00.standard $aniph 0
		}
		set expincr  "exp_Metall 0.002"
	}
}
SkyNet hat geschrieben: Alle Produktionsstätten in Wiggles wissen welche Rohstoffe zur verfügung stehen, selbst wenn diese sich noch in Brockenform befinden. In meinem Fall wird der Kupfererzbrocken allerdings nicht erkannt. Die kleinen Erzklumpen hingegen schon.
Ich vermute, dass der Auftrag Brocken-Abbauen built-in der wiggles.exe ist. Es wird ein Event evt_autoprod_harvest generiert. Die Definition des Events ist wiederum in TCL implementiert.
Benutzeravatar
cech12
Zwerg
Zwerg
Beiträge: 242
Registriert: Di 9. Jun 2015, 12:18
Kontaktdaten:

Re: Texture variation

Beitrag von cech12 »

Alle Produktionsstätten in Wiggles wissen welche Rohstoffe zur verfügung stehen, selbst wenn diese sich noch in Brockenform befinden. In meinem Fall wird der Kupfererzbrocken allerdings nicht erkannt. Die kleinen Erzklumpen hingegen schon.
Ich habe in der Datei Data\Scripts\init\lginit.tcl die Zeile 5 gefunden, in der ebenfalls die Erze aufgelistet werden.

Code: Alles auswählen

lg_addfilterclass {	Zwerg Wuker Troll Pilz Kohle Kristallerz Golderz Eisenerz Schatztonne }
Vielleicht hilft das ja, um das Problem zu lösen? :)
Antworten