package GCE::AttrTypemap; =head1 NAME GCE::AttrTypemap - this package handles the arch types and their specialities =cut use Crossfire; use strict; my %MONSTERATTRS = ( dam => [ 'damage' ], wc => [ 'weapon class' ], armour => [ 'armour' ], ac => [ 'armour class' ], # XXX: Can these values really be set/overridden from a map??? speed => [ 'speed' ], level => [ 'level' ], int => [ 'find hidden/invis.' ], pow => [ 'spell regen' ], con => [ 'regeneration' ], wis => [ 'wakeup radius' ], sp => [ 'spell points' ], maxsp => [ 'max spell pts.' ], flying => [ 'flying flag' ], see_invisible => [ 'see invisible' ], can_see_in_dark => [ 'can see in dark' ], reflect_spell => [ 'reflect spells' ], can_pass_thru => [ 'can pass thru' ], one_hit => [ 'kamikaze attacks' ], run_away => [ 'morale' ], ); # XXX: maybe add explanation and allowed values our %ARCHTYPES = ( 40 => { # PLAYERMOVER attacktype => [ 'paralyze' ], maxsp => [ 'paralysis moves' ], move_type => [ 'move type' ], speed => [ 'speed' ], sp => [ 'direction' ], level => [ 'move monsters' ], lifesave => [ 'can be used up' ], hp => [ 'use up moves' ], race => [ 'affected' ], slaying => [ 'unaffected' ], subtype => [ 'affected fields' ], }, 42 => { # CREATOR other_arch => [ 'create obj' ], connected => [ 'trigger' ], hp => [ 'max create cnt' ], lifesave => [ 'stay alive' ], slaying => [ 'name of created obj' ], level => [ 'level of created obj' ], }, 65 => { # MOOD FLOOR last_sp => [ 'mood' ], }, 83 => { # DUPLICATOR connected => [ 'connected'], other_arch => [ 'copy arch' ], level => [ 'copy cnt' ] }, 55 => { # MARKER slaying => [ 'code' ], speed => [ 'mark speed' ], food => [ 'mark duration' ], name => [ 'code remove' ], }, 51 => { # DETECTOR slaying => [ 'detect name' ], speed => [ 'sample speed' ], connected => [ 'connected' ], sp => [ 'sets buttons' ], hp => [ 'search inventory' ], }, 64 => { # CHECK_INV slaying => [ 'detect name' ], race => [ 'detect arch' ], hp => [ 'match value' ], last_heal => [ 'remove obj' ], last_sp => [ 'negate match' ], connected => [ 'push value' ], no_pass => [ 'no pass' ], }, 103 => { # CONVERTER other_arch => [ 'convert into' ], slaying => [ 'convert from' ], sp => [ 'into count' ], food => [ 'from count' ], }, 112 => { # DIRECTOR sp => [ 'direction' ], race => [ 'affected' ], slaying => [ 'unaffected' ], subtype => [ 'affected fields' ], }, 122 => { # CONTAINER container => [ 'max weight' ], Str => [ 'reduce %' ], # lowercase?? str => [ 'reduce %' ], }, generator => { # GENERATOR? other_arch => [ 'spawn arch' ], use_content_on_gen => [ 'spawn inv.' ], }, 80 => { # MONSTER %MONSTERATTRS }, monster => { # MONSTER? equivalent to type 80 ?? %MONSTERATTRS } ); sub detect_types { my ($arch) = @_; my $al_arch = $Crossfire::ARCH->{$arch->{_name}}; my @types; $al_arch->{type} and push @types, $al_arch->{type}; $al_arch->{generator} and push @types, 'generator'; $al_arch->{monster} and push @types, 'monster'; return @types; } sub get_attr_alias { my ($arch, $key) = @_; my @names; # XXX: is lowercasing key correct? for my $type (detect_types ($arch)) { if (defined $ARCHTYPES{$type} and exists $ARCHTYPES{$type}->{lc $key}) { my $name = $ARCHTYPES{$type}->{lc $key}->[0]; push @names, $name; } } @names or return $key; return ((join ",", @names) . " ($key)"); } sub interesting_fields { my ($arch) = @_; my %keys; for my $type (detect_types ($arch)) { for (keys %{$ARCHTYPES{$type} || {}}) { $keys{$_}++; } } return keys %keys; } =head1 AUTHOR Marc Lehmann http://home.schmorp.de/ Robin Redeker http://www.ta-sa.org/ =cut 1;