Donation

Help us to pay our server!
(: Consider a donation :)



Social Media

  • Facebook
  • Google+

Currently Online

Latest Posts

Topic: Win Condition Waldschrat / Wood Gnome ändern

game_student
Avatar
Joined: 2018-01-12, 22:17
Posts: 8
Ranking
Pry about Widelands
Posted at: 2018-01-12, 22:26

Hi Leute,

für studienzwecke modde ich widelands sodass man bäume pflanzen (ranger) muss und tiere (tierhüter) aufzieht. Dazu möchte ich gerne die win condition "wood_gnome" abändern sodass neben der anzahl der bäume auch die anzahl der tiere in den punktestand fließen. Könnt ihr mir bitte dabei helfen das programmiertechnisch umzusetzen?

folgender code ist vorhanden und zählt die bäume: \Widelands\data\scripting\win_conditions\wood_gnome.lua

  for idf,f in ipairs(fields) do
     -- check if field is owned by a player
     local owner = f.owner
     if owner then
        owner = owner.number
        -- check if field has an immovable
        local imm = f.immovable
        if imm then
           -- check if immovable is a tree
           if imm:has_attribute("tree") then
              _plrpoints[owner] = _plrpoints[owner] + 1
           end
        end
     end
  end

LG danke im Voraus


Top Quote
kaputtnik
Avatar
Joined: 2013-02-18, 20:48
Posts: 1275
Ranking
One Elder of Players
Location: Germany
Posted at: 2018-01-13, 01:13

Hi und willkommen im Forum face-smile.png

Tiere mit in den Punktestand einzubeziehen ist schwierig, weil Tiere ja durch die Gegend laufen. Sie können zwar von einem Tierhüter ausgesetzt werden, aber unter Umständen laufen sie dann direkt in das Gegnerische Gebiet...

Oder habe ich Deine Frage nicht verstanden?

Edited: 2018-01-13, 01:13
Top Quote
game_student
Avatar
Joined: 2018-01-12, 22:17
Posts: 8
Ranking
Pry about Widelands
Posted at: 2018-01-13, 07:52

Hi

Ja da hast du Recht. Das wäre dann Glückssache wieviele Tiere sich auf seinem eigenem Gebiet sich befinden.

Dann möchte ich gerne die „erzeugten“ Tiere vom Tierhüter in den punktestand einfließen lassen. Wie stelle ich dass an. face-smile.png

LG

EDIT: oder eher die Anzahl der Tierhüter und Ranger zählen weil das Script nicht während der Laufzeit mitzählt.

Edited: 2018-01-13, 08:20
Top Quote
kaputtnik
Avatar
Joined: 2013-02-18, 20:48
Posts: 1275
Ranking
One Elder of Players
Location: Germany
Posted at: 2018-01-13, 10:33

Die Anzahl der ausgesetzten Tiere zu zählen geht IMHO nicht. Aber ich bin da kein Profi.

Die Anzahl der Wildhüter Hütten zu zählen geht im Prinzip genauso wie in dem Codeschnipsel den Du bereits gefunden hast. Es gibt hier die Lua Documentation und nachfolgend die Widelands Scripting reference. Die Dokumentation ist etwas unübersichtlich und leider funktioniert die Suchfunktion nicht, aber es ist ein Anfang face-wink.png

Hast Du denn zumindest eine Idee wie Du das scripten könntest, oder fehlt Dir ein Ansatzpunkt? (Ich will Dir jetzt nicht eine fertige Lösung anbieten face-wink.png )


Top Quote
game_student
Avatar
Joined: 2018-01-12, 22:17
Posts: 8
Ranking
Pry about Widelands
Posted at: 2018-01-13, 12:28
Danke, da habe ich mich schon schlau gemacht und herausgefunden dass die Tiere das Attribute „eatable“ haben. Demnach habe ich versucht die Tiere so zu zählen aber das Script funktioniert leider nicht. Ich übersehe was aber komme nicht drauf:

for idf,f in ipairs(fields) do
-- check if field is owned by a player
local owner = f.owner
if owner then
owner = owner.number
-- check if field has an critters
local imm = f.critter
-- also tried with „critterS“
if imm then
-- check if immovable is a eatable
if imm:has_attribute("eatable") then
_plrpoints = _plrpoints + 1
end
end
end
end

Wie ich die Tierhüter zählen soll, weiß ich noch weniger ;)
Edited: 2018-01-13, 12:30
Top Quote
kaputtnik
Avatar
Joined: 2013-02-18, 20:48
Posts: 1275
Ranking
One Elder of Players
Location: Germany
Posted at: 2018-01-13, 14:36

game_student wrote:

        -- check if field has an critters
        local imm = f.critter

Welche Art von immovable ein 'field' hat weiß ein field nicht. Ein 'field' kann nur die Eigenschaft 'immovable' haben wenn ein immovable drauf steht., oder nicht die Eigenschaft immovable haben wenn nichts drauf steht. Das 'if' im folgenden kann also nicht greifen, weil 'imm' immer 'nil' sein wird.

        -- also tried with „critterS“
        if imm then

Ein Tier ist auch eine Art Immovable ... obwohl es mobil ist face-grin.png

Die Funktion 'has_attribute()' kommt von https://wl.widelands.org/docs/wl/autogen_wl_map/#wl.map.ImmovableDescription
und das ist eine Kind-Klasse von https://wl.widelands.org/docs/wl/autogen_wl_map/#wl.map.MapObjectDescription

Sieh dir dort mal die Angaben unter der Eigenschaft 'type_name' an.

Ich hoffe nicht zu sehr verwirrt zu haben.


Top Quote
game_student
Avatar
Joined: 2018-01-12, 22:17
Posts: 8
Ranking
Pry about Widelands
Posted at: 2018-01-13, 22:43

"Verwirrt" ist relativ. Ich kann nicht programmieren deshalb scheitere ich ;) Aber ich habs geschnallt dass ein field nur die eigenschaft immovable haben kann.

danke für den tipp mit type_name! warum kann ich ein flag so abfragen:

           if imm.descr.type_name == "flag" then
              _plrpoints[owner] = _plrpoints[owner] + 1

aber nicht ein building:

           if imm.descr.type_name == "building" then
              _plrpoints[owner] = _plrpoints[owner] + 1

Edit:

es funktioniert:

        local imm = f.immovable
        if imm then
           if imm.descr.type_name == "productionsite" then
              _plrpoints[owner] = _plrpoints[owner] + 1
           end
        end

jetzt muss ich nur mehr die tierhüter zählen aber wie?

Edited: 2018-01-13, 22:54
Top Quote
kaputtnik
Avatar
Joined: 2013-02-18, 20:48
Posts: 1275
Ranking
One Elder of Players
Location: Germany
Posted at: 2018-01-14, 10:58

Man kann ja auch andere Werte als type_name abfragen... Such Dir in https://wl.widelands.org/docs/wl/autogen_wl_map/#wl.map.MapObjectDescription das Attribut aus, mit welchem du z.B. den Namen des immovables abfragen kannst. Man muss allerdings wissen wie das Gebäude intern benannt wird. Das steht in der entsprechenden init.lua des Gebäudes.


Top Quote
Nordfriese
Avatar
Joined: 2017-01-17, 18:07
Posts: 183
Ranking
Widelands-Forum-Junkie
Posted at: 2018-01-14, 11:38

kaputtnik wrote:

game_student wrote:

        -- check if field has an critters
        local imm = f.critter

Welche Art von immovable ein 'field' hat weiß ein field nicht. Ein 'field' kann nur die Eigenschaft 'immovable' haben wenn ein immovable drauf steht., oder nicht die Eigenschaft immovable haben wenn nichts drauf steht. Das 'if' im folgenden kann also nicht greifen, weil 'imm' immer 'nil' sein wird.

        -- also tried with „critterS“
        if imm then

Ein Tier ist auch eine Art Immovable ... obwohl es mobil ist face-grin.png

Hier liegt ein Missverständnis vor. Tiere und andere mobile Wesen (z.B. Arbeiter) sind keine Immovables, sondern Bobs. Jedes Feld hat ein Array von Bobs, die sich gerade auf diesem Feld befinden. Um die Tiere auf einem Feld f zu zählen, muss f.bobs abgefragt werden:

for idx,bob in ipairs (f.bobs) do
   if bob:has_attribute ("eatable") then
      plrpoints[owner] = plrpoints[owner] + 1
   end
end

jetzt muss ich nur mehr die tierhüter zählen aber wie?

Es gibt einen viel einfacheren Weg, um die Tierhüter-Hütten von Spieler x zu zählen:

plrpoints [x] = plrpoints [x] + #wl.Game ().players [x]:get_buildings ("barbarians_gamekeepers_hut")

Top Quote
kaputtnik
Avatar
Joined: 2013-02-18, 20:48
Posts: 1275
Ranking
One Elder of Players
Location: Germany
Posted at: 2018-01-14, 13:05

Nordfriese wrote:

Ein Tier ist auch eine Art Immovable ... obwohl es mobil ist face-grin.png

Hier liegt ein Missverständnis vor. Tiere und andere mobile Wesen (z.B. Arbeiter) sind keine Immovables, sondern Bobs.

Upps, sorry.


Top Quote