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.11 by root, Mon Sep 22 01:33:09 2008 UTC vs.
Revision 1.15 by root, Tue Oct 13 00:24:14 2009 UTC

96 96
97=item $flag - A hashref that stores flags associated with the player and 97=item $flag - A hashref that stores flags associated with the player and
98can be seen by all NPCs (so better name your flags uniquely). This is 98can be seen by all NPCs (so better name your flags uniquely). This is
99useful for storing e.g. quest information. See C<@setflag> and C<@ifflag>. 99useful for storing e.g. quest information. See C<@setflag> and C<@ifflag>.
100 100
101=item @find - see @find, below.
102
101=back 103=back
102 104
103The environment is that standard "map scripting environment", which is 105The environment is that standard "map scripting environment", which is
104limited in the type of constructs allowed (no loops, for example). 106limited in the type of constructs allowed (no loops, for example).
105 107
138Like C<@cond>, but proceed regardless of the outcome. 140Like C<@cond>, but proceed regardless of the outcome.
139 141
140=item @msg perl 142=item @msg perl
141 143
142Like C<@cond>, but the return value will be stringified and prepended to 144Like C<@cond>, but the return value will be stringified and prepended to
143the message. 145the reply message.
146
147=item @check match expression
148
149Executes a match expression (see
150http://pod.tst.eu/http://cvs.schmorp.de/deliantra/server/lib/cf/match.pm)
151to see if it matches.
152
153C<self> is the npc object, C<object>, C<source> and C<originator> are the
154player communicating with the NPC.
155
156If the check fails, the match is skipped.
157
158=item @find match expression
159
160Like C<@check> in that it executes a match expression, but instead of
161failing, it gathers all objects matched into the C<@find> array variable.
162
163When you want to skip the match when no objects have been found, combine
164C<@find> with C<@cond>:
165
166 @match see my spellbook
167 @find type=SPELLBOOK in inv
168 @cond @find
169 It looks dirty.
170 @match see my spellbook
171 I can't see any, where do you have it?
144 172
145=item @setstate state value 173=item @setstate state value
146 174
147Sets the named state C<state> to the given C<value>. State values are 175Sets the named state C<state> to the given C<value>. State values are
148associated with a specific player-NPC pair, so each NPC has its own state 176associated with a specific player-NPC pair, so each NPC has its own state
201When the state argument is omitted the trigger is stateful and retains an 229When the state argument is omitted the trigger is stateful and retains an
202internal state per connected-id. There is a limitation to the use of this: The 230internal state per connected-id. There is a limitation to the use of this: The
203state won't be changed when the connection is triggered by other triggers. So 231state won't be changed when the connection is triggered by other triggers. So
204be careful when triggering the connection from other objects. 232be careful when triggering the connection from other objects.
205 233
206When a state argument is given it should be either 0 or 1. 1 will 'push' the connection 234When a state argument is given it should be a positive integer. Any value
207and 0 will 'release' the connection. This is useful for example when you want to 235C<!= 0> will 'push' the connection (in general, you should specify C<1>
208let a npc control a door. 236for this) and C<0> will 'release' the connection. This is useful for
237example when you want to let an NPC control a door.
209 238
210Trigger all objects with the given connected-id by 'releasing' the connection. 239Trigger all objects with the given connected-id by 'releasing' the connection.
211 240
212=item @playersound face-name 241=item @playersound face-name
213 242
244 my @replies; 273 my @replies;
245 my @match; # @match/@parse command results 274 my @match; # @match/@parse command results
246 275
247 my $state = $self->{npc}{$self->{ob}->name}{dialog_state} ||= {}; 276 my $state = $self->{npc}{$self->{ob}->name}{dialog_state} ||= {};
248 my $flag = $self->{ob}{dialog_flag} ||= {}; 277 my $flag = $self->{ob}{dialog_flag} ||= {};
278
279 my @find;
249 280
250 my %vars = ( 281 my %vars = (
251 who => $self->{ob}, 282 who => $self->{ob},
252 npc => $self->{npc}, 283 npc => $self->{npc},
253 state => $state, 284 state => $state,
282 313
283 } elsif ($cmd eq "eval") { 314 } elsif ($cmd eq "eval") {
284 cf::safe_eval $args, %vars; 315 cf::safe_eval $args, %vars;
285 warn "\@eval evaluation error: $@\n" if $@; 316 warn "\@eval evaluation error: $@\n" if $@;
286 317
318 } elsif ($cmd eq "check") {
319 eval {
320 cf::match::match $args, $self->{ob}, $self->{npc}, $self->{ob}
321 or next topic;
322 };
323 warn "\@check evaluation error: $@\n" if $@;
324
325 } elsif ($cmd eq "find") {
326 @find = eval {
327 cf::match::match $args, $self->{ob}, $self->{npc}, $self->{ob}
328 };
329 warn "\@find evaluation error: $@\n" if $@;
330
287 } elsif ($cmd eq "msg") { 331 } elsif ($cmd eq "msg") {
288 push @replies, [$self->{npc}, (scalar cf::safe_eval $args, %vars)]; 332 push @replies, [$self->{npc}, (scalar cf::safe_eval $args, %vars)];
289 333
290 } elsif ($cmd eq "setflag") { 334 } elsif ($cmd eq "setflag") {
291 my ($name, $value) = split /\s+/, $args, 2; 335 my ($name, $value) = split /\s+/, $args, 2;
307 $state->{$name} eq $value 351 $state->{$name} eq $value
308 or next topic; 352 or next topic;
309 353
310 } elsif ($cmd eq "trigger") { 354 } elsif ($cmd eq "trigger") {
311 my ($con, $state) = split /\s+/, $args, 2; 355 my ($con, $state) = split /\s+/, $args, 2;
312 $con = $con * 1;
313 356
314 if (defined $state) { 357 if (defined $state) {
315 $self->{npc}->map->trigger ($args, $state); 358 $self->{npc}->map->trigger ($con, $state, $self->{npc}, $self->{ob});
316 } else { 359 } else {
317 my $rvalue = \$self->{npc}{dialog_trigger}{$con}; 360 my $rvalue = \$self->{npc}{dialog_trigger}{$con+0};
318 $self->{npc}->map->trigger ($con, $$rvalue = !$$rvalue); 361 $self->{npc}->map->trigger ($con, $$rvalue = !$$rvalue, $self->{npc}, $self->{ob});
319 } 362 }
320 363
321 } elsif ($cmd eq "addtopic") { 364 } elsif ($cmd eq "addtopic") {
322 push @kw, split /\|/, $args; 365 push @kw, split /\|/, $args;
323 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic}; 366 $self->{add_topic}->(split /\s*\|\s*/, $args) if $self->{add_topic};
345 last; 388 last;
346 } 389 }
347 } 390 }
348 } 391 }
349 392
393 $self->{npc}->use_trigger ($self->{ob})
394 if $self->{npc}->type == cf::MAGIC_EAR;
395
350 return wantarray ? ($reply, @kw) : $reply; 396 return wantarray ? ($reply, @kw) : $reply;
351 } 397 }
352 } 398 }
353 } 399 }
354 400

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines