Autor Thema: AGS-Package für schnelles scripten  (Gelesen 7603 mal)

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
AGS-Package für schnelles scripten
« am: 16. September 2009, 18:18:56 »
Hallo Leute!

Ich habe mich einfach mal hingesetzt und zunächst mal die wichtigsten und am häufigsten eingesetzen AGS-Scripte tabellarisch zu sortieren und aufzulisten, um die Roh-Scriptings immer griffbereit zu haben.
Damit lässt sich ganz leicht per Copy/Paste das jeweilige Script in den dafür vorgesehenen Platz einfügen und muss dann nur noch individuell angepasst werden.

Vorteil: Man spart sich sehr viel Tipp-Arbeit und es passieren seltener Fehler und Bugs im Syntax. Funktionen, die nicht gebraucht werden, kann man einfach im Scriptfenster entfernen.

weiterer Vorteil: Insbesondere Anfänger kommen schneller zu Ergebnissen, weil sie für die Grundbefehle nicht ständig irgendwelche Starterpaks wieder reinladen müssen, um zu schauen, was sie im Syntax falsch eingegeben haben. Zudem wird es gerade für Neueinsteiger auf diese Weise einfacher sein, sich in AGS reinzuarbeiten, ohne sich durch den Irrgarten des AGS-Handbuchs durchschlagen zu müssen.

Zudem habe ich es als DOC-Datei gehalten, damit jeder dieses Dokument nachbearbeiten, erweitern und erneut hochladen kann. In diesem Sinne hoffe ich natürlich, dass viele MMM-Aktivisten diesen Gedanken teilen und jeder somit seine Arbeit beschleunigen kann, denn ich kann mir vorstellen, dass man auf diese Weise in 2 Stunden das schaffen kann, wofür man sonst 4 Stunden gebraucht hat.

Lange Rede, schwacher Sinn. Also zur Datei:

http://www.2shared.com/file/7843436/206ed4c0/AGS_Script_Package.html


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2375
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: AGS-Package für schnelles scripten
« Antwort #1 am: 16. September 2009, 18:28:38 »
sowas gibts schon länger -> KLICK
trotzdem danke für deine mühe, der ein oder andere wirds vielleicht brauchen können.  :)

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: AGS-Package für schnelles scripten
« Antwort #2 am: 16. September 2009, 18:32:45 »
Ich kann mir das zwar gerade nicht ansehen (.doc ist ein scheiß Format, wenn man kein Word hat), aber ich versteh auch nicht ganz, was das helfen soll. Befehle lassen sich aus der Hilfe-Datei rauskopieren, und wenn man ein Script aus den Starterpacks braucht, öffnet man einfach das GlobalScript per Texteditor und kopiert es sich raus...  ::)

Mister L

  • Boss der T.I.A.
  • Globaler Moderator
  • Ehrwürdiger Tentakel
  • *****
  • Beiträge: 3113
  • Geschlecht: Männlich
  • "R.I.P. Clever & Smart † 1958 -2023"
    • Profil anzeigen
    • Maniac Mansion - Night of the Meteor
Re: AGS-Package für schnelles scripten
« Antwort #3 am: 16. September 2009, 20:46:42 »
Warum beurteilst du etwas, ohne es überhaupt gesehen zu haben?  ::)

Viele Funktionen, die ich im Laufe meiner Episoden gelernt habe, waren weder im Starterpack noch in der AGS-Hilfe (für mich verständlich erklärt) zu finden.
Solche Scriptsdammlungen halte ich immer für sinvoll.  8)

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #4 am: 17. September 2009, 06:57:23 »
@edna-mausi:

Klar kann man sich Scripte auch aus Starterpacks raussuchen. Allerdings war auch dies nicht unbedingt ohne Zeitaufwand verbunden, wenn man sich erstens durch die Verzeichnisse klicken muss, um die gewünschte AGS-Datei zu haben und dann muss man sich zusätzlich das Script noch suchen.
Ich mache es ja erstens für mich selber, weil es praktischer ist, wenn man die komplette USED_ACTION-Liste auf einmal hat und nur noch die nicht gebrauchten Befehle entfernt. Und zweitens wäre es wirklich klasse, wenn jeder, der Lust dazu hat, diese Script-Sammlung zu erweitern.
Ansonsten kann ich das OpenOffice sehr empfehlen. Damit bekommt man auch die doc-Dateien geöffnet! ;)

@Rocco:
Das Tutorial hatte ich auch schon auf dem Rechner! ;) Stimmt, im Beispielcode ist die Struktur ähnlich wie bei mir. Hab es bei mir nur so sortiert, dass man für die Script-Sparten "Any click on" und "Use inventory" so 1:1 kopieren kann.

@all:
Wie gesagt: Jeder darf das Script aktualisieren und wär möglich, dass da mal ne schöne Sammlung zusammenkommt.


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

KhrisMUC

  • Mod
  • volljähriger Tentakel
  • **
  • Beiträge: 989
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #5 am: 18. September 2009, 19:47:32 »
Ist ja nett gemeint, aber jede Menge alter Code, und warum steht FaceDirection jedesmal im if-Block anstatt einmal davor?
Und als Word-Datei? Und anstatt Parameter einfach freizulassen, muss man jedesmal erst "xxx" rauslöschen?
Und die Verwendung von GlobalInts wird erklärt, anstatt davon abzuraten?

Diese ganzen veralteten Praktiken sollten eh schleunigst verschwinden, vor allem aus einer Hilfedatei für Neueinsteiger!
Ich tut euch selbst alle einen Gefallen, wenn ihr auf aktuellen Code (und am besten gleich AGS 3.x) umsteigt.

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #6 am: 18. September 2009, 21:08:28 »
Welche Alternative nutzt Du denn, KhrisMuc? Kannst ja am besten mal einen Beispielcode einblenden, damit ich dies bei mir auch umkrempeln kann. ;)

BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Chrisu

  • Tentakelschleim
  • *
  • Beiträge: 8
  • Geschlecht: Männlich
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #7 am: 19. September 2009, 12:25:29 »
Hi,

bei mir sieht das z.B. aktuell so aus:

// ================================================== HOTSPOT: Bett
function hBed_AnyClick()
{
  if (player.x < 125) {
    walkTo.x = 115;
    walkTo.y = 129;
    walkTo.dir = eDirRight;
  } else if (player.x < 208) {
    walkTo.x = 165;
    walkTo.y = 140;
    walkTo.dir = eDirUp;
  } else {
    walkTo.x = 214;
    walkTo.y = 129;
    walkTo.dir = eDirLeft;
  }

  if (!walkTo.go()) return false;

  if (UsedAction(eActWalkTo)) {
    // ...
  }

  else if (UsedAction(eActLookAt)) {
    cBernard.SayIfPlayer("Hier schlafen Mom und Dad.");
    cBritney.SayIfPlayer("Hier schlafen Mom und Dad.");
    cAntonio.SayIfPlayer("Mein Bett.");
    cJoyce.SayIfPlayer("Mein Bett.");
  }

  else if (UsedAction(eActPickUp)) {
    player.Say("Das Bett ist doch viel zu schwer und groß um es herumzutragen.");
  }

  else if (UsedAction(eActUse)) {
    player.Say("");
    cBernard.SayIfPlayer("Aus dem Alter bin ich schon längst heraus. Ich habe mein eigenes Bett.");
    cBritney.SayIfPlayer("Aus dem Alter bin ich schon längst heraus. Ich habe mein eigenes Bett.");
    cAntonio.SayIfPlayer("Ich bin noch nicht müde.");
    cJoyce.SayIfPlayer("Ich bin noch nicht müde.");
  }

  else if (UsedAction(eActOpen) || UsedAction(eActClose)) {
    player.Say("Hier kann ich nichts verunstalten, da das ganze Bettzeug fehlt.");
  }

  else if (UsedAction(eActPush) || UsedAction(eActPull)) {
    player.Say("Da ist nicht viel Freiraum für Umgestaltungsmöglichkeiten.");
  }

  else Unhandled();
}

Das walkTo ist einfach nur ein struct, go eine zugehörige Funktion. Optional kann man noch per walkTo.wait eine Pause einfügen.

Gruß,
Chrisu

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #8 am: 19. September 2009, 15:22:07 »
Genau.
Insbesondere diese x-y-Variante bei Hotspots, die an verschiedenen Stellen im Raum verteilt sind, habe ich bspw. auch bei meinem Hotel-Tech-Demo angewendet. Diese Funktion findet man auch zu den Wandlampen im Mansion (Eingangsflur oben). Das ist sinnvoll, wenn man mehrere Anlaufpunkte in einem Raum hat, diese zu einem Hotspot zusammenzufassen und die Walk-Befehle mit den if-player-x-y zu setzen.

Was benutzen denn die meisten heute alternativ zu den GlobalInts? (am bestem mit Beispielcode)



BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Chrisu

  • Tentakelschleim
  • *
  • Beiträge: 8
  • Geschlecht: Männlich
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #9 am: 19. September 2009, 16:22:27 »
Hallo,

GlobalInts sind schon deswegen schlecht, weil nicht selbsterklärend - sprechende Variablennamen sind einfach besser. Ich habe beispielsweise jedem Raum ein struct spendiert, anhand dessen ich entsprechende Zustände ablesen und steuern kann. Muss man dann halt im Header deklarieren und per export/import global verfügbar machen. Hier ein Beispiel für Britneys Kleiderschrank:

// ================================================== HOTSPOT: Kleiderschrank
function hWardrobe_AnyClick()
{
  walkTo.x = 245;
  walkTo.y = 133;
  walkTo.dir = eDirUp;

  if (!walkTo.go()) return false;

  if (UsedAction(eActWalkTo)) {
    // ...
  }

  else if (UsedAction(eActLookAt)) {
    if (rBritney.wardrobe == eOpened) {
      cBritney.SayIfPlayer("Sieht so aus als ob meine ganze Kleidung in der Wäsche ist.");
      cBritney.SayIfNotPlayer("Ich schlußfolgere: Der Schrank ist leer.");
    } else {
      cBritney.SayIfPlayer("Mein Kleiderschrank.");
      cBritney.SayIfNotPlayer("Britneys lila Kleiderschrank.");
    }
  }

  else if (UsedAction(eActPickUp)) {
    player.Say("Dafür gibt es Möbelpacker.");
    player.Say("Und ich bin definitiv keiner.");
  }

  else if (UsedAction(eActUse)) {
    player.Say("Mich darin jetzt zu verstecken ist keine Problemlösung.");
  }

  else if (UsedAction(eActOpen)) {
    if (rBritney.wardrobe == eOpened) {
      player.Say("Der Schrank ist schon offen.");
    } else if (rBritney.wardrobe == eLocked) {
      player.Say("Der Schrank geht nicht auf.");
      cBritney.SayIfPlayer("Ich habe ihn wohl abgeschlossen.");
      cBritney.SayIfNotPlayer("Britney hat ihn vermutlich abgeschlossen.");
    } else {
      PlaySound(85);
      rBritney.wardrobe = eOpened;
      oWardrobe.Visible = true;
    }
  }

  else if (UsedAction(eActClose)) {
    if (rBritney.wardrobe == eOpened) {
      PlaySound(85);
      rBritney.wardrobe = eClosed;
      oWardrobe.Visible = false;
    } else {
      player.Say("Der Schrank ist schon zu.");
    }
  }

  else if (UsedAction(eActPush) || UsedAction(eActPull)) {
    player.Say("Nein, der Schrank ist mir schwer.");
  }

  else Unhandled();
}

Den Startwert ob der Schrank offen, geschlossen oder abgesperrt ist, kann man dann für den Spielstart zentral festlegen ohne die ganzen Raumskripte nochmal anzufassen. Auch die Türen werden entsprechend vorkonfiguriert. Das sieht (vorläufig) bei mir so aus:

doors.config(eHauseingang, 8, eClosed, eLocked, eClosed, eLocked, 4096);
Neu ist dabei, dass definiert ist, in welchen Raum die Türe aufgeht. Türen können somit z.B. von einer Seite eines Raumes geschlossen sein, von der anderen Seite aber abgesperrt (ohne Schlüssel nicht zu öffnen) - also eine typische Haustüre. (Auch so "Spezialfälle" wie z.B. Türe steht offen ist aber in dieser Stellung blockiert sind damit machbar.) Die letzte Zahl (4096) ist die Schlossnummer. Jedes Inventar bekommt bei den Properties eine "keynumber" und wenn die zur "locknumber" passt, dann lässt sich damit die Tür öffnen/absperren. (Die beiden Werte werden binär verglichen, wodurch man auch Generalschlüssel definieren kann.) Im Raumskript sieht der Tür-Code dann so aus:

// ================================================== HOTSPOT: Zimmertür
function hDoor_AnyClick()
{
  if (player == cBritney) doors.sayLookAt = "Meine Zimmertüre.";
  else doors.sayLookAt = "Britneys Zimmertüre";

  if (doors.anyClick(eBritney, oDoor, 271, 133, eDirRight, 2, 45, 134, eDirRight) == 0) Unhandled();

  doors.resetDoorStrings();
}


1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #10 am: 21. September 2009, 16:32:06 »
Das sieht doch schon mal sehr gut aus! ;)

hWardrobe ist nun der Script-Name für den Hotspot

Muss ich für rBritney.Wardrobe zentral einen Anfangswert festlegen oder brauch ich den erst bei der jeweiligen Funktion einzubauen?

Als "Switch-Set" kann ich doch sicherlich auch anstelle von "eOpened" auch sowas wie "ePickedUp" einsetzen, oder?


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Chrisu

  • Tentakelschleim
  • *
  • Beiträge: 8
  • Geschlecht: Männlich
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #11 am: 21. September 2009, 21:24:10 »
Hi,

Zitat
hWardrobe ist nun der Script-Name für den Hotspot

Alles wie gehabt: hBeispiel = Hotspot, iBeispiel = Inventory, oBeispiel = Object, cBeispiel = Character, usw. In Anlehnung daran habe ich das Struct für die Räume (room) mit einem kleinen r versehen, also rBritney.wardrobe ist der Kleiderschrank in Britneys Zimmer.

Zitat
Muss ich für rBritney.Wardrobe zentral einen Anfangswert festlegen oder brauch ich den erst bei der jeweiligen Funktion einzubauen?

Den Zustand für den Spielanfang kann man zentral festlegen. Alle Startwerte stehen in einer Funktion, welche man nur noch im ersten Raum in dem der Spieler startet einmalig aufrufen braucht. Man könnte die Startwerte für einen bestimmten Raum aber natürlich genausogut im Raum-Script (before fade-in) festlegen. Wenn alles zentral abgelegt ist, finde ich es aber übersichtlicher. Na ja, Geschmackssache. ;)

Zitat
Als "Switch-Set" kann ich doch sicherlich auch anstelle von "eOpened" auch sowas wie "ePickedUp" einsetzen, oder?

Bin mir jetzt nicht sicher ob ich dich richtig verstehe, aber rBritney.wardrobe ist ganz einfach nur der "Öffnungszustand". Dieser kann nur die Werte geöffnet (eOpened), geschlossen (eClosed) und abgesperrt (eLocked) annehmen. (ePickedUp würde dann ja bedeuten, dass jemand die Schranktüren geklaut hat. :P) Alle Türen, Fenster, Schubläden, Schranktüren etc. haben eine entsprechende Variable für so einen Öffnungszustand.

Gruß,
Chris

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #12 am: 21. September 2009, 22:05:57 »
Richtig. ;)

Was kann man denn sonst als Global Int - Alternative nehmen, wenn man Variablen einsetzen möchte, die nicht an Settings wie (Opened, Closed, Locked) gebunden sind.

Ich schreibe hier mal ein Beispiel:


// Einstellung der GlobalInts bei Spielstart

SetGlobalInt(135,1); // Schlüssel befindet sich unter Fußmatte


// Fußmatte (Hotspot 12) wird angehoben

if (Used_Action (A_PULL)) {
  ObjectOn(11); // Objekt 'Fußmatte umgeklappt' an
  DisableHotspot(12); // Hotspot Fußmatte deaktiviert
  if(GetGlobalInt(135) == 1) ObjectOn(13); // wenn GI-135 gleich 1 ist wird der Schlüssel (Object13) angezeigt
  }


// Fußmatte umgeklappt (Object 11) wird heruntergeklappt

if (Used_Action (A_PUSH)) {
  ObjectOff(11); // Objekt 'Fußmatte umgeklappt' aus
  ObjectOff(13); // Objekt 'Schlüssel' aus
  EnableHotspot(12); // Hotspot Fußmatte aktiviert
  }


// der Schlüssel (Object 13)

if (Used_Action (A_PICK_UP)) {
  ObjectOff(13); // Objekt 'Schlüssel' aus
  AddInventory(2); // Schlüssel wandert ins Inventar
  SetGlobalInt(135,0); // GI 135 wird auf 0 gesetzt -- Schlüssel befindet sich nicht mehr unter der Fußmatte
}

 
 


Das jetzt als klassisches Beispiel mit dem Schlüssel unter der Fußmatte.
Wie würde man das denn HEUTE besser programmieren?


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Chrisu

  • Tentakelschleim
  • *
  • Beiträge: 8
  • Geschlecht: Männlich
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #13 am: 21. September 2009, 23:02:52 »
Hallo,

Zitat
Was kann man denn sonst als Global Int - Alternative nehmen,

Na ganz einfach: Eine globale Variable. ;) Einfach mal in der AGS-Hilfe unter export/import nachlesen. Das eOpened/eClosed/eLocked ist lediglich ein enum damit's lesbarer wird. Ich hätte als Werte auch 0/1/2 oder bla/blubb/sabber schreiben können.

Wenn du eine Variable im Raumscript außerhalb einer Funktion definierst, ist sie innerhalb dieses Skriptes global. Wenn sie über alle Räume hinweg verfügbar sein soll (wie ein GlobalInt) dann leg die Variable z.B. im Globalscript an, exportiere sie dort und im Header importiert du sie. Auf dein Beispiel übertragen:

// *** GlobalScript.asc ***

bool keyUnderneathDoormat = true;
export keyUnderneathDoormat;


// *** GlobalScript.ash ***

import bool keyUnderneathDoormat;


// *** Room script ***

// Fußmatte wird angehoben
if (UsedAction(eActPull)) {
  oDoormat.Visible = true;
  hDoormat.Enabled = false;
  oKey.Visible = keyUnderneathDoormat;
}

// umgeklappte Fußmatte wird heruntergeklappt
if (UsedAction(eActPush)) {
  oDoormat.Visible = false;
  oKey.Visible = false;
  hDoormat.Enabled = true;
}

// der Schlüssel
if (UsedAction(eActPickUp)) {
  oKey.Visible = false;
  player.AddInventory(iKey);
  keyUnderneathDoormat = false;
}

Ich hoffe ich habe keinen Murks verzapft, falls ja möge man mich bitte korrigieren. :-X

Gruß,
Chrisu

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1271
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: AGS-Package für schnelles scripten
« Antwort #14 am: 21. September 2009, 23:09:06 »
Das sieht doch schon mal sehr gut aus.

Kann ich ja bei nächster Gelegenheit ja mal so probieren. ;)


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"