Autor Thema: Frage zu Use Inventory  (Gelesen 3464 mal)

Der Kompaniechef

  • volljähriger Tentakel
  • *****
  • Beiträge: 689
    • Profil anzeigen
Frage zu Use Inventory
« am: 05. Juli 2012, 11:51:14 »
Nach längeren ausprobieren habe ich die schnauze voll.
Und zwar geht es um das Benutzen von Inventargegeständen mit objecten/hotspots.
Ich möchte das beim Benutzen einens bestimmten Gegestandes z.B Inventargegestand 9 etwas bestimmtes gesagt wird.
bei allen anderen soll nur gesagt werden das ist keine gute Idee
mein Script is folgender:
  }
}
else if (UsedAction (A_USE_INV)) {
if (MovePlayer (150,127)) {
  if (character [GetPlayerCharacter ()].activeinv == 9) {
    FaceDirection (GetPlayerCharacter (),  DIR_UP);
    Wait (5);
    DisplaySpeech (GetPlayerCharacter (), "Der fernseher ist doch schon an.");
}
else
FaceDirection (GetPlayerCharacter (),  DIR_UP);
 DisplaySpeech (GetPlayerCharacter (), "Das ist keine Fernbedienung.");
  }   
}   
}

Das Problem ist benutze ich jetzt die Fernbedienung mit dem fernseher werden beide texte gesagt, was ja keinen Sinn ergibt.
Ich nutze ags 3.2
Kann einer mir bitte den script so umschreiben das dies nicht mehr passiert!?
MfG JPJF

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2372
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Frage zu Use Inventory
« Antwort #1 am: 05. Juli 2012, 12:04:18 »
Gewöhn dir an, den code schöner zu formatieren, damit du siehst welche klammern zu welchem block gehören.
In diesem Fall ist dein else Zweig nicht geklammert damit wird nur die erste Zeile nach dem else damit verknüpft, die zeile darunter aber immer ausgeführt.

[ags]
else if (UsedAction (A_USE_INV))
{
  if (MovePlayer (150,127))
  {
    if (character [GetPlayerCharacter ()].activeinv == 9)
    {
      FaceDirection (GetPlayerCharacter (),  DIR_UP);
      Wait (5);
      DisplaySpeech (GetPlayerCharacter (), "Der fernseher ist doch schon an.");
    }
    else
    {
     FaceDirection (GetPlayerCharacter (),  DIR_UP);
     DisplaySpeech (GetPlayerCharacter (), "Das ist keine Fernbedienung.");
    }
 }
}  
[/ags]

weil es Boogie noch übersichtlicher formatiert hätte, seinen beitrag aber wieder gelöscht mach ich das auch noch mal schöner.....
« Letzte Änderung: 05. Juli 2012, 12:10:33 von Rocco »

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #2 am: 05. Juli 2012, 13:34:02 »
Wie wäre es denn damit...

[ags]    
  else if (UsedAction(eActUseInventory) && player.ActiveInventory == iFernbedienung)
    {
     if(oFernseherAn.Visible)    //Wenn Fernseher an   
      {
       player.Say("Der Fernseher ist doch schon an.");
      }
    else
     {
       oFernseherAn.Visible = true;
     }
    }
    else if (UsedAction(eActUseInventory))
    {
     Wait(5);
     player.Say("Das ist doch keine Fernbedienung.");
    }
[/ags]
« Letzte Änderung: 06. Juli 2012, 03:35:25 von ZAK »
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

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #3 am: 05. Juli 2012, 19:48:40 »
Seit wie viel Jahren ist GetPlayerCharacter(), DisplaySpeech() und Ähnliches nun veraltet...? Fünf oder so.

ZAK:
[ags]// kommentare werden automatisch grün gemacht[/ags]

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #4 am: 06. Juli 2012, 03:36:30 »
ZAK:
[ags]// kommentare werden automatisch grün gemacht[/ags]
Danke
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

Der Kompaniechef

  • volljähriger Tentakel
  • *****
  • Beiträge: 689
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #5 am: 07. Juli 2012, 20:23:07 »
Danke hat prima geklappt. (script von roco)
So die nächste frage.
Wie scripte ich das bei zwei bestimmten Inventargegeständen ein Satz kommt beim Rest aber wieder der Standartspruch

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #6 am: 07. Juli 2012, 21:33:42 »
Danke hat prima geklappt. (script von roco)
So die nächste frage.
Wie scripte ich das bei zwei bestimmten Inventargegeständen ein Satz kommt beim Rest aber wieder der Standartspruch


Dann solltest du besser roco fragen, denn die Antwort war bereits in meinem Skript...

hier ein Skriptbeispiel nach dem neuem Standart:
[ags]function oAsche_AnyClick()
   {
     if (any_click_move(110, 125, eDirUp))
   {
      if (UsedAction(eActWalkTo))
      {
            Wait(5);
      }
      else if (UsedAction(eActLookAt))
      {
      Wait(5);
      player.Say("Da war mal eine Feuerstelle.");
      }
      else if (UsedAction(eActPickUp))
      {
      Wait(5);
      player.Say("Asche zu Asche...");
            Wait(20);
      player.Say("Aber das gehört nicht in meine Hosentasche.");
          }
      else if (UsedAction(eActUse))
      {
      Wait(5);
            player.Say("Ja, hier könnte ich Feuer machen.");
      }
      else if (UsedAction(eActOpen))
      {
      Wait(5);
            player.Say("Das macht nun wirklich kein Sinn.");
      }
          else if (UsedAction(eActClose))
      {
      Wait(5);
            player.Say("Das macht nun wirklich kein Sinn.");
      }
      else if (UsedAction(eActPull))
      {
      Wait(5);
            player.Say("Da bewegt sich nichts.");
      }
      else if (UsedAction(eActPush))
      {
      Wait(5);
            player.Say("Da bewegt sich nichts.");
      }
          else if (UsedAction(eActUseInventory) && player.ActiveInventory == iLukenoeffner)
      {
            Wait(5);
            player.Say("Da ist nichts bruchbares drin.");
      }
          else if (UsedAction(eActUseInventory) && player.ActiveInventory == iFeuerholz)
      {
            Wait(5);
            player.Say("Ich sollte vorher die Feuerstelle sichern.");
      }
          else if (UsedAction(eActUseInventory) && player.ActiveInventory == iMoos01)
      {
            Wait(5);
            player.Say("Ein bisschen Holz wäre sehr hilfreich.");
      }
          else if (UsedAction(eActUseInventory) && player.ActiveInventory == iNagellackentferner)
          {
            Wait(5);
            player.Say("Das macht hier kein Sinn.");
          }
          else if (UsedAction(eActUseInventory))
      {
      Wait(5);
      player.Say("Das kann ich hier nicht benutzen.");
      }
   else Unhandled();
    }
}
[/ags]
« Letzte Änderung: 09. Juli 2012, 13:20:41 von ZAK »
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

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Frage zu Use Inventory
« Antwort #7 am: 09. Juli 2012, 12:03:20 »
Bevor das hier noch weiter ausartet: JPJF, das nennt man Transfer. Es ist im Grunde 1+1 zusammenzählen, wobei aber nicht eins, die Zahl, gemeint ist, sondern eine Erkenntnis.
Du weißt jetzt, wie man bei einem Gegenstand einen Satz ausgibt, und beim Rest einen anderen. Kann es wirklich so schwer sein, da einen zweiten Gegenstand dazu zu bauen?

Jetzt aber mal zum Code: die Reihenfolge der ifs sollte folgende sein, um den Code nicht unnötig zu verlängern;
1) if (MovePlayer(...))
2) Verbabfrage
3) player.ActiveInventory

Konkret:
[ags]function xy() {

  // erst der Positionscheck. Hat der Spieler den Gegenstand erreicht?
  if (MovePlayer(123, 234) == 2) {

    // dann der Aktionscheck. Welches Verb wurde verwendet?
    if (UsedAction(...)) {
      ...
    }

    else if (UsedAction(eActUseInventory)) {

      // Benutze Inventar mit xy wurde verwendet. Welcher Inventargegenstand genau?
      if (player.ActiveInventory == iKeule) {
        ...
      }
      else if (player.ActiveInventory == iScharferStein) {
        ...
      }
      // anderer Inventargegenstand
      else if Unhandled();
    }
    // andere Verben
    else Unhandled();
  }
  // Gegenstand nicht erreicht
  else player.Say("Ich komme nicht ran.");
}[/ags]

Man beachte die korrekte Einrückung, welche die Lesbarkeit deutlich erhöht!