blob: ee6d04ba9d75dbbd94b7da2039fcf4dced897c7a [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002SetChats()
Zesstra953f9972017-02-18 15:37:36 +01003**********
MG Mud User88f12472016-06-24 23:31:02 +02004
MG Mud User88f12472016-06-24 23:31:02 +02005
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra0c1a85a2018-02-07 23:46:50 +01009 void SetChats(int chance, mixed strs);
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012DEFINIERT IN
13============
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 /std/npc/chat.c
MG Mud User88f12472016-06-24 23:31:02 +020016
MG Mud User88f12472016-06-24 23:31:02 +020017
Zesstra953f9972017-02-18 15:37:36 +010018ARGUMENTE
19=========
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra0c1a85a2018-02-07 23:46:50 +010021 int chance
22 Prozentuale Wahrscheinlichkeit einer Ausgabe
23
24 mixed strs
25 Array mit den verschiedenen Moeglichkeiten der Monsterchats
Zesstra953f9972017-02-18 15:37:36 +010026
27
28BESCHREIBUNG
29============
30
Zesstra0c1a85a2018-02-07 23:46:50 +010031 Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat
32 einen zufaellig gewaehlten Text aus dem Array <strs> in den Raum
33 aus. Dabei wird per Default send_room() ohne erneutes Umbrechen mit
34 den Messagetypen MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.
Zesstra953f9972017-02-18 15:37:36 +010035
Zesstra0c1a85a2018-02-07 23:46:50 +010036 Die einzelnen Arrayelemente koennen:
Zesstra953f9972017-02-18 15:37:36 +010037
Zesstra0c1a85a2018-02-07 23:46:50 +010038 * Strings sein
Zesstra953f9972017-02-18 15:37:36 +010039
Zesstra0c1a85a2018-02-07 23:46:50 +010040 * Closures sein, deren Rueckgabe ausgegeben wird und die
41 zusaetzlich einen aenderbaren und in send_room() verwendeten
42 'msg_typ' per Referenz uebergeben bekommen
Zesstra953f9972017-02-18 15:37:36 +010043
Zesstra0c1a85a2018-02-07 23:46:50 +010044 * Arrays mit der Struktur *({<string|closure msg >, <int
45 msg_typ>})* sein, fuer die obige Regeln auf 'msg' angewendet
46 werden und bei denen 'msg_typ' im send_room() verwendet wird
Zesstra953f9972017-02-18 15:37:36 +010047
Zesstra0c1a85a2018-02-07 23:46:50 +010048 Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
49 verwenden. In allen Funktionen ist this_player() das Monster
50 selbst. Normalerweise muss man die Nachrichten selbst umbrechen,
51 ausser man uebergibt die Message-Typen explizit und uebergibt kein
52 MSG_DONT_WRAP.
Zesstra953f9972017-02-18 15:37:36 +010053
54
55BEMERKUNGEN
56===========
57
Zesstra0c1a85a2018-02-07 23:46:50 +010058 * im Kampf werden keine Chats ausgegeben, man muss dann
59 SetAttackChats() verwenden
60
61 * die strings werden (noch) durch process_string() geschickt,
62 dieses sollte man aber nicht mehr verwenden
63
64 * 'chance' gilt sowohl fuer Attack- als auch normale Chats
65
66 * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen
67 NPC voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0
68 setzen
69
70 * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen
71 ('stillen')
72
73 * NPC haben bei Abwesenheit von Spielern in der Regel keinen
74 Heartbeat, weswegen dann auch die Chats ausgeschaltet sind
75
76 * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER
77 uebergeben
78
79
80BEISPIELE
81=========
82
83 // Ein einfaches Beispiel:
84 SetChats(20,
85 ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
86 "Der Ork grinst Dich unverschaemt an.\n",
87 "Der Ork wedelt mit seinem Saebel vor dir herum.\n",
88 "Der Ork stupst Dich mit dem Finger hart.\n"}));
89
90 // Ein Beispiel mit send_room-Typen ohne MSG_DONT_WRAP
91 SetChats(20,
92 ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.", MT_LISTEN}),
93 ({"Der Ork grinst Dich unverschaemt an.", MT_LOOK}),
94 ({"Der Ork wedelt mit seinem Saebel vor dir herum.", MT_LOOK}),
95 ({"Der Ork stupst Dich mit dem Finger hart.", MT_LOOK|MT_FEEL})}));
96
97 // Laengeres Beispiel mit Closures
98 protected string chat_flightinfo(int msg_typ);
99 protected string chat_trysteal(int msg_typ);
100
101 void create() {
102 SetChats(20,
103 ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n", MT_LISTEN}),
104 #'chat_flightinfo,
105 #'chat_trysteal}));
106 // [...]
107 }
108
109 protected string chat_flightinfo(int msg_typ) {
110 msg_typ = MT_LISTEN;
111 return ("Der Ork sagt: "+
112 (QueryProp(P_HP)<QueryProp(P_WIMPY)?
113 "Ich hab Angst!":
114 "Guck mich nicht so an, Schwaechling!"));
115 }
116
117 protected string chat_trysteal(int msg_typ) {
118 object *pls = filter(all_inventory(environment()), #'interactive);
119 if(sizeof(pls)) {
120 object pl = pls[random(sizeof(pls))];
121 if(!IS_LEARNER(pl)) {
122 object *objs = all_inventory(pl);
123 if(sizeof(objs)) {
124 object ob = objs[random(sizeof(objs))];
125 if(ob->move(this_object(),
126 M_NO_SHOW|M_GIVE|M_MOVE_ALL)==MOVE_OK) {
127 if(pl->ReceiveMsg(Name(WER)+" stiehlt dir "+ob->name(WEN, 0)+".",
128 MT_FEEL|MT_LOOK)<0)
129 pl->ReceiveMsg("Irgendwie scheint dir jetzt etwas zu fehlen.",
130 MT_FEEL|MT_LOOK|MSG_DONT_IGNORE);
131 send_room(environment(),
132 Name(WER, 1)+" bestiehlt "+pl->name(WEN)+".",
133 MT_LOOK, 0, 0, ({pl}));
134 return "";
135 }
136 }
137 }
138 }
139 msg_typ = MT_LOOK;
140 return Name(WER, 1)+" schaut sich verstohlen um.";
141 }
Zesstra953f9972017-02-18 15:37:36 +0100142
143
144SIEHE AUCH
145==========
146
Zesstra0c1a85a2018-02-07 23:46:50 +0100147 Verwandt:
148 *SetAttackChats()*
Zesstra953f9972017-02-18 15:37:36 +0100149
Zesstra0c1a85a2018-02-07 23:46:50 +0100150 Props:
151 *P_CHAT_CHANCE*
152
153 Sonstiges:
154 *send_room()*, *process_string()*
155
1563. April 2017 Gloinson