Charakterwechsel:

Dieses Starterpack hat zwei zustzliche Buttons neben dem Inventar. Wie in DOTT kann man hier optional zwischen bis zu drei Charakteren hin- und herwechseln.
Die Sprites fr die Knpfe muss man selbst erstellen, bis jetzt sind nur Bernard, Syd und Ash enthalten. (Sprite manager -> Main -> GUIs -> Heads)
Das Format ist 30x24 Pixel.

Will man zu anderen Charakteren wechseln und hat entsprechende Sprites hinzugefgt, muss man AGS die Spritenummern mitteilen.
Das geschieht in der game_start. (Men -> Script -> game_start)
Am Ende stehen bereits die drei Zeilen fr die enthaltenen Knpfe:

  cc_busp[cSyd.ID]=827; 
  cc_busp[cBernhard.ID]=826;
  cc_busp[cAsh.ID]=828;

Im gleichen Format trgt man einfach direkt drunter eine neue Zeile ein.

Beispiel:
Man mchte auch zu Wendy wechseln, hat den Kopf im Sprite manager importiert und das Sprite hat die Nummer 832 erhalten.
Also fgt man folgende Zeile ein:

  cc_busp[cWendy.ID]=832;

Um jetzt im Spiel festzulegen, zwischen welchen Charakteren man wechseln kann, gibt es zwei neue Funktionen.

  AddChangePlayer(Character);

Diese Funktion nimmt den bergebenen Charakter in die Liste auf.

  RemoveChangePlayer(Character);

Hiermit entfernt man einen Charakter wieder aus der Liste. Wird der momentane Charakter bergeben, wird zum zweiten Charakter gewechselt.

Um selbst den aktiven Charakter zu wechseln, stehen drei Funktionen zur Verfgung:

  SetChangePlayer(Character);

Entspricht einem Klick des Spielers auf einen der Charakter-Buttons.

  SetPlayer(Character);

Diese Funktion, mit der man ursprnglich den momentanen Charakter wechseln konnte, tut dies auch weiterhin, sie leert aber gleichzeitig die Liste der anderen Charaktere.
Mchte man weiterhin mehrere benutzen, sollte man diesen Befehl verwenden:

  SetPlayers(Character, Character, Character);

Der erste Parameter wird zum momentanen Charakter, die anderen beiden erscheinen auf den Charakterbuttons.
Wenn man nur mit zwei Personen weiterspielen soll, bergibt man als dritten Parameter einfach "null".

Zustzlich gibt es noch vier Variablen:

  bool ChangeableTo(Character)

Liefert true oder false zurck, je nachdem, ob der Spieler momentan zu dieser Person wechseln kann.

  int UpperButton(), int LowerButton()

Liefert die ID des Charakters zurck, der auf dem oberen/unteren Knopf ist (oder -1, wenn der Knopf nicht vorhanden ist).
Vorsicht: nicht ohne Check einfach "character[UpperButton()]" verwenden!

  int ListLength()

Liefert zurck, zu wievielen Charakteren der Spieler momentan wechseln kann.


Beispiel:
Syd will in Urlaub fliegen. (Er ist anfangs der Hauptcharakter.)
Syd ruft Bernard an und fragt, ob er mitkommen will, Bernard stimmt zu:

  AddChangePlayer(cBernhard);    // Bernard heit im Pack IMMER NOCH BernHard ;)

Jetzt kann man zwischen Bernard und Syd wechseln.
Whrend Bernard seinen Koffer packt und zum Flughafen fhrt, fragt Syd auch Wendy:

  AddChangePlayer(cWendy);

Nun kann man zwischen allen dreien wechseln. Die drei treffen sich am Flughafen, fliegen nach Borneo und erforschen den Dschungel.
Pltzlich luft einer der drei in eine Falle:

  trapped=player;                // globale Variable, im global script durch "Character *trapped;" deklariert
  RemoveChangePlayer(trapped);   // gefangenen Spieler aus der Liste nehmen

Angenommen, man hat Bernard gesteuert, und Wendy und Syd waren auf den Knpfen. Dieser Befehl bewirkt nun, dass Wendy der aktive Spieler wird und Syd auf dem oberen Knopf landet. Bernard hingegen sitzt in der Falle fest und kann nicht mehr gesteuert werden.

Jetzt wollen wir zurck zu Dave aufs Festland wechseln, ohne dass wir auch Wendy und Syd steuern knnen:

  SetPlayer(cDave);

Jetzt macht sich Dave alleine auf die Suche nach den dreien. Er findet Reservierungen fr die Flugtickets und fliegt hinterher nach Borneo. Dort findet er Wendy und Syd, die hilflos im Urwald rumsitzen.

  TALK_TO Syd:

  if (player==cDave || ChangeableTo(cDave)) {     // Dave ist auf der Insel
    if (ChangeableTo(cSyd)==false) {
      player.Say("Komm, Syd, wir mssen %s suchen!", trapped.name);
      AddChangePlayer(cSyd);
      if (ListLength()==2) {                      // Dave hat die beiden anderen gefunden
        player.Say("Was %s wohl gerade macht?", trapped.name);
        SetPlayer(trapped);                       // Wechsel zum Gefangenen
      }
    }
  }

Dasselbe steht bei Bernard und Wendy, damit Dave die brigen einsammeln kann, egal wer gefangen wurde.

Bernard wacht in einer Htte auf und kann sich schlielich befreien. Wechsel zurck zu den drei "Rettern":

  if (trapped==cBernhard) SetPlayers(cDave, cWendy, cSyd);
  if (trapped==cSyd) SetPlayers(cDave, cWendy, cBernhard);
  if (trapped==cWendy) SetPlayers(cDave, cSyd, cBernhard);

-Ende-

----------------------------

Tren:

Damit die Tren ordnungsgem funktionieren, habe ich bei den Properties eine Tren-Property hinzugefgt.

Diese ist von Haus aus -1 und hat zweierlei Zweck:
Bei Objekten, die eine offene Tr darstellen, muss die zur Tr gehrende GlobalInt eingetragen sein.
Bei Rumen mit Tren muss die Objekt-Indexnummer der letzten Tr eingetragen sein.

Beispiel:
Man mchte diesem Starterpack eine neue Tr verpassen, die nchste freie GlobalInt wre dann Nr. 8.
Wenn man nun in einem der betreffenden Rume das offene-Tr-Objekt einfgt, klickt man danach den Button "Properties" an und trgt statt der -1 bei "Tren" eine 8 ein.
Dies macht man logischerweise in beiden Rumen.

Anschlieend berprft man noch in beiden Rumen die Anzahl der Objekte.
Angenommen, die Objekte eines Raumes sehen so aus:

0: erste offene Tr
1: Blumenvase
2: Zettel
3: zweite offene Tr
4: Piranha

Die hchste Indexnummer eines Trobjekts ist 3.
Also wechselt man zu "Settings", klickt "Room properties" an und trgt bei "Tren" eine 3 ein.

Das war's.

********************

Wen die Technik interessiert:
Im CharacterChange-Modul ist eine on_event-Funktion. Diese wird von AGS aufgerufen, noch bevor die "Player enters screen (before fadein)" des Raumes selbst aufgerufen wird und berprft die Tren.
Dazu holt sie sich die eingetragene Anzahl der Objekte aus den Room properties, zhlt die Objekte durch, holt sich dabei die Tr-GlobalInt aus den Object properties und schaltet das jeweilige Objekt entsprechend der GlobalInt an oder aus.