Seite 2 von 9

Verfasst: 19.04.2005, 21:46
von hansa_export
Mulle The Striker hat geschrieben:Ja, okay, aber ich hab bislang niemals etwas mit den globalen Variablen ausprobiert. Wie soll ich dabei vorgehen?
Hier mal ein Beispiel für den offenen Karton auf dem Dachboden meiner Episode in der ein Generator steht!

Code: Alles auswählen

  // script for object9: Any click on object
int gen;
  gen = GetGlobalInt(70); // Globale Variable definieren



if (character[GetPlayerCharacter()].inv[36] > 0){

 if (UsedAction (A_WALK_TO))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
    }
  }

  else if (UsedAction (A_CLOSE))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
      ObjectOn(8);
      PlaySound(50);
      ObjectOff(9);
     
      
      
    }
  }  
 else if (UsedAction (A_LOOK_AT))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
      DisplaySpeech(BERNHARD, "Der Karton ist leer.");}
      
      
    }
  }


else if (gen == 1) {
  
   if (UsedAction (A_WALK_TO))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
    }
  }

  else if (UsedAction (A_CLOSE))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
      ObjectOn(8);
      PlaySound(50);
      ObjectOff(9);
     
      
      
    }
  }  
 else if (UsedAction (A_LOOK_AT))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
      DisplaySpeech(BERNHARD, "Der Karton ist leer.");}
      
      
    }
  }


else  {
  
 if (UsedAction (A_WALK_TO))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
    }
  }

  else if (UsedAction (A_CLOSE))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
       ObjectOn(8);
       PlaySound(50);
      ObjectOff(9);
      
          
      
    }
  }  
 else if (UsedAction (A_LOOK_AT))
  {
     if (MovePlayer (71, 131))
    {
      FaceLocation (GetPlayerCharacter (), -999, 131);
      Wait (5);
      FaceLocation (GetPlayerCharacter (), 150, 999);
      Wait(5);
      PlaySound(4);
      AddInventory(36);
      DisplaySpeech(BERNHARD, "Da lag ein Generator drin.");}
      
      
      
      
    }
  }

 }  
  
mfg steffen :)

Verfasst: 19.04.2005, 21:52
von Anonymous1
Schluck!

Ich glaub, ich muss das erstmal verdauen!

Soviele Details, nur um eine Kleinigkeit zusammenzustellen?!

Okay, ich versuch das Mal.

Vielen Dank, hansa_export.

Verfasst: 19.04.2005, 21:55
von hansa_export
Und hier der Hotspot vom Eingangsflur wo man den Generator hinstellt!

Code: Alles auswählen

  // script for hotspot6: Use inventory on hotspot
int plana, gen;
  plana = GetGlobalInt(16);
  gen = GetGlobalInt(70);

if (plana == 2) {
  
     
if (MovePlayer(218, 140))
    {
      FaceLocation (GetPlayerCharacter (), 150, -999);
      Wait(5);
      ObjectOn(18);
      PlaySound(35);
      LoseInventory(36);
      DisableHotspot(6);
      Wait(5);
      gen ++;
      SetGlobalInt(70, gen);
      }  
}
else {
   if (MovePlayer(218, 140))
    {
      FaceLocation (GetPlayerCharacter (), 150, -999);
      Wait(5);
      FaceLocation (GetPlayerCharacter (), 150, 999);
  DisplaySpeech(BERNHARD, "Ich sollte erst den Plan mit der Tür und dem Eimer machen!");
}
}
mfg steffen :)

Verfasst: 19.04.2005, 23:34
von hansa_export
Hier noch eine kleine Hilfe: http://www.bigbluecup.com/hosted/german ... alInts.htm

mfg steffen :)

Verfasst: 20.04.2005, 00:13
von Rocco
bevor du noch die krise bekommst,
im prinzip is es ganz einfach, wenn
du die aktion ausführst, zB ein objekt wir genommen
dann setzt du einen wert

if(Used_Action(Pick_Up)
{
SetGlobalInt(1,1); // setz den werd von GlobalInt 1 auf wert 1
ObjectOff(2);
.
.
}

woanders kannst du anhand dieser variable schauen ob das object angezeigt werden soll oder nicht und zwar zB so:

if(GetGlobalInt(1)) //Ist GlobalInt1 positiv also grösser 0 dann
{

ObjectOn(2);

}

oder
if(!GetGlobalInt(1)) // wenn GlobalInt1 null ist dann
{
....
}

zur sicherheit solltest du aber lieber höhere werte verwenden, weil die globalInts bis ca. 20 schon anderwertig in verwendung sind.

ich hab globalInt 40 - 60 verwendet
zB: SetGlobalInt(40, (GetGlobalInt(40) +1)); // erhöh den wert von GlobalInt40 um 1

Verfasst: 20.04.2005, 15:02
von Rocco
ich hätt noch eine frage zum MMM template,
der GIVE_TO Befehl funktioniert leider nicht auf NPCs.
Was muss man ändern, damit das funktioniert?
Der workaround mit benutze ist nicht zufriedenstellend, weil
beispielsweise bei meiner Episode viele Spieler versuchen Hoagie das Zelt mit Gib Zelt an Hoagie zu übergeben.
Das es mit benutze dann geht ist unlogisch und frustrierend,
ich würd das gerne anpassen.

Verfasst: 20.04.2005, 15:48
von KhrisMUC
Ich hab den betreffenden Teil im global script gefunden:

Code: Alles auswählen

    else if ((GSagsusedmode == 4) && (GetLocationType (mouse.x, mouse.y) == 2) && isAction (A_GIVE_TO) && (GetCharacterAt (mouse.x, mouse.y) < 7))
    {
      SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
      if (GoToCharacter (GSlocid, 0, 1, 2))
      {
        ItemGiven = character [GetPlayerCharacter ()].activeinv;
        if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), MODE_USEINV) == 1)
        {
          RunCharacterInteraction (GSlocid, MODE_USEINV);
        }
        GiveInv (ItemGiven, GSlocid);
        character [GetPlayerCharacter ()].activeinv = -1;
      }
      SetAction (A_DEFAULT);
    }
1. Man kann nur den Charakteren 1-6 etwas geben (klar), muss man also ändern (1. if-Abfrage)
2. Man muss die Character-Interaction Use inventory on character benutzen, nicht AnyClick.
3. Durch Abfrage einer GlobalInt muss man gegebenenfalls verhindern, dass das Item den Besitzer wechselt.
Man könnte das script auch pauschal so ändern:

Code: Alles auswählen

        if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), MODE_USEINV) == 1)
        {
          RunCharacterInteraction (GSlocid, MODE_USEINV);
        }
        else
        {
          GiveInv (ItemGiven, GSlocid);
          character [GetPlayerCharacter ()].activeinv = -1;
        }
      }
Wenn der NPC das Item tatsächlich erhalten soll, entweder keine Interaction einbauen, oder es ihm in dieser übergeben.

Verfasst: 20.04.2005, 16:15
von Rocco
vielen dank, damit müsst ichs eigentlich hinkriegen.

Verfasst: 20.04.2005, 18:08
von Anonymous1
Nochmals Danke, Leute!

Hab aber einen ganz anderen Weg gefunden, das Problem zu lösen.
Ich habe nämlich das Programm vorgegaukelt, dass wenn man Objekt A vom Behälter genommen hat, der Hotshot in einem Objekt umgewandelt wird.
Ich habe also den Hotshot bei der Aktion gelöscht und den Behälter als Objekt wiedergegeben, so dass das Programm denkt, der Behälter wäre leer.
Naja, ich habe es doch geschafft, einen anderen, vor allem Dingen, leichteren Weg zu finden.

Trotzdem, eure Bemühungen sollen belohnt werden. :D
Sieht ihr aber erst, wenn meine neue Episode erst fertig ist. :wink:

FaceCharacterBug - Behebung

Verfasst: 21.04.2005, 18:43
von Rocco
Beim basteln am GiveTo Befehl ist mir grade ein Bug im Maniac Mansion Script aufgefallen, den ich korrigieren konnte.
Soweit ich mich erinnern kann, ist der bei einigen Episoden auch schon aufgetreten.
Und zwar wenn 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

Verfasst: 22.04.2005, 19:55
von Anonymous1
Ich habe noch zwei Fragen:

1. Wie lautet die Funktion, um den Hauptcharakter zu wechseln?

2. Wie soll ich vorgehen, wenn der andere Hauptcharakter einen anderen Satz aussprechen soll?
Zum Beispiel (ich nehme mal Hoagie und Bernhard):
Bernhard schaut die Tür an und sagt: "Nett."
Hoagie schaut die Tür an und sagt: "Echt geil."

...

Verfasst: 22.04.2005, 20:10
von Floyd
SetPlayerCharacter (int char_id);
Hiermit bestimmst du, mit welchem Charakter du gerade spielst.

Um einen anderen Satz auszugeben, musst du abfragen, welcher Charakter gerade aktiv ist. Das geht mit
GetPlayerCharacter ();
Du schreibst also z.B.
if (GetPlayerCharacter() ==1 ) {
DisplayMessage (1);
}
else if (GetPlayerCharacter() ==2 ) {
DisplayMessage (2);
}
MfG Floyd

Verfasst: 22.04.2005, 20:16
von Anonymous1
Danke für den Tipp, Floyd! :D

Werde mal probieren, ob das klappt!

Verfasst: 29.04.2005, 21:43
von Orange
Ich poste hier auch mal was... ich hoffe es stört nicht, dass ich dazu keine neuen Thread aufmache.

In Anbetracht des Gedankens auch selbst mal einen Teil von MMM zu erschaffen, hätte ich offenbar ein ziemliches Problem. Ich hab bisher noch nie mit beschrifteten Gegenständen in AGS-Spielen hantiert und weiß daher auch keinen Deut wie das funktioniert. Also, dass die Hotspots mit einem Wort erklärt werden, wenn man mit der Maus drüber fährt...

Und noch was? Wie schafft ihr es in die MMM-SPiele Umlaute reinzubringen? Das hat mich etwas verwundert. Ich musste bisher immer ae, oe, etc. schreiben, weil der englische AGS-Script das nicht annimmt, genauso wie ß.

Verfasst: 29.04.2005, 22:01
von Problem
Du brauchst einfach einen zeichensatz (Font), der Umlaute hat.

Und wenn du wissen willst, wie in MMM das alles umgesetzt wuird, lad dir doch einfach das AGS Starterpack für MMM runter, und vergleiche :wink:
Da ist nämlich schon das komplette Interface mit Beispielräumen drin.