Wuääh... das alles zu erklären, wird ekelhaft. Schneller ginge es wahrscheinlich, wenn ich es selbst machen und hier rein stellen würde. Aber versuchen wir erstmal, dich zum Skripter auszubilden ;-) Du hast nicht zufällig etwas Erfahrung mit Pascal oder Delphi?
Ich werd im Folgenden mit Prozedure-Namen um mich schmeißen, die du allesamt in der
Referenz nachschlagen kannst.
Also:
Gebäude nach Forschung freischalten geht ohne Probleme im Editor und ohne Skript. Entweder direkt das Gebäude als Forschung eintragen, oder der Forschung das Gebäude als Nachfolger mit 0 Stunden Forschungszeit zuweisen (wie es üblicherweise bei Waffen und Munition gemacht wird).
Mittels dem EVENT_ONBASEROOMBUILDED-Event müsste man dann alle Basen überwachen (am besten pro Basis eine Instanz des Skripts starten, und sich die Option offenhalten, auf EVENT_SPECIAL_NEWBASE mit einer weitern Instanz zu reagieren). Dazu am besten eine for-Schleife mit base_api_GetBaseCount und ...GetBaseByIndex.
Folgendes habe ich nie getestet, deshalb ist es mit Vorsicht zu genießen (ich gehe davon aus, das es so klappt, aber ich hab's wie gesagt nie getestet): Mittels mission_api_StartScriptWithObject das Überwachung-Skript starten, das Objekt wäre in diesem Fall eine Baisis, die in der for-Schleife via base_api_GetBaseByIndex rausgefischt wird (vorsicht, man muss die TBasis für in ein TObject umwandeln, und im Zielskript wieder zurück!). Danach haben wir eine Instanz pro Basis, die sich genau um eine Basis kümmert. Besser für die Übersicht in diesem Skript. Hat aber evtl einen Nachteil, je nachdem, wie du dir das ganze vorgestellt hattest: Mit dem Weg, den ich hier vorschlage, wird die globale Forschungsrate um 10% erhöht für jede Basis, die das Gebäude besitzt!
Dieses Skript wird sich dann um die erwähnten Events (OnBaseRoomBuilded (was fürn mieses Englisch ^^), OnBaseRoomDestroyed, OnBaseDestroyed) kümmern, dazu dient register_event(@*NameDerProzedur*, *basis*, *EVENT_NAME*).
Bei OnBaseRoomBuilded: Alle Gebäude checken (for i:=0 to GetArrayLength(TBase.RoomArray) do) und, falls das gewünschte Gebäude dabei ist, mittels game_api_GetInterger und game_api_SetInteger die Globale Variable ForschTime um 10 (oder andere Prozentzahl) erhöhen. Ein Flag, mit dem sich das Skript merkt, ob schon ein Gebäude vorhanden war, ist deshalb unerlässlich. Sonst würde so lange, wie das Gebäude steht, JEDES fertiggestellte Gebäude erneut 10% Forschungsbonus auslösen.
Bei OnBaseRoomDestroyed: Vice Verda, hier wird der Wert um 10 verringert, falls das Flag sagt, letztes Mal war ein Gebäude da - aber kein Gebäude mehr vorhanden ist.
OnBaseDestroyed: Einfach Skript beenden (mission_abort/lose/win - macht keinen Unterschied, solange keine procedure OnMissionAbort/-Lose/-Win vorhanden ist).
Das Gebäude nur einmal im ganzen Spiel zuzulassen, wird nicht direkt möglich sein. Pro Basis dürfte es sogar unmöglich sein, da . Man kann natürlich versuchen, das Gebäude bei Fertigstellung des ersten Exemplars aus inaktiv zu schalten, aber ich weiß nicht, ob das nicht auch das fertige Gebäude verschwinden lässt. Ich denke zwar nicht, aber wer weiß...
Ganz abgesehen davon ist es durchaus möglich, dass mehrere Exemplare des Gebäudes gleichzeitig (oder zumindest vor Fertigstellung des 1.) in Auftrag gegeben werden. Und ich weiß nicht, ob die durch die Inaktiv-Schaltung abgebrochen werden. Da müsste man wohl alle Gebäude checken, das Vorkommen des Gebäudes zählen, und alle außer dem ersten zerstören.
Das alles macht aber nichts, weil man leicht einrichten kann, dass der Bonus nur 1x angewendet wird, so das weiter Gebäude nichts weiter bringen.
Ich hoffe, meine Ausführungen sind einigermaßen verständlich... ich brabbel hier Zeug vor mich hin, dass ich vor 2 Monaten garnicht kapiert hätte xD
Frag einfach nach, wenn was unklar ist.