--- 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; }