Dieser Post hat mich motiviert, etwas mehr als bisher über hintergründige Änderungen in Freewar zu informieren. Erwartet hier nicht tägliche oder wöchentliche Updates, aber wann immer ein größerer technischer Change im Hintergrund stattfindet, welcher keine Auswirkungen auf das Gameplay haben sollte, aber möglicherweise Bugs produziert, schreib ich hier ein paar Sätze darüber. Die Idee ist, ein wenig Verständnis zu schaffen, wenn temporär Dinge buggen,die jahrelang problemlos funktioniert haben. Das wirkt dann natürlich sinnlos, warum wir überhaupt etwas ändern, aber es hilft uns auf lange Sicht, Features bugfrei rauszubringen.
Ihr könnt diesen Thread auch benutzen, um technische Fragen zu stellen, die euch schon immer interessiert haben und die nur Entwickler beantworten können.
Anpassungen an IDs und Keys
Aktuell läuft ein mehrstufiger Plan, um Items in Freewar besser identifizierbar zu machen. Dazu zunächst ein paar Hintergrund-Infos:
Jedes Item hat eine abstrakte "Dummy-ID". Diese ID ist identisch für jedes Item desselben Typos, so hat zum Beispiel jeder Heilzauber die Dummy-ID 1 und jede Larafblüte die Dummy-ID 100. Diese ID wird genutzt, um ein neues Item aus dem Nichts zu erzeugen, also z.B. wenn ihr einen Heilzauber im Shop kauft oder einen Hasen tötet, wobei ein Hasenfell entsteht.
Jedes Item hat außerdem einen Item-Key. Auch dieser ist identisch für jedes Item desselben Typs. Der Unterschied zur Dummy-ID ist eigentlich nur, dass der Item-Key bei tatsächlich existierenden Items vorhanden ist, während die Dummy-ID nur für die theoretische Definition eines Items existiert. Stand jetzt ist nicht garantiert, dass der Item-Key identisch mit der Dummy-ID ist - dazu später mehr.
Zuletzt hat noch jedes Item eine ID. Die könnt ihr sogar ingame sehen, z.B. wenn ihr euch den Link betrachtet, der beim Klick auf den Button "Anschauen" im Inventar entsteht: ...item.php?action=watch&act_item_id=308305893. Diese ID ist ein eindeutiger Wert, der ein Item in der Datenbank identifiziert. Items gleichen Typs haben NICHT dieselbe ID.
Darüber hinaus haben Items natürlich noch eine Menge mehr Attribute, nach denen sie unterschieden werden. Der Zustand und die Stärke einer Waffe, der Verkaufspreis im Shop und - ganz wichtig - der Itemname.
Nun denkt mal an ein komplexes Feature in Freewar wie z.B. die Inventar-Filter. Wie werden dort wohl hintergründig Items identifiziert, die im Filter angezeigt bzw. ausgeblendet werden sollen? Geht es nur über den Namen? Das kann nicht funktionieren, denn es gibt ja Items wie Gewebeproben, Puppen, grüne [eingestellte] Zauberkugeln oder (starke) Rückangriffszauber, die variable Namen aufweisen. Geht es nur über den Item-Key? Das wäre schön, aber auch das ist leider nicht ganz so einfach. Manche Leute wollen ja z.B. einen Unique-Schlüssel der Festung besitzen, aber alle anderen Schlüssel der Festung im Shop verkaufen. Was daher im Hintergrund passiert ist, dass in euren Filtern sowohl der gewünschte Itemname als auch der zugehörige Itemkey hinterlegt ist. Für die normalen Filter klappt das so auch ganz gut, denn deren Logik ist relativ simpel: Wenn ein Item im Inventar, im Shop oder an der Bank sowohl im Namen als auch im Item-Key einem Eintrag im Filter entspricht, wird es angezeigt. Ansonsten nicht. Es braucht nur noch ein wenig magic zum Identifizieren von Items, die einen variablen Namen haben.
Bei dem Mindestmengen-Filter wurde es jedoch um einiges komplexer. Hier war nicht nur wichtig, dass die entsprechenden Items angezeigt wurden, sondern auch die vorhandenen Mengen waren relevant. Das führte zu komplexem Code, denn es sind die folgenden Edge-Cases zu beachten:
- Items mit gleichem Namen und gleichen Key, die nicht gruppiert werden [z.B. Zauber der Erfahrung mit anderem Tali-Träger im Itemtext oder grüne eingestellte Zauberkugeln für unterschiedliche Zielorte]
- Items mit unterschiedlichem Namen und gleichem Key, die aber dieselbe Dummy-ID haben und somit gruppiert betrachtet werden sollten [Gewebeproben etc]
- Items mit unterschiedlichem Namen und gleichem Key, die NICHT dieselbe Dummy-ID haben [Charaspezifische Wissenszauber]

Das wird nun angepasst. Im ersten Schritt habe ich am Sonntag die Wissenszauber angepasst, sodass jeder von ihnen nun einen eigenen Key hat. Das hatte den Nebeneffekt - wie von Strohhut Ruffy gemeldet - dass sie nicht mehr korrekt in Filtern auftauchen, da dort noch der alte Key hinterlegt ist. Sie müssen also manuell entfernt und wieder hinzugefügt werden - das geht z.B. ganz einfach, indem man den Filter exportiert und direkt wieder importiert. In einem zweiten, weniger invasiven, aber deutlich umfangreicherem Schritt hat bwoebi dafür gesorgt, dass alle hardcodierten Referenzen auf Item-Keys durch Referenzen auf Konstanten ersetzt wurden. In einem dritten Schritt wollen wir nun anpassen, dass für jedes in Freewar existierende Item die Dummy-ID identisch mit dem Item-Key ist. Zusammengenommen werden diese Änderungen uns erlauben, ähnlichen Code wie bei den Filtern zukünftig kürzer, einfacher und damit bugfreier zu schreiben als bisher.