Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Nachrichten - Chrisu

Seiten: [1]
1
Allgemeine Diskussionen / Re: Maniac Birthday
« am: 27. September 2009, 19:08:33 »
Hi,

schließe mich an - alles Gute, Gesundheit und viel (Frei-)Zeit und Muse für MMM! ;D

2
Ressourcen / Re: AGS-Package für schnelles scripten
« 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

3
Ressourcen / Re: AGS-Package für schnelles scripten
« 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

4
Ressourcen / Re: AGS-Package für schnelles scripten
« 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();
}


5
Ressourcen / Re: AGS-Package für schnelles scripten
« 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

6
Newbies / Re: Der Give-Script
« am: 11. September 2009, 23:53:55 »
Hi,

es kann passieren, dass sich zum Zeitpunkt des Aufrufs der Zeile mit der if-Abfrage an den Mauskoordinaten gar kein Character befindet. Folglich liefert der Teil "GetCharacterAt (mouse.x, mouse.y)" auch keinen gültigen Character, was die FaceCharacter-Funktion dann mit dem zitierten Fehler "invalid character specified" quittiert. Besser ist es daher, die if-Abfrage noch mit einem "GetLocationType" zu verknüpfen, um sicherzustellen, dass bei x/y auch tatsächlich ein Character ist.

Gruß,
Chrisu

7
Hi,

die Neuerungen sind drinnen, d.h. alle Raumskripte arbeiten bereits mit dem Code der momentan aktuellen Version AGS 3.1.2, das GlobalScript ist auch schon entsprechend angepasst (u.a. mit Zuhilfenahme der aktuellen Starterpacks 3.0.2 eines gewissen Rulamans). ;) Es sind allenfalls ein paar kleine Änderungen drinnen, z.B. hie und da zusätzliche (optionale) Parameter bei Funktionen und so. Wer sich also beim Coden bereits auf AGS 3+ umgestellt hat und die neuen "MMM-Funktionen" kennt, dürfte sich beim neuen Bernard-SP auch soweit auskennen, um ohne Probleme mit aktueller Syntax loslegen zu können. (Bis zum Erscheinen des Starterpacks wird's dann vermutlich eh schon das finale AGS 3.2 geben, d.h. dass wir dann auch bereits das neue Soundsystem drinnen haben werden.)

Gruß,
Chrisu

8
Hallo!

Wir - das bin ich und meine Schwester - spielen uns, seit den Anfängen von MMM, fleißig die Staffeln rauf und runter. Vor einiger Zeit haben wir jedoch auch begonnen unsere erste eigene Episode zu erstellen. Zwar leider immer wieder mit längeren Unterbrechungen, ich hoffe aber dass wir das Projekt Ende/Anfang 2009/2010 fertig haben werden. Ein Grund für die etwas längere Entwicklungszeit mag auch sein, dass wir nebenbei auch das Bernard-Starterpack erweitern und verbessern, auf dem dann unser Spiel basiert: Fehlerhafte Grafiken/Perspektiven korrigieren, fehlende Funktionalitäten diverser neuer und bereits vorhandener Einrichtungsgegenstände nachrüsten, Hauselektrifizierung, etc. Unter anderem wurde z.B. dafür gesorgt, dass die Abmaße der Räume jetzt besser zueinander passen, d.h. alles ist mit einem gezeichneten Hausplan stimmig. (Keine Angst, es wurde soweit wie möglich versucht, dabei behutsam vorzugehen, um an den bisher gewohnten Räumen, der Anordnung und dem Flair nichts kaputt zu machen.) Vielleicht sagen jetzt einige von euch: "Oh, nein! Nicht noch eine Bernard-Folge!" Zu unserer Verteidigung können wir aber sagen, dass es, als wir damit angefangen haben, fast nur dieses eine Starterpack gab. (Ja ja, ist wirklich lange her.) Damit es nicht langweilig wird, gibt es aber natürlich auch neues im Haus, am Haus und ums Haus herum zu entdecken. Hier wird aber noch nichts verraten, als Beispiel nur so viel: Das Haus ist ab sofort komplett unterkellert. Einige Dinge werden sich auch komfortabel per Setup-Variablen steuern lassen. Das bedeutet wer später das Startpack für eigene Episoden verwenden möchte und etwas dagegen hat, dass sich bestimmte Schränke, Schubladen oder Fenster öffnen lassen oder dass die Spielerfigur aus dem offenen Fenster in den Garten klettern kann, muss nicht erst unseren Code umschreiben sondern kann all diese Dinge zentral im Skript mittels Variablen einstellen.

Arbeitstitel: "Der ganz normale Wahnsinn" (Titel der fertigen Episode kann sich noch ändern.)

Hauptcharakter: (good old) Bernard

Story: Ein an sich wunderschöner Sonntagmorgen, wenn da nicht dieses fürchterlich ungeliebte Schulprojekt wäre, das Bernard noch fertigstellen müsste. Wie bitte?! Eine Hausaufgabe die Bernard nicht freiwillig und mit Freuden schon längst am Freitagnachmittag erledigt hat? Gibt's doch gar nicht. Doch, das gibt's tatsächlich und zu allem Übel sorgt natürlich auch der Rest der Familie dafür, dass Bernard kaum eine ruhige Minute bleibt. Schließlich wollen auch noch die Arbeiten die einem die Eltern aufgebrummt haben rechtzeitig erledigt werden - von den im eigenen Labor noch ausstehenden Experimenten wollen wir da erst gar nicht anfangen zu reden. Als wäre das noch nicht genug, muss sich Bernard obendrein noch mit einem ganz anderen Klotz am Bein herumärgern ... Ob das wohl gut geht? Wird Bernard dem Wahnsinn anheim fallen? Oder kann's der Sellenklempner in einer zusätzlichen Mittwochssitzung wieder richten? Wir werden's (hoffentlich bald) sehen.

Neue Charaktere: "Ryan" (und noch mindestens 2 weitere, die ich hier nicht verrate)

Räume: Alle bislang bestehenden Standardräume in angepasster Fassung + mindestens 10 komplett neue

Aktueller Fortschritt:
Story: 90 %
Grafiken: 15 %
Räume: 70 %
Story-Code: 5 %
Übersetzung: 0 %

Voraussichtliche Veröffentlichung:
Episode: Ende/Anfang 2009/2010
Das neue Bernard Starterpack (dann wohl für AGS >3.2) wird anschließend zur Verfügung gestellt.

Seiten: [1]