Hauptmenü

Neuigkeiten:

Bitte unterstützt uns und bestellt über diese Links bei Amazon  oder HumbleBumble!

Probleme mit Starterpack AGS3

Begonnen von ZAK, 09. Dezember 2010, 23:57:13

Vorheriges Thema - Nächstes Thema

Timer

Du hast bei der öffne-Funktion ein paar geschweifte Klammern seltsam gesetzt. Und der Zustand des Tresors musste noch geändert werden.
Ich denke mal, es sollte so aussehen:

else if( UsedAction(eActOpen))
{
  if (Tresor == 0) player.Say("Er ist verschlossen.");
  else if (Tresor == 2) player.Say("Er ist schon offen.");
  else if(Tresor == 1)
  {
    player.Say("o.k.");
    PlaySound(1);
    oTresor.Visible = true;
    Tresor = 2; // Tresor -> "AUF"
    if (Game.DoOnceOnly("Ein Werkzeugkasten"))
    {
      Wait(40);
      player.Say("Ein Werkzeugkasten!");
      Wait(20);
      player.Say("Den nehme ich mal mit.");
      Wait(5);
      PlaySound(4);
      player.AddInventory(iWerkzeug);
    }
  }
}

...und der Teil unten sollte wohl in die "eActUseInv"-Section (?) - also so:

if (UsedAction (eActUseInv)) {
  if (player.ActiveInventory != iScluesselkarte) player.Say ("Das macht keinen Sinn.");
  else
  {
    if (Tresor == 1) player.Say("Ich werde den Schrank nicht wieder zuschließen, warum auch?");
    else if (Tresor == 2) player.Say("Ich werde den Schlüssel nicht in den Schrank legen, warum auch?");
    else {
      Tresor = 1; // nicht verschlossen aber zu
      player.Say("Der Schlüssel passt! Ich schließe den Schrank auf.");
    }
  }
}


Sollte eigentlich funktionieren.

ZAK

#76
habe das script noch etwas änder müssen, aber jetzt geht es....
...dafür das ich überhaupt keine ahnung habe, habe ich mich aber gut geschlagen.

code:
Zitatelse if( UsedAction(eActOpen))
   {
     if (Tresor == 0) player.Say("Er ist verschlossen.");
     else if (Tresor == 2) player.Say("Er ist schon offen.");
     else if(Tresor == 1)
     {
     player.Say("o.k.");
     PlaySound(1);
     oTresor.Visible = true;
     Tresor = 2; // Tresor -> "AUF"
     if (Game.DoOnceOnly("Ein Werkzeugkasten"))
     {
       Wait(40);
       player.Say("Ein Werkzeugkasten!");
       Wait(20);
       player.Say("Den nehme ich mal mit.");
       Wait(5);
       PlaySound(4);
       player.AddInventory(iWerkzeug);
     }
   }
 }

Zitatelse if (UsedAction (eActUseInventory))
   {
    if (player.ActiveInventory != iSchluesselkarte) player.Say ("Das macht keinen Sinn.");
    else if (Tresor == 1) player.Say("Ich werde den Schrank nicht wieder zuschließen, warum auch?");
    else if (Tresor == 2) player.Say("Ich werde den Schlüssel nicht in den Schrank legen, warum auch?");
    else {
     Tresor = 1; // nicht verschlossen aber zu
     player.Say("Der Schlüssel passt! Ich schließe den Schrank auf.");
     }
   }
 }

das mit den kabeln und so muss ich erst noch probieren...
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

ZAK

aber irgendwo scheint noch ein fehler zu sein...

nachdem ich den "tresor" aufgeschlossen habe und die tür wieder zu mache ist der tresor zu, aber beim erneuten offnen sieht der tresor zu aus und der player sagt "ist doch offen"...

code oTresor:
Zitatfunction oTresor_AnyClick()
{
    if (any_click_move(895, 135, eDirRight))
   {
      if (UsedAction(eActWalkTo))
      {
      //   Wait(5);
      }
      else if (UsedAction(eActLookAt))
      {
      Wait(5);
         player.Say("Leer.");
      }
      else if (UsedAction(eActOpen))
      {
         PlaySound(1);
         oTresor.Visible = true;
    }
      else if (UsedAction(eActClose))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPush))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPull))
      {
         Wait(5);
         player.Say("Ist doch schon offen.");
      }
      else if (UsedAction(eActPickUp))
      {
         Wait(5);
         player.Say("Soll den Schrank da etwa rausreißen?");
      }
      else if (UsedAction(eActUse))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else Unhandled();
   }
}

Code hTresor:
Zitatfunction hTresor_AnyClick()
{
   if (any_click_move(895, 135, eDirRight))
   {
      if (UsedAction(eActWalkTo))
      {
      //   Wait(5);
      }
      else if (UsedAction(eActLookAt))
      {
         Wait(5);
         player.Say("Was da wohl drin ist?");
      }
      else if (UsedAction(eActPickUp))
      {
         Wait(5);
         player.Say("Das geht nicht.");
      }
    else if( UsedAction(eActOpen))
    {
      if (Tresor == 0) player.Say("Er ist verschlossen.");
      else if (Tresor == 2) player.Say("Er ist schon offen.");
      else if(Tresor == 1)
      {
      PlaySound(1);
      oTresor.Visible = true;
      Tresor = 2; // Tresor -> "AUF"
      if (Game.DoOnceOnly("Ein Werkzeugkasten"))
      {
        Wait(40);
        player.Say("Ein Werkzeugkasten!");
        Wait(20);
        player.Say("Den nehme ich mal mit.");
        Wait(5);
        PlaySound(4);
        player.AddInventory(iWerkzeug);
      }
    }
  }
    if (UsedAction(eActClose))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPull))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=true;
      }
      else if (UsedAction(eActPush))
      {
      Wait(5);
      player.Say("Ich will nichts kaputt machen.");
    }
    else if (UsedAction (eActUseInventory))
    {
     if (player.ActiveInventory != iSchluesselkarte) player.Say ("Das macht keinen Sinn.");
     else if (Tresor == 1) player.Say("Ist doch offen.");
     else if (Tresor == 2) player.Say("Das behalte ich besser. ");
     else {
      Tresor = 1; // nicht verschlossen aber zu
      player.Say("Jetzt ist der Tresor offen.");
      }
    }
  }
}
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

ZAK

Fehler gefunden....!!!!

Code:
Zitat
...
      if (Tresor == 0) player.Say("Er ist verschlossen.");
      else if (Tresor == 2) player.Say("Er ist schon offen.");
      else if(Tresor == 1)
      {
      PlaySound(1);
      oTresor.Visible = true;
      Tresor = 2; // Tresor -> "AUF"       <----------------Tresor = 1; (ist richtig)---------------
...
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

Timer

Praktisch ja... logisch nicht. Denn der Status für "offen" ist ja schließlich "2". ;)
Damit es auch logisch richtig ist, musst du den Status wieder auf "zu", also "1" setzen, sobald wieder geschlossen wird.

Siehe folgt:
else if (UsedAction(eActClose))
{
  Wait(5);
  PlaySound(1);
  oTresor.Visible=false;
  Tresor = 1; <- neu eingefügt: Status auf "ZU".
}


Natürlich macht das alles nicht viel Sinn, wenn du sowieso Objekte verwendest, da kannst du die ganzen Variablen auch gleich ganz weg lassen, aber ich wollte gerade ein bisschen klugscheißern. ;)

ZAK

das klappt aber so nicht...
...wie ich es im script geändert habe geht alles ( kleiner mankel ist, wenn ich als erstes auf "schliessen" gehe höre ich das "sound" öffnen/schliessen). änder ich irgend welches im script (welches ich wieder reture mache) kann ich die tür auch ohne schlüssel öffnen...
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

ZAK

ich verstehe die scripts nun gar nicht mehr, erst geht alles, dann änder ich ne kleinigkeit und dann geht alles nicht mehr.... sitze nun schon den halben tag an der einen sache mit dem "tresor"....

code hTresor:
Zitat
function hTresor_AnyClick()
{
   if (any_click_move(895, 135, eDirRight))
   {
      if (UsedAction(eActWalkTo))
      {
      //   Wait(5);
      }
      else if (UsedAction(eActLookAt))
      {
         Wait(5);
         player.Say("Was da wohl drin ist?");
      }
      else if (UsedAction(eActPickUp))
      {
         Wait(5);
         player.Say("Das geht nicht.");
      }
    else if( UsedAction(eActOpen))
    {
      if (Tresor == 0) player.Say("Er ist verschlossen.");
      else if (Tresor == 2) player.Say("Er ist schon offen.");
      else if(Tresor == 1) player.Say("Ist doch zu.");
      {
      PlaySound(1);
      oTresor.Visible = true;
      Tresor = 1; // Tresor -> "AUF"
      if (Game.DoOnceOnly("Ein Werkzeugkasten"))
      {
        Wait(40);
        player.Say("Ein Werkzeugkasten!");
        Wait(20);
        player.Say("Den nehme ich mal mit.");
        Wait(5);
        PlaySound(4);
        player.AddInventory(iWerkzeug);
      }
    }
  }
    if (UsedAction(eActClose))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPull))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=true;
      }
      else if (UsedAction(eActPush))
      {
      Wait(5);
      player.Say("Ich will nichts kaputt machen.");
    }
    else if (UsedAction (eActUseInventory))
    {
     if (player.ActiveInventory != iStetoskop) player.Say ("Das macht keinen Sinn.");
     else if (Tresor == 1) player.Say("Ist doch offen.");
     else if (Tresor == 2) player.Say("Das behalte ich besser. ");
     else {
      Tresor = 1; // nicht verschlossen aber zu
      player.Say("Jetzt ist der Tresor offen.");
      }
    }
  }
}

code oTresor
Zitat
function oTresor_AnyClick()
{
    if (any_click_move(895, 135, eDirRight))
   {
      if (UsedAction(eActWalkTo))
      {
      //   Wait(5);
      }
      else if (UsedAction(eActLookAt))
      {
      Wait(5);
         player.Say("Leer.");
      }
      else if (UsedAction(eActOpen))
      {
         PlaySound(1);
         oTresor.Visible = true;
    }
      else if (UsedAction(eActClose))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPush))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else if (UsedAction(eActPull))
      {
         Wait(5);
         player.Say("Ist doch schon offen.");
      }
      else if (UsedAction(eActPickUp))
      {
         Wait(5);
         player.Say("Soll den Schrank da etwa rausreißen?");
      }
      else if (UsedAction(eActUse))
      {
         Wait(5);
         PlaySound(1);
         oTresor.Visible=false;
      }
      else Unhandled();
   }
}

habe nur iSchluesselkarte gegen i Stetoskop getauscht....
ich weiss nicht mehr weiter...
...hat einer mal ein script für mich... ???
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

Timer

Was genau funktioniert denn nicht? Bis jetzt sieht das Script eigentlich ganz OK aus. :-\

Rocco

überarbeite mal diesen part, das ist ein bisschen konfus, die Klammerung stimt sicher nicht.

    else if( UsedAction(eActOpen))
    {
      if (Tresor == 0) player.Say("Er ist verschlossen.");
      else if (Tresor == 2) player.Say("Er ist schon offen.");
      else if(Tresor == 1) player.Say("Ist doch zu.");
      {         <------------------------------                // klammer zuviel
      PlaySound(1);
      oTresor.Visible = true;
      Tresor = 1; // Tresor -> "AUF"
      if (Game.DoOnceOnly("Ein Werkzeugkasten"))
      {
        Wait(40);
        player.Say("Ein Werkzeugkasten!");
        Wait(20);
        player.Say("Den nehme ich mal mit.");
        Wait(5);
        PlaySound(4);
        player.AddInventory(iWerkzeug);
      }
    }

ZAK

#84
Habe die klammer raus genommen, geht aber immer noch nicht. wenn ich auf "öffne Tresor" gehe passiert das:
player say ("der ist verschlossen") Tresortür geht auf, player say (" Ein Werkzeukasten") (" den nehme ich mal mit") ...werkzeugkasten geht ins Inventar....

gehe ich als erstes mit "schliesse Tresor" an die sache, dann höre ich das geräusch "playsound(4)"....

//Edit:

habe das porblem weitesgehend gelöst...
...so langsam verstehe ich die script's...
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

Endres

Die Klammer war nicht überflüssig, sondern das player.Say - Warum sollte man sagen "Ist doch zu." wenn der Tresor aufgeschlossen ist und geöffnet werden soll..?

else if(Tresor == 1) {
 PlaySound(1);
 oTresor.Visible = true;
 Tresor = 2;
 if(Game.DoOnceOnly("Ein Werkzeugkasten")) {
   Wait(40);
   player.Say("Ein Werkzeugkasten!");
   Wait(20);
   player.Say("Den nehme ich mal mit.");
   Wait(5);
   PlaySound(4);
   player.AddInventory(iWerkzeug);
 }
}


Vergiss bitte nicht die zusätzliche geschlossene Klammer für das else if.

Edit: Was mir gerade wieder auffällt: @Rocco: Können wir nicht mal langsam AGS-Source-Highlighting in das Forum einbauen? ;)



Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

KhrisMUC

#86
Zak: Du bist zu hastig und ungeduldig. Programmieren ist nicht wie backen, wo man auch mal bissl nach Schnauze machen kann; alles muss exakt sein.
Dabei hilft es natürlich, wenn man weiß, wann man welche Klammer setzen muss. Und man sollte sich von Anfang an einen der gängigen Einrückungsstile angewöhnen, gerade wenn man viel mit if-else-Zeug arbeiten muss. Das hilft ungemein bei der Fehlerbeseitigung.

Ich verwende diesen hier:

function bla() {

 if (dingens) {
   blablabla();
   zeuch();

   if (a == b) {
     das_noch();
     und_das_auch();
   }
 }
 else {
   wat_anderes();
 }
}


Wie Du siehst, steht die schließende Klammer jeweils unter function/if/else. Viele Leute schreiben die öffnende in die nächste Zeile auf gleiche Höhe, dann stehen die Klammern eines Paares immer untereinander und man hat automatisch die fast leere Zeile, die ebenfalls deutlich zur Übersichtlichkeit beiträgt:

function bla()
{
 if (dings)
 {
   mach_das();
 }
 tu_dies();
}


Du wirst auch feststellen, dass die Bereitschaft zur Hilfe zunimmt, wenn Dein Code lesbarer ist.

ZAK

#87
@KhrisMUC
wie du aus meinen vorherigen scrpits ja sehen kannst schreibe (oder kopiere) die scripts auch so das die "klammern" untereinander sind, hatte nur in meiner verzweiflung (und zu faul etwas immer wieder neu zu schreiben) einfach mit zwischen kopiert.
bisweilen sind meine scripts soweit übersichtlich und sortiert....

bin nun dabei die "Items" miteinander zu kombinieren...
...aber ich bekomme das nicht so hin...
ich habe im Inventar teile einer nachricht die ich nun mit hilfe von "kleber" auf ein "poster" bringen möchte, aber um die nachricht auf dem "poster" lesbar zu machen, sollen erst alle teile aufgeklebt sein.
also "benutze" "teil einer nachricht" mit "kleber", dann "benutze" "teil einer nachricht mit kleber" mit "poster" ( ein teil der nachricht verschwindet aus dem "inventar" und das "poster" wechsellt in "poster mit teil einer nachrich". zum schluss( wenn das letzte teil des puzzle zugefügt ist) soll dann im inventar "poster mit nachricht" sein, welches ich dann (mit hilfe von wand, wo das poster aufgehängt wird) lesbar sein.
hat jemand ein script dafür... ??? oder hilfe...
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

KhrisMUC

Was genau funktioniert denn nicht?
Ich würde für jede Teilnachricht zwei Items machen, eins mit und eins ohne Kleber.
Wenn der Kleber mit Teilnachricht X benutzt wird (oder umgekehrt), verschwindet sie aus dem Inventar und wird durch klebrige Teilnachricht X ersetzt.
Das Poster wiederum zählt mit, wie viele Teilnachrichten schon drauf sind. Sprich, jedesmal, wenn man eine klebrige Teilnachricht mit dem Poster benutzt, verschwindet sie und eine Variable wird eins hochgezählt. Danach wird jedesmal überprüft, ob Variable == Anzahl der Teilnachrichten; falls ja, Poster durch fertiges Poster ersetzen.

Wo genau ist da jetzt das Problem? Bist Du zu faul, Dich selbst damit auseinander zu setzen? Oder verstehst Du einfach nicht, wie man programmiert? Ich checks nicht.

ZAK

nein, zu faul bin ich nicht.... nur noch anfänger (habe so was noch nie gemacht)
habe die "items" mit "Teil der nachricht" und "Teil der nachricht mit kleber" sowie die "dose mit kleber", "offene dose mit kleber" , "pinsel", "pinsel mit kleber" und "Schraubendreher". bekomme ja noch nicht mal hin das ich mit "benutze Schraubendreher" die "dose mit kleber" öffnen kann...
...ich möchte halt mit dem "schraubendreher" die "dose mit kleber" öffnen können, dann mit "benutze pinsel mit doses mit kleber", "pinsel mit kleber" mit "teil der nachricht" und dann "teil der nachricht mit kleber" mit "poster" benutzen.
beim "werkzeugkasten" hat es komischerweise gut geklappt (da habe ich mit "schau" den "schraubendreher" bekommen)
code:
Zitatfunction iWerkzeug_Look()
{
   player.Say("Ein Werkzeugkasten.");
      Wait(5);
         if (Game.DoOnceOnly("Ein Schraubendreher!"))
      {
        Wait(5);
        player.Say("...da ist ein Schraubendreher drin!");
        Wait(5);
        PlaySound(4);
        player.AddInventory(iSchraubendreher);
      }
}

beim "Schraubendreher" geht das irgendwie nicht...
Code:
Zitatfunction iSchraubendreher_Interact()
{
  if(UsedAction(eActUse))
  Wait(5);
   if (Game.DoOnceOnly("Öffnen"))
    {
     Wait(5);
     player.Say("...dann mache ich die Dose mal au.!");
        Wait(5);
        PlaySound(4);
        player.AddInventory(iKleber02);
      }
}
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!