Script-Frage: Look at Inv<--->properties

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Smiley

Script-Frage: Look at Inv<--->properties

Beitrag von Smiley »

Hi,
ich möchte nicht bei jedem Inventory-Object ein "look at"-Script machen ala "DisplaySpeechAt..", sondern nur eine Skript-Zeile, die den Text aus den Properties nimmt.

Krieg das aber irgendwie nicht gebacken, und wär für jeden Tipp dankbar..
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Ich glaube du suchst nach unhandeld_event:

unhandled_event (int what, int type)
Called when an interaction is run, but no events are listed in the interaction window. This could be used to display a default "I can't do that" type of message. The values of WHAT and TYPE tell you what the player did.
The possible values are listed below:

WHAT TYPE Description
1 1 Look at hotspot
1 2 Interact with hotspot
1 3 Use inventory on hotspot
1 4 Talk to hotspot
1 7 Pick up hotspot
1 8 Cursor Mode 8 on hotspot
1 9 Cursor Mode 9 on hotspot
2 0 Look at object
2 1 Interact with object
2 2 Talk to object
2 3 Use inventory on object
2 5 Pick up object
2 6 Cursor Mode 8 on object
2 7 Cursor Mode 9 on object
3 0 Look at character
3 1 Interact with character
3 2 Speak to character
3 3 Use inventory on character
3 5 Pick up character
3 6 Cursor Mode 8 on character
3 7 Cursor Mode 9 on character
4 1 Look at nothing (ie. no hotspot)
4 2 Interact with nothing
4 3 Use inventory with nothing
4 4 Talk to nothing
5 0 Look at inventory
5 1 Interact with inventory (currently not possible)
5 2 Speak to inventory
5 3 Use an inventory item on another
5 4 Other click on inventory
Note that the "Character stands on hotspot" event does not trigger this function, and it will not be triggered if there is an "Any click" interaction defined. This function is not triggered if the player clicks on nothing (hotspot 0).


Wenn du bei look at nichts eingibst und dafür im global script ein unhandeled event für look at machst (am besten mit einem random* effekt, damit es nicht immer die gleiche Nachricht ist) erreichst du wohl was du willst.

*: Random
Random (int max)

Returns a random number between 0 and MAX. This could be useful to do various effects in your game.
NOTE: The range returned is inclusive - ie. if you do Random(3); then it can return 0, 1, 2 or 3.

Example:

int ran=Random(2);
if (ran==0) NewRoom(1);
else if (ran==1) NewRoom(2);
else NewRoom(3);

will change the current room to room 1,2 or 3 depending on a random result.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Deine Frage lässt mich wieder hoffen...endlich mal eine vernünftige, intelligente Frage, die auch noch zeigt, dass Du Dir eigene Gedanken gemacht hast. (Das mein ich ernst)
Das einzige, was noch fehlt: Welche AGS Version benutzt Du? MMMania-Starterpack oder nicht?

Genau diese (sehr elegante) Methode benutze ich übrigens auch :D

Alles AGS 2.62-code:
Im Global Script gibt es die Funktion on_mouse_click, im defaultgame sieht der Teil, der einen Linksklick behandelt, so aus:

Code: Alles auswählen

  else if (button == LEFT) {
    ProcessClick(mouse.x, mouse.y, mouse.Mode );
  }
ProcessClick() ist eine eingebaute Funktion, die sich nicht verändern lässt. Man muss also alles manuell coden. Bei mir sieht das so aus:
Ganz am Anfang von on_mouse_click:

Code: Alles auswählen

  int x=mouse.x;
  int y=mouse.y;
  int obj=GetObjectAt(x, y);
  int cha=GetCharacterAt(x,y);
  int hot=GetHotspotAt(x,y);
  string do;
Dann der LinksKlick-Teil:

Code: Alles auswählen

if (button==LEFT)
{
  if (GetCursorMode()==MODE_LOOK)
  {
    StrCopy(do, "ns");

    if (hot>0)  // look at hotspot
    {
      GetHotspotPropertyText(hot, "description", do);
    }
    else if (obj>-1)  // look at object
    {
      GetObjectPropertyText(obj, "description", do);
    }
    else if (cha>0)   // look at character
    {
      GetCharacterPropertyText(cha, "description", do);
    }  
    
    if (StrComp(do,"ns")==0)
    {
      DisplaySpeech(EGO, "You see nothing special.");
    }
    else if (StrComp(do,"process")==0)
    {
      ProcessClick(mouse.x, mouse.y, MODE_LOOK);
    }
    else
    {
      DisplaySpeech(EGO, do);
    }
  }
  else
  {
    ProcessClick(mouse.x, mouse.y, GetCursorMode());
  }
}
Wenn du jetzt im Properties Editor ein Property namens description hinzufügst, wird immer der Text angezeigt, der dort steht. Wenn ich allerdings wollte, dass doch mehr passiert, hab ich dort process eingetragen, in diesem Fall wird dann das Interaction event aufgerufen.

EDIT: hab gerade gesehen, dass Du inventory items gemeint hast :)

hier (auch in on_mouse_click):

Code: Alles auswählen

  if (button==RIGHTINV) {
    if (game.inv_activated>0) {
      string desc;
      GetInvPropertyText(game.inv_activated, "description", desc);
      if (StrComp(desc, "process")==0) {
        RunInventoryInteraction(game.inv_activated, MODE_LOOK);
      }
      else {
        DisplaySpeech(EGO, desc);
      }
    }
  }
Rechtsklick auf Inventory item -> Character sagt Beschreibung
diese ist process -> stattdessen wird Interaction event aufgerufen
Use gopher repellent on funny little man
Smiley

Beitrag von Smiley »

Danke für die Antworten!

@khrismuc
Hab dein Skript jetzt in unhandled_event statt in on_mouse_click, weil er da nicht drauf reagieren wollte...
Benutzeravatar
TheIncredibleLovis
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 208
Registriert: 12.04.2005, 18:08
Wohnort: Hamburg, Regen, Frisur hält!

Beitrag von TheIncredibleLovis »

khrismuc hat geschrieben:Deine Frage lässt mich wieder hoffen...endlich mal eine vernünftige, intelligente Frage, die auch noch zeigt, dass Du Dir eigene Gedanken gemacht hast.
:wink: seh ich auch so
Antworten