Latest Posts

Topic: Mauern Skript

hessenfarmer
Avatar
Joined: 2014-12-11, 22:16
Posts: 2714
Ranking
One Elder of Players
Location: Bavaria
Posted at: 2024-09-10, 14:16

Also die seltsame Skript Notation ist so nicht zu verstehen.
Was ich im Kopf hatte war ungefähr folgendes:
1. Maurer sucht nach einem Marker im Arbeitsbereich
2. Arbeiter geht zu Marker. 3. Arbeiter sucht die benachbarten Felder reihum mit einer Liniensuche Raduis 1 nach Maueranschlüssen ab.
4. Für gefundene Anschlüsse aktiviert er die transform Aktion in der Entgegengesetzten Richtung der Suche des gefundenen Anschlusses also den Anschluss in Richtung des neuen Mauerteils von dem aus gesucht wurde.
(etwa findobject=attrib:SW radius:1 direction NE; callobject=add_SW) 5. Arbeiter sucht das gerade gebaute Mauerobjekt und lässt den Anschluss in Richtung des gerade gefundenen Anschlusses transformieren.

dazu braucht es neben der Liniensuche wie von Teayo korrekt festgestellt mindestens die call Funktion für den Arbeiter und die Implementierung des on_failure Mechanismuses.
Oder aber man versucht das per skript zu lösen. da ja mit 1.3 jetzt auch beliebige lua Skripte benutzt werden können.
Ich würde fast letzteres versuchen, das dieses ggf. den Aufwand für c++ implementierung veringert.


Top Quote
Teayo
Avatar
Topic Opener
Joined: 2015-03-09, 21:11
Posts: 186
OS: Windows 11 Home 64-bit
Version: 1.2 from Juni (06) 2023
Ranking
Widelands-Forum-Junkie
Location: Deutschland
Posted at: 2024-09-11, 09:39

hessenfarmer schrieb sinngemäß :
Also die seltsame Skript Notation ist so nicht zu verstehen . Was ich im Kopf hatte war ungefähr folgendes :
1, Der Maurer sucht im Arbeitsbereich nach einen Mauer Marker .

"findobject=empire_plus_immovable_wall_place_marker radius:15",

2, Der Maurer geht zum Mauer Marker .

"createware=empire_plus_ware_granite",
"walk=object",

3, Der Maurer sucht die benachbarten Punkte reihum mit einer Liniensuche mit dem Radius 1 nach Mauer Objekten ab .

"call=start_add_wall_connection_to_east on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_east:1",
"call=start_add_wall_connection_to_north_east on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_north_east:1",
"call=start_add_wall_connection_to_north_west on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_north_west:1",
"call=start_add_wall_connection_to_south_east on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_south_east:1",
"call=start_add_wall_connection_to_south_west on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_south_west:1",
"call=start_add_wall_connection_to_west on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_west:1",

4, Der Maurer aktiviert die transform Aktion für alle gefundenen Mauer Objekte in der entgegengesetzten Richtung der Suche des gefundenen Mauer Objektes .
Also den Anschluss in Richtung des neuen Mauerteils von dem aus gesucht wurde .

"call=start_add_wall_connection_to_east on_failure:continue",
    "findobject=attribute:empire_plus_walls direction_east:1",
    "callobject=change_west",
...

5, Der Maurer sucht das gerade gebaute Mauerobjekt , also das was neu hinzugefügt wird und lässt den Anschluss in Richtung des zuletzt gefundenen Anschlusses transformieren .

"call=start_add_wall_connection_to_east on_failure:continue",
    "findobject=attribute:empire_plus_walls_construction radius:0",
    "callobject=change_east",


Also das was du in deinen obrigen Post beschreibst , entspricht genau dem was in Methode 4 von mir anhand deiner ersten Überlegungen ausgearbeitet wurde .
Lediglich der Schutz gegen überlagerte Bearbeitung von Mauer Objekten wird von dir nicht erwähnt .
Auch nach dieser Überprüfung kristallisiert sich heraus , das die beschriebenen Parameter für die Aktionen benötigt werden und hinzugefügt werden müssen .
Ich habe auch keine Probleme wenn dies als Skript ? hinzugefügt wird , anstatt dies im C++ Code von Widelands zu implementieren .
Allerdings bin ich da vollkommen überfragt wie man das macht und wo man so ein Skript in der Erweiterung hinzufügt .
Damit hatte ich mich noch garnicht beschäftigt . Ich wollte ursprünglich nur Mauern mit einer Erweiterung hinzufügen und nun stellt sich ja heraus ,
das ich dafür doch sehr tief abtauchen muss , als ursprünglich vorgenommen .
Zum Glück hatte ich in meinen vorherigen Post ein Inhaltsverzeichnis mit Abschnitten angelegt , sonst würde es sehr unübersichtlich werden .


Das Imperium schlägt zurück ! TY

Top Quote
hessenfarmer
Avatar
Joined: 2014-12-11, 22:16
Posts: 2714
Ranking
One Elder of Players
Location: Bavaria
Posted at: 2024-09-11, 09:54

Ok danke für die Klarstellung. Jetzt verstehe ioch es auch.

Deine Einschätzung der dafür zu implementierenden Arbeiter Programmfunktionen ist auch korrekt.

Der Einsatz eines Skriptes kann alle Möglichkeiten unserer lua Schznittstelle nutzen und ist daher flexibler. Ich we3rde mal schauen ob man das Gnaze als Skript implementieren kann, dann erfolgt der Aufruf einfach durch das Programm "script=SKRIPTNAME".

Falls ich dafür keine Lösung finde würde ich mich an die Implementierung der benötigten Programme machen.


Top Quote
Teayo
Avatar
Topic Opener
Joined: 2015-03-09, 21:11
Posts: 186
OS: Windows 11 Home 64-bit
Version: 1.2 from Juni (06) 2023
Ranking
Widelands-Forum-Junkie
Location: Deutschland
Posted at: 2024-09-11, 12:04

Kurze Nachfrage ,

"callworker=...
    "findobject=...
"consume=...
"playsound=...
"animate=...
"callworker=
    "walk=object",
    ...
...

Bleibt ein durch den Arbeiter gefundenes Objekt weiterhin selektiert und für den Arbeiter reserviert , auch wenn das erste Arbeiter Programm sein Ende erreicht hat und beendet worden ist
und dann zwischenzeitlich das Gebäude vom Arbeiter sein Programm fortsetzt und erst nach einer gewissen Zeit das zweite Arbeiter Programm aufruft ,
das dann versucht auf das im vorherigen ersten Arbeiter Programm gefundene und selektierte Objekt zurückzugreifen ?
Oder ist es so das sobald das Arbeiter Programm beendet ist , auch die Selektion und die damit verbundene Reservierung für den Arbeiter , des Objektes aufgehoben wird ?
Wenn ein Programm ein Fehlschlag erhält dann wird es ja auch vorzeitig beendet .

Obwohl wenn ich logisch denke , zwei Steinbrüche bearbeiten ein Stein Objekt .
Wenn die Objekt Selektion auch nach dem Ende des Arbeiter Programmes erhalten bleibt , dann kann der Arbeiter des anderen Steinbruches ,
das Stein Objekt gar nicht durch findobject finden und selektieren , da das Stein Objekt noch für den vorherigen Arbeiter reserviert und selektiert ist .
Wie kann man das überprüfen ...
* Wenn der Steinhauer sein Programm abschließt dann wurde ja der Stein verkleinert also transform Objekt , also neues Objekt .
Das könnte man daran nicht erkennen .
* Steinbruch Gebäude zerstören während der Steinhauer am selektierten und reservierten Objekt ist .
Möglich aber dann gibt es bestimmt Sicherheitsvorkehrungen in den Abläufen für Gebäude zerstören / abreißen die das selektierte reservierte Objekt wieder freigeben .

Was genau passiert eigentlich bei der Aktion callworker ?

"callworker=A"
    "createbob=worker",
    "set_programm=A"
    ...
    rufe das eigentliche und sichtbare Programm aus der init.lua auf 
    ...
    "return"
        "removeobject=worker"
        "give_result_of_programm=A to building_programm"

oder ist es 
"callworker=A"
    "graphic=enabled"
    "set_programm=A"
    ...
    rufe das eigentliche und sichtbare Programm aus der init.lua auf 
    ...
    "return"
        "graphic=disabled"
        "give_result_of_programm=A to building_programm"

Bei der einen Variante bleibt der Arbeiter als Objekt erhalten und wird nur unsichtbar , sobald er im Gebäude ist .
Bei der anderen Variante wird der Arbeiter als Objekt entfernt , sobald er im Gebäude ist .


Das Imperium schlägt zurück ! TY

Top Quote
Teayo
Avatar
Topic Opener
Joined: 2015-03-09, 21:11
Posts: 186
OS: Windows 11 Home 64-bit
Version: 1.2 from Juni (06) 2023
Ranking
Widelands-Forum-Junkie
Location: Deutschland
Posted at: 2024-09-11, 13:29

Gebäude : https://codeberg.org/Teayo/widelands_addon_empire_plus/src/branch/main/wallbuilder_init.lua
Arbeiter : https://codeberg.org/Teayo/widelands_addon_empire_plus/src/branch/main/wallmason_init.lua
Mauer : https://codeberg.org/Teayo/widelands_addon_empire_plus/src/branch/main/generic_wall_construction_init_programm_section.lua


Das Imperium schlägt zurück ! TY

Top Quote
Nordfriese
Avatar
Joined: 2017-01-17, 17:07
Posts: 2007
OS: Debian Testing
Version: Latest master
Ranking
One Elder of Players
Location: 0x55555d3a34c0
Posted at: 2024-09-11, 13:57

Am Ende des Programms, in welchem findobject aufgerufen wurde, wird das ausgewählte Objekt automatisch abgewählt. Und zwar unabhängig davon, ob das Programm regulär sein Ende erreicht oder durch Fehlschlag eines Schrittes abgebrochen wird. Bestes Beispiel, um das zu sehen, ist der amazonische Liana Cutter.

Arbeiter werden (anders als Waren) niemals gelöscht – wenn sie in einem Gebäude sind, sind sie lediglich unsichtbar, aber existieren weiterhin, und ihre Zustandsvariablen bleiben erhalten.

Edited: 2024-09-11, 14:00

Top Quote
Teayo
Avatar
Topic Opener
Joined: 2015-03-09, 21:11
Posts: 186
OS: Windows 11 Home 64-bit
Version: 1.2 from Juni (06) 2023
Ranking
Widelands-Forum-Junkie
Location: Deutschland
Posted at: 2024-09-12, 20:57

Kurze Nachfrage ,
gibt es eine Zeichenketten-Längen-Begrenzung für Einheiten Namen ?

Dann 2. bei meinen Überlegungen ( wohlgemerkt nicht im Spiel überprüft )

"construct=idle duration:0s decay_after:1h",
"transform=empire_plus_immovable_wall_construction_01i84_east0_northeast0_northwest0_southeast0_southwest0_west0"

Genau wie bei Baustellen wird ja auch bei der construct Aktion das darzustellende Bild Stück für Stück von unten nach Oben dargestellt . Oder bei einen Spritesheet eben Teilbild für Teilbild .
Wenn ich mir das richtig überlege , dann wird der Marker gar nicht zu sehen sein , weil sein Baufortschritt ist 0% , wenn der Spieler Ihn platziert .
Gibt es eine Möglichkeit die graphische Anzeige zu invertieren , beziehungsweise das unabhängig vom Baufortschritt des Objektes , immer das idle angezeigt wird ?

Und zuletzt noch , welche Zeichen sind für Einheiten Namen Zeichenketten erlaubt ? [ A-Z , a-z , 0-9 , _ ]
Ich frage mich ob . ( Punkte ) in Einheiten Namen erlaubt sind . Möglicherweise sind auch - ( Bindestriche ) erlaubt , diese werde ich aber nie nutzen , genau wie A-Z nie .


Das Imperium schlägt zurück ! TY

Top Quote
Nordfriese
Avatar
Joined: 2017-01-17, 17:07
Posts: 2007
OS: Debian Testing
Version: Latest master
Ranking
One Elder of Players
Location: 0x55555d3a34c0
Posted at: 2024-09-12, 21:59

Grundsätzlich gibt es bei Einheitennamen gar keine Beschränkungen. Ich würde empfehlen, die Namen nicht übermäßig lang zu halten, da Fehlermeldungen auf eine nicht von uns einstellbare Höchstlänge abgeschnitten werden; aber rein prinzipiell spricht nichts gegen Namen mit so vielen Zeichen wie dein Rechner Arbeitsspeicher für hat. Bei den Zeichen kannst du auch die komplette ASCII-Bandbreite außer nutzen. Bei nicht-ASCII-Zeichen wie Äöüß könnte es möglicherweise Probleme geben, falls im Mehrspieler die Teilnehmer unterschiedliche Encodings verwenden; getestet hat das meines Wissens aber noch niemand.


Die Anzeige für Objekte in Konstruktion hängt immer vom Baufortschritt ab, etwas anderes ist nicht vorgesehen.


Top Quote
hessenfarmer
Avatar
Joined: 2014-12-11, 22:16
Posts: 2714
Ranking
One Elder of Players
Location: Bavaria
Posted at: 2024-09-12, 23:06

konnte es noch nicht testen, aber jetzt habe ich zumindest ein Konzept die Funktion mit bestehenden Mitteln (bis auf den Marker) zu realisieren.

Vorraussetzung:

Die verschiedenen Mauertypen werden durch ein Bitpattern in Attribut und Namen repräsentiert. Für jede Anschlußrichtung wird ein Bit reserviert (z.B. E = 1 (000001), NE = 2 (000010), NW = 4 (000100), usw.)

  1. Der Arbeiter nutz findobject um einen Marker zu finden, und geht dort hin.
  2. dort wir dann das Skript aufgerufen.
  3. das Skript startet an der Position des Arbeiters (worker.field) und sucht zunächst den Marker, um dessen Position zu ermitteln.
  4. von dieser Position wird Reihum in jeder Richtuing as Nachjbarfeld geprüft.
  5. sollte dort bereits ein Mauerteil sein (has_attribute = wall) wird per string pattern search das Bit Pattern aus dem Namen (immovable.name) extrahiert und das richtige Bit hinzugefügt, wenn nicht bereits existent (z.b. weil dort ursprünglich schon mal eine amuerteil stand welches zerstört wurde.
  6. dann wird das vorhandene Mauerteil mit dem neuen Mauerteil inkl. der neuen Anschlussrichtung ausgetauscht und das korrepondierende Bit in das Bittpattern für das Mauerteil an der MArkerposition eingefügt.
  7. zum Schluß wird das Mauerteil mit dem ermittelten Bitpattern an der Stelle des Markers gebaut.

Wenn ein Mauerteil abgebaut wird bleiben die anschließenden Reste stehen, auch um optisch ein wenig Zerstörung keine schönen Abschlüsse darzustellen.


Top Quote
Teayo
Avatar
Topic Opener
Joined: 2015-03-09, 21:11
Posts: 186
OS: Windows 11 Home 64-bit
Version: 1.2 from Juni (06) 2023
Ranking
Widelands-Forum-Junkie
Location: Deutschland
Posted at: 2024-09-12, 23:41

@Nordfriese ,
Danke .

@hessenfarmer ,
Ich verstehe was du mit den Bitpattern meinst . Das hatte ich ganz am Anfang im Tabellen Dokument genutzt um alle 84 Varianten zu ermitteln ,
wovon aber nur 64 benötigt werden , da die restlichen Varianten graphisch identisch zu einer anderen Variante sind .
Feedback zu deiner Vorgestellten Methode kann ich jetzt noch nicht geben , das muss ich mir ersteinmal in ruhe durchlesen und verstehen . Ich bin zu diesen Zeitpunkt dafür zu müde .

Was ich noch an Informationen bereitstellen kann :

...\addons\empire_plus.wad\tribes\immovables\07_walls\45_wall_3_3_3\register.lua

So sieht aktuell ein typischer Register Eintrag einer Mauer aus . Wegen den Bitmuster hessenfarmer , was du geschrieben hast , mit Attribut und Namen .
Hier ist nichts in Stein gemeißelt , der lange Name kann auch wieder kürzer werden .
Ich habe entsprechende Batch Dateien und Massenbearbeitungs Optionen in Notepad++ , um solche systemischen Änderungen schnell umzusetzen .

return
{
    empire_plus_immovable_wall_45.84_v3_t3_r3_east.0_north-east.0_north-west.1_south-east.1_south-west.0_west.1=
    {
        "__replace_if_exists",
        "empire_immovables_wall_45.84_v3_t3_r3_east.0_north-east.0_north-west.1_south-east.1_south-west.0_west.1",
        "addon_content",
        "addon_empire_plus",
        "tribe_empire_plus",
        "object_type_immovable",
        "empire_plus_immovable",
        "size_medium",
        "stone_walls",
        "walls",
        "walls_empire_plus",
        "walls_connections_3",
        "walls_no_connection_to_east",
        "walls_no_connection_to_east_empire_plus",
        "walls_no_connection_to_north_east",
        "walls_no_connection_to_north_east_empire_plus",
        "walls_connection_to_north_west",
        "walls_connection_to_north_west_empire_plus",
        "walls_connection_to_south_east",
        "walls_connection_to_south_east_empire_plus",
        "walls_no_connection_to_south_west",
        "walls_no_connection_to_south_west_empire_plus",
        "walls_connection_to_west",
        "walls_connection_to_west_empire_plus"
    }
}

Bericht aus meiner Problem Liste.txt vom 2024.09.13

Nummer Priorität Status Prognose Titel Beschreibung
01 1 -
Sehr
Niedrig
0 -

Ungelöst
1 -
Sehr
Langfristig
Mauer Gelände
Höhen Unterschiede
Wenn zwei Mauer Objekte sich nicht auf der gleichen Höhe befinden ,
ist ein graphischer Versatz bei Ihrer Verbindung zu sehen .
- Es ist noch nicht möglich abzufragen auf welcher Höhe sich Objekte befinden .
02 1 -
Sehr
Niedrig
1 -

Offen
2 -

Langfristig
Verschiedene Mauer
Höhen als
Ausbaustufen
Ermöglichen das eine Mauer verstärkt werden kann ,
und so mehr Zeit benötigt wird um sie niederzureisen .
- Dies würde das Verknüpfungsystem der Mauer Varianten untereinander sehr stark verkomplizieren .
03 4 -

Hoch
0 -

Ungelöst
3 -

Mittelfristig
Mauer Varianten
transform Schleifen
Wenn das Spiel gestartet oder geladen wird , bleibt das Spiel im Ladebildschirm stehen .
Je mehr transform Schleifen aktiviert sind , umso länger dauert das laden .
Schon ab einen geringen aktivierten Anteil aller vorhandenen transform Schleifen ,
bleibt das Spiel defakto dauerhaft im Ladebildschirm stehen .
- Wird ausgelöst bei der Überprüfung der lua-Skript-Dateien
04 5 -
Sehr
Hoch
2 -

Gelöst
4 -

Kurzfristig
Arbeiter
Mauer Impuls
- Es ist noch nicht möglich das ein Arbeiter einen weiteren Arbeiter erschafft .
# UPDATE : Mauer Arbeiter Impulse werden nicht mehr benötigt ,
da eine Skript Lösung gefunden wurde , die nur mit dem Maurer Arbeiter auskommt .
05 3 -

Mittel
0 -

Ungelöst
3 -

Mittelfristig
Mauer Marker
Anzeige
Der Mauer Marker wird nicht angezeigt , weil sein Baufortschritt 0% hat und damit
das darzustellende Bild zu 0% angezeigt wird . Da es wie bei Baustellen gehandhabt wird .
- Es gibt noch keine Möglichkeit ein Bild unabhängig vom Baufortschritt anzuzeigen , oder als Invertierte Baustelle .
- Beziehungsweise vielleicht Lösung über zusätzliches Objekt

Das Imperium schlägt zurück ! TY

Top Quote