[Gelöst] #appendto array[1] ?

Gibt es eine Möglichkeit, bei einem appendto eine Liste oderso zu verwenden, damits weniger arbeit ist?

Ich möchte in einem Script an sehr viele objekte via appendto was zufügen. Die ganzen Ids dieser objekte brauche ich noch an mehrere anderen Stellen im Skript, weshalb ich es für sinnvoll halte, einfach ein array mit den IDs zu füllen und dann durchzulaufen, anstatt jedesmal alle IDs aufzulisten.

Geht sowas auch bei appendto?  Am Besten wäre es natürlich, wenn ich den appendto Befehl sogar in eine for schleife verpacken könnte. Aber soweit ich es jetzt ausprobiert habe, geht sowas nicht…

Wisst ihr einen anderen Weg, wie man das vereinfachen kann?

ähnliches Problem: Kann ich Funktionen innerhalb einer Schleife erstellen? Oder wie löse ich das Problem anders?

for(var i = 1; i < Forschungsliste(2,i)[1]; i++)  //      Forschungsliste(2,i)[1] returned die Länge der Liste
{
    public func eval(Format("GetResearchBase%d",i))() { return(Forschungsliste(2,i)[0]); }       //      Forschungsliste(2,i)[,] returned die Id der Liste an der stelle i
}

Sinn ist es sowas wie das hier zu vereinfachen:

public func GetResearchBase1() { return(CNKT); }
public func GetResearchBase2() { return(ANVL); }
public func GetResearchBase3() { return(FACK); }
public func GetResearchBase4() { return(LNKT); }
public func GetResearchBase5() { return(FRGE); }
public func GetResearchBase6() { return(TENP); }
public func GetResearchBase7() { return(FDRS); }
public func GetResearchBase8() { return(AEHN); }
public func GetResearchBase9() { return(_BMR); }
public func GetResearchBase10() { return(WDBR); }
public func GetResearchBase11() { return(SIGN); }
public func GetResearchBase12() { return(ELEF); }
public func GetResearchBase13() { return(BETL); }
public func GetResearchBase13() { return(KA_S); }

Gibt es einen speziellen Grund, warum du die Funktionsnamen nummerieren willst und nicht einfach die Zahl als Parameter übergibst oder direkt ein Array zurückgibst?
Also sowas wie:

local aResearchBases;

public func Intialize() {
  //…
  aResearchBases = [CNKT, ANVL, …];
  //…
}

// Variante 1: Direkt das Array zurückgeben und hoffen, dass kein Bösewicht irgendwelche Einträge überschreibt.
public func GetResearchBases() {
  return aResearchBases;
}

// Variante 2: Nur Zugriff über Index zulassen
public func GetResearchBases(int i) {
  return aResearchBases[i];
}


Oh, und wenn du deine Indizierung bei 1 starten lässt, möchtest du eventuell ein <= statt < in der for-Schleife verwenden (denn der Index 13 wäre in einer Liste der Länge 13 ja dann noch gültig).

danke für die antwort :slight_smile:
Ja ist mir auch schon der Gedanke gekommen, dass es mit parametern deutlich sinnvoller ist. Nur ist es halt im Basis Forschungslabor aus dem Objekte Pack so definiert, dass man GetResearchBaseX verwenden muss.
Habe es jetzt aber ergänzt, sodass es auch mit einer Liste von IDs umgehen kann:

var BaseList = DefinitionCall(idDef, "GetResearchBaseList"); // eine liste
        if (BaseList)
          for(var j=0;j < GetLength(BaseList);j++)   // eine globale Array funtkion aus einem Array.c skript, um sicherzugehen, dass das array auch so lang ist, wie der index der abgefragt wird
            idBase = ArrayData(BaseList,j, 0)
            if (idBase)
              if (!GetPlrKnowledge(iPlr,idBase)) fHasBase=0;


edit jetzt verbessert zu:
var BaseList = DefinitionCall(idDef, "GetResearchBaseList"); // eine liste
        if (BaseList)
          for(var idBase in BaseList) 
              if (!GetPlrKnowledge(iPlr,idBase)) fHasBase=0;


Da fällt mir ein:
Gibt es eine möglichkeit, eine for schleife über jedes listenelement zu machen, ohne die Länge der Liste dabei beachten zu müssen? Also sowas wie "for entry in liste" oder ähnliches?

achso und noch sicherheitshalber die Frage:
in C4 Skript fangen die indizes von listen bei 0 an, oder? Und auch die Indizes von z.b GetDefinition fangen bei 0 an, oder? und 0 ist unwahr, richtig? Ist eine leere Liste auch unwahr?

edit:
habe eben ein Array.c und ein ArrayMath.c skript gefunden, welches wohl von jemanden hier erstellt wurde. Ist aufjedenfall schonmal hilfreich, aber ich glaub so eine for schleife kann man damit noch nicht erstellen… aber folgende funktion wäre sicher hilfreich, falls es sowas nicht gibt:
//Geschützer Array Zugriff
global func ArrayData(array anArray, int dnIndex, xExeption)
{
  if (Inside(dnIndex, 0, GetLength(anArray) - 1))
    return anArray[dnIndex];
  return xExeption;

>Gibt es eine möglichkeit, eine for schleife über jedes listenelement zu machen, ohne die Länge der Liste dabei beachten zu müssen? Also sowas wie "for entry in liste" oder ähnliches?


Ja, gibt es:

for(var element in liste) {
...
}


>in C4 Skript fangen die indizes von listen bei 0 an, oder? Und auch die Indizes von z.b GetDefinition fangen bei 0 an, oder?


Arrays fangen bei 0 an und ich wüsste spontan kein Beispiel für einen Index bei irgendeiner Funktion, der nicht bei 0 anfängt (sowas wie PlayerIDs sind ja keine Indizes).

>und 0 ist unwahr, richtig? Ist eine leere Liste auch unwahr?


0 wird zu false konvertiert, aber Arrays werden zu true (wie alles, was nicht 0 ist; siehe da den letzten Absatz).

-> ![]
= 0
-> ![1]
= 0
-> !0
= true

alles klar, danke :slight_smile:

Dann wäre dieser Teil der Frage geklärt :slight_smile:

bleibt nur noch die erste Frage bezüglich des appendto… damit will ich halt ebenfalls sowas abkürzen und bei Änderungen, diese nicht in x skripten ändern muessen:
natürlich mit #

appendto HUT3
appendto CNKT
appendto ANVL
appendto FACK
appendto LNKT
appendto FRGE
appendto TENP
appendto FDRS
appendto AEHN
appendto _BMR
appendto WDBR
appendto SIGN
appendto ELEF
appendto BETL
appendto KA_S

#appendto funktioniert zur Compilezeit. Es kann gar nicht in Funktionen und erst recht nicht in Schleifen stehen. Was du machen kannst ist aber:

#appendto *

func GetResearchBase()
{
  // Huette, Bausatz, Amboss erst nach dem Flint
  var appendto_ids = [HUT3, CNKT, ANVL];
  if (GetIndexOf(appendto_ids, GetID()) >= 0) return FLNT;
  // Standard-Forschungsvoraussetzungen
  return _inherited(…);
}

>#appendto *


Woah! Genial :)

vielen dank, darauf bin ich nicht gekommen :slight_smile:
Funktioniert :slight_smile:

Wenn ich sehr viele Objekte habe, nehme ich mal an, dass appendto * dafür sorgt, dass das Laden des spiels etwas länger dauert, richtig ?

Wenn ich nun auch mehrere Skripte habe, wo ich appendto * verwende, ist es dann evlt sinnvoll, sie alle in ein einziges Skript zusammenzufügen, damit appendto * nur einmal ausfgeführt werden muss? Oder macht das zeitlich keinen Unterschied?

Das Zusammenbauen der Scripte ist zeitlich ziemlich egal.

Nein, geht nicht. Du kannst dir natuerlich ein kleines Script schreiben, was aus deiner Liste einfach die ganzen Zeilen mit den #appendto generiert.

joa, aber das wäre doch zu umständlich :smiley:
geht ja auch darum, dass wenn ich mich mal umentscheide, dass ich dann nur ein einer stelle eine kleine Ändeurng machen muss, und gut ist :slight_smile:

Die Lösung von Sven2 ist also schon perfekt. Dennoch danke für deine Antwort :slight_smile: