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.22 by root, Sat Oct 24 11:45:40 2009 UTC vs.
Revision 1.38 by root, Sat Nov 17 23:40:02 2018 UTC

1#
2# This file is part of Deliantra, the Roguelike Realtime MMORPG.
3#
4# Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
5# Copyright (©) 2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
6#
7# Deliantra is free software: you can redistribute it and/or modify it under
8# the terms of the Affero GNU General Public License as published by the
9# Free Software Foundation, either version 3 of the License, or (at your
10# option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the Affero GNU General Public License
18# and the GNU General Public License along with this program. If not, see
19# <http://www.gnu.org/licenses/>.
20#
21# The authors can be reached via e-mail to <support@deliantra.net>
22#
23
1=head1 NAME 24=head1 NAME
2 25
3cf::match - object matching language 26cf::match - object matching language
4 27
5=head1 DESCRIPTION 28=head1 DESCRIPTION
12 35
13Match the object if it has a slaying field of C<key1>: 36Match the object if it has a slaying field of C<key1>:
14 37
15 slaying = "key1" 38 slaying = "key1"
16 39
17Match the object if it has an object with name C<force> and 40Match the object if it has an object with name C<force> and
18slaying C<poison> in it's inventory: 41slaying C<poison> in it's inventory:
19 42
20 has (name = "force" and slaying = "poison") 43 has (name = "force" and slaying = "poison")
21 44
22Find all inventory objects with value >= 10, which are not invisible: 45Find all inventory objects with value >= 10, which are not invisible:
92Not that C<not> only negates a condition and not the whole match 115Not that C<not> only negates a condition and not the whole match
93expressions, thus 116expressions, thus
94 117
95 not applied in inv 118 not applied in inv
96 119
97is true if there is I<any> non-object in the inventory. To negate a whole 120is true if there is I<any> non-applied object in the inventory. To negate
98match, you have to use a sub-match. To check whether there is I<no> 121a whole match, you have to use a sub-match: To check whether there is
99applied object in someones inventory, write this: 122I<no> applied object in someones inventory, write this:
100 123
101 not (applied in inv) 124 not (applied in inv)
102 125
103Example: match applied weapons. 126Example: match applied weapons.
104 127
105 applied type=WEAPON 128 applied type=WEAPON
106 129
107Example: match horns or rods. 130Example: match horns or rods.
108 131
109 type=HORN or type=ROD 132 type=HORN or type=ROD
133
134Example: see if the originator is a player.
135
136 type=PLAYER of originator
110 137
111=item in ... 138=item in ...
112 139
113The in operator takes the context set and modifies it in various ways. As 140The in operator takes the context set and modifies it in various ways. As
114a less technical description, think of the C<in> as being a I<look into> 141a less technical description, think of the C<in> as being a I<look into>
203Starts with the default object - this is the object passed to the match to 230Starts with the default object - this is the object passed to the match to
204match against by default. Matches have an explicit C<of object> appended, 231match against by default. Matches have an explicit C<of object> appended,
205but submatches start at the current object, and in this case C<of object> 232but submatches start at the current object, and in this case C<of object>
206can be used to start at the original object once more. 233can be used to start at the original object once more.
207 234
235=item of self
236
237Starts with the object initiating/asking for the match - this is basically
238always the object that the match expression is attached to.
239
208=item of source 240=item of source
209 241
210Starts with the I<source> object - this object is sometimes passed to 242Starts with the I<source> object - this object is sometimes passed to
211matches and represents the object that is the source of the action, such 243matches and represents the object that is the source of the action, such
212as a rod or a potion when it is applied. Often, the I<source> is the same 244as a rod or a potion when it is applied. Often, the I<source> is the same
219the original initiator of an action, most commonly a player or monster. 251the original initiator of an action, most commonly a player or monster.
220 252
221This object is often identical to the I<source> (e.g. when a player casts 253This object is often identical to the I<source> (e.g. when a player casts
222a spell, the player is both source and originator). 254a spell, the player is both source and originator).
223 255
224=item of self
225
226Starts with the object initiating/asking for the match - this is basically
227always the object that the match expression is attached to.
228
229=back 256=back
230 257
231=head2 EXPRESSIONS 258=head2 EXPRESSIONS
232 259
233Expressions used in conditions usually consist of simple boolean checks 260Expressions used in conditions usually consist of simple boolean checks
242 269
243=item scalar object attributes 270=item scalar object attributes
244 271
245Object attributes that consist of a single value (C<name>, C<title>, 272Object attributes that consist of a single value (C<name>, C<title>,
246C<value> and so on) can be specified by simply using their name, in which 273C<value> and so on) can be specified by simply using their name, in which
247acse their corresponding value is used. 274case their corresponding value is used.
248 275
249=item array objects attributes 276=item array objects attributes
250 277
251The C<resist> array can be accessed by specifying C<< resist [ ATNR_type ] 278The C<resist> array can be accessed by specifying C<< resist [ ATNR_type ]
252>>. 279>>.
256 resist[ATNR_ACID] > 30 283 resist[ATNR_ACID] > 30
257 284
258=item functions 285=item functions
259 286
260Some additional functions with or without arguments in parentheses are 287Some additional functions with or without arguments in parentheses are
261available. 288available. They are documented in their own section, below.
262 289
263=item { BLOCK } 290=item { BLOCK }
264 291
265You can specify perl code to execute by putting it inside curly 292You can specify perl code to execute by putting it inside curly
266braces. The last expression evaluated inside will become the result. 293braces. The last expression evaluated inside will become the result.
305 332
306=item none 333=item none
307 334
308This simply evaluates to false, and simply makes matching I<never> a bit 335This simply evaluates to false, and simply makes matching I<never> a bit
309easier to read. 336easier to read.
337
338=item archname
339
340The same as C<< { $_->arch->archname } >> - the archetype name is commonly
341used to match items, so this shortcut is provided.
342
343=item resist_xxx
344
345Resistancy values such as C<resist_physical>, C<resist_magic>,
346C<resists_fire> etc. are directly available (but can also be accessed via
347array syntax, i.e. C<resists[ATNR_FIRE]>).
348
349=item body_xxx_info and body_xxx_used
350
351Every body location (e.g. C<body_neck_info>, C<body_arm_used> etc.) can
352be accessed via these functions (these are aliases to more cumbersome C<< {
353$_->slot_info (body_xxx) } >> and C<slot_used> method calls).
354
355Example: (e.g. on a door) match only players that have no arms.
356
357 match type=PLAYER and body_arm_info=0
310 358
311=item has(condition) 359=item has(condition)
312 360
313True iff the object has a matching inventory object. 361True iff the object has a matching inventory object.
314 362
433 1 481 1
434 }, 482 },
435 none => sub { 483 none => sub {
436 0 484 0
437 }, 485 },
486 archname => sub {
487 '$_->arch->archname'
488 },
438 ); 489 );
490
491 # resist_xxx
492 for my $atnr (0 .. cf::NROFATTACKS - 1) {
493 $special{"resist_" . cf::attacktype_name ($atnr)} = sub { "\$_->resist ($atnr)" };
494 }
495
496 # body_xxx_info and _used
497 for my $slot (0 .. cf::NUM_BODY_LOCATIONS - 1) {
498 my $name = cf::object::slot_name $slot;
499
500 $special{"body_$name\_info"} = sub { "\$_->slot_info ($slot)" };
501 $special{"body_$name\_used"} = sub { "\$_->slot_used ($slot)" };
502 }
439 503
440 sub constant { 504 sub constant {
441 ws; 505 ws;
442 506
443 return $1 if /\G([\-\+0-9\.]+)/gc; 507 return $1 if /\G([\-\+0-9\.]+)/gc;
688 752
689 $res 753 $res
690} 754}
691 755
692if (0) {#d# 756if (0) {#d#
693 die parse 1, 'stats.pow'; 757 die parse 1, 'type=PLAYER and body_arm_info=0';
694 exit 0; 758 exit 0;
695} 759}
696 760
697our %CACHE; 761our %CACHE;
698 762
699sub compile($$) { 763sub compile($$) {
700 my ($wantarray, $match) = @_; 764 my ($wantarray, $match) = @_;
701 my $expr = parse $wantarray, $match; 765 my $expr = parse $wantarray, $match;
702 warn "MATCH DEBUG $match,$wantarray => $expr\n";#d# 766# warn "MATCH DEBUG $match,$wantarray => $expr\n";#d#
703 $expr = eval " 767 $expr = eval "
704 package cf::match::exec; 768 package cf::match::exec;
705 sub { 769 sub {
706 my (\$object, \$self, \$source, \$originator) = \@_; 770 my (\$object, \$self, \$source, \$originator) = \@_;
707 $expr 771 $expr

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines