1 | #!perl |
1 | #!perl |
2 | use List::Util qw/min/; |
2 | use List::Util qw/min/; |
3 | |
3 | |
4 | my $WC_BASE_VALUE = 15 * 5000; # 15r |
4 | my $WC_BASE_VALUE = 15 * 5000; # 15r |
5 | my $AC_BASE_VALUE = 40 * 5000; # 40r |
5 | my $AC_BASE_VALUE = 40 * 5000; # 40r |
6 | my $DAM_BASE_VALUE = 200; # 25p |
6 | my $DAM_BASE_VALUE = 200; # 3.6p |
7 | my $MAGIC_BASE_VALUE = 100 * 5000; # 100r |
7 | my $MAGIC_BASE_VALUE = 100 * 5000; # 100r |
8 | |
8 | |
9 | my $MAX_LEVEL = cf::settings->max_level; |
9 | my $MAX_LEVEL = cf::settings->max_level; |
10 | |
10 | |
11 | # maximum values of additions at $MAX_LEVEL difficulty |
11 | # maximum values of additions at $MAX_LEVEL difficulty |
12 | my $MAX_ADD_WC = 15; |
12 | my $MAX_ADD_WC = 15; |
13 | my $MAX_ADD_AC = 5; # weapons should rather give wc than ac |
13 | my $MAX_ADD_AC = 5; # weapons should rather give wc than ac |
14 | my $MAX_ADD_DAM = 50; |
14 | my $MAX_ADD_DAM = 70; |
15 | my $MAX_ADD_MAGIC = 5; |
15 | my $MAX_ADD_MAGIC = 5; |
16 | |
16 | |
17 | # TODO: should become part of some stdlib |
17 | # TODO: should become part of some stdlib |
18 | sub rand_range($$) { |
18 | sub rand_range($$) { |
19 | $_[0] + ($_[1] - $_[0]) * rand |
19 | $_[0] + ($_[1] - $_[0]) * rand |
… | |
… | |
31 | |
31 | |
32 | my $magic_diff = $weapon->magic - $clone->magic; |
32 | my $magic_diff = $weapon->magic - $clone->magic; |
33 | |
33 | |
34 | if ($wc_diff > 0) { $value += $WC_BASE_VALUE * 1.5 * $wc_diff * rand_range .5, 1 } |
34 | if ($wc_diff > 0) { $value += $WC_BASE_VALUE * 1.5 * $wc_diff * rand_range .5, 1 } |
35 | if ($ac_diff > 0) { $value += $AC_BASE_VALUE * 1.5 * $ac_diff * rand_range .5, 1 } |
35 | if ($ac_diff > 0) { $value += $AC_BASE_VALUE * 1.5 * $ac_diff * rand_range .5, 1 } |
36 | if ($dam_diff > 0) { $value += $DAM_BASE_VALUE * ($dam_diff ** 2.4) * rand_range .5, 1 } |
36 | if ($dam_diff > 0) { $value += $DAM_BASE_VALUE * ($dam_diff ** 2.1) * rand_range .7, 1 } |
37 | if ($magic_diff > 0) { $value += $MAGIC_BASE_VALUE * 1.5 * $magic_diff * rand_range .5, 1 } |
37 | if ($magic_diff > 0) { $value += $MAGIC_BASE_VALUE * 1.5 * $magic_diff * rand_range .5, 1 } |
38 | |
38 | |
39 | # warn sprintf "WC DIFF: %3d, %3d, %3d, %3d | %10d = %10.3f r\n", |
39 | #warn sprintf "WC DIFF: %3d, %3d, %3d, %3d | %10d = %10.3f r\n", |
40 | # $dam_diff, $wc_diff, $ac_diff, $magic_diff, $value, $value / 5000 |
40 | # $dam_diff, $wc_diff, $ac_diff, $magic_diff, $value, $value / 5000 |
41 | # if $cf::CFG{ext_bonus_debug}; |
41 | # if $cf::CFG{ext_bonus_debug}; |
42 | |
42 | |
43 | $weapon->value ($value); |
43 | $weapon->value ($value); |
44 | } |
44 | } |
45 | |
45 | |
46 | cf::object->attach ( |
46 | cf::object->attach ( |
… | |
… | |
49 | my ($item, $creator, $diff, $max_magic, $flags) = @_; |
49 | my ($item, $creator, $diff, $max_magic, $flags) = @_; |
50 | return if $flags || !$creator; |
50 | return if $flags || !$creator; |
51 | |
51 | |
52 | $diff /= $MAX_LEVEL; |
52 | $diff /= $MAX_LEVEL; |
53 | |
53 | |
54 | $item->stats->wc ($item->stats->wc + int $MAX_ADD_WC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.35; |
54 | $item->stats->wc ($item->stats->wc + int $MAX_ADD_WC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.2; |
55 | $item->stats->ac ($item->stats->ac + int $MAX_ADD_AC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.2; |
55 | $item->stats->ac ($item->stats->ac + int $MAX_ADD_AC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.15; |
56 | $item->stats->dam ($item->stats->dam + int $MAX_ADD_DAM * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.7; |
56 | $item->stats->dam ($item->stats->dam + int $MAX_ADD_DAM * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.85; |
57 | $item->magic ($item->magic + int $MAX_ADD_MAGIC * $diff * rand_range .5, 1) if rand() <= 0.2; |
57 | $item->magic ($item->magic + int $MAX_ADD_MAGIC * $diff * rand_range .5, 1) if rand() <= 0.1; |
58 | |
58 | |
59 | determine_weapon_value $item; |
59 | determine_weapon_value $item; |
60 | |
60 | |
61 | cf::override; |
61 | cf::override; |
62 | }, |
62 | }, |