-
Drachentöter
Dieser Code geht davon aus dass 5000 die höchste verwendete Variablen-ID ist. Solltest du höhere Variablen verwenden, musst du die Zahl "5000" im Code entsprechend ändern.
Für die anderen Variablen habe ich keine ID angegeben, da kannst du beliebige nehmen.
Es wird ein assoziatives Array implementiert, in Variablen NACH DEM ENDE DER DEFINIERTEN, also wenn z.B. 5000 die höchste eingestellte Variable ist, werden Variablen ab #5001 verwendet. Diese erscheinen NICHT im F9-Menü!
Es werden Daten in je 2 Variablen gespeichert, einmal ein Schlüssel, einmal ein Wert. Das Ende der Liste wird durch Schlüssel 0 signalisiert.
Dieses Skript kodiert Map ID und Event ID in einem Schlüssel. In dem assoziativen Array speichert jedes Pflanzenevent den Zeitpunkt an dem es respawnt wird, oder 0 wenn es gerade sichtbar und aktiv ist. Es gibt ein Common Event was den Timer verwaltet und bei Bedarf Events respawnt oder beim Mapwechsel erneut deaktiviert, je nach Bedarf.
Auf diese Weise kann man Pflanzen einfach kopieren. Pflanzen haben 3 Eventseiten, Eventseite 1 dient dazu, eine Pflanze zu respawnen, während Eventseite 2 sie deaktiviert. Dies passiert nach außen rein über die Eventgrafik (leer = deaktiviert). Eventseite 3 ist die, die beim Enterdruck ausgeführt wird. Da wird u.a. die Respawnzeit der Pflanze festgelegt sowie was genau passieren soll wenn man eine aktive Pflanze anspricht.
Das Skript geht von maximal 1000 Events auf einer Map aus, obwohl der Maker afaik 9999 erlaubt, sowie maximal 9999 Maps (ich gehe davon aus du verwendest den 2k3, sonst wären es 999 Maps). Solltest du tatsächlich mehr verwenden, musst du die Zahl "1000" im Code ändern, allerdings je mehr Events du erlaubst, desto weniger Maps sind möglich. 1000 sollte also normalerweise gut passen.
WARNUNG: Das ganze entstand gerade hier aus meinem Kopf. Ich habe es nicht getestet!
Common Event "GetAssocValue":
<> Comment: Dieses CE dient dazu, einen Wert anhand eines Schlüssels aus unserem assoziativen Array zu lesen.
<> Comment: Skript erwartet Schlüssel in Variable [AKey] und liefert Ergebnis in Variable [AValue] oder 0 wenn Schlüssel nicht vorhanden
<> Comment: Alle Elemente des assoziativen Arrays werden abgeklappert.
<> Change Variable [AIndexCounter] = 5000
<> Comment: Standardwert ist 0.
<> Change Variable [AValue] = 0
<> Label: 1
<> Change Variable [AIndexCounter] += 1
<> Change Variable [ATempKey] = V[V[AIndexCounter]]
<> Comment: Ist der Schlüssel 0, wäre das Ende der Liste erreicht.
<> Fork Condition: If V[ATempKey] != 0
....<> Change Variable [AIndexCounter] += 1
....<> Fork Condition: If V[ATempKey] != V[AKey]
........<> Comment: Weitersuchen
........<> Go To Label: 1
........<>
....: Else Case
........<> Comment: Schlüssel gefunden, Wert einlesen
........<> Change Variable [AValue] = V[V[AIndexCounter]]
........<>
....: End Case
....<>
: End Case
Common Event "SetAssocValue":
<> Comment: Dieses CE dient dazu, einen Wert anhand eines Schlüssels in unserem assoziativen Array zu speichern.
<> Comment: Skript erwartet Schlüssel in Variable [AKey] und Wert in Variable [AValue]
<> Comment: Alle Elemente des assoziativen Arrays werden abgeklappert.
<> Change Variable [AIndexCounter] = 5000
<> Label: 1
<> Change Variable [AIndexCounter] += 1
<> Change Variable [ATempKey] = V[V[AIndexCounter]]
<> Comment: Wenn der Schlüssel nicht 0 ist, ist der Slot schon belegt.
<> Fork Condition: If V[ATempKey] != 0
....<> Comment: In diesem Fall stellen wir sicher, dass wir den gesuchten Schlüssel gefunden haben.
....<> Fork Condition: If V[ATempKey] != V[AKey]
........<> Comment: Weitersuchen
........<> Change Variable [AIndexCounter] += 1
........<> Go To Label: 1
........<>
....: End Case
....<>
: Else Case
....<> Comment: Der Schlüssel ist 0, d.h. der Slot ist frei (Ende der Liste erreicht), wir legen hier also den neuen Schlüssel fest.
....<> Change Variable [V[AIndexCounter]] = V[AKey]
....<>
: End Case
<> Comment: Wert wird gesetzt.
<> Change Variable [AIndexCounter] += 1
<> Change Variable [V[AIndexCounter]] = V[AValue]
Pflanzenevent Seite 1 (keine Startbedingungen, On Key Press):
<> Comment: Diese Eventseite wird gecallt wenn das Event respawnt wird
<> Move Event: This Event => Change Event Graphic (Die Grafik die die Pflanze im Normalfall haben soll)
Pflanzenevent Seite 2 (keine Startbedingungen, On Key Press):
<> Comment: Diese Eventseite wird gecallt wenn das Event deaktiviert wird
<> Move Event: This Event => Change Event Graphic (Leeres Tile im Upper Layer oben links)
Pflanzenevent Seite 3 (keine Startbedingungen, On Key Press):
<> Comment: Diese Eventseite wird im Normalfall gecallt (wenn der Spieler das Event anspricht)
<> Comment: Hier wird der Schlüssel zusammengebaut. Er besteht aus Map ID * 1000 + Event ID, also z.B. 34009 für Map 34, Event 9
<> Change Variable [AKey] = Map ID of This Event
<> Change Variable [AKey] *= 1000
<> Change Variable [X] = X of This Event
<> Change Variable [Y] = Y of This Event
<> Get Event ID (V[X], V[Y]) => [EventID]
<> Change Variable [AKey] += V[EventID]
<> Comment: Der aktuell gespeicherte Wert für dieses Event wird aus dem assoziativen Array gelesen. Ist er 0, heißt das, das Event ist aktiv!
<> Call Common Event: GetAssocValue
<> Fork Condition: If V[AValue] == 0
....<> *********************************** HIER CODE EINFÜGEN DER BEIM ANSPRECHEN DES AKTIVEN (!) EVENTS PASSIEREN SOLL, z.B. "Du hast die Pflanze gepflückt" o.ä.
....<> Comment: Das Event wird jetzt deaktiviert.
....<> Change Variable [PageID] = 2
....<> Call Map Event: ID V[EventID], Page V[PageID]
....<> Change Variable [AValue] = V[GlobalTimer]
....<> Comment: ***** HIER DIE DAUER IN SEKUNDEN EINSTELLEN DIE DAS EVENT ZUM RESPAWNEN BRAUCHT! *****
....<> Change Variable [AValue] += 300
....<> Comment: Der Zeitpunkt, zu der das Event respawnt werden soll, wird im assoziativen Array gespeichert.
....<> Call Common Event: SetAssocValue
....<>
: End Case
Parallel Process Common Event: "TimerUpdate"
<> Comment: Dieses Common Event updatet den Timer und sorgt dafür dass deaktivierte Events beim Mapwechsel automatisch wieder deaktiviert werden.
<> Label: 1
<> Change Variable [TMapID] = Map ID of Hero
<> Comment: In FrameCounter wird die Anzahl Frames seit der letzten Sekundenzählung gespeichert. Eine Sekunde hat 60 Frames.
<> Comment: GlobalTimer enthält die Anzahl Sekunden seit Beginn des Spiels. Ist FrameCounter 0, gilt eine Sekunde als abgelaufen und GlobalTimer erhöht.
<> Comment: Zu Beginn des Spiels ist FrameCounter 0, GlobalTimer wird also sofort um 1 erhöht, dadurch ist es nie 0 (was wir ja als "Event aktiv" verwenden).
<> Fork Condition: If V[FrameCounter] == 0
....<> Change Variable [GlobalTimer] += 1
....<> Comment: Alle Elemente des assoziativen Arrays werden abgeklappert.
....<> Change Variable [TIndexCounter] = 5000
....<> Label: 2
....<> Change Variable [TIndexCounter] += 1
....<> Change Variable [TTempKey] = V[V[TIndexCounter]]
....<> Comment: Ist der Schlüssel 0, wäre das Ende der Liste erreicht.
....<> Fork Condition: If V[TTempKey] != 0
........<> Change Variable [TIndexCounter] += 1
........<> Change Variable [TTempMapID] = V[TTempKey]
........<> Change Variable [TTempMapID] /= 1000
........<> Comment: Nur Events auf der aktuellen Map werden berücksichtigt.
........<> Fork Condition: If V[TTempMapID] == V[TMapID]
............<> Change Variable [TTempValue] = V[V[TIndexCounter]]
............<> Comment: Ist das Event bereits aktiv, weitersuchen
............<> Fork Condition: If V[TTempValue] == 0
................<> Go To Label: 2
................<>
............: End Case
............<> Comment: Ist der Respawnzeitpunkt erreicht oder überschritten, wird das Event respawnt.
............<> Fork Condition: If V[TTempValue] < V[GlobalTimer]
................<> Comment: Wert wird auf 0 für "Event aktiv" gesetzt und Eventseite 1 aufgerufen (wo die Grafik auf Normalgrafik geändert wird).
................<> Change Variable V[V[TIndexCounter]] = 0
................<> Change Variable [TTempKey] Mod= 1000
................<> Change Variable [TPageID] = 1
................<> Call Map Event: ID V[TTempKey], Page V[TPageID]
................<>
............: End Case
............<>
........: End Case
........<> Go To Label: 2
........<>
....: End Case
....<>
: End Case
<> Comment: Wenn die Map gewechselt wurde, werden alle Events auf der neuen Map bei Bedarf deaktiviert, wenn sie nicht aktiv sein sollen
<> Fork Condition: If V[TMapID] != V[TLastMapID]
....<> Change Variable [TLastMapID] = V[TMapID]
....<> Comment: Alle Elemente des assoziativen Arrays werden abgeklappert.
....<> Change Variable [TIndexCounter] = 5000
....<> Label: 3
....<> Change Variable [TIndexCounter] += 1
....<> Change Variable [TTempKey] = V[V[TIndexCounter]]
....<> Comment: Ist der Schlüssel 0, wäre das Ende der Liste erreicht.
....<> Fork Condition: If V[TTempKey] != 0
........<> Change Variable [TIndexCounter] += 1
........<> Change Variable [TTempMapID] = V[TTempKey]
........<> Change Variable [TTempMapID] /= 1000
........<> Comment: Nur Events auf der aktuellen Map werden berücksichtigt.
........<> Fork Condition: If V[TTempMapID] == V[TMapID]
............<> Change Variable [TTempValue] = V[V[TIndexCounter]]
............<> Comment: Nur deaktivierte Events werden berücksichtigt.
............<> Fork Condition: If V[TTempValue] != 0
................<> Comment. Eventseite 2 wird aufgerufen damit das Event unsichtbar (und durchgängig) wird.
................<> Change Variable [TTempKey] Mod= 1000
................<> Change Variable [TPageID] = 2
................<> Call Map Event: ID V[TTempKey], Page V[TPageID]
................<>
............: End Case
............<>
........: End Case
........<> Go To Label: 3
........<>
....: End Case
....<>
: End Case
<> Comment: Eigentlich ist am Ende eines PP automatisch ein 1-Frame-Wait, aber um auf Nummer sicher zu gehen, machen wir das Wait selber und verwenden Label 1 als Loop.
<> Wait 0.0s
<> Comment: FrameCounter wird erhöht und wenn er 60 wäre, auf 0 gesetzt.
<> Change Variable: [FrameCounter] += 1
<> Change Variable: [FrameCounter] Mod= 60
<> Go To Label: 1
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Geändert von Cherry (14.08.2012 um 15:41 Uhr)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln