Alles klar, danke für deine Antworten :)
Habe es jetzt mal eingebaut und es scheint auch zu funktionieren :)
Leider hat sich ein anderes Problem eingeschlichen, was ich auch schon vor dem arraysystem hatte. Und zwar passiert es nun, dass die Forschungszeit offensichtlich nciht mehr korrekt berechnet wird.... ICh hab noch nicht ganz rausgekriegt, welches muster dahinter steckt , aber zurzeit sieht es so aus, als würde es reichen eine Forschung normal durchzuziehen. Danach wird anscheinend der progress nicht mehr zurückgesetzt, denn jede weitere Forschung dauert plötzlich nur noch wenige sekunden.
Eigentlich ist das nicht möglich, da meine einzigen Änderungen am Originalskript if Befehle sind, welche sich lediglich um den Geldabzug kümmern und nicht mit progress oderso in Berührung kommen...
Hier mal die Funktionen die ich geändert habe. Alle anderen Funktionen sind unberührt und weiterhin wie im Originalskript, ich hebe meine Änderungen mal fett hervor:
local restime, kosten,kosten2; // Benötigte Gesamtzeit zum Forschen, kosten: die kostenanzeige im Menü, kosten2: die tatsächlichen kosten des nun zu erforschenden Objekts
protected func SelectResearchCategory(idImage, pClonk, dwCategory)
{
// Auswahlmenü erzeugen
CreateMenu(idImage, pClonk, this(), 0, "$TxtNothingelsetoresearc$");
// Alle geladenen Baupläne überprüfen
var i,idDef,iPlr=GetOwner(pClonk);
while (idDef = GetDefinition(i++, dwCategory))
// Passende Kategorie
if (GetCategory(0, idDef) & C4D_Knowledge())
// Dem Spieler noch nicht bekannt
if (!GetPlrKnowledge(iPlr,idDef))
{
// Keine Forschungsgrundlage nötig oder Forschungsgrundlage vorhanden
kosten = DefinitionCall(idDef, "GetResearchCosts");
var idBase = DefinitionCall(idDef,"GetResearchBase"), fHasBase, j;
fHasBase = !idBase || GetPlrKnowledge(iPlr,idBase); j=1;
// Erweiterte Forschungsgrundlagen
while (idBase = DefinitionCall(idDef, Format("GetResearchBase%d", ++j)))
if (!GetPlrKnowledge(iPlr,idBase)) fHasBase=0;
// Ist schon durch etwas anderes erforschbar? (Zugbrücke rechts -> Zugbrücke links etc.)
var link;
if (link = DefinitionCall(idDef, "GetResearchLink"))
if (GetName(0, link)) // Linkdefinition auch tatsächlich geladen?
if(!GetPlrKnowledge(iPlr, link) ) // Linkdefinition noch nicht erforscht? (passiert durch SetPlrKnowledge-Aufrufe oder Szenariovorgaben)
continue;
// Menüeintrag hinzufügen
// if (fHasBase) AddMenuItem("$TxtResearchs$", "SelectResearch", idDef, pClonk, 0, pClonk);
if (fHasBase) AddMenuItem(Format("%s (%d C.)erforschen",GetName(0,idDef),kosten),"SelectResearch",idDef, pClonk, 0, pClonk);
}
return(1);
}
public func SelectResearch(def, clonk)
{
kosten2 = DefinitionCall(target=def, "GetResearchCosts", this(), clonk);
if (!AccHasResearch(def, GetOwner())){
if(GetWealth(GetOwner())< kosten2)
return(Message("$NotEnoughMoney$",this()),Sound("Error"));
};
// Anfangen
AddCommand(clonk, "Call", this(), def, 0, 0, 0, "StartResearch", 10, 1);
// Vorher ins Labor gehen
if (Contained(clonk) != this())
{
AddCommand(clonk, "Wait", 0, 0, 0, 0, 40);
AddCommand(clonk, "Enter", this());
}
}
private func CancelResearch()
{
if (GetChar(GetAction()) == GetChar("R")) SetAction("Idle");
EnergyCheck(0);
}
protected func StartResearch(clonk, def)
{
// Spieler hat diesen Bauplan schon
if (GetPlrKnowledge(clonk->GetOwner(), def))
{
Message("$TxtAlreadyDeveloped$", this(), GetName(0, def));
Sound("Error");
return(0);
}
// Bisherige Forschung abbrechen
CancelResearch();
// nur, wenn ansonsten inaktiv oder schon am Forschen
if (!ActIdle()) if (GetChar(GetAction()) != GetChar("R")) return(0);
// Besitzer anpassen (der Besitzer des forschenden Clonks erhält den Bauplan)
SetOwner(GetOwner(clonk));
// Neues Forschungsziel: Fortschritt zurücksetzen
if (def != target) progress = 0;
// Forschungsziel und Gesamtzeit setzen
restime = DefinitionCall(target=def, "GetResearchTime", this(), clonk);
// Forschungsaktion starten
if (!AccHasResearch(def, GetOwner())){
SetWealth(GetOwner(),GetWealth(GetOwner())- kosten2);
Sound("Cash");
AddToResearchAcc(def, GetOwner());
};
SetAction("Research");
return (1);
}