[D2NT] Zur Syntax der .nip-Dateien

01/09/2012 23:15 worthless1337#1
Habe leider nirgendwo eine Spezifikation der Syntax und der Keywords fuer die .nip-Dateien finden koennen.
So glaube ich, dass hierzu ein Thread sinnvoll waere, in dem entsprechende Fragen abgehandelt werden koennen.

Hier also meine konkreten Fragen zur Syntax:
  • kann man ueberlange Zeilen wrappen, z.B. mit \ am Zeilenende wie in C, um die Datei uebersichtlich zu formatieren?
  • kann man Klammerung unbegrenzt verschachteln?
  • welche Precedence haben die Operatoren? (Das zu wissen, waere schoen, um ueberfluessige Klammerungen zu vermeiden)
  • kann man Makros erstellen/benutzen (z.B. wie bei C), um die .nip-Dateien uebersichtlicher zu gestalten? (Ansonsten wuerde ich halt den C-Preprocessor benutzen.)
  • gibt es vielleicht irgendwo eine vollstaendige Keywortliste? falls nicht:
  • gibt es Keywords fuer genauere Spezifizierung von [ItemAddClassSkills], also z.B. fuer Feuerskills, PB oder PC?
  • gibt es Keywords fuer z.B. self repair / self replenish?

Danke schon mal fuer Eure Hilfe!

Stefan


P.S.:
Habe gestern Muddywaters D2NT heruntergeladen, installiert, konfiguriert und testlaufen lassen mit meiner Blizzard/Meteor-Sorc.
Bin absoluter D2NT-Neuling, und bin begeistert, wie kinderleicht und selbsterklaerend die Konfiguration ist, wenn man der Anleitung von Muddyswater folgt.
Hat alles auf Anhieb funktioniert!
Sehr sauber und uebersichtlich gemacht, ein dickes Lob an Muddywater und alle Contributors!

Aber nun muss ich erstmal die .nip-Dateien nach meinem Geschmack zusammenschreiben, damit der Bot auch das aufsammelt, was ich haben will.
Daher dieser Thread.
Da es sich im weiteren Sinne um Programmierung handelt, hoffe ich, dass dies das richtige Unterforum ist - wenn nicht, bitte verschieben.
01/10/2012 00:45 mirkoregge#2
Schon mal [Only registered and activated users can see links. Click Here To Register...] reingeschaut?

Bei mir sieht dann z.b. die Pickit so aus: (Auszug)
Code:
//=========================================
//==========Natalya's Odium================
//=========================================
[Name] == GrimHelm && [Quality] == Set # [Defense] == 300 && [Dexterity] == 30 && [Strength] == 20 && [FireResist] == 20																	// Natalya's Totem
//[Name] == ScissorsSuwayyah && [Quality] == Set # [IAS] == 40																																// Natalya's Mark
[Name] == LoricatedMail && [Quality] == Set # [Defense] == 721 && [Sockets] == 3																											// Natalya's Shadow
[Name] == MeshBoots && [Quality] == Set # [Defense] == 169 && [ColdResist] == 25 && [LightResist] == 25																						// Natalya's Soul

//===============================================
//==========Tal Rasha's Wrappings================
//===============================================
//[Name] == SwirlingCrystal && [Quality] == Set # [SkillColdMastery] == 2 && [SkillFireMastery] == 2 && [SkillLightningMastery] == 2														// Tal Rasha's Lidless Eye
//[Name] == DeathMask && [Quality] == Set # [MaxHP] == 60 && [MaxMana] == 30																												// Tal Rasha's Horadric Crest
//[Name] == LacqueredPlate && [Quality] == Set # [Defense] >= 833 																															// Tal Rasha's Guardianship
//[Type] == amulet && [Quality] == Set # [SorceressSkills] == 2 && [MaxHP] == 50 && [MaxMana] == 42 																						// Tal Rasha's Adjucation
//[Name] == MeshBelt && [Quality] == Set # [ItemMagicBonus] >= 15 && [MaxMana] == 30																										// Tal Rasha's Fine-Spun Cloth

//============================================
//==========Trang-Oul's Avatar================
//============================================
[Name] == BoneVisage && [Quality] == Set # [Defense] == 257 && [MaxMana] == 150																												// Trang-Oul's Guise
//[Name] == ChaosArmor && [Quality] == Set # [EnhancedDefense] == 150																														// Trang-Oul's Scales
[Name] == CantorTrophy && [Quality] == Set # [FireResist] == 45 && [Defense] == 189																											// Trang-Oul's Wing
[Name] == TrollBelt && [Quality] == Set # [Defense] == 166 && [MaxMana] == 50																												// Trang-Oul's Girth
[Name] == HeavyBracers && [Quality] == Set # [FCR] == 20 && [ColdResist] == 30 && [Defense] >= 74																							// Trang-Oul's Claws
Alle Codes für die Items findest du in der NTItemAlias.ntl
01/10/2012 01:22 TheCrazy11#3
Eine kleine Übersicht des Aufbaus ist in der NTItemParser.ntl am Anfang:
Code:
/*

[Item-parser Syntax Information]

1. [Keyword] separates into two groups
   - [Property Keywords] : [Type], [Name], [Class], [Quality], [Flag], [Level], [Prefix], [Suffix]
   - [Stat Keywords] : [Number or Alias]

2. [Keyword] must be surrounded by '[' and ']'

3. [Property Keywords] must be placed first

4. Insert '#' symbol between [Property Keywords] and [Stat Keywords]

5. Use '+', '-', '*', '/', '(', ')', '&&', '||', '>', '>=', '<', '<=', '==', '!=' symbols for comparison

6. Use '//' symbol for comment

*/
Muddy hat da noch die [MaxQuantity] hinzugefügt (muss am Anfang der Zeile stehen!):
Code:
[B][MaxQuantity] == 1 && [/B][Name] == RingMail && [Quality] == set // Angelic Mantle
Die vollständige Keywordliste ist, wie mirkoregge schon erwähnt hat, in der NTItemAlias.ntl ersichtlich, wie auch die Qualitätsstufen, Klassen usw.

selfrepair bzw. selfreplenish:
Code:
[ItemReplenishDurability] >= 1
[ItemReplenishQuantity] >= 1
01/10/2012 06:12 worthless1337#4
Danke sehr fuer die hilfreichen Antworten und Verweise!
Die Fragen nach Keywordliste und nach dem grundlegenden Aufbau der Beschreibungszeilen sind damit beantwortet.

Das Verzeichnis scripts\libs\common ist wirklich sehr informativ.
Mein Wunsch nach der Moeglichkeit des Line-Wrappings zur uebersichtlichen Formatierung koennte mit einer kleinen Aenderung in ntitemparser.ntl in der Funktion NTIP_OpenFile() umgesetzt werden.
Habe dazu den Code [Only registered and activated users can see links. Click Here To Register...] gepostet.

Bleiben fuer mich also nur noch diese Fragen offen:
  • kann man Klammerung unbegrenzt verschachteln?
  • welche Rangfolge haben die Operatoren? (Das zu wissen, waere schoen, um ueberfluessige Klammerungen zu vermeiden)

Werde das posten, so ich das herausbekomme, aber vielleicht weiss ja jemand noch einen Link, der die Antwort schon hat?
01/10/2012 07:35 TheCrazy11#5
Das Verzeichnis scripts\libs\common\ sollte informativ sein, dort sind alle benötigten Bibliotheken gespeichert! ;)

Ansonsten sehe ich keinen Sinn hinter deinem Wunsch des Line-Wrappings, mir kommt vor, dass dadurch die Nips eher unübersichtlicher werden.

Noch zu deinen Fragen:
  • Klammerung sollte theoretisch unbegrenzt funktionieren.
  • Rangfolge der Operatoren weiß ich nicht genau, ich glaube, dass das && vor dem || beachtet wird, ein Beispiel aus der normal.nip von Muddy:
    Code:
    [Name] == Monarch && [Quality] == normal && [Flag] == ethereal # [Sockets] == 0 && [Defense] >= 220 || [Sockets] == 4 && [Defense] >= 330 // BO Spirit socketable (bugable)
    Muddy könnte dir da sicherlich weiterhelfen, ich habe jetzt auf die Schnelle die Codestelle nicht gefunden, wo das umgesetzt wird!
01/10/2012 12:26 Muddy Waters#6
Die Klammerung funktioniert in der Tat unbegrenzt. Grundsätzlich werden die Zeilen einfach in JavaScript Code übersetzt, genau das macht die ItemParser library. Damit wird aus jeder Zeile in den Nips ein String, der einen Boolschen Ausdruck repräsentiert und welcher dann der eval() Funktion übergeben wird, die den Code daraufhin ausführt.

Aus einer Zeile
Code:
[Name] == Shako && [Quality] == unique && [Flag] != ethereal # [Defense] >= 135 // Harlequin Crest
wird somit folgender Ausdruck:
Code:
item.classid == 422 && item.quality == 7 && !(item.itemflag&0x4000000) // 1 Abschnitt
item.GetStat(31) >= 135 // 2 Abschnitt
Wie durch die Trennung in Abschnitte verdeutlich werden die Ausdrücke vor und nach dem # unabhängig voneinander ausgewertet, das sollte man im Hinblick auf eine sinnvolle Klammersetzung im Hinterkopf behalten.

Es gelten ansonsten die üblichen JavaScript Syntaxregeln, natürlich entspricht auch die Rangfolge der Operatoren derselben wie in JavaScript, also:
Code:
1. 	Rangstufe: 	,
2. 	Rangstufe: 	= += -= <<= >>= &= ^= |=
3. 	Rangstufe: 	?:
4. 	Rangstufe: 	||
5. 	Rangstufe: 	&&
6. 	Rangstufe: 	|
7. 	Rangstufe: 	^
8. 	Rangstufe: 	&
9. 	Rangstufe: 	== === != !=
10. 	Rangstufe: 	< <= > >=
11. 	Rangstufe: 	<< >> >>>
12. 	Rangstufe: 	+ -
13. 	Rangstufe: 	* / %
14. 	Rangstufe: 	! ~ - ++ --
15. 	Rangstufe: 	() [] . (Klammerung und Vektoren)
01/10/2012 17:05 worthless1337#7
Quote:
Originally Posted by TheCrazy11 View Post
Ansonsten sehe ich keinen Sinn hinter deinem Wunsch des Line-Wrappings, mir kommt vor, dass dadurch die Nips eher unübersichtlicher werden.
Kommt wohl drauf an, was man gewohnt ist.
Fuer mich sind lange Zeilen, die ungebrochen ueber mehrere Bildschirmzeilen gehen, unuebersichtlich, geschweige denn von Zeilen, fuer die man den Horizontal-Scrollbar bemuehen muss.
Hauptsache fuer mich ist, dass das Line-Wrapping, so wie ich es fuer mich umgesetzt habe, meinen Vorstellungen entgegenkommt und mir das Zusammenschreiben leichter macht. Ob es Anderen auch gefaellt, ist eine ganz andere Sache. Muss ja keiner benutzen.

Quote:
Originally Posted by TheCrazy11 View Post
Muddy könnte dir da sicherlich weiterhelfen, ich habe jetzt auf die Schnelle die Codestelle nicht gefunden, wo das umgesetzt wird!
In der Tat, es ist genaugenommen pure Faulheit. Ich koennte mir natuerlich auch den ganzen Code durchsehen (was ich auch tun werde, wenn ich mal mehr Zeit habe).

Quote:
Originally Posted by Muddy Waters View Post
Die Klammerung funktioniert in der Tat unbegrenzt. Grundsätzlich werden die Zeilen einfach in JavaScript Code übersetzt, genau das macht die ItemParser library. Damit wird aus jeder Zeile in den Nips ein String, der einen Boolschen Ausdruck repräsentiert und welcher dann der eval() Funktion übergeben wird, die den Code daraufhin ausführt.

Aus einer Zeile [...] wird somit folgender Ausdruck: [...]
Sehr anschauliche Darstellung, die mit ein paar Worten kurz erklaert, was man sonst in laengerem Codelesen selbst herausklamuesern muesste. eval() ist wirklich eine schoene Sache, gefaellt mir (Muss gestehen, dass ich ein absoluter Javascript-Nub bin).

Nun weiss ich alles Notwendige, um meine Pickit-Dateien schoen sauber und detailliert auszuarbeiten.

Danke Euch sehr fuer die Hilfe!