Aber ich poste die Lösung nochmal:
Es geht jetzt zum Beispiel um diesen Eintrag hier im SOM. Ich biete eine Konfigurations-Möglichkeit an, bei der der Anwender seine Wunscherweiterungen speichern kann. Zu diesem Zeitpunkt gibt es kein Schiff, kein Objekt, kein nix. Es ist eine Auswahl verfügbarer Schiffserweiterungen.
[ external image ]
Um die Standardeinträge (z.B. Handels-Sw MK1) in die Liste zu bekommen ist es relativ einfach. Ich prüfe in einem Script, ob der Spieler den nötigen Ruf hat um die Ware zu erwerben und Trage dann die Ware, nötiger Ruf (true/false) und die Rubrik (korrespondierend zu meinem eigenen t_file) in ein Array ein:
Code: Select all
$tmpWare = {Handelssoftware MK1}
$tmpEntry = array alloc: size=3
$tmpEntry[0] = $tmpWare
$tmpNotoReq = get notoriety required to buy ware: $tmpWare
* Rangcheck:
if $MaxNoto >= $tmpNotoReq AND $tmpNotoReq != null
$tmpEntry[1] = [TRUE]
else
$tmpEntry[1] = [FALSE]
end
$tmpEntry[2] = 109
append $tmpEntry to array $tmpArray
Diese Standard-Waren werden immer eingetragen, da sie auch immer verfügbar sind und immer gleich heißen.
Komplett anders verhält es sich nun mit den durch externe Scripte erzeugte Waren, wie z.B. "Warenlogistik-SW MK1". Diese Ware wird erst mit der Installation über eine bestehende Ware drübergebügelt.
Die Warenlogistig-SW heißt vorher {SS_WARE_SW_NEW5} oder 6. Jedenfalls heißt sie ab der Installation NICHT mehr so, sondern eben {Warenlogistiksoftware MK1}. Ab diesem Zeitpunkt ist diese Ware auch nur noch so abfragbar. Sobald man auf den ehemaligen SS-Typ abfragt kracht es. Andersrum natürlich auch, wenn die Erweiterung nicht installiert wurde.
Da ich nun nicht wissen kann, ob eine Ware installiert wurde oder nicht, habe ich nur die Möglichkeit über Maintype und Subtype zu prüfen. Diese Werte sind nämlich eineindeutig. Wenn Du den Main- und Subtype einer Ware kennst, dann kann diese auch "Hugo-Egon-Fritz" heißen. Völlig irrelevant.
Ich prüfe nun, ob die Waren, die von "außen" durch fremde Scripte angelegt werden, genauso heißt, wie es der im t-File hinterlegte Name. Ist das so, dann ist die Ware auch vorhanden. Geht nämlich beim init des jeweiligen Scripts irgendwas schief, dann ist die Ware nicht vorhanden!
Der Code dazu sieht nun folgendermaßen aus:
Code: Select all
$tmpSector = get sector from universe index: x=1, y=1
$tmpWare = create flying ware: maintype=16 subtype=64 count=1 sector=$tmpSector x=20000 y=10000 z=30000 selfdestruct=null
$tmpName = $tmpWare->get name
* Lesen des Warennamen aus dem t-File:
$tmpTName = read text: page=17 id=5803
$tmpWare->destruct: show no explosion=[TRUE]
if $tmpName == $tmpTName
* In diesem Fall entspricht der Warenname dem Warennamen aus dem t-File
$tmpEntry = array alloc: size=3
$tmpWare = get ware from maintype 16 and subtype 64
$tmpEntry[0] = $tmpWare
$tmpNotoReq = get notoriety required to buy ware: $tmpWare
* Rangcheck:
if $MaxNoto >= $tmpNotoReq AND $tmpNotoReq != null
$tmpEntry[1] = [TRUE]
else
$tmpEntry[1] = [FALSE]
end
$tmpEntry[2] = 109
append $tmpEntry to array $tmpArray
end
So - falls Du Dich fragst, was das mit der flying ware soll, erkläre ich das auch noch gerne.
Ich benötige den Namen der Ware für den Abgleich mit den Namen im t-File. Dafür muss die Ware existieren. Auf ein Referenzobjekt kann ich diesen nämlich nicht abfragen.
Speichern hingegen tue ich die Ware als Referenzobjekt, da ich diese später brauche.
Aus diesem Grund lösche ich die erzeugte flying ware wieder und erzeuge mir, wenn die Ware übereinstimmt eine neues Referenzobjekt.
Ich hoffe, dass ich alle so erklären konnte, dass es verständlich ist.