--- deliantra/server/lib/cf/match.pm 2009/11/03 23:44:21 1.24
+++ deliantra/server/lib/cf/match.pm 2012/11/06 21:52:55 1.36
@@ -1,22 +1,22 @@
#
# This file is part of Deliantra, the Roguelike Realtime MMORPG.
-#
-# Copyright (©) 2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
-#
+#
+# Copyright (©) 2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+#
# Deliantra is free software: you can redistribute it and/or modify it under
# the terms of the Affero GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the Affero GNU General Public License
# and the GNU General Public License along with this program. If not, see
# .
-#
+#
# The authors can be reached via e-mail to
#
@@ -231,6 +231,11 @@
but submatches start at the current object, and in this case C
can be used to start at the original object once more.
+=item of self
+
+Starts with the object initiating/asking for the match - this is basically
+always the object that the match expression is attached to.
+
=item of source
Starts with the I object - this object is sometimes passed to
@@ -247,11 +252,6 @@
This object is often identical to the I (e.g. when a player casts
a spell, the player is both source and originator).
-=item of self
-
-Starts with the object initiating/asking for the match - this is basically
-always the object that the match expression is attached to.
-
=back
=head2 EXPRESSIONS
@@ -270,7 +270,7 @@
Object attributes that consist of a single value (C, C,
C and so on) can be specified by simply using their name, in which
-acse their corresponding value is used.
+case their corresponding value is used.
=item array objects attributes
@@ -284,7 +284,7 @@
=item functions
Some additional functions with or without arguments in parentheses are
-available.
+available. They are documented in their own section, below.
=item { BLOCK }
@@ -334,6 +334,27 @@
This simply evaluates to false, and simply makes matching I a bit
easier to read.
+=item archname
+
+The same as C<< { $_->arch->archname } >> - the archetype name is commonly
+used to match items, so this shortcut is provided.
+
+=item resist_xxx
+
+Resistancy values such as C, C,
+C etc. are directly available (but can also be accessed via
+array syntax, i.e. C).
+
+=item body_xxx_info and body_xxx_used
+
+Every body location (e.g. C, C etc.) can
+be accessed via these functions (these are aliases to more cumbersome C<< {
+$_->slot_info (body_xxx) } >> and C method calls).
+
+Example: (e.g. on a door) match only players that have no arms.
+
+ match type=PLAYER and body_arm_info=0
+
=item has(condition)
True iff the object has a matching inventory object.
@@ -461,8 +482,24 @@
none => sub {
0
},
+ archname => sub {
+ '$_->arch->archname'
+ },
);
+ # resist_xxx
+ for my $atnr (0 .. cf::NROFATTACKS - 1) {
+ $special{"resist_" . cf::attacktype_name ($atnr)} = sub { "\$_->resist ($atnr)" };
+ }
+
+ # body_xxx_info and _used
+ for my $slot (0 .. cf::NUM_BODY_LOCATIONS - 1) {
+ my $name = cf::object::slot_name $slot;
+
+ $special{"body_$name\_info"} = sub { "\$_->slot_info ($slot)" };
+ $special{"body_$name\_used"} = sub { "\$_->slot_used ($slot)" };
+ }
+
sub constant {
ws;
@@ -716,7 +753,7 @@
}
if (0) {#d#
- die parse 1, 'stats.pow';
+ die parse 1, 'type=PLAYER and body_arm_info=0';
exit 0;
}
@@ -725,7 +762,7 @@
sub compile($$) {
my ($wantarray, $match) = @_;
my $expr = parse $wantarray, $match;
- warn "MATCH DEBUG $match,$wantarray => $expr\n";#d#
+# warn "MATCH DEBUG $match,$wantarray => $expr\n";#d#
$expr = eval "
package cf::match::exec;
sub {