blob: fd99a3d876549f991a3fd659dd85f643fbae0dba [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001SetChats()
2==========
3
4FUNKTION
5--------
Zesstra18626972017-01-31 10:38:27 +01006
Christian Georg Beckera32ae762017-04-03 01:06:34 +02007 void SetChats(int chance, mixed strs);
Zesstra18626972017-01-31 10:38:27 +01008
9DEFINIERT IN
10------------
Zesstra18626972017-01-31 10:38:27 +010011
Christian Georg Beckera32ae762017-04-03 01:06:34 +020012 /std/npc/chat.c
Zesstra18626972017-01-31 10:38:27 +010013
14ARGUMENTE
15---------
Zesstra18626972017-01-31 10:38:27 +010016
Christian Georg Beckera32ae762017-04-03 01:06:34 +020017 int chance
18 Prozentuale Wahrscheinlichkeit einer Ausgabe
19 mixed strs
20 Array mit den verschiedenen Moeglichkeiten der Monsterchats
Zesstra18626972017-01-31 10:38:27 +010021
22BESCHREIBUNG
23------------
Zesstra18626972017-01-31 10:38:27 +010024
Christian Georg Beckera32ae762017-04-03 01:06:34 +020025 Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat einen
26 zufaellig gewaehlten Text aus dem Array <strs> in den Raum aus. Dabei
27 wird per Default send_room() ohne erneutes Umbrechen mit den Messagetypen
28 MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.
Zesstra18626972017-01-31 10:38:27 +010029
Christian Georg Beckera32ae762017-04-03 01:06:34 +020030 Die einzelnen Arrayelemente koennen:
31
32 * Strings sein
33 * Closures sein, deren Rueckgabe ausgegeben wird und die zusaetzlich
34 einen aenderbaren und in send_room() verwendeten 'msg_typ' per
35 Referenz uebergeben bekommen
36 * Arrays mit der Struktur
37 `({<string|closure msg >, <int msg_typ>})` sein, fuer
38 die obige Regeln auf 'msg' angewendet werden und bei denen 'msg_typ'
39 im send_room() verwendet wird
Zesstra18626972017-01-31 10:38:27 +010040
Christian Georg Beckera32ae762017-04-03 01:06:34 +020041 Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
42 verwenden. In allen Funktionen ist this_player() das Monster selbst.
43 Normalerweise muss man die Nachrichten selbst umbrechen, ausser man
44 uebergibt die Message-Typen explizit und uebergibt kein MSG_DONT_WRAP.
Zesstra18626972017-01-31 10:38:27 +010045
46BEMERKUNGEN
47-----------
Zesstra18626972017-01-31 10:38:27 +010048
Christian Georg Beckera32ae762017-04-03 01:06:34 +020049 * im Kampf werden keine Chats ausgegeben, man muss dann SetAttackChats()
50 verwenden
51 * die strings werden (noch) durch process_string() geschickt,
52 dieses sollte man aber nicht mehr verwenden
53 * 'chance' gilt sowohl fuer Attack- als auch normale Chats
54 * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen NPC
55 voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0 setzen
56 * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen ('stillen')
57 * NPC haben bei Abwesenheit von Spielern in der Regel keinen Heartbeat,
58 weswegen dann auch die Chats ausgeschaltet sind
59 * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER uebergeben
60
61BEISPIELE
62---------
63
64.. code-block:: pike
65
66 // Ein einfaches Beispiel:
67 SetChats(20,
68 ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
69 "Der Ork grinst Dich unverschaemt an.\n",
70 "Der Ork wedelt mit seinem Saebel vor dir herum.\n",
71 "Der Ork stupst Dich mit dem Finger hart.\n"}));
72
73.. code-block:: pike
74
75 // Ein Beispiel mit send_room-Typen ohne MSG_DONT_WRAP
76 SetChats(20,
77 ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.", MT_LISTEN}),
78 ({"Der Ork grinst Dich unverschaemt an.", MT_LOOK}),
79 ({"Der Ork wedelt mit seinem Saebel vor dir herum.", MT_LOOK}),
80 ({"Der Ork stupst Dich mit dem Finger hart.", MT_LOOK|MT_FEEL})}));
81
82.. code-block:: pike
83
84 // Laengeres Beispiel mit Closures
85 protected string chat_flightinfo(int msg_typ);
86 protected string chat_trysteal(int msg_typ);
87
88 void create() {
89 SetChats(20,
90 ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n", MT_LISTEN}),
91 #'chat_flightinfo,
92 #'chat_trysteal}));
93 // [...]
94 }
95
96 protected string chat_flightinfo(int msg_typ) {
97 msg_typ = MT_LISTEN;
98 return ("Der Ork sagt: "+
99 (QueryProp(P_HP)<QueryProp(P_WIMPY)?
100 "Ich hab Angst!":
101 "Guck mich nicht so an, Schwaechling!"));
102 }
103
104 protected string chat_trysteal(int msg_typ) {
105 object *pls = filter(all_inventory(environment()), #'interactive);
106 if(sizeof(pls)) {
107 object pl = pls[random(sizeof(pls))];
108 if(!IS_LEARNER(pl)) {
109 object *objs = all_inventory(pl);
110 if(sizeof(objs)) {
111 object ob = objs[random(sizeof(objs))];
112 if(ob->move(this_object(),
113 M_NO_SHOW|M_GIVE|M_MOVE_ALL)==MOVE_OK) {
114 if(pl->ReceiveMsg(Name(WER)+" stiehlt dir "+ob->name(WEN, 0)+".",
115 MT_FEEL|MT_LOOK)<0)
116 pl->ReceiveMsg("Irgendwie scheint dir jetzt etwas zu fehlen.",
117 MT_FEEL|MT_LOOK|MSG_DONT_IGNORE);
118 send_room(environment(),
119 Name(WER, 1)+" bestiehlt "+pl->name(WEN)+".",
120 MT_LOOK, 0, 0, ({pl}));
121 return "";
122 }
123 }
124 }
125 }
126 msg_typ = MT_LOOK;
127 return Name(WER, 1)+" schaut sich verstohlen um.";
128 }
129
Zesstra18626972017-01-31 10:38:27 +0100130
131SIEHE AUCH
132----------
Zesstra18626972017-01-31 10:38:27 +0100133
Christian Georg Beckera32ae762017-04-03 01:06:34 +0200134 Verwandt:
135 :doc:`SetAttackChats`
136 Props:
Arathorn0487fdb2019-11-26 19:16:14 +0100137 :doc:`../props/P_CHAT_CHANCE`, :doc:`../props/P_ACHATS`, :doc:`../props/P_ACHAT_CHANCE`
Christian Georg Beckera32ae762017-04-03 01:06:34 +0200138 Sonstiges:
139 :doc:`../sefun/send_room`, :doc:`../sefun/process_string`
Zesstra18626972017-01-31 10:38:27 +0100140
Arathorn0487fdb2019-11-26 19:16:14 +010014103. April 2017 Gloinson