--- deliantra/server/lib/cf/match.pm 2010/03/20 20:26:18 1.25 +++ deliantra/server/lib/cf/match.pm 2010/10/11 18:40:44 1.31 @@ -1,7 +1,7 @@ # # This file is part of Deliantra, the Roguelike Realtime MMORPG. # -# Copyright (©) 2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team +# Copyright (©) 2009,2010 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 @@ -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<value> 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<never> 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<resist_physical>, C<resist_magic>, +C<resists_fire> etc. are directly available (but can also be acessed via +array syntax, i.e. C<resists[ATNR_FIRE]>). + +=item body_xxx_info and body_xxx_used + +Every body location (e.g. C<body_neck_info>, C<body_arm_used> etc.) can +be accessed via these functions (these are aliases to more cumbersome C<{ +$_->slot_info (body_xxx) }> and C<slot_used> 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; @@ -477,8 +514,6 @@ 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}; @@ -718,7 +753,7 @@ } if (0) {#d# - die parse 1, 'stats.pow'; + die parse 1, 'type=PLAYER and body_arm_info=0'; exit 0; } @@ -727,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 {