Autor Thema: Variable setzen  (Gelesen 6386 mal)

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1250
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Variable setzen
« am: 22. April 2008, 12:56:56 »
Hallo Leute!

Aus Bernhards Starterpack habe ich mal versucht, mit dem Interaction-Script vom Inventory Item "Portemonaie" zu arbeiten. Es hat aber nicht funktioniert.

Folgendes möchte ich gerne umsetzen:

Ich möchte, wenn der Charakter erstmals ins Gerümpel greift, einen Gegenstand findet und ihn an sich nimmt.
WENN er diesen Gegenstand bei sich hat und die gleiche Interaction wiederholt, soll er stattdessen sagen "Da gibt es nichts mehr zu holen!"
Ich habe es schon mal mit dem SetGlobalInt versucht, habe aber nicht herausgefunden, wie ich ihn anwende...

..oder gibt es noch die Alternative, ne klassische Variable einzusetzen ( A=0 ; if "Gegenstand genommen" then A=1 ...)   
Ich hoffe ich stell es jetzt mal nicht zu kompliziert dar!  ;)

Hier ist mein Script...ich musste es so zurücklassen, damit ich mein Game gespeichert bekomme.
Mein Ziel ist es, die Information "GetGlobalInt (25) = 0 )" zu vermitteln. Habe aber die richtige Programmierweise nicht herausfinden können.

Hier das Script:

Zitat
else if (UsedAction (A_PICK_UP))
  {
    if (MovePlayer (240, 128))
    {
      FaceDirection(GetPlayerCharacter(),DIR_UP);
      GetGlobalInt(25) ;
      DisplaySpeech(GetPlayerCharacter(),"Hmmm...dieses Kügelchen sieht noch einigermaßen nützlich aus.");
      Wait (5);
      PlaySound(4);
      AddInventory(6);
      SetGlobalInt(25,1);
    }
else {
    DisplaySpeech(GetPlayerCharacter(),"Hier ist nichts brauchbares mehr zu finden.");
  }
}




Danke schon mal im vorraus!  ;)
"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!"

RedPhoenix@work

  • Gast
Re: Variable setzen
« Antwort #1 am: 22. April 2008, 14:08:00 »
Der Skript müsste folgendermaßen lauten:

Zitat
else if (UsedAction (A_PICK_UP))
{
 if (MovePlayer (240, 128))
 {
  if (GetGlobalInt(25) == 0)
  {
   FaceDirection(GetPlayerCharacter(),DIR_UP);
   DisplaySpeech(GetPlayerCharacter(),"Hmmm...dieses Kügelchen sieht noch einigermaßen nützlich aus.");
   Wait (5);
   PlaySound(4);
   AddInventory(6);
   SetGlobalInt(25,1);
   }
   else if (GetGlobalInt(25) == 1)
   {
   DisplaySpeech(GetPlayerCharacter(),"Hier ist nichts brauchbares mehr zu finden.");
   }
  }
}

MalleTheRedPhoenix

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1256
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Variable setzen
« Antwort #2 am: 22. April 2008, 14:12:45 »
Das war übrigens ich! Wollte Irritationen vermeiden! ;)
Wie Phönix aus der Asche.

Neue Charaktere, MOR-Spiel und potenzielles Starterpack für MMM und MOR in Arbeit.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2667
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Variable setzen
« Antwort #3 am: 22. April 2008, 14:24:46 »
dazu braucht man aber kein GlobalInt zu verballern!

es gibt da beim charakter eine eigenschaft, mit der man feststellen kann, wie oft ein objekt im inventory vorhanden ist

if(player.inv[iKUGEL] > 0)

wenn iKUGEL die ID von deinem inventory item ist

bin mir da jetzt aber nicht 100%ig sicher, ob das wirklich inv heißt oder nicht invquantity oder so  ;)
« Letzte Änderung: 22. April 2008, 14:31:42 von Bòógieman »
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

Kaktus

  • volljähriger Tentakel
  • *****
  • Beiträge: 755
  • Geschlecht: Männlich
  • Waaaah!
    • Profil anzeigen
    • E-Mail
Re: Variable setzen
« Antwort #4 am: 22. April 2008, 14:35:24 »
@1mal_volltanken
Ich würde dir allerdings raten, dir anzugewöhnen die Variablen selber im GlobalScript zu deklarieren.
Das ist einfach übersichtlicher zu lesen, da man am Namen der Variable direkt den Nutzen erkennen kann.
Stell dir vor du hast einen Code in dem zig Verschiedene Get/SetGlobalInt untereinander verschachtelt sind, dann kommst du selbst mit einer Liste durcheinander.

Das geht so:

Global Script:
int portmoneeDurchsucht;
export portmoneeDurchsucht;

Global Script Header:
import int portmoneeDurchsucht;
Der Code sähe dann folgendermaßen aus:
else if (UsedAction (A_PICK_UP))
{
if (any_click_move(240, 128, DIR_UP))
{
       if (!portmoneeDurchsucht)
      {
            player.Say("Hmmm...dieses Kügelchen sieht noch einigermaßen nützlich aus.");
            Wait (5);
            PlaySound(4);
            player.AddInventory(iKUGEL);
            portmoneeDurchsucht++;
      }

      else player.Say("Hier ist nichts brauchbares mehr zu finden.");

}

@Bòógieman Wenn der Player aber die Kugel nicht mehr hat, aber das Portmonee immernoch, dann kann er es nochmal durchsuchen und erhält auf wundersame Weise nochmals eine Kugel.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2667
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Variable setzen
« Antwort #5 am: 22. April 2008, 16:39:58 »
@kaktus: das ist doch genau das, was gewünscht ist
WENN er diesen Gegenstand bei sich hat und die gleiche Interaction wiederholt, soll er stattdessen sagen "Da gibt es nichts mehr zu holen!"

oder zumindest lese ich das so aus 1mal_volltanken's beschreibung ;)
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

NsMn

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1646
  • Geschlecht: Männlich
  • überzeugter Paint-Nutzer
    • ICQ Messenger - 404385098
    • Profil anzeigen
    • E-Mail
Re: Variable setzen
« Antwort #6 am: 22. April 2008, 16:43:26 »
Aber wenn er die Kugel z.B. mit einem Loch benutzt,ist sie weg.

MalleTheRedPhoenix

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1256
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Variable setzen
« Antwort #7 am: 22. April 2008, 18:02:24 »
@Bòógieman: Das Problem bei Deinem Skript ist, dass Du dem Programm den Befehl gibt's, dass er den Satz nicht mehr erwähnt, wenn der betreffende Gegenstand sich jetzt im Inventar befindet. Das Problem mag zwar nicht mehr auftreten, wenn man den entsprechenden Ort im späteren Verlauf nicht mehr besuchen kann, wo man den Gegenstand ursprünglich her hat. Wenn man allerdings immer noch genau an den Ort im Spiel zurückkehren kann und sich immer noch das Objekt dort befindet, wo man den Inventargegenstand her hatte, besteht die Gefahr, dass man trotz Deines Prinzips sich der Skript wiederholt, obwohl das nicht passieren soll.

Ich erkläre genauer, was ich meine:

Nehmen wir mal an, Du würdest von Britneys Schrank einen ihrer BHs stehlen wollen. (Geile Vorstellung! ;D)
Der entsprechende Wert des betreffenden Gegenstandes war vorher 0. Du sagst also dem Programm, dass er, wenn der Charakter den Gegenstand nimmt, der Wert auf 1 umspringen soll, wenn er den entsprechenden Inventargegenstand bei sich aufgenommen hat. Dadurch soll das Programm auch später die Erkenntnis gewinnen, dass, wenn der Wert auf 1 ist, der Charakter sagen soll "Ich kann KEIN BH mehr im Schrank finden!".

Bloß hat die Sache einen Haken: Wenn der entsprechende Gegenstand nun im Inventar verschwindet (ob nun durch eine Aktion oder sonst was), wird der Wert 1 automatisch wieder auf 0 gesetzt, da in dem Fall das Programm erkennt, dass der Item sich nicht mehr im Besitz des Charakteres befindet. Das bedeutet also, dass laut dem Skript sich der Gegenstand wieder im entsprechenden Objekt befindet, so dass der Skript wieder auf Anfang geht und man wieder ein BH bekommt, obwohl logischerweise sich kein BH mehr im Schrank befinden sollte!

Deswegen ist dieser Befehl, falls man am alten Ort zurück kehrt, ein wenig fahrlässig. Und dem Fall würde ich lieber auf die Globalints zurückgreifen, da man diese manuell ändern kann, ohne, dass das Programm dazwischen funkt.
Wie Phönix aus der Asche.

Neue Charaktere, MOR-Spiel und potenzielles Starterpack für MMM und MOR in Arbeit.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2667
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Variable setzen
« Antwort #8 am: 22. April 2008, 19:56:57 »
bin leider nur programmierer von beruf, kenn mich also mit variablen und logik überhaupt nicht aus  ::)
könntet ihr bitte meinen vorigen post nochmals vollkommen ignorieren und mir das nochmal in einem 27-bildschirmseitigen post mit lustigen beispielen erklären?  :-*

aber ich probier es auch mal mit einer metapher:
ein kunde (1mal_volltanken) kommt zum autohändler und fragt nach einem grünen motorrad um damit zur arbeit fahren zu können
ich würde ihm ein grünes motorrad verkaufen weil er ja eins haben will
ihr verkauft ihm ein grünes auto (das kann ja auch fahren und ist obendrein noch viel sicherer als ein motorrad)
 ;D ;)


und nochmal zum mitschreiben, ich interpretiere 1mal_volltanken's angaben so, dass er "Da gibt es nichts mehr zu holen!" nur sehen will, wenn er wirklich die Kugel im inventar hat
also wenn er sie in ein loch wirft, will er es wieder zulassen, dass man sich eine neue kugel holen kann
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

Kaktus

  • volljähriger Tentakel
  • *****
  • Beiträge: 755
  • Geschlecht: Männlich
  • Waaaah!
    • Profil anzeigen
    • E-Mail
Re: Variable setzen
« Antwort #9 am: 22. April 2008, 20:19:42 »
und nochmal zum mitschreiben, ich interpretiere 1mal_volltanken's angaben so, dass er "Da gibt es nichts mehr zu holen!" nur sehen will, wenn er wirklich die Kugel im inventar hat
Ich wette dagegen!  ;D
Der Satz von volltanken, den du weiter oben gepostet hat, beißt sich mit dem Rest seines Posts. Daher tippe ich in diesem Satz auf einen kleinen Logikfehler von Seiten 1mal_volltankens.

Und seit wann kennen sich Programmierer sich mit Logik aus, ich dachte das sei ein Teilgebiet der Philosophie? ???

Link2005

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1777
  • Geschlecht: Männlich
  • Guck mal Mami - Ohne Blog!
    • Profil anzeigen
Re: Variable setzen
« Antwort #10 am: 22. April 2008, 20:44:04 »
Wenn er die Kugel(Oder in Mulles Beispiel Brits BH) Aber danach nicht mer nehmen möchte, sollte man aber eine 2. Variable einführen, die dann von 0 auf 1 umspringt, wenn er den Gegenstand schon mal hatte, und nicht mehr hat. Diese sollte dann verhindern, das der Char den BH noch mal nimmt. Um es mal in Basic auszudrücken:

*Andere Script-Punkte*
11010 input aktion$
11020 if aktion$="Nimm Kugel" then if Var2$="0"Inventar$=Inventar$+Kugel:Var1$="1" else print"Da gibt es nichts mehr zu holen!"
11030 if aktion$="Gib Kugel an Blablabla" or "Benutze Kugel mit Laberrababer" then Var1$="0":Var2="1":Inventar$=Inventar$-Kugel

Mit anderen worten: Ich würde ihm ein grünes Motorrad mit Umtauschgutschein für ein Grünes Auto gegen das Motorrad anbieten. ;D

MMM Epi 63: B-DUN DX
10% - AGS-Rohdateien von B-DuN finden
25% - Story
60% - Scripten, Grafiken
85% - Betatest
100%

MalleTheRedPhoenix

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1256
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Variable setzen
« Antwort #11 am: 22. April 2008, 21:22:29 »
bin leider nur programmierer von beruf, kenn mich also mit variablen und logik überhaupt nicht aus  ::)
könntet ihr bitte meinen vorigen post nochmals vollkommen ignorieren und mir das nochmal in einem 27-bildschirmseitigen post mit lustigen beispielen erklären?  :-*

aber ich probier es auch mal mit einer metapher:
ein kunde (1mal_volltanken) kommt zum autohändler und fragt nach einem grünen motorrad um damit zur arbeit fahren zu können
ich würde ihm ein grünes motorrad verkaufen weil er ja eins haben will
ihr verkauft ihm ein grünes auto (das kann ja auch fahren und ist obendrein noch viel sicherer als ein motorrad)
 ;D ;)


und nochmal zum mitschreiben, ich interpretiere 1mal_volltanken's angaben so, dass er "Da gibt es nichts mehr zu holen!" nur sehen will, wenn er wirklich die Kugel im inventar hat
also wenn er sie in ein loch wirft, will er es wieder zulassen, dass man sich eine neue kugel holen kann

Tut mir Leid, aber ich wusste nicht, dass Du beruflich Programmierer bist.

Ich habe aber 1mal_volltanken so verstanden, dass er nur ein Gegenstand aus einem Objekt bekommt und es nachher nicht mehr im Objekt ist. Deswegen auch die Sache mit den Variablen.
Wie Phönix aus der Asche.

Neue Charaktere, MOR-Spiel und potenzielles Starterpack für MMM und MOR in Arbeit.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2667
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Variable setzen
« Antwort #12 am: 22. April 2008, 21:50:55 »
ok, um hier nicht noch weiter unnötiges gegenseitiges bekehren zu betreiben fasse ich mal zusammen:

um eine variable kommt man nicht rum wenn folgendes erfüllt ist:
der gegenstand darf insgesamt nur ein einziges mal aus dem gerümpel genommen werden
der spieler kann den gegenstand aus seinem inventar entfernen und DANACH wieder zum gerümpel gelangen

in diesem fall würde aber auch eine lokale variable im raum reichen, es sei denn man benötigt die "kugel wurde schonmal genommen"-information auch in einem anderen raum/bei einer interaktion mit einem charakter oder inventory item/bei dialogen/oder gar zyklisch


meine variante passt wenn:
die kugel erst wieder aus dem inventory verschwindet, wenn der spieler gar nicht mehr zum gerümpel gelangen kann
(zB bernard nimmt die kugel und aktiviert damit einen teleporter der ihn ohne wiederkehr zum mars teleportiert  ;D )
ODER eine neue kugel genommen werden darf, nachdem die erste verbraucht wurde

das lässt sich zwar ebenfalls mit einer variable lösen, aber das wäre unnötig kompliziert


so lieber 1mal_volltanken, jetzt musst du dich entscheiden, wer soll dein herzblatt sein?  ;D :P


PS: mir fällt gerade auf, dass mein voriger post vielleicht in einer etwas zu harschen tonart geschrieben ist  :-\
sorry, war nicht ganz so gemeint  ;)
« Letzte Änderung: 22. April 2008, 21:57:26 von Bòógieman »
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

MalleTheRedPhoenix

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1256
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Variable setzen
« Antwort #13 am: 22. April 2008, 21:55:14 »
Oder: Deal oder no Deal?!? ;D

Okay Bòógieman. Du kennst Dich jedenfalls mit der Programmierersprache besser aus als ich. Also halte ich erstmal die Klappe! :)
Wie Phönix aus der Asche.

Neue Charaktere, MOR-Spiel und potenzielles Starterpack für MMM und MOR in Arbeit.

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1250
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Variable setzen
« Antwort #14 am: 23. April 2008, 00:18:18 »
OK, da bin ich wieder!  ;) Hat lange gedauert, aber hatte noch Spätschicht!  8) Vielen Dank für die vielen Posts. Aber da ich mein Anliegen nur zu 90% ausführlich beschrieben hatte, wollte ich es hiermit noch mal ganz genau beschreiben:

Diese Kugel soll in diesem Hotspot/Objekt "Gerümpel" nur EINMAL gefunden werden. Wenn jene Kugel im Laufe des Spiels verbraucht wird, gibt es dort keine neue zu finden. Das wäre ja auch nicht notwendig, weil so ein Item eben einem bestimmten Zweck dienen soll. Ich schätze, es würde jedem Spieler die Laune verderben, wenn man aufgrund einer Idee ein wichtiges Item falsch einsetzt, verbraucht und das Spiel dann unlösbar wird und man dazu gezwungen ist, den Spielstand neu zu laden...besonderes Negativ-Beispiel wäre aus Maniac Mansion der "Farb-Entferner".

Jedenfalls vielen Dank. Ich werd mal probieren, das korrigierte GlobalInt-Script einzusetzen!  ;)
"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!"