Autor Thema: Der Give-Script  (Gelesen 5619 mal)

Non-Trouble Maker

  • Gast
Der Give-Script
« am: 30. November 2008, 18:31:39 »
Hallo,

ich wollte mal fragen wie der Geb-Gegenstand-an-Person-Script funktioniert?
Ich weiß gerademal das man zuerst if (UsedAction(A_GIVE_TO)) {eingeben, aber wie es dann weitergeht weiß ich nicht. :(

Könnt ihr mir helfen?

Siel

  • Teenie Tentakel
  • ****
  • Beiträge: 389
  • Maybe a miracle will occur...
    • Profil anzeigen
Re: Der Give-Script
« Antwort #1 am: 30. November 2008, 19:40:30 »
Das müsst wenn ich recht entsinne auch in den AGS-Tutorials stehen. Aber trotzdem nochmal hier die erklärung:

Du möchtest natürlich, dass nur bei einem ganz bestimmten gegenstand etwas passiert, daher musst du folgende if-Klammer einbauen:
Zitat von: AGS-Code
if (character [GetPlayerCharacter ()].activeinv == *Inventory-Nummer hier*) {
  (Auszuführende Aktionen)
}
Bei den anderen Gegenständen soll vermutlich ein standartsatz kommen, sowas wie "nein danke, das möchte ich nicht", solltest du am ende des codes so was wie das hier einfügen:
Zitat von: AGS-Code
else {
  DisplaysSpeech(*Charakter-Nummer hier*, "Nein danke, dass möchte ich nicht.");
}

Hoffe ich konnte weiterhelfen.
Die Vergangenheit ist im Nachhinein meist eine schlechte Idee.

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: Der Give-Script
« Antwort #2 am: 01. Dezember 2008, 11:01:35 »
Ich glaube, das funktioniert so nicht.
Man muss bedenken, dass die "Gib"-Funktion in MMD dazu da war, Gegenstände zwischen den 3 Spielfiguren auszutauschen.
Wenn man die Starterpacks unverändert benutzt "verschwinden" mit dem "Give-To"-Befehl die Gegenstände in den "Inventaren" der Figuren (sofern es sich um die MM-Kids handelt).  :-\ 

Siel

  • Teenie Tentakel
  • ****
  • Beiträge: 389
  • Maybe a miracle will occur...
    • Profil anzeigen
Re: Der Give-Script
« Antwort #3 am: 01. Dezember 2008, 15:20:55 »
Ich habs mal probiert und es ging wirklich nicht. Daher hier die Lösung, die bei mir funktioniert hat:

Der Befehl A_GIVE_TO bringt tatsächlich nichts. Daher  muss man die AGS-eigene Funktion Use inventory on charakter anstattvon Any click on character verwenden.
Dann sieht der Code wieder ganz normal aus, bis auf dass man sich die A_GIVE_TO if-Klammer sparen kann.
Die Vergangenheit ist im Nachhinein meist eine schlechte Idee.

Non-Trouble Maker

  • Gast
Re: Der Give-Script
« Antwort #4 am: 13. Dezember 2008, 11:35:33 »
Ich hab jetzt ein Problem, dass ich nicht folgen kann,
wie ich die Gebe-Funktion einbauen kann. :'(

Also wie kann ich ihn am einfachsten ausführen?

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: Der Give-Script
« Antwort #5 am: 13. Dezember 2008, 12:56:23 »
Ich mach das jetzt immer so:

Bei "use inventory on character":
if(MovePlayer(cJim.x-50, cJim.y))
    {
      player.FaceCharacter(cJim);
      FaceCharacter (JIM, GetPlayerCharacter());
      Wait (5);


if (player.activeinv == 1)
{
DisplaySpeech (JIM,  "Geld?");
DisplaySpeech (JIM,  "Hier, mitten in der Wüste haben wir keine Verwendung für Geld!");
DisplaySpeech (JIM,  "Ich besitze kein Geld und möchte auch keines.");
  }


  else DisplaySpeech (GetPlayerCharacter(),  "Das gebe ich besser nicht her.");
 
}

Und bei "any click on character:
if(MovePlayer(cJim.x-50, cJim.y))
    {
     player.FaceCharacter(cJim);
     Wait (5);
  }


if(UsedAction(A_WALK_TO)){


 FaceDirection(GetPlayerCharacter(), DIR_RIGHT);
 }

else if(UsedAction(A_LOOK_AT)){

DisplaySpeech(GetPlayerCharacter(),"Das ist Jim McGarmond, der Chauffeur.");

}


else if(UsedAction(A_TALK_TO)){

  player.FaceCharacter(cJim);
  FaceCharacter (JIM, GetPlayerCharacter());
GUIOff (0);
GUIOff (1);
Wait(1);
RunDialog (3);
}


else if(UsedAction(A_PICK_UP) || UsedAction(A_USE)){

DisplaySpeech(GetPlayerCharacter(),"Der ist wirklich nicht mein Typ.");

}
else if(UsedAction(A_OPEN)){
  player.Say("Keine Chance.");
}

else if(UsedAction(A_PUSH)){
player.Say("So gut kenne ich den Herrn nicht.");
 
}

else if(UsedAction(A_PULL)){
  player.Say("Ich will keinen unnötigen Ärger!");
}

else if(UsedAction(A_CLOSE)){
  player.Say("Wie soll das denn gehen?");
 
}

else if(!UsedAction(A_USE_INV) && !UsedAction(A_GIVE_TO)){
Unhandled();
}   

Dann geht auch der Gib-Befehl.  :)
« Letzte Änderung: 13. Dezember 2008, 12:57:37 von Mister L »

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1250
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der Give-Script
« Antwort #6 am: 11. September 2009, 22:41:43 »
Hallo!

Habe da ein Problem:

Habe es mit dem GIVE_TO und USE_INV_onCharacter genauso programmiert, wie MisterL es hier aufgeführt hat.

Im Spiel klappt dieser Befehl beim ersten mal (meistens) noch einwandfrei. Spätestens wenn ich diese Interaktion zum zweiten Mal durchführe, steigt AGS aus;
mit folgender Fehlermeldung:

An error has occured. Please contact the game author for support, as this likely to be a scripting error and not a bug in AGS.
(ACI version 2.72.920)

in Global script (line 1882)
from Global script (line 1932)
from Global script (line 2280)

Error: FaceCharacter: invalid character specified


Das steht in den angegebenen Zeilen:

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

1932   unhandled_event (0, 0);

2280 else Unhandled();



Arbeite mit 2.72-Starter-Paket für ManiacDungeon.

Kennt Ihr dieses Problem? Wär klasse, wenn mir jemand helfen könnte.


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: Der Give-Script
« Antwort #7 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

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Der Give-Script
« Antwort #8 am: 12. September 2009, 00:45:17 »
Aber ist es nicht so, das sich die FaceCharacter-Funktion sowieso noch in der Afrage befindet, ob der Charakter bei mouse.x/mouse.y größer als 0 und kleiner als 6 (es war doch 6...) ? Dann dürfte sowas auch nicht auftreten - Es kann sein, dass man tatsächlich vor FaceCharacter schon den Mauszeiger bewegt hat, aber dann wäre auch ein GetLocationType nutzlos...

Die beste Lösung wäre vllt, nur einmalig den Wert von GetCharacterAt() in einer Variable speichert, und GetCharacterAt überall im Give-Script durch diese Variable ersetzt.

Sch***e... hab' ans falsche Script gedacht  :-[
« Letzte Änderung: 12. September 2009, 00:48:15 von NsMn »

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1250
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der Give-Script
« Antwort #10 am: 12. September 2009, 20:03:16 »
Hatte schon selbst nen Weg gefunden, diesen Bug zu entschärfen! ;)

Und zwar habe ich in folgender Leiste...

else if(!UsedAction(A_USE_INV) && !UsedAction(A_GIVE_TO)){
Unhandled();
}   

das Unhandled entfernt, dass es dann so aussah:

else if(!UsedAction(A_USE_INV) && !UsedAction(A_GIVE_TO)){

}   

...und tatsächlich! Es stürzt nicht mehr ab! :)


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

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Der Give-Script
« Antwort #11 am: 13. September 2009, 04:10:22 »
Könnte ich mal den umliegenden Code sehen?
Das sieht mir nämlich nicht nach einer guten Lösung aus.

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
Re: Der Give-Script
« Antwort #12 am: 14. September 2009, 17:48:21 »
Ja, leere If's wäre so wie eine Mathematische Klammer ohne Inhalt. z.B.: (3*(5-4))*3=9 3*(      )*3=9
;)
Also wenn aber Unhandled den Fehler verursacht, könnte das auch so ernsthafte Probleme zeigen!


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

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1250
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der Give-Script
« Antwort #13 am: 14. September 2009, 19:22:27 »
Könnte ich mal den umliegenden Code sehen?
Das sieht mir nämlich nicht nach einer guten Lösung aus.

Diese Zeile ist in dem "Any click on character"-Script.

Alles weiter befindet sich in "Use inventory on character".

Darunter sind dann alle "if (player.activeinv == 1)" und "else if (player.activeinv == 2)" zu setzen, ggf. abgeschlossen mit einem "else Unhandled();".


Naja. Wichtig ist, dass es funktioniert. Nicht, dass es nachvollziehbar aussieht.  ;D

Denke die Aufteilung für "Any click" und "Use inventory" eignet sich so auch für Hotspots und Objects, da es mit der "(Used_Action(USE_INV))" in dem "Any click"-Script sehr unübersichtlich wird, wodurch beim abspeichern immer Fehlermeldungen auftreten, dass entweder zu viele oder zu wenige geschwungene Klammern vorhanden sind. :)


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!"

Rayman

  • Dott-MMM-Entwickler
  • Midlife Crisis Tentakel
  • **
  • Beiträge: 1580
    • Profil anzeigen
Re: Der Give-Script
« Antwort #14 am: 15. Januar 2011, 20:47:51 »
-Hat sich erledigt-
« Letzte Änderung: 15. Januar 2011, 21:44:28 von Rayman »