Seite 1 von 1

Hilfe zum Starterpack

Verfasst: 19.09.2006, 21:33
von Iason79
Hallo erst mal.

Ich habe mir mal das Starterpack (Bernard) geladen und teste jetzt im Haus rum, auf:
http://www.adventure-treff.de/fanadv/tu ... gs_mmm.php
das tutorial ist sehr interessant; aber wie ich das bisjetzt mitbekommen habe, werden in MMM praktisch ausschlieslich scripte unter "Any click on.." verwendet.
Nun habe ich ein Problem mit den Inventory-Gegenständen, laut den Tutorial von DasJan sollte man

Code: Alles auswählen

if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
FaceCharacter (SANDY, GetPlayerCharacter ());
DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe.");
LoseInventory(8);
DisplaySpeech(SANDY,"Danke, ich mag Lampen.");
}
verwenden. Der Text den Sandy sagt bekomme ich zB. auch wenn ich im Haus die Fernbedienung hohle und Sie ihr gebe. Zur spezifischen Frage, (für MMM zugeschnitten) welche Befehle brauche ich, das ich genau Item Nr. 8 aus dem Inventory verschwindet und dazu auch der richtige Text ausgegeben wird (Das sie endlich was hat das sie mir an den Kopf werfen kann :) ).
zb. A_GIVE_TO...
auserdem stürtzt das Game ab, aber das wurde auch schon von Rocco erwähnt, nur seine lösung:
Rocco hat geschrieben: Es geht um einen allgemeinen Bug, der sich bis jetzt hartnäckig in allen starterpacks gehalten hat, vorwiegend aber auch beim GIVE TO Befehl auftritt.
Und zwar wenn man eine Interaction mit einem anderen Character versucht und dabei ein Unhandled Event auslöst und man währendessen mit der Maus nicht mehr am Character ist, stürzt das Game ab mit einer Fehlermeldung - FaceCharacter kann nicht ausgeführt werden....

und zwar gibts in der Funktion unhandled_event nach dem grünen auskommentierten code so rund um zeile 2000 eine Zeile da steht:

Code: Alles auswählen

if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));

diese ersetzen durch:

Code: Alles auswählen

if (type == 2 || type == 6)
    {
    if(GetLocationType(mouse.x,mouse.y)==2)
    FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
    }

dann sollte der bug nicht mehr auftreten
hat mir leider nicht geholfen.

Und welche scripte verwendet man das eine bestimte Handlung erst zu einen späteren Zeitpunkt ausgeführt wird (erst reden oä.)
Ich weiß das es viele Tutorials gibt, nur viele leider auf englisch und kaum eines das speziell für MMM ausgelegt ist, so kann man schon einges anstellen im Haus, aber viele Sachen bleiben mir doch verschlossen.

Ich würde mich sehr über (sagen wir mal) Forgeschrittenen-Tutorial freuen damitt auch mehr Newbies wie ich sich trauen mal am Haus rumzubasteln, und erfolgserlebnisse gibts ja schnell, nur den Char blöde Sprüche aufsagen lassen bei einer bestimmten Aktion durchs Haus laufen zu lassen, sich im Kreis drehen zu lassen is doch etwas wenig, selbst für eine erste Test-Episode.

//post scriptum:
Ich verwende AGS 2.71 und das passende Startpaket dazu

Verfasst: 19.09.2006, 22:23
von Mister L
Hier mal ein paar Codezeilen aus meiner letzten Episode.

Also Character auswählten und "Interaction" anklicken.
Der Code wird bei "UseInventoryOnCharacter" eingesetzt:

Code: Alles auswählen

if (character [GetPlayerCharacter ()].activeinv == 5) { 
MoveCharacter (DAVE, 186, 134);
Wait (1);
while(character[DAVE].walking) Wait(1);
FaceDirection (DAVE, DIR_RIGHT);
DisplaySpeech (DAVE, "Wollen Sie mal Fotos sehen?");
DisplaySpeech (FREDS, "Nein, in meiner Zeitung sind genug Fotos!");
}

else if (character [GetPlayerCharacter ()].activeinv == 4) { 
MoveCharacter (DAVE, 186, 134);
Wait (1);
while(character[DAVE].walking) Wait(1);
FaceDirection (DAVE, DIR_DOWN);
DisplaySpeech (DAVE, "Ich kann auch so mit ihm sprechen...");
DisplaySpeech (FREDS, "Leider!");
}
activeinv == 4 ist dann immer die Nummer des Gegenstandes (in diesem Fall 4).
Ich hoffe, das hilft dir weiter.

Verfasst: 19.09.2006, 22:25
von Bòógieman
zum ersten problem:

Code: Alles auswählen

if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
FaceCharacter (SANDY, GetPlayerCharacter ());
if(player.activeinv == 8) {
DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe.");
LoseInventory(8);
DisplaySpeech(SANDY,"Danke, ich mag Lampen.");
}
else {
DisplaySpeech(SANDY,"Was soll ich damit?");
}
}
player.activeinv stellt den verwendeten inventargegenstand dar :wink:

EDIT: Mister L du alter vordrängler :lol:

Verfasst: 19.09.2006, 22:25
von KhrisMUC
Willkommen im Forum!

Zuallererst:
Bild Wichtig: Hilfreiche Funktionen in MMM

Sich erst nur in AGS, und dann ins Starterpack einzuarbeiten, kann nicht schaden, aber es geht zur Not auch so. Wichtig ist nur, sich gleich die neuen Befehle anzugewöhnen, da AGS seit Version 2.7 objekt-orientiert ist.
Beispiel: statt DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe."); schreibt man inzwischen: player.Say("Hier, eine Lampe.");
Das Tutorial ist leider nicht mehr aktuell.

Um abzufragen, welcher Gegenstand übergeben wurde, benutzt man player.ActiveInventory, also z.B. so:

Code: Alles auswählen

if (player.ActiveInventory==iLamp) {
  ...
}
else {
  player.Say("Warum sollte ich ihr das geben?");
}
Wichtig ist hierbei auch, dass es mit A_USE_INV funktioniert, aber nicht mit A_GIVE_TO. Letzteres diente ursprünglich nur dazu, Gegenstände zwischen den verschiedenen spielbaren Figuren auszutauschen.

Der von Rocco erwähnte "bug" ist eigentlich keiner, er tritt nur auf, wenn Unhandled() fälschlicherweise aufgerufen wird, nachdem eine Interaktion erfolgt ist.
Wenn es so verwendet wird, wie es gedacht ist, gibt es keinerlei Probleme.

Dialoge werden immer am Ende ausgeführt, auch wenn sie mittendrin stehen. Abhilfe kann man mit einer zweiten RunScript-Aktion schaffen.
Beispiel:

Code: Alles auswählen

// global script

int weitermachen=0;    // Statusvariable

// 1. Runscript: (übliche Abfrage der Aktion)
// any click on Sandy
if (MovePlayer (130, 133)) { 
  FaceDirection (player.ID, DIR_UP);  

  if (UsedAction (A_WALK_TO)) {} 

  else if (UsedAction (A_LOOK_AT)) { 
    player.Say("Das ist Sandy."); 
  } 

  else if (UsedAction (A_TALK_TO)) { 
    weitermachen=1; 
    dSandy.Start();       // Dialog starten
  } 

  else Unhandled (); 
}

// 2. Runscript
if (weitermachen) {
  weitermachen=0;
  ...                   //  weitere Befehle, die nach dem Dialog ausgeführt werden
}

Verfasst: 19.09.2006, 22:27
von Mister L
Wie man sieht. Es führen viele Wege zum Ziel. :wink:

Verfasst: 19.09.2006, 23:55
von Iason79
danke mal für die schnelle Antworten, der

Code: Alles auswählen

if(player.activeinv == ?) {
...
hat mir schon mal sehr geholfen;

Und ich sringe gerne ins kalte Wasser, ich will ja kein x-beliebiges-Adventure machen, ich möchte eben gerne im MMM beginnen; und die Hilfen und FAQ´s die ich sonst finde sind (fast) alle auf Englisch (und als ich 1986 eingeschult wurde wurds noch nicht unterrichtet)

Um das Szenario noch etwas weiterzuspinnen, wenn ich einen Carakter einen Gegenstand gegeben habe, welchen befehl sollte ich noch im "else if (UsedAction (A_TALK_TO)) { " einfügen damitt ich nach übergabe des inv-gegenstandes 8 eine andere antwort bekomme;
bzw: wenn ich 2 caraktäre habe denen ich den gegenstand geben KÖNNTE, das jeder der Beiden nach abgabe des Gegenstandes an einen der beiden andere Kommentare abgibt (zB. Dave und Sandy wollen beide die Lampe, und einer ist sauer wenn der andere die Lampe bekommt, bzw verlässt den Raum, oder ich gebe Dave die Lampe und bekomme von jemand anderen einen Gegenstand der vor und nach abgabe des Items an mich wieder andere Kommentare spricht.
ein paar einfache codes die verwende, wobei eine Erklärung wie xxx macht dies und yyy macht das, und ich hoffe ich kann das dann zusammenkleistern und zum laufen bringen;

Tut mir Leid für solche n00b-Fragen; wenn jemand so nett währe und ein kleines Lern-Haus erstellen könnte wo man als Newbie mal alle Gescripteten Interaktionen zwischen Personen und Gegegenständen ansehen kann und selbst etwas rumbasteln/verändern das würde mir viel mehr helfen als immer zu fragen, im Startpaket gibts leider nicht viel fertiges zum durchstödern und "a-ha so hat der das gemacht".
Mag vllt. etwas Anmasend klingen aber grade für manche währe es sicher interessant zu beobachten wie ein kleines Haus mit 2-3 Personen und ein Rätsel genau aufgebaut sind, will sagen in fremder Leute Scripte schnüffeln.

Verfasst: 20.09.2006, 00:03
von Mister L
Ich werd jetzt nicht 100% Schlau aus deinem letzten Beitrag.
Du kannst ja, wenn alle Charaktere im gleichen Raum sind, alles in ein Script schreiben.

Code: Alles auswählen

if (MovePlayer (230, 135)) { 
FaceCharacter (GetPlayerCharacter (), SANDY); 
FaceCharacter (SANDY, GetPlayerCharacter ()); 
if(player.activeinv == 8) { 
DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe."); 
LoseInventory(8); 
DisplaySpeech(SANDY,"Danke, ich mag Lampen."); 
DisplaySpeech(DAVE,"He, ich wollte die Lampe auch haben!"); 
DisplaySpeech(DAVE,"Du Penner!);
MoveCharacterBlocking (Dave, 133, 350, DIR_RIGHT);     // Dave geht weg 
} 
else { 
DisplaySpeech(SANDY,"Was soll ich damit?"); 
} 
} 
Du könntest auch den Dialog mit Dave erweitern, nachdem Sandy die Lampe bekommen hat:

Code: Alles auswählen

if (MovePlayer (230, 135)) { 
FaceCharacter (GetPlayerCharacter (), SANDY); 
FaceCharacter (SANDY, GetPlayerCharacter ()); 
if(player.activeinv == 8) { 
DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe."); 
LoseInventory(8); 
DisplaySpeech(SANDY,"Danke, ich mag Lampen."); 

SetDialogOption (1 , 2, 1)  // Damit aktivierst du im Dialog 1 die Option 2
 
} 
else { 
DisplaySpeech(SANDY,"Was soll ich damit?"); 
} 
} 
Wenn bei Talk_To mit Dave dann der Dialog 1 abgefragt wird, kannst du bei Option 2 einen passenden Satz reinschreiben.

Verfasst: 20.09.2006, 00:10
von Iason79
Nun ich meinte eher nachdem ich jetzt Sandy die Lampe gegeben habe das beide Dave/Sandy anders antworten, bzw wenn ich Sandy die Lampe gegeben habe von Dave einen Gegenstand erhalte der nach der Übergabe wieder etwas anderes sagt, nicht das ich einen Roman schreiben möchte wobei die Caraktäre nach gewissen Handlungen etwas anderes erzählen, aber das war mein Gedanke; oder anders ausgedrückt nach Handlung X verhalten sich Personen Y und Z anders usw.

Verfasst: 20.09.2006, 00:18
von Mister L
Sowas kannst du über Variablen machen.

Ich benutze dafür meist die GlobalInts. (Wird nicht von jedem für gut befunden, klappt aber :wink: ).

Code: Alles auswählen

if (GetGlobalInt (100) ==0) {
       {
Displayspeech (DAVE, "Danke für die Lampe!");
}
}

else if (GetGlobalInt (100) ==1) {
       {
Displayspeech (DAVE, "Wieso habe ich die Lampe nicht bekommen?");
}
}
Du kannst die GlobalInts mit diesem Code auf andere Werte setzen:

Code: Alles auswählen

SetGlobalInt (100,1);
Wichtig: In den Starterpacks sind die ersten 30 GlobalInts oft schon belegt. Wenn man bei 100 anfängt kann nix passieren. man hat ja 500 zur Verfügung...

Verfasst: 20.09.2006, 00:41
von Iason79
Danke, das hat mir sehr gehollfen, im ersten Versuch hats schon geklappt (nagut im 2., "}" vergessen^^), damit eröffnen sich schon mal sehr viele möglichkeiten, ich hoffe mal ich bin die nächste Zeit beschäftigt mit AGS und geh euch nicht weiter auf die Nerven, aber Ihr hört sicher wieder von mir, auch wenns nur mal wieder ein Problem ist :>

Und danke noch mal für die rasche Hilfe, jetzt bastel ich mal weiter am Bernoulli Haus..

Verfasst: 20.09.2006, 00:44
von Mister L
Geh' uns ruhig auf die Nerven. :wink:
Wir freuen uns über jeden Neuzugang bei MMM! :D

Verfasst: 20.09.2006, 12:27
von Rocco
Hallo Iason,

willkommen an Bord, das mit einer kleinen open-source episode ist eine gute idee, das werden wir machen.

@khrismuc: vielleicht hast du lust ein kleines open source beispielgame zu programmieren, wo es weniger auf den inhalt als auf effizientes coden mit dem starterpack ankommen würde.
wäre sicher eine feine sache, speziell für neueinsteiger Bild