PBeM-Spiele
Aktuelle Zeit: 28.03.2024 10:05

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: allgemeine Fragen zu Vorlage
BeitragVerfasst: 05.01.2010 22:19 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 10:28 
Offline
Fast-Mitglied
Fast-Mitglied
Benutzeravatar

Registriert: 13.09.2002 15:47
Beiträge: 59
Wohnort: Bremen
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 10:59 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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"?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 14:01 
Offline
Forumheld
Forumheld
Benutzeravatar

Registriert: 08.02.2005 16:41
Beiträge: 396
Wohnort: Karlsruhe
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
}

_________________
Bild

--> Fehlermeldungen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 15:20 
Offline
Fast-Mitglied
Fast-Mitglied
Benutzeravatar

Registriert: 13.09.2002 15:47
Beiträge: 59
Wohnort: Bremen
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 16:21 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 06.01.2010 17:50 
Offline
Forumheld
Forumheld
Benutzeravatar

Registriert: 08.02.2005 16:41
Beiträge: 396
Wohnort: Karlsruhe
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.

_________________
Bild

--> Fehlermeldungen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 10.01.2010 23:54 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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... ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 11.01.2010 02:02 
Offline
Fast-Mitglied
Fast-Mitglied
Benutzeravatar

Registriert: 20.07.2003 21:00
Beiträge: 80
Wohnort: Ritus, 8. Welt
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

_________________
Quiquid id est, timeo Danaos et (iam) dona ferentes.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 19.01.2010 22:16 
Offline
Anfänger
Anfänger
Benutzeravatar

Registriert: 20.09.2003 10:47
Beiträge: 35
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
}
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 20.01.2010 23:29 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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.


Zuletzt geändert von Andunier am 01.02.2010 15:53, insgesamt 6-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 31.01.2010 00:05 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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 ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 31.01.2010 01:54 
Offline
Forumheld
Forumheld
Benutzeravatar

Registriert: 08.02.2005 16:41
Beiträge: 396
Wohnort: Karlsruhe
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...

_________________
Bild

--> Fehlermeldungen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 31.01.2010 08:38 
Offline
Frischling
Frischling
Benutzeravatar

Registriert: 21.12.2004 00:59
Beiträge: 24
Wohnort: Hamburg, Germany
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 01.02.2010 00:40 
Offline
Etabliertes Mitglied
Etabliertes Mitglied

Registriert: 05.05.2005 21:32
Beiträge: 182
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?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 49 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
Webhosting by sunrise design ohg