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