--- deliantra/Deliantra/Deliantra.pm 2006/08/31 21:09:32 1.71 +++ deliantra/Deliantra/Deliantra.pm 2006/09/04 17:58:51 1.72 @@ -162,15 +162,56 @@ or die "$path: $!"; } +my %attack_mask = ( + physical => 0x00000001, + magic => 0x00000002, + fire => 0x00000004, + electricity => 0x00000008, + cold => 0x00000010, + confusion => 0x00000020, + acid => 0x00000040, + drain => 0x00000080, + weaponmagic => 0x00000100, + ghosthit => 0x00000200, + poison => 0x00000400, + slow => 0x00000800, + paralyze => 0x00001000, + turn_undead => 0x00002000, + fear => 0x00004000, + cancellation => 0x00008000, + deplete => 0x00010000, + death => 0x00020000, + chaos => 0x00040000, + counterspell => 0x00080000, + godpower => 0x00100000, + holyword => 0x00200000, + blind => 0x00400000, + internal => 0x00800000, + life_stealing => 0x01000000, + disease => 0x02000000, +); + +sub _add_resist($$$) { + my ($ob, $mask, $value) = @_; + + while (my ($k, $v) = each %attack_mask) { + $ob->{"resist_$k"} += $value if $mask & $v; + } +} + # object as in "Object xxx", i.e. archetypes sub normalize_object($) { my ($ob) = @_; # nuke outdated or never supported fields - delete $ob->{$_} for qw( + delete @$ob{qw( can_knockback can_parry can_impale can_cut can_dam_armour can_apply pass_thru can_pass_thru - ); + )}; + + if (my $mask = delete $ob->{immune} ) { _add_resist $ob, $mask, 100; } + if (my $mask = delete $ob->{protected} ) { _add_resist $ob, $mask, 30; } + if (my $mask = delete $ob->{vulnerable}) { _add_resist $ob, $mask, -100; } # convert movement strings to bitsets for my $attr (keys %FIELD_MOVEMENT) {