--- deliantra/server/lib/cf/match.pm 2009/10/21 00:44:39 1.21
+++ deliantra/server/lib/cf/match.pm 2010/03/20 20:26:18 1.25
@@ -1,3 +1,25 @@
+#
+# This file is part of Deliantra, the Roguelike Realtime MMORPG.
+#
+# Copyright (©) 2009 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
+#
+
=head1 NAME
cf::match - object matching language
@@ -94,9 +116,9 @@
not applied in inv
-is true if there is I non-object in the inventory. To negate a whole
-match, you have to use a sub-match. To check whether there is I
-applied object in someones inventory, write this:
+is true if there is I non-applied object in the inventory. To negate
+a whole match, you have to use a sub-match: To check whether there is
+I applied object in someones inventory, write this:
not (applied in inv)
@@ -108,6 +130,10 @@
type=HORN or type=ROD
+Example: see if the originator is a player.
+
+ type=PLAYER of originator
+
=item in ...
The in operator takes the context set and modifies it in various ways. As
@@ -364,6 +390,7 @@
expr = flag
| sattr
| aattr '[' ']'
+ | 'stat.' statattr
| special
| func '(' args ')'
| '{' perl code block '}'
@@ -372,6 +399,7 @@
sattr =
aattr =
flag =
+ statattr =
special =
constant = | '"' '"' |
@@ -449,7 +477,10 @@
our $flag = $cf::REFLECT{object}{flags};
our $sattr = $cf::REFLECT{object}{scalars};
+ # quick hack to support archname, untested
+ $sattr->{archname} = "W";
our $aattr = $cf::REFLECT{object}{arrays};
+ our $lattr = $cf::REFLECT{living}{scalars};
sub expr {
# ws done by factor
@@ -462,6 +493,16 @@
$res .= $expr =~ /\{([^;]+)\}/ ? $1 : "do $expr";
+ } elsif (/\Gstats\.([A-Za-z0-9_]+)/gc) {
+
+ if (exists $lattr->{$1}) {
+ $res .= "\$_->stats->$1";
+ } elsif (exists $lattr->{"\u$1"}) {
+ $res .= "\$_->stats->\u$1";
+ } else {
+ die "living statistic name expected (str, pow, hp, sp...)\n";
+ }
+
} elsif (/\G([A-Za-z0-9_]+)/gc) {
if (my $func = $func{$1}) {
@@ -677,7 +718,7 @@
}
if (0) {#d#
- die parse 1, 'applied in inv';
+ die parse 1, 'stats.pow';
exit 0;
}