Autor Thema: AGS3-Starterpacks: Enums, Funktionen und allgemeine Tipps  (Gelesen 7571 mal)

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 988
    • Profil anzeigen
AGS3-Starterpacks: Enums, Funktionen und allgemeine Tipps
« am: 28. Dezember 2008, 20:21:34 »
Hier werde ich in Kürze nach und nach die gängigsten Starterpack-Funktionen erläutern, außerdem sollten wir uns auf Konventionen einigen, was den Umstieg auf oo betrifft, z.B. einheitliche Namen für enums.

Es gibt viel Spielraum für Verbesserungen, teilweise sind es Kleinigkeiten, aber auch oft erhebliche Vereinfachungen.
Es wird auch das ein oder andere Modul geben, ein Beispiel wäre das Anpassen der Standardverben bei bestimmten Aktionen.

Außerdem sollten alle Packs so ausgebaut werden, dass sie mit mehreren Charakteren spielbar sind. Auch das wird hier nachzulesen sein.

Dieses Thema bleibt vorerst mal geschlossen. :)

Enums
neue Funktionen (Link durch Rulaman hinzugefügt)
ChangeCharacter-Modul (Link durch Rulaman hinzugefügt)
« Letzte Änderung: 28. Februar 2009, 20:55:18 von rulaman »

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 988
    • Profil anzeigen
ENUMS
« Antwort #1 am: 30. Dezember 2008, 15:02:14 »
Für Richtungen in Verbindung mit Character.FaceDirection(eDirection dir) stehen folgende eNums zur Verfügung:

eDirUp, eDirLeft, eDirDown, eDirRight

Für Verben in Verbindung mit UsedAction(eAction test_action) stehen folgende eNums zur Verfügung:

eActLookAt, eActTalkTo, eActGiveTo, eActPickUp, eActUse, eActOpen, eActClose, eActPush, eActPull

(Momentan werden auch noch alle alten Defines unterstützt [z.B. DIR_DOWN oder A_OPEN].)


Diese eNums müssen keineswegs auswendig gelernt werden; sobald die Funktion getippt ist, genügt es, die offene Klammer zu tippen, und die Liste der verfügbaren eNums wird angezeigt. Wie man sieht, wirken die Defines hier ziemlich störend, weswegen sie voraussichtlich bald abgeschafft werden.

rulaman

  • Moderator
  • Teenie Tentakel
  • *****
  • Beiträge: 354
  • Geschlecht: Männlich
    • Profil anzeigen
neue Funktionen
« Antwort #2 am: 28. Februar 2009, 20:43:43 »
Durch das Umschreiben auf die AGS Version 3 ergeben sich einige Neuerungen in den Starterpacks.

Es gibt jetzt der konsistenz wegen einige zusätzliche Character-Funktionen:
Character.FaceDirection(<Direction>);
Character.SayIfPlayer("Text");
player.FaceDirection(eDirDown);
cDave.SayIfPlayer("Ich sehe nichts besonderes.");
cMichael.SayIfPlayer("Da ist ein Fleck an der Wand.");

Wie im Code-Abschnitt zu sehen, kann man für mehrere Spieler, die man während einer Episode steuern kann, auf das gleiche Objekt diese SayIfPlayer-Extends anwenden. Es wird nur, der Satz des jeweiligen Spielers angezeigt. (Ein Beispiel kann man im Syd/Achmed Starterpack sehen.)


Auch wurden einige Object-Funktionen auf OO angepasst:
Object.init_object(<GI>);
oTuer.init_object(21);

Die init_object-Funktion ist für mehrere Spieler geeignet, da vor jeder neuen Raum-Einblendung die Türengrafik neu gesetzt wird. Je nach Wert der globalen Variablen.


any_click_move(x, y, <Direction>);
any_click_move(65, 127, eDirUp);

Die Funktion ersetzt praktisch die bekannte MovePlayer-Funktion. Diese hat den Nachteil, dass man immer ein Charakter.FaceDirection(<Direction>); am Ende brauchte.


Enums2
UsedAction(<Action>);
UsedAction(eActPush);

Die UsedAction-Funktion nimmt jetzt enums entgegen. Diese werden im Editor schon angezeigt und erleichtern den Code-Fluss.
Baden ist die einzige Möglichkeit, den Dreck der Füße an den Hals zu bekommen.

rulaman

  • Moderator
  • Teenie Tentakel
  • *****
  • Beiträge: 354
  • Geschlecht: Männlich
    • Profil anzeigen
ChangeCharacter-Modul
« Antwort #3 am: 28. Februar 2009, 20:52:11 »
Seit der Version 3 ist in allen Starterpacks das CharacterChange-Modul von KhrisMUC enthalten.

So lässt sich in jedem Spiel mit mehreren Spieler spielen.
Character.AddChangePlayer();
cAchmed.AddChangePlayer();

Obige Zeile fügt Achmed den spielbaren Charakteren hinzu.
Jetzt wird Achmeds Bild an der rechten Seite des Inventars angezeigt und die Anzahl der sichtbaren Inventargegenstände auf dem Bildschirm vermindert.
Ab sofort lässt sich per Mausklick zwischen beiden Spielern hin- und herschalten. Alle benötigten Grafiken für die Haupt-Charakterköpfe sind bereits enthalten.

Natürlich lässt sich ein Spieler auch wieder entfernen. Character.RemoveChangePlayer();
Baden ist die einzige Möglichkeit, den Dreck der Füße an den Hals zu bekommen.

rulaman

  • Moderator
  • Teenie Tentakel
  • *****
  • Beiträge: 354
  • Geschlecht: Männlich
    • Profil anzeigen
FAQ
« Antwort #4 am: 01. März 2009, 13:03:48 »
FAQ: HgFs (Häufig gestellte Fragen)

F: Wieso als Template?
Mir ist eher durch Zufall bewusst geworden, dass alle Spiele, die auf dem gleichen Template basieren, auch die gleiche UniqueID besitzen. Dadurch kann man aus versehen eine Translationdatei eines anderen, auf der gleichen Vorlage basierenden Spieles verwenden.
Bsp: MMM01 gibt es auch in Englisch, der Spieler kopiert diese Datei jetzt aber in den Ordner für MMM02. Das beide auf der gleichen Vorlage (ZIP) basieren und somit die gleiche UniqueID haben, erkennt die Engine eine passende Übersetzungsdatei, welche aber nicht die richtigen Texte enthält und somit für diese Spiel nutzlos ist. Durch die Verwendung eines Templates wird diese UniqueID neu erzeugt.

F: Wieso sind einige Grafiken etwas anders, als in den alten Starterpacks (die für AGS2.7x)?
Einige Grafiken enthielten Fehler, die mir während der Transformation zum neuen AGS3 auffielen. Diese habe ich beseitigt.
Da wären in erster Linien die Türengrafiken zu nennen, welche in einem Raum den Türgriff auf der linken Seite, in einem anderen Raum auf der rechten Seite hatten.

F: Muss ich die neuen enums lernen? Was ist jetzt anders?
Nein, die neuen enums werden einem im Editor angezeigt, sobald man die öffnende Klammer einer Funktion setzt.
Außerdem gelten auch noch die alten Varianten.

- more todo -
« Letzte Änderung: 01. März 2009, 13:14:22 von rulaman »
Baden ist die einzige Möglichkeit, den Dreck der Füße an den Hals zu bekommen.

rulaman

  • Moderator
  • Teenie Tentakel
  • *****
  • Beiträge: 354
  • Geschlecht: Männlich
    • Profil anzeigen
MMM_GO (Debuggen von Releases)
« Antwort #5 am: 05. März 2009, 21:01:52 »
Die unheimliche Möglichkeit Release-Versionen zu debuggen

Die Vorgeschichte
Als ich mal wieder Larry spielte, und auf Al Lowes Seite ein paar Debugging-Tipps für LL7 fand, dachte ich mir, das wäre was für MMM und andere Spiele.

Die Technik
Im GlobalScript.asc gibt es ganz oben zwei wichtige defines
#define HIDDEN_DEBUG_STRING "MMM_GO"
//#define HIDDEN_DEBUG_ENABLED

Der erste gibt einen Dateinamen an, der für die Funktionalität der Debuggingfeatures im entsprechenden Verzeichnis vorhanden sein muss.
Im Beispiel die Datei MMM_GO. Dazu muss dann das Define HIDDEN_DEBUG_ENABLED aktiviert sein (Kommentarzeichen entfernen).

Dann wird beim Starten des Spieles versucht diese Datei zu öffnen. Ist diese vorhanden, dann werden bei aktivierten AGS-DEBUG features alle Debuggingfunktionalitäten aktiviert. Ist diese Datei bei einem Spielerelease nicht mehr vorhanden, dann kann man diese Debuggingfeatures nicht mehr benutzen.

Trotzdem kann man nachträglich ein Release debuggen, indem man die entsprechende Datei erstellt, beziehungsweise seinen Beta-Testern überlässt. Die entsprechende Datei muss dabei keinen Inhalt haben, sie muss nur vorhanden sein.

Nachspann
Es wird jedem, der dieses Feature in seinen Spielen verwenden möchte empfohlen eine andere Datei, als die MMM_GO zu verwenden.
Da die Dateigröße zwischen den Optionen Debugging-enabled und Debugging-disabled nur wenige Bytes beträgt, wirkt sich das Ganze nicht groß aus.
Baden ist die einzige Möglichkeit, den Dreck der Füße an den Hals zu bekommen.

rulaman

  • Moderator
  • Teenie Tentakel
  • *****
  • Beiträge: 354
  • Geschlecht: Männlich
    • Profil anzeigen
Re: AGS3-Starterpacks: eigenartige Funktionen im Mansion-SP
« Antwort #6 am: 01. Juni 2010, 08:52:28 »
Mir sind eigenartige Funktionen und Konstrukte im Mansion-Starterpack aufgefallen, mit denen ich nichts anfangen kann

Du meinst sicherlich so etwas:
if ( !cFred.SayIfPlayer("Nein, im Moment muss ich das nicht.") )
{
player.SayIfIsEdison("Ich weiss nicht wie es funktioniert.");
player.SayIfNotEdison("Es ist nicht eingeschaltet.");
}

Das ist ganz einfach zu verstehen.
Nehmen wir uns zuerst die inneren Funktionen vor.
Die erste Zeile,
player.SayIfIsEdison("Ich weiss nicht wie es funktioniert.");
sagen nur die Edisons (Ed, Fred, Edna)
die zweite Zeile,
player.SayIfNotEdison("Es ist nicht eingeschaltet.");
sagen alle anderen (Nicht Edisons)

Soweit klar?

Nun aber zur ersten Zeile.
if ( !cFred.SayIfPlayer("Nein, im Moment muss ich das nicht.") )

Diesen Satz sagt Fred, nur wenn er der Spieler ist. Ist das nicht der Fall, sagt Fred nichts, die Funktion liefert false zurück und wird durch das !-Zeichen verneint, also ist die Bedinung erfüllt und die anderen Sätze werden ausgeführt.
Im Fall, das Fred der Spieler ist, sagt er seinen Satz, die Funktion liefert true zurück, wird verneint und die inneren Befehle werden nicht ausgeführt.

Jetzt dürfte dich verwirren, dass den inneren Satz die Edisons sagen, und Fred somit auch sagen müsste, oder?
Da aber die Bedinung nicht erfüllt ist, wenn Fred der Spieler ist, wird dieser Befehl übersprungen.
Baden ist die einzige Möglichkeit, den Dreck der Füße an den Hals zu bekommen.