ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/NPC_Dialogue.pm
(Generate patch)

Comparing deliantra/server/ext/NPC_Dialogue.pm (file contents):
Revision 1.1 by root, Fri Dec 15 19:29:18 2006 UTC vs.
Revision 1.9 by root, Mon Apr 21 06:35:26 2008 UTC

3NPC_Dialogue 3NPC_Dialogue
4 4
5=head1 DESCRIPTION 5=head1 DESCRIPTION
6 6
7NPC dialogue support module. 7NPC dialogue support module.
8
9=over 4
8 10
9=cut 11=cut
10 12
11package NPC_Dialogue; 13package NPC_Dialogue;
12 14
26} 28}
27 29
28sub new { 30sub new {
29 my ($class, %arg) = @_; 31 my ($class, %arg) = @_;
30 32
33 $arg{ob} = $arg{pl}->ob;
34
31 my $self = bless { 35 my $self = bless {
32 %arg, 36 %arg,
33 }, $class; 37 }, $class;
34 38
35 $self->{match} ||= [parse_message $self->{npc}->msg]; 39 $self->{match} ||= [parse_message $self->{npc}->msg];
102 106
103=back 107=back
104 108
105The environment is that standard "map scripting environment", which is 109The environment is that standard "map scripting environment", which is
106limited in the type of constructs allowed (no loops, for example). 110limited in the type of constructs allowed (no loops, for example).
111
112Here is a example:
113
114=over 4
115
116=item B<matching for an item name>
117
118 @match hi
119 @cond grep $_->name =~ /royalty/, $who->inv
120 You got royalties there! Wanna have!
121
122You may want to change the C<name> method there to something like C<title>,
123C<slaying> or any other method that is allowed to be called on a
124C<cf::object> here.
125
126=item B<matching for an item name and removing the matched item>
127
128 @match found earhorn
129 @cond grep $_->slaying =~ /Gramp's walking stick/, $who->inv
130 @eval my @g = grep { $_->slaying =~ /Gramp's walking stick/ } $who->inv; $g[0]->decrease;
131 Thanks for the earhorn!
132
133This example is a bit more complex. The C<@eval> statement will search
134the players inventory for the same term as the C<@cond> and then
135decreases the number of objects used there.
136
137(See also the map: C<scorn/houses/cornerbrook.map> for an example how this is
138used in the real world :-)
139
140=back
107 141
108=item @eval perl 142=item @eval perl
109 143
110Like C<@cond>, but proceed regardless of the outcome. 144Like C<@cond>, but proceed regardless of the outcome.
111 145
164 198
165 @match hi 199 @match hi
166 @ifflag kings_quest 200 @ifflag kings_quest
167 Hi, I was told you want to do the kings quest? 201 Hi, I was told you want to do the kings quest?
168 202
169=item @trigger connected-id 203=item @trigger connected-id [state]
170 204
171Trigger all objects with the given connected-id. The trigger is stateful 205Trigger all objects with the given connected-id.
172and retains state per connected-id. 206
207When the state argument is omitted the trigger is stateful and retains an
208internal state per connected-id. There is a limitation to the use of this: The
209state won't be changed when the connection is triggered by other triggers. So
210be careful when triggering the connection from other objects.
211
212When a state argument is given it should be either 0 or 1. 1 will 'push' the connection
213and 0 will 'release' the connection. This is useful for example when you want to
214let a npc control a door.
215
216Trigger all objects with the given connected-id by 'releasing' the connection.
217
218=item @playersound face-name
219
220Plays the given sound face (either an alias or sound file path) so that
221only the player talking to the npc can hear it.
222
223=item @npcsound face-name
224
225Plays the given sound face (either an alias or sound file path) as if
226the npc had made that sound, i.e. it will be located at the npc and all
227players near enough can hear it.
173 228
174=item @addtopic topic 229=item @addtopic topic
175 230
176Adds the given topic names (separated by C<|>) to the list of topics 231Adds the given topic names (separated by C<|>) to the list of topics
177returned. 232returned.
186 my $lcmsg = lc $msg; 241 my $lcmsg = lc $msg;
187 242
188 topic: 243 topic:
189 for my $match (@{ $self->{match} }) { 244 for my $match (@{ $self->{match} }) {
190 for (split /\|/, $match->[0]) { 245 for (split /\|/, $match->[0]) {
191 if ($_ eq "*" || $lcmsg eq lc) { 246 if ($_ eq "*" || $lcmsg =~ /\b\Q$_\E\b/i) {
192 my $reply = $match->[1]; 247 my $reply = $match->[1];
193 my @kw; 248 my @kw;
194 249
195 my @replies; 250 my @replies;
196 my @match; # @match/@parse command results 251 my @match; # @match/@parse command results
219 or next topic; 274 or next topic;
220 275
221 } elsif ($cmd eq "comment") { 276 } elsif ($cmd eq "comment") {
222 # nop 277 # nop
223 278
279 } elsif ($cmd eq "playersound") {
280 $self->{ob}->contr->play_sound (cf::sound::find $args);
281
282 } elsif ($cmd eq "npcsound") {
283 $self->{npc}->play_sound (cf::sound::find $args);
284
224 } elsif ($cmd eq "cond") { 285 } elsif ($cmd eq "cond") {
225 cf::safe_eval $args, %vars 286 cf::safe_eval $args, %vars
226 or next topic; 287 or next topic;
227 288
228 } elsif ($cmd eq "eval") { 289 } elsif ($cmd eq "eval") {
251 my ($name, $value) = split /\s+/, $args, 2; 312 my ($name, $value) = split /\s+/, $args, 2;
252 $state->{$name} eq $value 313 $state->{$name} eq $value
253 or next topic; 314 or next topic;
254 315
255 } elsif ($cmd eq "trigger") { 316 } elsif ($cmd eq "trigger") {
317 my ($con, $state) = split /\s+/, $args, 2;
318 $con = $con * 1;
319
320 if (defined $state) {
321 $self->{npc}->map->trigger ($args, $state);
322 } else {
256 my $rvalue = \$self->{npc}{dialog_trigger}{$args*1}; 323 my $rvalue = \$self->{npc}{dialog_trigger}{$con};
257 $self->{npc}->map->trigger ($args, $$rvalue = !$$rvalue); 324 $self->{npc}->map->trigger ($con, $$rvalue = !$$rvalue);
325 }
258 326
259 } elsif ($cmd eq "addtopic") { 327 } elsif ($cmd eq "addtopic") {
260 push @kw, split /\|/, $args; 328 push @kw, split /\|/, $args;
261 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic}; 329 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic};
262 330

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines