Forum moved to if-forum.org
Autor Nachricht
<  I6 Npc Actions
Mikawa
BeitragVerfasst am: Do, 8 Jan 2015 - 16:48  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Hm, ich frage mich gerade, wie man in Inform 6 Aktionen auf Npc-Befehle manuell umleitet.

Es gibt ja die <<Take apple>> Schreibweise, aber das löst eine Aktion ##Take für den Spieler aus, nicht für einen Npc.

Hatte jemand schon mal ein ähnliches Problem?

Grüße,
--MI
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Do, 8 Jan 2015 - 17:56  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Kommt drauf an, wo das drinsteht, in before-Statements sollte <<take self>> funktionieren, wo dann Unterscheidungen getroffen werden können.
_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mikawa
BeitragVerfasst am: Do, 8 Jan 2015 - 18:43  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Also ein kleines Beispiel:

Ich habe einen Hund als NPC, dem ich Befehle erteilen kann (z.B. "Hund, fass den Mann") und will aber dass das Kommando "Hetz Hund auf Mann" erstere Aktion triggert, also die Orders Rule in dem Hund-Objekt mit dem Kommando <<Attack Mann>> triggert.

Also in der Hetz-Aktion
Code:

[HetzSub;
  if (noun == Hund && second == Mann) <<Was muss hier stehen?>>
];
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Do, 8 Jan 2015 - 19:05  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Schwer zu sagen: üblich ist mehr

Code:
Object Hund ... blah
with ... blah
   before [;
      Attack:
         if (second == Mann) ... blah
   (alle Klammern zu)

mit etwas mehr Code könnte ich da etwas mehr sagen, ich bin aber nun kein I6-Experte, hab mich aber schon ordentlich damit beschäftigt.
_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mikawa
BeitragVerfasst am: Do, 8 Jan 2015 - 19:13  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Zu lösen ist es umgekehrt natürlich einfacher, also die Kommando-Aktion in der Orders Rule auf Attack umleiten
Code:

Object  Hund
  orders [;
    Attack, Bite:
      if (noun == Mann) {
        <<Hetz Hund Mann>>;
      }
  ],
;

[HetzSub;
  if (noun == Hund && second == Mann) "Der Hund stürzt sich auf den Mann.";
  "Nichts passiert.";
];


Dann steht eben der Ausführungscode in der HetzSub. Mich hätte es aber interessiert, ob es auch anders herum geht, also man quasi "von der HetzSub aus" die Orders Rule beim Hund "manuell" auslösen kann. Dazu habe ich trotz langer Suche in den Dokus nichts gefunden ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Do, 8 Jan 2015 - 19:34  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Probier's hier mal mit <<Hetz self Mann>>. So ein bisschen Objektorientierung ist in I6 schon drinne: orders kennt die Instanz "Hund" nicht, Self ist Übergabeparameter an externe Routinen.
_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mikawa
BeitragVerfasst am: Do, 8 Jan 2015 - 21:00  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Ich glaube mein Problem ist noch nicht ganz angekommen, ich weiß aber auch nicht wie ich es anders formulieren soll ... Also konkret: kann man eine Order Aktion (Hund, fass den Mann) "manuell" auslösen? Dann haben wir ja nicht die gewohnte Schablone mit <<Aktion noun noun>> sondern einen abweichenden Actor, der ja nicht der Spieler, sondern der NPC ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Do, 8 Jan 2015 - 21:29  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Was heißt "manuell auslösen"? Das sieht mir sehr nach einem Persuasion-Problem aus, das in I6 nach meinem Kenntnisstand "von Hand" über jeweilige Routinen für NPCs gelöst werden muss. In I7 könnte ich dafür elegante Lösungen nennen, I6 ist halt anders..
_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mikawa
BeitragVerfasst am: Do, 8 Jan 2015 - 22:16  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Einfach, ob man eine beliebige Aktion zu einer NPC Aktion umleiten kann. Anders formuliert: Kann man z.B. das Öffnen einer Tür mit einem Schlüssel (was ja normalerweise der Spieler ausführt) von einem NPC machen lassen, der daneben steht und den passenden Schlüssel in der Hand hält.

Also die Aktion
[Spieler öffnet Tür mit Schlüssel]
abbrechen und stattdessen
den Befehl:
Jim, öffne die Tür mit dem Schlüssel
[Spieler befiehlt Jim, die Tür zu öffnen]

ausführen lassen, ohne dass es der Spieler eingetippt hat. Das Makro <<...>> übernimmt ja genau diese Funktion, hat aber meiner Meinung nach nicht die Möglichkeit, als Actor den NPC zu bestimmen. Vielleicht geht das ja anders, aber wie?

Das Manual sagt dazu nur:
Zitat:

At any given time, just one action is under way, though others may be waiting
to resume when the current one has finished. The current action is always
stored in the four variables
actor action noun second
actor, noun and second hold the objects involved, or the special value nothing
if they aren't involved at all. (There's always an actor, and for the time being
it will always be equal to player.) action holds the kind of action. Its possible
values can be referred to in the program using the ## notation: for example
if (action == ##Look) ...
tests to see if the current action is a Look.


Aber wie setzt man das korrekt, so dass die bestehende Aktion abgebrochen und eine neue stattdessen vom NPC ausgeführt wird? Vielleicht geht es ja auch schlicht nicht ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hannes
BeitragVerfasst am: Fr, 9 Jan 2015 - 8:16  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.03.2010
Beiträge: 660

Was ist, wenn du die vier relevanten globalen Variablen – actor, action, noun, second – einfach manuell setzt und dann die Originalaktion weiterlaufen lässt?

Ansonsten steht da ja noch der magische Satz:
Zitat:
If you really need to, you can declare a new fake action with the directive Fake_action ‹Action-name›;. You can then cause this action with < and > as usual.


In dem Sub könntest du dann ja ebenfalls umleiten oder Variablen setzen, wie's beliebt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Fr, 9 Jan 2015 - 10:25  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Mikawa hat folgendes geschrieben:
ausführen lassen, ohne dass es der Spieler eingetippt hat. Das Makro <<...>> übernimmt ja genau diese Funktion, hat aber meiner Meinung nach nicht die Möglichkeit, als Actor den NPC zu bestimmen. Vielleicht geht das ja anders, aber wie?

Habs jetzt nicht ausprobiert, nach meinem I6-Verständnis sollte aber ein Dreieckstausch des player-Objekts hinhauen. Um das bellende Beispiel oben zu verwenden, in etwa:
Code:
Object Hund has animate,
  orders [p;
    Attack, Bite:
      if (noun == Mann) {
        p = player;
        player = self;        ! oder player = actor?
        <Hetz self Mann>;
        player = p;
      }
      rtrue;
  ], ...

_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
proc
BeitragVerfasst am: Fr, 9 Jan 2015 - 11:05  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin

Ah, hab grad was gefunden das hilfreich sein könnte:
http://inform.onyxring.com/InformGuide.aspx?article=24#redirecting
_________________
interactive fiction database
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mikawa
BeitragVerfasst am: Fr, 9 Jan 2015 - 11:08  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham

Danke für den hervorragenden Artikel!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  Inform & Glulx

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05