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

Comparing deliantra/server/lib/cf/match.pm (file contents):
Revision 1.28 by root, Sat Aug 28 00:05:33 2010 UTC vs.
Revision 1.37 by root, Sun Jan 29 02:47:05 2017 UTC

1# 1#
2# This file is part of Deliantra, the Roguelike Realtime MMORPG. 2# This file is part of Deliantra, the Roguelike Realtime MMORPG.
3# 3#
4# Copyright (©) 2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4# Copyright (©) 2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5# 5#
6# Deliantra is free software: you can redistribute it and/or modify it under 6# Deliantra is free software: you can redistribute it and/or modify it under
7# the terms of the Affero GNU General Public License as published by the 7# the terms of the Affero GNU General Public License as published by the
8# Free Software Foundation, either version 3 of the License, or (at your 8# Free Software Foundation, either version 3 of the License, or (at your
9# option) any later version. 9# option) any later version.
10# 10#
11# This program is distributed in the hope that it will be useful, 11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details. 14# GNU General Public License for more details.
15# 15#
16# You should have received a copy of the Affero GNU General Public License 16# You should have received a copy of the Affero GNU General Public License
17# and the GNU General Public License along with this program. If not, see 17# and the GNU General Public License along with this program. If not, see
18# <http://www.gnu.org/licenses/>. 18# <http://www.gnu.org/licenses/>.
19# 19#
20# The authors can be reached via e-mail to <support@deliantra.net> 20# The authors can be reached via e-mail to <support@deliantra.net>
21# 21#
22 22
23=head1 NAME 23=head1 NAME
24 24
34 34
35Match the object if it has a slaying field of C<key1>: 35Match the object if it has a slaying field of C<key1>:
36 36
37 slaying = "key1" 37 slaying = "key1"
38 38
39Match the object if it has an object with name C<force> and 39Match the object if it has an object with name C<force> and
40slaying C<poison> in it's inventory: 40slaying C<poison> in it's inventory:
41 41
42 has (name = "force" and slaying = "poison") 42 has (name = "force" and slaying = "poison")
43 43
44Find all inventory objects with value >= 10, which are not invisible: 44Find all inventory objects with value >= 10, which are not invisible:
268 268
269=item scalar object attributes 269=item scalar object attributes
270 270
271Object attributes that consist of a single value (C<name>, C<title>, 271Object attributes that consist of a single value (C<name>, C<title>,
272C<value> and so on) can be specified by simply using their name, in which 272C<value> and so on) can be specified by simply using their name, in which
273acse their corresponding value is used. 273case their corresponding value is used.
274 274
275=item array objects attributes 275=item array objects attributes
276 276
277The C<resist> array can be accessed by specifying C<< resist [ ATNR_type ] 277The C<resist> array can be accessed by specifying C<< resist [ ATNR_type ]
278>>. 278>>.
282 resist[ATNR_ACID] > 30 282 resist[ATNR_ACID] > 30
283 283
284=item functions 284=item functions
285 285
286Some additional functions with or without arguments in parentheses are 286Some additional functions with or without arguments in parentheses are
287available. 287available. They are documented in their own section, below.
288 288
289=item { BLOCK } 289=item { BLOCK }
290 290
291You can specify perl code to execute by putting it inside curly 291You can specify perl code to execute by putting it inside curly
292braces. The last expression evaluated inside will become the result. 292braces. The last expression evaluated inside will become the result.
331 331
332=item none 332=item none
333 333
334This simply evaluates to false, and simply makes matching I<never> a bit 334This simply evaluates to false, and simply makes matching I<never> a bit
335easier to read. 335easier to read.
336
337=item archname
338
339The same as C<< { $_->arch->archname } >> - the archetype name is commonly
340used to match items, so this shortcut is provided.
341
342=item resist_xxx
343
344Resistancy values such as C<resist_physical>, C<resist_magic>,
345C<resists_fire> etc. are directly available (but can also be accessed via
346array syntax, i.e. C<resists[ATNR_FIRE]>).
347
348=item body_xxx_info and body_xxx_used
349
350Every body location (e.g. C<body_neck_info>, C<body_arm_used> etc.) can
351be accessed via these functions (these are aliases to more cumbersome C<< {
352$_->slot_info (body_xxx) } >> and C<slot_used> method calls).
353
354Example: (e.g. on a door) match only players that have no arms.
355
356 match type=PLAYER and body_arm_info=0
336 357
337=item has(condition) 358=item has(condition)
338 359
339True iff the object has a matching inventory object. 360True iff the object has a matching inventory object.
340 361
459 1 480 1
460 }, 481 },
461 none => sub { 482 none => sub {
462 0 483 0
463 }, 484 },
485 archname => sub {
486 '$_->arch->archname'
487 },
464 ); 488 );
489
490 # resist_xxx
491 for my $atnr (0 .. cf::NROFATTACKS - 1) {
492 $special{"resist_" . cf::attacktype_name ($atnr)} = sub { "\$_->resist ($atnr)" };
493 }
494
495 # body_xxx_info and _used
496 for my $slot (0 .. cf::NUM_BODY_LOCATIONS - 1) {
497 my $name = cf::object::slot_name $slot;
498
499 $special{"body_$name\_info"} = sub { "\$_->slot_info ($slot)" };
500 $special{"body_$name\_used"} = sub { "\$_->slot_used ($slot)" };
501 }
465 502
466 sub constant { 503 sub constant {
467 ws; 504 ws;
468 505
469 return $1 if /\G([\-\+0-9\.]+)/gc; 506 return $1 if /\G([\-\+0-9\.]+)/gc;
475 die "number, string or uppercase constant name expected\n"; 512 die "number, string or uppercase constant name expected\n";
476 } 513 }
477 514
478 our $flag = $cf::REFLECT{object}{flags}; 515 our $flag = $cf::REFLECT{object}{flags};
479 our $sattr = $cf::REFLECT{object}{scalars}; 516 our $sattr = $cf::REFLECT{object}{scalars};
480 # quick hack to support archname, untested
481 $sattr->{archname} = "W";
482 our $aattr = $cf::REFLECT{object}{arrays}; 517 our $aattr = $cf::REFLECT{object}{arrays};
483 our $lattr = $cf::REFLECT{living}{scalars}; 518 our $lattr = $cf::REFLECT{living}{scalars};
484 519
485 sub expr { 520 sub expr {
486 # ws done by factor 521 # ws done by factor
716 751
717 $res 752 $res
718} 753}
719 754
720if (0) {#d# 755if (0) {#d#
721 die parse 1, 'stats.pow'; 756 die parse 1, 'type=PLAYER and body_arm_info=0';
722 exit 0; 757 exit 0;
723} 758}
724 759
725our %CACHE; 760our %CACHE;
726 761

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines