PBeM-Spiele
http://www.pbem-spiele.de/forum/

allgemeine Fragen zu Vorlage
http://www.pbem-spiele.de/forum/viewtopic.php?f=16&t=3321
Seite 1 von 3

Autor:  Andunier [ 05.01.2010 22:19 ]
Betreff des Beitrags:  allgemeine Fragen zu Vorlage

Mal ein eigenes Thema um Ennos-Vorlage-Eintrag nicht zu verwäsern.

Steckt in "region.baeume" die Anzahl der Bäume in der Region oder Bäume+Schösslinge? Und kann man auch irgendwie nur die Anzahl Schösslinge abfragen? Um bspw. die Anzahl freier Arbeitsplätze auszurechnen, oder bekomme ich die eleganter über ein Attribut heraus?

Autor:  Thoran [ 06.01.2010 10:28 ]
Betreff des Beitrags: 

Hai!

Es gibt sowohl REGION.Baeume als auch REGION.Schoesslinge als auch REGION.Arbeitsplaetze.

REGION.Baeume sind tatsächlich nur die Bäume in der Region.

Gruß,
Thorsten

Autor:  Andunier [ 06.01.2010 10:59 ]
Betreff des Beitrags: 

Ok, vielen Dank Thoran. Mein "Lernskript" ist http://www.gulrak.de/vorlage/doku/. Da fehlen die Schoesslinge noch. Gibt es eine aktuellere Dokumentation?

Und ich hätte auch gleich noch ne Syntax-Frage:
Ich habe einen Parameter "$good" und will testen, ob die Einheit dieses Gut bei sich trägt. Ich bin mit nicht sicher wie ich das unit-Attribut "Gegenstaende[<idx>].Anzahl" richtig interpretiere. Meine Vermutung ist:

"#proc testgood $good { #if unit.gegenstaende[$good].anzahl > 0 { mach was }}"

Gerade bei den eckigen Klammern bin ich mir nicht sicher ob die hin müssen oder nicht.
Und der korrekte Programmaufruf wäre dann z.B. "#call testgood Stein"?

Autor:  Solthar [ 06.01.2010 14:01 ]
Betreff des Beitrags: 

Du kannst einfach Unit.$Ding>0 (ohne Leerzeichen!) benutzen.

Soviel ich weiß, muss Gegenstaende[<idx>] mit einer Zahl indiziert sein, also etwa
Code:
#while $idx<Unit.Gegenstaende.size {
    #if Unit.Gegenstaende[$idx].Anzahl>5 { ... }
    $idx=$idx+1
}

Autor:  Thoran [ 06.01.2010 15:20 ]
Betreff des Beitrags: 

Andunier hat geschrieben:
Ok, vielen Dank Thoran. Mein "Lernskript" ist http://www.gulrak.de/vorlage/doku/. Da fehlen die Schoesslinge noch. Gibt es eine aktuellere Dokumentation?


Nur die, die in den jeweiligen Versionen von Vorlage als history.txt mit dabei ist.

Die aktuelle Vorlage-Version ist übrigens:
Vorlage V1.6.2-1 [Build 524, 2007-11-29, 01:39:21]

Andunier hat geschrieben:
Und ich hätte auch gleich noch ne Syntax-Frage:
Ich habe einen Parameter "$good" und will testen, ob die Einheit dieses Gut bei sich trägt. Ich bin mit nicht sicher wie ich das unit-Attribut "Gegenstaende[<idx>].Anzahl" richtig interpretiere. Meine Vermutung ist:

"#proc testgood $good { #if unit.gegenstaende[$good].anzahl > 0 { mach was }}"

Gerade bei den eckigen Klammern bin ich mir nicht sicher ob die hin müssen oder nicht.
Und der korrekte Programmaufruf wäre dann z.B. "#call testgood Stein"?


Das hat Solthar ja schon beantwortet (bis auf die Frage nach dem korrekten Aufruf, der aber wie von Dir vermutet ist). Aber noch eine kleine Anmerkung dazu: Leerzeichen sind leider eine mittlere Katastrophe in Vorlage :-(

Du mußt ein Leerzeichen vor und hinter jeder geschweiften Klamer haben. Du darfst kein Leerzeichen innerhalb von Ausdrücken (also Bedingungen bei if- oder while Abfragen bzw. Termen von Berechnungen haben). Ebenso darf kein Leerzeichen bei komplexen "Ausdrücken" beim Zugriff auf Attribute stehen. Es gibt eine kleine Ausnahme dabei, die mit dem Zeilenumbruch durch ein Backslash zu tun hat - dort kann man dann auch innerhalb von Ausdrücken wieder Leerzeichen verwenden. So weit alles klar ;-)

Gruß,
Thorsten

Autor:  Andunier [ 06.01.2010 16:21 ]
Betreff des Beitrags: 

Ok, vielen Dank Euch beiden.
Das Leerzeichen wohl heikel sind hab ich inzwischen gelesen. Ich bin aber immer noch leicht verwirrt wegen der Syntax, da ich versuche Ennos Makro-Vorlage zu verstehen (besonders "#proc dig $item $skill", zum Verständnis von Parametern).

Folgendes sollte also gehen
Code:
#proc testgood $good { #if unit.$good>0 { ... } }

mit bspw. dem Aufruf
Code:
// #call testgood Stein


Ginge denn auch folgende Syntax, die exakt das selbe macht?
Code:
#proc testgood $good { #if unit.gegenstaende[$good].anzahl>0 { ... } }

mit dem leicht modifizierten Aufruf
Code:
// #call testgood 'Stein'


Also wenn ich den Parameter wie einen Index benutzen will, muss er in Hochkommas übergeben werden? Wenn dem so ist, habe ich Ennos Makros hoffentlich verstanden ;)

Autor:  Solthar [ 06.01.2010 17:50 ]
Betreff des Beitrags: 

Nein. In eckigen Klammern steht praktisch immer eine Zahl. Ausnahme scheint resource[<Index>].<Attribut> zu sein, wo ausdrücklich der Name der Resource erlaubt ist (war mir bis jetzt auch neu).

Demnach ist auch die Zeile in Ennos "dig"
Code:
#proc dig $item $skill
{
#if region.resource[$item].skill>unit.Talente[$skill].Stufe {

meiner Meinung nach falsch und müsste stattdessen
Code:
#if region.resource[$item].skill>unit.$skill.Stufe {

heißen. Aufruf ist müsste dann sein (edit: egal ob mit oder ohne Hochkommata)
Code:
#call dig Stein Steinbau

Ennos Version funktioniert wahrscheinlich meistens 'zufällig', da unit.Talente['Steinbau'] als unit.Talente[0] interpretiert wird, was normalerweise das gewünschte ergibt, wenn die Einheit nur ein Talent hat. Aber hier begebe ich mich schon auf dünnes Eis, weil ich normalerweise Vorlage nicht selber programmiere, sondern hauptsächlich die Skriptsammlung von Roman Benesch verwende.

Autor:  Andunier [ 10.01.2010 23:54 ]
Betreff des Beitrags: 

Was darf ich bei
Code:
region.resource[<Index>].<Attribut>
alles als Attribut setzen? Konkret versuche ich für die Ressource Stein die benötigte Abbaustufe herauszubekommen. Ich debugge gerade, indem ich mir erstmal verschiedene Befehle mittels "#message" als Kommentar an die aufrufende Einheit schreiben lasse.
Code:
  #message ''+region.Stein+' region.Stein'
  #message ''+region.Stein.skill+' region.Stein.skill'
  #message ''+region.ressource[Stein].skill+' region.ressource[Stein].skill'
  #message ''+region.ressource['Stein'].skill+' region.ressource[Stein].skill'
  #message ''+region.Stein.Talent+' region.Stein.Talent'
  #message ''+region.Stein.Stufe+' region.Stein.Stufe'
  #message ''+region.Stein.size+' region.Stein.size'

Aber alle meine Versuche geben "0" zurück!? Was mache ich falsch?
Wenigstens die Talentstufe wird mit
Code:
#message ''+unit.Steinbau.Stufe+' Talentstufe.'
richtig angegeben... ;-)

Autor:  Phygon [ 11.01.2010 02:02 ]
Betreff des Beitrags: 

Mit region.resource[<index>].<Attribut> greift man auf den RESOURCE Block im CR zu. Der sieht zum Beispiel so aus:

Code:
RESOURCE 123456
"Pferde";type
11;number

RESOURCE 123789
"Steine";type
5;skill
2;number

Als Attribut kann man die Tags angeben, die vorkommen (type, number, skill). Der Index darf eine Zahl von 0 bis resource.Size-1 sein, oder ein String, und zwar der Resource-Typ, wie er im CR vorkommt, also plural.

Beispiel:
Code:
#message 'Skill: '+region.resource['Steine'].skill
#message 'Anzahl: '+region.resource['Steine'].number

Autor:  Jutta [ 19.01.2010 22:16 ]
Betreff des Beitrags: 

Also bei mir läuft dieses Skript (vielleicht ist das ja hilfreich!):

#proc stein
{
#if region.resource[steine].skill>unit.steinbau.stufe { #message 'Talentstufe zu gering!' }
#else {
#if unit.silber>2000 { #tag EINHEIT ejcOrdersconfirmed 1 } else { #message 'zu wenig Silber' }
machen stein
}
}

Autor:  Andunier [ 20.01.2010 23:29 ]
Betreff des Beitrags: 

Dankeschön, so ähnlich sieht mein Skript jetzt auch aus. Nur fange ich noch ab, falls ich in der Region noch gar keine Steine sehe. Denn dann soll die Einheit einfach weiter lernen. Also auch ein Steinsucher z.B. in einem Sumpf kann mit folgendem Makro ausgerüstet werden:
Code:
#proc quarry
{
  #if region.resource['Steine'].skill<1 {
    LERNEN Steinbau
   #call confirm
  }
  #else
  {
    #if region.resource['Steine'].skill>unit.Steinbau.Stufe {
      LERNEN Steinbau
    }
    #else
    {
      MACHEN Stein
    }
    #call confirm
  }
}


Mein erstes eigenes Makro (zum Burgen bauen) ist das folgende, falls es jemandem zum Lernen hilft:
Code:
#proc buildBurg $no $size
; baut Burg $nummer auf Groesse $size aus
{   
   ; bindet die Daten der config Datei ein.
   #config Buildings nested

   ; soviel muss noch gebaut werden bis $size erreicht ist
   $togo=$size-building[$no].Groesse
   ; soviel kann pro Woche gebaut werden
   $cango=floor(unit.Burgenbau.Stufe*unit.Anzahl/Buildings[building[$no].Typ].Talent)
 
   #if $togo>0 {
      ;ja, es muss noch gebaut werden
      #if unit.Burgenbau.Stufe>=Buildings[building[$no].Typ].Talent&&(region.pool.Stein>=$cango||region.pool.Stein>=$togo) {
         ;ja, die Einheit kann an dem Gebaeude bauen und es sind genug Steine in der Region
         MACHEN $togo BURG $no
         #call confirm
      } #else {
         ;nein, die Einheit kann an dem Gebaeude noch nicht bauen oder es sind nicht ausreichend Steine da
         Lerne Burgenbau
         #call confirm
         }
   } #else {
      ;nein, Burg ist ausgebaut
      Lerne Burgenbau
      #message 'Burg ausgebaut'
      ;nicht bestätigen
   }
}

edit-Bemerkung: Die obige Version funktioniert nun, dank der vielen Anmerkungen in den nachfolgenden Antworten.

Autor:  Andunier [ 31.01.2010 00:05 ]
Betreff des Beitrags: 

Mein erstes eigenes Skript "#proc buildBurg $no $size" ist fehlerhaft. Warum? ;-)

Ich bekomme folgende Fehlermeldung:
Code:
building[$no].size

-> Falsche Indizierung fuer Objekt BUILDING

Hier steht:
Um ein Gebäude anzusprechen dessen Identifikations-Nummer einem bekannt ist, verwendet man:
Code:
building[<id>].<Attribut>

Ist die "Identifikations-Nummer" nicht identisch der Ingame Gebäudenummer? Oder ist es ein Problem, dass die Nummer ein Parameter ist? Bin für Tipps aller Art dankbar, um meine erste eigene Prozedur doch noch zum Laufen zu bringen ;-)

Autor:  Solthar [ 31.01.2010 01:54 ]
Betreff des Beitrags: 

Identifikationsnummer hat nichts mit der Eressea-Gebäude-ID zu tun. I.A. sind alle Arrays in Vorlage einfach durchnummeriert von 0 bis (Anzahl Dinge -1).
Code:
building[0]
ist das erste Gebäude,
Code:
building[1]
das zweite usw. Also um ein Gebäude mit einer bestimmten Nummer zu finden braucht
Code:
#proc dosomethingforbuilding $nummer {
  $no = 0
  #while ($no < region.building.size) {
    #if (region.building[$no].nummer==$nummer) {
       ; do something
    }
    $no=$no+1
  }
}
Tippfehler zu später Stunde vorbehalten...

Autor:  Gulrak [ 31.01.2010 08:38 ]
Betreff des Beitrags: 

Jetzt guck ich zufällig mal in das Forum, und es gibt tatsächlich einen Vorlage-Thread! :D

Zunächst mal sorry, das die Doku so lange nicht mehr gepflegt wurde! Ich will mal sehen, ob ich die Doku in nächster Zeit wieder editierbar machen kann, dann ist es auch leichter, ein paar Änderungen einzupflegen.

Solthar hat geschrieben:
Identifikationsnummer hat nichts mit der Eressea-Gebäude-ID zu tun. I.A. sind alle Arrays in Vorlage einfach durchnummeriert von 0 bis (Anzahl Dinge -1).
Code:
building[0]
ist das erste Gebäude,
Code:
building[1]
das zweite usw.


Das stimmt so nicht. Die Identifikationsnummer ist genau die vom Eressea-Server vergebene (heute meist Base36 kodierte) Gebäudenummer. Für unit, building und ship gilt: Wenn sie ohne Region mit einem Parameter angesprochen werden also z.B.
Code:
building[e1k]
dann ist die Nummer gemeint die auch im NR verwendet wird, und kein Index. Building verhält sich dann also wie ein #dict. Relativ zur aktuellen oder einer gegebenen Region ist es hingegen wie ein #array, also z.B.
Code:
region.building.size
für die Anzahl der Gebäude in der aktuellen Region bzw.
Code:
region.building[0].groesse
für die Grösse des ersten Gebäudes der Region (groesse, nicht size, weil das Attribut im CR so genannt wird, size hätte versucht das addressierte Gebäude als Array zu interpretieren und dessen Grösse zu ermitteln, ein einzelnes Gebäude ist aber kein Array, daher die etwas kryptische Fehlermeldung).

Genrell hab ich mich bemüht, in der Doku immer Index oder $idx zu verwenden wenn ein numerischer Index von 0 bis size gemeint ist, und Id oder teilweise Nummer wenn die Server-Nummer gemeint ist, also die meist base36 kodierte Kennung eines Game-Objektes.

Wenn ein Attribut nicht in der Doku steht, reicht eigentlich immer ein Blick in den CR, es kann über den dort verwendeten Namen auch aus Vorlage heraus erreicht werden.

Nicht immer sind die Fehlermeldungen die allerbesten, das teilt Vorlage mit vielen Compilern. :wink:

Generell würde ich jedem der selber Skripte entwickelt raten, sich mit dem Skriptdebugger http://www.gulrak.de/vorlage/doku/SkriptDebugger.html vertraut zu machen. Der funktioniert leider nicht aus Magellan heraus, sondern nur wenn man die Kommandozeile benutzt, aber er spart einem oft stundenlanges grübeln. Aktiviert wird er bei Verwendung des Parameters -et sobald Vorlage auf einen Fehler trifft, oder aus einem Skript gezielt mit #trace 2 und auf der dann erscheinenden Kommandozeile kann man leicht Zugriffe überprüfen und versteht mit etwas Übung meist schnell was nicht funktioniert.

Autor:  Andunier [ 01.02.2010 00:40 ]
Betreff des Beitrags: 

Wenn man der Datei e3.cfg in Ennos Vorlage-.zip-Archiv folgende 4 Zeilen voranstellt,
Code:
[Options]
EBase = 36
PBase = 36
BBase = 36
funktioniert es so wie Gulrak schreibt.

Jetzt kann man tatsächlich mit dem Parameter $no und dem Befehl
Code:
building[$no].Groesse
die Größe der Burg (mit Ingame-Gebäudenummer $no) abfragen.

Aktuell habe ich aber folgendes Problem: Ich möchte den Talentwert wissen, mit dem ich an der Burg $no weiterbauen kann.
Code:
building[$no].Talent
liefert aber als benötigten Talentwert fälschlicherweise 0 zurück (und resultiert dadurch in einer Division-by-zero). Möglicherweise muss hier auch im e3.cfg-file eine Änderung vorgenommen werden. Allerdings sehen für mich die folgenden Zeilen richtig aus (mal vorausgesetzt ich frage nicht gerade den Talentwert ab, den ich brauche um an einem Gerüst, Wache oder Wachturm weiterzubauen. Dazu müssten diese erst irgendwie ins .cfg-file eingebaut werden; für ein Wachturm müsste der Talentwert dann sogar idealerweise auf NaN oder -1 stehen):
Code:
[Buildings]
[...]
"Grundmauern",  1, "Talent",    1, "Größe", 0, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
"Befestigung",  2, "Talent",   10, "Größe", 1, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
"Turm",         3, "Talent",   50, "Größe", 2, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
"Burg",         4, "Talent",  250, "Größe", 3, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
"Festung",      5, "Talent", 1250, "Größe", 4, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
"Zitadelle",    6, "Talent", 6250, "Größe", 5, "Bonus", "Baukosten",  1, "Stein", "Unterhalt",   0, "Silber"
bzw.
Code:
[Castles]
;CRT,           AbGr, BauernBonus
"Grundmauern",     1,   0
"Befestigung",    10,   1
"Turm",           50,   2
"Burg",          250,   3
"Festung",      1250,   4
"Zitadelle",    6250,   5


Muss hier noch eine Modifikation für E3 vorgenommen werden? Oder an einer anderen Stelle um den korrekten Talentwert zu bekommen?
Hat schon jemand ein modifiziertes E3 .cfg-file geschrieben, das z.B. die neuen Schiffstypen kennt und deren Unterteilung in Ladung/Passagiere und ist bereit dieses weiterzugeben?

Seite 1 von 3 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/