--- deliantra/maps/perl/bonus.ext 2006/12/11 15:59:08 1.1 +++ deliantra/maps/perl/bonus.ext 2006/12/11 18:16:02 1.2 @@ -1,15 +1,14 @@ #!perl -our $DEBUG = 1; -our $ENABLED = 0; - -$ENABLED or return; +$cf::CFG{ext_bonus} + or return; my $WC_BASE_VALUE = 15 * 5000; # 15r my $AC_BASE_VALUE = 40 * 5000; # 40r my $DAM_BASE_VALUE = 100; # 20p my $MAGIC_BASE_VALUE = 100 * 5000; # 100r +# TODO: should be queryable from perl my $MAX_LEVEL = 115; # maximum values of additions at $MAX_LEVEL difficulty my $MAX_ADD_WC = 15; @@ -17,28 +16,31 @@ my $MAX_ADD_DAM = 50; my $MAX_ADD_MAGIC = 5; -sub rand_half($) { - (($_[0] / 2) * rand) + ($_[0] / 2) +# TODO: should become part of some stdlib +sub rand_range($$) { + $_[0] + ($_[1] - $_[0]) * rand } sub determine_weapon_value { my ($weapon) = @_; + my $clone = $weapon->arch->clone; my $value = $clone->value; - my $wc_diff = $weapon->stats->wc - $clone->stats->wc; - my $ac_diff = $weapon->stats->ac - $clone->stats->ac; + my $wc_diff = $weapon->stats->wc - $clone->stats->wc; + my $ac_diff = $weapon->stats->ac - $clone->stats->ac; my $dam_diff = $weapon->stats->dam - $clone->stats->dam; + my $magic_diff = $weapon->magic - $clone->magic; - if ($wc_diff > 0) { $value += rand_half ($WC_BASE_VALUE * 1.5) * $wc_diff } - if ($ac_diff > 0) { $value += rand_half ($AC_BASE_VALUE * 1.5) * $ac_diff } - if ($dam_diff > 0) { $value += rand_half ($DAM_BASE_VALUE * 1.5) * $dam_diff } - if ($magic_diff > 0) { $value += rand_half ($MAGIC_BASE_VALUE * 1.5) * $magic_diff } - if ($DEBUG) { - warn sprintf "WC DIFF: %3d, %3d, %3d, %3d | %10d = %10.3f r\n", - $dam_diff, $wc_diff, $ac_diff, $magic_diff, $value, $value / 5000; - } + if ($wc_diff > 0) { $value += $WC_BASE_VALUE * 1.5 * $wc_diff * rand_range .5, 1 } + if ($ac_diff > 0) { $value += $AC_BASE_VALUE * 1.5 * $ac_diff * rand_range .5, 1 } + if ($dam_diff > 0) { $value += $DAM_BASE_VALUE * 1.5 * $dam_diff * rand_range .5, 1 } + if ($magic_diff > 0) { $value += $MAGIC_BASE_VALUE * 1.5 * $magic_diff * rand_range .5, 1 } + + warn sprintf "WC DIFF: %3d, %3d, %3d, %3d | %10d = %10.3f r\n", + $dam_diff, $wc_diff, $ac_diff, $magic_diff, $value, $value / 5000 + if $cf::CFG{ext_bonus_debug}; $weapon->value ($value); } @@ -46,27 +48,17 @@ cf::attach_to_type cf::WEAPON, 0, on_add_bonus => sub { my ($item, $creator, $diff, $max_magic, $flags) = @_; - return if $flags != 0 || !$creator; - - $diff = $diff / $MAX_LEVEL; - - $item->stats->wc ( - $item->stats->wc + int ((rand_half $MAX_ADD_WC) * (1+rand) * $diff)) - if rand() <= 0.35; - - $item->stats->ac ( - $item->stats->ac + int ((rand_half $MAX_ADD_AC) * (1+rand) * $diff)) - if rand() <= 0.2; + return if $flags || !$creator; - $item->stats->dam ( - $item->stats->dam + int ((rand_half $MAX_ADD_DAM) * (1+rand) * $diff)) - if rand() <= 0.7; + $diff /= $MAX_LEVEL; - $item->magic ( - $item->magic + int ((rand_half $MAX_ADD_MAGIC) * $diff)) - if rand() <= 0.2; + $item->stats->wc ($item->stats->wc + int $MAX_ADD_WC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.35; + $item->stats->ac ($item->stats->ac + int $MAX_ADD_AC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.2; + $item->stats->dam ($item->stats->dam + int $MAX_ADD_DAM * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.7; + $item->magic ($item->magic + int $MAX_ADD_MAGIC * $diff * rand_range .5, 1) if rand() <= 0.2; - determine_weapon_value ($item); + determine_weapon_value $item; cf::override; - }; + }, +;