Autor |
Nachricht |
< I6 Npc Actions |
|
Verfasst am:
Do, 8 Jan 2015 - 16:48
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 17:56
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 18:43
|
|
|
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?>>
];
|
|
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 19:05
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 19:13
|
|
|
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 ... |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 19:34
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 21:00
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 21:29
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Do, 8 Jan 2015 - 22:16
|
|
|
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 ... |
|
|
|
|
|
Verfasst am:
Fr, 9 Jan 2015 - 8:16
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Fr, 9 Jan 2015 - 10:25
|
|
|
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 |
|
|
|
|
|
Verfasst am:
Fr, 9 Jan 2015 - 11:05
|
|
|
Experte
Anmeldungsdatum: 08.12.2009
Beiträge: 923
Wohnort: Berlin
|
|
|
|
|
|
|
Verfasst am:
Fr, 9 Jan 2015 - 11:08
|
|
|
Abenteurer
Anmeldungsdatum: 03.09.2009
Beiträge: 453
Wohnort: Cham
|
|
Danke für den hervorragenden Artikel! |
|
|
|
|
|