IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6 Npc Actions
AntwortenNeues ThemaNeue Umfrage

I6 Npc Actions

Geschrieben um 17:48 am 08.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

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

Geschrieben um 18:56 am 08.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

Kommt drauf an, wo das drinsteht, in before-Statements sollte <<take self>> funktionieren, wo dann Unterscheidungen getroffen werden können.

-----
Geschrieben um 19:43 am 08.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

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


&#91;HetzSub;

  if &#40;noun == Hund && second == Mann&#41; &lt;&lt;Was muss hier stehen?>>

&#93;;
Geschrieben um 20:05 am 08.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

Schwer zu sagen: üblich ist mehr


with ... blah

   before &#91;;

      Attack&#58;

         if &#40;second == Mann&#41; ... blah

   &#40;alle Klammern zu&#41;

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.

-----
Geschrieben um 20:13 am 08.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

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


Object  Hund

  orders &#91;;

    Attack, Bite&#58;

      if &#40;noun == Mann&#41; &#123;

        &lt;&lt;Hetz Hund Mann>>;

      &#125;

  &#93;,

;

&#91;HetzSub;

  if &#40;noun == Hund && second == Mann&#41; "Der Hund stürzt sich auf den Mann.";

  "Nichts passiert.";

&#93;;

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 ...

Geschrieben um 20:34 am 08.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

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.

-----
Geschrieben um 22:00 am 08.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

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.

Geschrieben um 22:29 am 08.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

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..

-----
Geschrieben um 23:16 am 08.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

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 ...

Geschrieben um 09:16 am 09.01.2015 | Zitat | Editieren | Löschen
Hannes
Avatar
Mitglied
Prof Gumby
Beiträge: 558

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.

Geschrieben um 11:25 am 09.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

Mikawa:

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:



  orders &#91;p;

    Attack, Bite&#58;

      if &#40;noun == Mann&#41; &#123;

        p = player;

        player = self;        ! oder player = actor?

        &lt;Hetz self Mann>;

        player = p;

      &#125;

      rtrue;

  &#93;, ...```
-----
Geschrieben um 12:05 am 09.01.2015 | Zitat | Editieren | Löschen
proc
Avatar
Mitglied
Retired Gumby
Beiträge: 706

Ah, hab grad was gefunden das hilfreich sein könnte:

http://inform.onyxring.com/InformGuide.aspx?article=24#redirecting

-----
Geschrieben um 12:08 am 09.01.2015 | Zitat | Editieren | Löschen
Mikawa
Avatar
Mitglied
Prof Gumby
Beiträge: 324

Danke für den hervorragenden Artikel!

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz