1 | #!perl |
1 | #!perl |
2 | |
2 | |
3 | our $DEBUG = 1; |
3 | $cf::CFG{ext_bonus} |
4 | our $ENABLED = 0; |
4 | or return; |
5 | |
|
|
6 | $ENABLED or return; |
|
|
7 | |
5 | |
8 | my $WC_BASE_VALUE = 15 * 5000; # 15r |
6 | my $WC_BASE_VALUE = 15 * 5000; # 15r |
9 | my $AC_BASE_VALUE = 40 * 5000; # 40r |
7 | my $AC_BASE_VALUE = 40 * 5000; # 40r |
10 | my $DAM_BASE_VALUE = 100; # 20p |
8 | my $DAM_BASE_VALUE = 100; # 20p |
11 | my $MAGIC_BASE_VALUE = 100 * 5000; # 100r |
9 | my $MAGIC_BASE_VALUE = 100 * 5000; # 100r |
12 | |
10 | |
|
|
11 | # TODO: should be queryable from perl |
13 | my $MAX_LEVEL = 115; |
12 | my $MAX_LEVEL = 115; |
14 | # maximum values of additions at $MAX_LEVEL difficulty |
13 | # maximum values of additions at $MAX_LEVEL difficulty |
15 | my $MAX_ADD_WC = 15; |
14 | my $MAX_ADD_WC = 15; |
16 | my $MAX_ADD_AC = 5; # weapons should rather give wc than ac |
15 | my $MAX_ADD_AC = 5; # weapons should rather give wc than ac |
17 | my $MAX_ADD_DAM = 50; |
16 | my $MAX_ADD_DAM = 50; |
18 | my $MAX_ADD_MAGIC = 5; |
17 | my $MAX_ADD_MAGIC = 5; |
19 | |
18 | |
|
|
19 | # TODO: should become part of some stdlib |
20 | sub rand_half($) { |
20 | sub rand_range($$) { |
21 | (($_[0] / 2) * rand) + ($_[0] / 2) |
21 | $_[0] + ($_[1] - $_[0]) * rand |
22 | } |
22 | } |
23 | |
23 | |
24 | sub determine_weapon_value { |
24 | sub determine_weapon_value { |
25 | my ($weapon) = @_; |
25 | my ($weapon) = @_; |
|
|
26 | |
26 | my $clone = $weapon->arch->clone; |
27 | my $clone = $weapon->arch->clone; |
27 | my $value = $clone->value; |
28 | my $value = $clone->value; |
28 | |
29 | |
29 | my $wc_diff = $weapon->stats->wc - $clone->stats->wc; |
30 | my $wc_diff = $weapon->stats->wc - $clone->stats->wc; |
30 | my $ac_diff = $weapon->stats->ac - $clone->stats->ac; |
31 | my $ac_diff = $weapon->stats->ac - $clone->stats->ac; |
31 | my $dam_diff = $weapon->stats->dam - $clone->stats->dam; |
32 | my $dam_diff = $weapon->stats->dam - $clone->stats->dam; |
|
|
33 | |
32 | my $magic_diff = $weapon->magic - $clone->magic; |
34 | my $magic_diff = $weapon->magic - $clone->magic; |
33 | |
35 | |
34 | if ($wc_diff > 0) { $value += rand_half ($WC_BASE_VALUE * 1.5) * $wc_diff } |
36 | if ($wc_diff > 0) { $value += $WC_BASE_VALUE * 1.5 * $wc_diff * rand_range .5, 1 } |
35 | if ($ac_diff > 0) { $value += rand_half ($AC_BASE_VALUE * 1.5) * $ac_diff } |
37 | if ($ac_diff > 0) { $value += $AC_BASE_VALUE * 1.5 * $ac_diff * rand_range .5, 1 } |
36 | if ($dam_diff > 0) { $value += rand_half ($DAM_BASE_VALUE * 1.5) * $dam_diff } |
38 | if ($dam_diff > 0) { $value += $DAM_BASE_VALUE * 1.5 * $dam_diff * rand_range .5, 1 } |
37 | if ($magic_diff > 0) { $value += rand_half ($MAGIC_BASE_VALUE * 1.5) * $magic_diff } |
39 | if ($magic_diff > 0) { $value += $MAGIC_BASE_VALUE * 1.5 * $magic_diff * rand_range .5, 1 } |
38 | if ($DEBUG) { |
40 | |
39 | warn sprintf "WC DIFF: %3d, %3d, %3d, %3d | %10d = %10.3f r\n", |
41 | 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; |
42 | $dam_diff, $wc_diff, $ac_diff, $magic_diff, $value, $value / 5000 |
41 | } |
43 | if $cf::CFG{ext_bonus_debug}; |
42 | |
44 | |
43 | $weapon->value ($value); |
45 | $weapon->value ($value); |
44 | } |
46 | } |
45 | |
47 | |
46 | cf::attach_to_type cf::WEAPON, 0, |
48 | cf::attach_to_type cf::WEAPON, 0, |
47 | on_add_bonus => sub { |
49 | on_add_bonus => sub { |
48 | my ($item, $creator, $diff, $max_magic, $flags) = @_; |
50 | my ($item, $creator, $diff, $max_magic, $flags) = @_; |
49 | return if $flags != 0 || !$creator; |
51 | return if $flags || !$creator; |
50 | |
52 | |
51 | $diff = $diff / $MAX_LEVEL; |
53 | $diff /= $MAX_LEVEL; |
52 | |
54 | |
53 | $item->stats->wc ( |
55 | $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 + int ((rand_half $MAX_ADD_WC) * (1+rand) * $diff)) |
56 | $item->stats->ac ($item->stats->ac + int $MAX_ADD_AC * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.2; |
55 | if rand() <= 0.35; |
57 | $item->stats->dam ($item->stats->dam + int $MAX_ADD_DAM * (1 + rand) * $diff * rand_range .5, 1) if rand() <= 0.7; |
|
|
58 | $item->magic ($item->magic + int $MAX_ADD_MAGIC * $diff * rand_range .5, 1) if rand() <= 0.2; |
56 | |
59 | |
57 | $item->stats->ac ( |
|
|
58 | $item->stats->ac + int ((rand_half $MAX_ADD_AC) * (1+rand) * $diff)) |
|
|
59 | if rand() <= 0.2; |
|
|
60 | |
|
|
61 | $item->stats->dam ( |
|
|
62 | $item->stats->dam + int ((rand_half $MAX_ADD_DAM) * (1+rand) * $diff)) |
|
|
63 | if rand() <= 0.7; |
|
|
64 | |
|
|
65 | $item->magic ( |
|
|
66 | $item->magic + int ((rand_half $MAX_ADD_MAGIC) * $diff)) |
|
|
67 | if rand() <= 0.2; |
|
|
68 | |
|
|
69 | determine_weapon_value ($item); |
60 | determine_weapon_value $item; |
70 | |
61 | |
71 | cf::override; |
62 | cf::override; |
72 | }; |
63 | }, |
|
|
64 | ; |