Latest Posts

Topic: Fragen zu Lua

Taurus

Topic Opener
Joined: 2011-05-31, 18:37
Posts: 8
Ranking
Pry about Widelands
Location: Germany / Leipzig
Posted at: 2011-06-06, 15:27

Halli hallo, ich versuch mich grade ein bischen an Lua und habe zu Testzwecken mal eine kleine Mission gemacht.Nun bekomm ich es aber im moment nicht hin, einen Auftrag hinzu zu fügen. Es kommt immer wieder eine Fehler- meldung:"nil value"(Zeile 17): print "#########################" print "Hello world" print "#########################"

set_textdomain("scenario_Mission01.wmf") p = wl.Game().players[1] p:forbid_buildings("all") p:allow_buildings{"lumberjacks_hut"} hq = p:place_building("headquarters_interim", wl.Game().map:get_field(47,45),false,true) hq:set_wares{ trunk = 20} hq:set_workers{builder=10,carrier=40,lumberjack=2,stonemason=2} home = wl.Game().map:get_field(47,45) use("aux", "coroutine") title = "Jepp" msg = "test test test 1 2 3 1 2 3" wl.Game().players[1]:message_box(title, msg) p:add_objectiv{name = "aufgabe" ,title = "hallo",body = " welt"}

Was mach ich bei "p:add_obje...." falsch?

Außerdem hätte ich gerne, dass ein bestimmtes Gebiet erst betreten werden kann, wenn ein paar andere Bedingungen vorher erfüllt werden. Dazu habe ich ein bischen Geröll platziert und würde es gerne entfernen, sobald Bedingung xy erfüllt ist. Nun zu meiner Frage:

Ist es möglich mit Lua, während des Spiels, das Geröll zu entfernen und wenn ja, welchen Befehl brauch ich dafür? Ich hab bei "core functionality" schon die "remove()" Funktion gefunden, weiß aber nicht wie ich sie Anwenden muss.

Danke im voraus für die Hilfe! Taurus

PS: Ich weiß, dass das Thema eigendlich in das "Editor Forum" gehört, aber mein Englisch ist soooo schlecht, dass ich mich nicht mal traue dort was rein zu schreiben face-smile.png

Edited: 2011-06-06, 21:46

Top Quote
Beefy
Avatar
Joined: 2011-06-09, 09:04
Posts: 1
Ranking
Just found this site
Posted at: 2011-06-09, 09:05

Es fehlt ein e.

add_objective und nicht add_objectiv


Top Quote
Taurus

Topic Opener
Joined: 2011-05-31, 18:37
Posts: 8
Ranking
Pry about Widelands
Location: Germany / Leipzig
Posted at: 2011-06-09, 09:15

OMG Was für ein dämlicher Fehler! Werde ab jetzt in meiner Fehleranalyse die Rechtschreibung mit einbeziehen ;).

Es stürtzt das Spiel im übrigen nach der message_box() ab. In der stdout.txt steht am Ende:

Trying to run: map, init: ######################### Hello world

Forcing flag at (48, 46) Message: adding (wh) (warehouse) 1

Jetzt bin ich mir nicht sicher was der Fehler ist. Liegt es daran, dass mit dem objectivE nichts passiert?

Edited: 2011-06-09, 09:15

Top Quote
martin

Joined: 2011-01-13, 13:21
Posts: 65
Ranking
Likes to be here
Posted at: 2011-06-09, 09:34

Hallo Taurus und willkommen im Forum :) Kleiner Hinweis: Quelltext kannst du bei "markdown" in umgekehrten Hochkommata (`) ordentlich darstellen. Deine Zeile 17 lautet also wahrscheinlich folgendermaßen:

p:add_objectiv{name = "aufgabe" ,title = *"hallo",body = *" welt"}

Zwei Gedanken hierzu: 1. "Zielvorgabe" heißt im Englischen "objective" - könnte es vielleicht sein, dass du ein "e" vergessen hast? ;) 2. Habe ich die Sternchen (*) korrekt rekonstruiert? Dann probier es mal ohne. Ich wüsste nämlich nicht, warum die dort stehen müssen. Die Syntax ist mir bei Lua zumindest nicht bekannt und dürfte außerdem dazu führen, dass die Zeichenfolgen mit 0 multipliziert werden - und dann wäre deine Fehlermeldung "nil value" sogar ziemlich logisch face-smile.png


Top Quote
Taurus

Topic Opener
Joined: 2011-05-31, 18:37
Posts: 8
Ranking
Pry about Widelands
Location: Germany / Leipzig
Posted at: 2011-06-09, 09:48

Hiho martin, jepp ich hab das e vergessen ^¿^. Die (*) hast du leider nicht richtig rekonstruiert. Eigendlich heißt die Zeile bei mir:

p:add_objective{name = "aufgabe", title = _"Hallo", body = _"Welt"}

Nun hab ich das in mein Script auch eingefügt und das Spiel stürzt ab. In der stdout.txt steht leider auch nichts brauchbares drin. Ich hab jetzt nach jeder Zeile ein print "check 1" usw eingefügt und er geht genau bis vor den Befehl p:add_objective{name = "aufgabe", title = _"Hallo", body = _"Welt"}.
Weißt du evtl. wo der Fehler ist?

PS: Danke Beefy&martin für eure Antworten.

Edited: 2011-06-09, 09:50

Top Quote
martin

Joined: 2011-01-13, 13:21
Posts: 65
Ranking
Likes to be here
Posted at: 2011-06-09, 10:21

Ah, okay, ich seh schon - das waren also die translatable-Markierungen.

Bekommst du seit dem "e" immernoch die "nil value" Meldung oder ist es inzwischen ein anderer Fehler?


Top Quote
Taurus

Topic Opener
Joined: 2011-05-31, 18:37
Posts: 8
Ranking
Pry about Widelands
Location: Germany / Leipzig
Posted at: 2011-06-09, 10:34

Es kommt garkeine Fehlermeldung mehr. Das Spiel geht einfach aus. Ich hab auch in der "stdout.txt" nachgeguckt und da ist das letzte was drinne steht, dass das Lied geladen wurde. Ich poste am besten nochmal Quelltext und "stdout.txt":

print "#########################" print "Hello world" print "#########################" set_textdomain("scenario_Mission01.wmf") p = wl.Game().players[1] p:forbid_buildings("all") p:allow_buildings{"lumberjacks_hut"} hq = p:place_building("headquarters_interim", wl.Game().map:get_field(47,45),false,true) hq:set_wares{ trunk = 20} hq:set_workers{builder=10,carrier=40,lumberjack=2,stonemason=2} home = wl.Game().map:get_field(47,45) title = "Jepp" msg = "test testtest 1 2 3 1 2 3" print "check 1" wl.Game().players[1]:message_box(title, msg) print "check 2" p:add_objective{name = "aufgabe", title = "Hallo", body = "Welt"} print "check 3"

und in der "stdout.txt" steht am Ende:

Trying to run: map, init: ######################### Hello world ######################### Forcing flag at (48, 46) Message: adding (wh) (warehouse) 1 check 1 Sound_Handler: loaded song "music\ingame_09.ogg" check 2

Das wars. Ich fass nochmal zusammen: Das "e" hat gefehlt -> "e" hinzugefügt -> Fehlermeldung komm nichtmehr, aber Spiel geht einfach aus -> hab die print "check NR" Zeilen eingefügt -> in der objective Zeile haut irgend etwas nicht hin -> ratlosigkeit

Edited: 2011-06-09, 10:36

Top Quote
martin

Joined: 2011-01-13, 13:21
Posts: 65
Ranking
Likes to be here
Posted at: 2011-06-10, 09:41

Hmm, lass mal analysieren: Ich beziehe mich hierbei auf das Beispielskript <widelands>/campaigns/t01.wmf/scripting/init.lua und deine print-Statements vernachlässige ich mal face-wink.png

set_textdomain("scenario_Mission01.wmf") Hier wird die gettext-Domain für die Lokalisierung ausgewählt. Existiert die bei dir? D.h. hast du eine Datei <widelands>/po/scenario_Mission01.wmf erstellt? Wenn nicht, dürfte das aber eigentlich nicht zum Absturz führen, sondern auf deine ursprünglichen Zeichenfolgen _"Hallo" und _"Welt" zurückfallen. (Für später: die sollen eigentlich in Englisch geschrieben sein)

p = wl.Game().players[1] p:forbid_buildings("all") p:allow_buildings{"lumberjacks_hut"} Stimmt soweit überein.

hq = p:place_building("headquarters_interim", wl.Game().map:get_field(47,45),false,true) hq:set_wares{ trunk = 20} hq:set_workers{builder=10,carrier=40,lumberjack=2,stonemason=2} home = wl.Game().map:get_field(47,45) Okay, du hast eine andere Startposition für dein Hauptquartier gewählt (ist diese Position eigentlich gültig? Kartengrenzen, Terrain, etc.), schränkst die Vorräte stark ein und stellst keinen Förster (ranger) zur Verfügung. Aber ist ja durchaus legitim face-wink.png Ich weiß schließlich nicht, was du vorhast...

title = "Jepp" msg = "test testtest 1 2 3 1 2 3" wl.Game().players[1]:message_box(title, msg) Wird diese Message Box überhaupt angezeigt? Laut deinen check-Ausgaben müsste die Methode ja aufgerufen worden sein. Laut der ersten Mission der Barbaren-Kampagne nimmt sie jedoch noch einen weiteren Parameter entgegen, der aus { posx, posy, h } besteht und die Position der Message Box und ihre Höhe anzugeben scheint. Ich weiß grad nicht, ob dieser Parameter optional ist. Mal nebenbei: warum nimmst du nicht p:message_box(...)? Das wäre einfacher.

p:add_objective{name = "aufgabe", title = "Hallo", body = "Welt"} Schau dir mal die Datei <widelands>/campaigns/t01.wmf/scripting/texts.lua an. Die add_objective-Methode übernimmt drei Parameter - also nicht in geschweifte Klammern setzen! Du solltest also lieber schreiben p:add_objective("aufgabe", _"Hallo", _"Welt") wobei "aufgabe" die interne Bezeichnung der Aufgabe ist. "Hallo" ist dann der Titel der Aufgabe - den bekommt der Spieler auch zu sehen. Und "Welt" wäre ein erklärender Text wenn man diese Aufgabe auswählt. name, title und body sind insofern nicht nötig. Probier mal, ob es damit funktioniert face-smile.png

Viele Grüße Martin

Edited: 2011-06-10, 09:43

Top Quote
Taurus

Topic Opener
Joined: 2011-05-31, 18:37
Posts: 8
Ranking
Pry about Widelands
Location: Germany / Leipzig
Posted at: 2011-06-10, 19:35

Hiho, vielen Dank martin, dass du dir für mich so viel Mühe gemacht hast und alles auseinander genommen hast. Ich hab jetzt die {} durch () ersetzt und "name =" usw entfernt. Jubel Trubel Heiterkeit! ^¿^ Es funktioniert. Ich muss leider gestehen, dass ich mich mit der Syntax noch nicht auskenne. Ich weiß absolut nicht wann ich () {} oder [] benutzen muss. Deswegen entstehen bei mir so viele Fehler.

Im übrigen funktioniert die message_box. Sie wird angezeigt und {posx, posy,h } ist soweit ich es verstanden habe optional und ist Standartmäßig auf die Mitte eingestellt.

Was set_textdomain("scenario_Mission01.wmf")macht weiß ich ehrlich gesagt garnicht. Ich hab es nur aus den anderen Scripts übernommen. Und was du als Beschreibung der Funktion sagst verstehe ich auch nicht :D. Ich sollte evtl. auch dazu sagen das ich WindowsXP benutze. Deswegen sagt mir der Pfad den du geschrieben hast auch nicht viel. Ich habe mit dem Mapeditor einfach eine Karte erstellt, sie in den "campaigns" Ordner geschoben und dort entpackt. So wie es ChemBro bei seiner SUL Kampagne beschrieben hat.

Ich hab mal eine Frage zu den init.lua Dateien aus den anderen Kampagnen. Werden die bei dir auch so zerhackstückelt angezeigt? Ich geb mir nämlich echt viel mühe so viel wie möglich daraus zu lernen und nicht ständig im Forum zu fragen, aber bei mir ist die Darstellung sowas von kacke, dass ich erstmal ne Stunde brauche, eh ich ein bischen Ordnung rein gebracht habe.

Nagut, ich glaube ich hab jetzt erstmal alles was ich wissen muss um mir meine erste kleine Mission zurecht zu machen. Ich hoffe dir ist es recht, wenn der Berater von meinem kleinen Thorben ab jetzt Martin heißt face-wink.png

Dank für die Hilfe, Taurus

Edited: 2011-06-10, 19:38

Top Quote
ChemBro

Joined: 2009-05-30, 11:09
Posts: 59
Ranking
Likes to be here
Posted at: 2011-06-10, 19:43

Denk nur dran, dein Scripting woanders zu sichern, solltest du die Karte im Editor bearbeiten, da dieser Ordner einfach überschrieben (bzw. geleert) wird. Erspart dir Zeit und Ärger. face-smile.png


Top Quote