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