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.8 by root, Sun Aug 26 04:07:40 2007 UTC vs.
Revision 1.14 by root, Thu Jan 8 19:23:44 2009 UTC

11=cut 11=cut
12 12
13package NPC_Dialogue; 13package NPC_Dialogue;
14 14
15use strict; 15use strict;
16
17sub has_dialogue($) {
18 my ($ob) = @_;
19
20 $ob->msg =~ /^\@match /;
21}
22 16
23sub parse_message($) { 17sub parse_message($) {
24 map [split /\n/, $_, 2], 18 map [split /\n/, $_, 2],
25 grep length, 19 grep length,
26 split /^\@match /m, 20 split /^\@match /m,
125 119
126=item B<matching for an item name and removing the matched item> 120=item B<matching for an item name and removing the matched item>
127 121
128 @match found earhorn 122 @match found earhorn
129 @cond grep $_->slaying =~ /Gramp's walking stick/, $who->inv 123 @cond grep $_->slaying =~ /Gramp's walking stick/, $who->inv
130 @eval my @g = grep { $_->slaying =~ /Gramp's walking stick/ } $who->inv; $g[0]->decrease_ob_nr (1); 124 @eval my @g = grep { $_->slaying =~ /Gramp's walking stick/ } $who->inv; $g[0]->decrease;
131 Thanks for the earhorn! 125 Thanks for the earhorn!
132 126
133This example is a bit more complex. The C<@eval> statement will search 127This 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 128the players inventory for the same term as the C<@cond> and then
135decreases the number of objects used there. 129decreases the number of objects used there.
207When the state argument is omitted the trigger is stateful and retains an 201When 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 202internal 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 203state won't be changed when the connection is triggered by other triggers. So
210be careful when triggering the connection from other objects. 204be careful when triggering the connection from other objects.
211 205
212When a state argument is given it should be either 0 or 1. 1 will 'push' the connection 206When a state argument is given it should be a positive integer. Any value
213and 0 will 'release' the connection. This is useful for example when you want to 207C<!= 0> will 'push' the connection (in general, you should specify C<1>
214let a npc control a door. 208for this) and C<0> will 'release' the connection. This is useful for
209example when you want to let an NPC control a door.
215 210
216Trigger all objects with the given connected-id by 'releasing' the connection. 211Trigger all objects with the given connected-id by 'releasing' the connection.
217 212
218=item @playersound face-name 213=item @playersound face-name
219 214
313 $state->{$name} eq $value 308 $state->{$name} eq $value
314 or next topic; 309 or next topic;
315 310
316 } elsif ($cmd eq "trigger") { 311 } elsif ($cmd eq "trigger") {
317 my ($con, $state) = split /\s+/, $args, 2; 312 my ($con, $state) = split /\s+/, $args, 2;
318 $con = $con * 1;
319 313
320 if (defined $state) { 314 if (defined $state) {
321 $self->{npc}->map->trigger ($args, $state); 315 $self->{npc}->map->trigger ($con, $state, $self->{npc}, $self->{ob});
322 } else { 316 } else {
323 my $rvalue = \$self->{npc}{dialog_trigger}{$con}; 317 my $rvalue = \$self->{npc}{dialog_trigger}{$con+0};
324 $self->{npc}->map->trigger ($con, $$rvalue = !$$rvalue); 318 $self->{npc}->map->trigger ($con, $$rvalue = !$$rvalue, $self->{npc}, $self->{ob});
325 } 319 }
326 320
327 } elsif ($cmd eq "addtopic") { 321 } elsif ($cmd eq "addtopic") {
328 push @kw, split /\|/, $args; 322 push @kw, split /\|/, $args;
329 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic}; 323 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic};
337 } 331 }
338 } 332 }
339 333
340 delete $self->{npc}{$self->{ob}->name}{dialog_state} unless %$state; 334 delete $self->{npc}{$self->{ob}->name}{dialog_state} unless %$state;
341 delete $self->{ob}{dialog_flag} unless %$flag; 335 delete $self->{ob}{dialog_flag} unless %$flag;
342
343 # combine lines into paragraphs
344 $reply =~ s/(?<=\S)\n(?=\w)/ /g;
345 $reply =~ s/\n\n/\n/g;
346 336
347 # ignores flags and npc from replies 337 # ignores flags and npc from replies
348 $reply = join "\n", (map $_->[1], @replies), $reply; 338 $reply = join "\n", (map $_->[1], @replies), $reply;
349 339
350 # now mark up all matching keywords 340 # now mark up all matching keywords
355 last; 345 last;
356 } 346 }
357 } 347 }
358 } 348 }
359 349
350 $self->{npc}->use_trigger ($self->{ob})
351 if $self->{npc}->type == cf::MAGIC_EAR;
352
360 return wantarray ? ($reply, @kw) : $reply; 353 return wantarray ? ($reply, @kw) : $reply;
361 } 354 }
362 } 355 }
363 } 356 }
364 357

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines