ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/bonus.ext
Revision: 1.9
Committed: Tue May 4 21:45:42 2010 UTC (14 years ago) by root
Branch: MAIN
CVS Tags: rel-3_1, rel-3_0, HEAD
Changes since 1.8: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #! perl
2
3 use List::Util qw/min/;
4
5 my $WC_BASE_VALUE = 15 * 5000; # 15r
6 my $AC_BASE_VALUE = 40 * 5000; # 40r
7 my $DAM_BASE_VALUE = 200; # 4p
8 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 my $MAX_ADD_WC = 10;
14 my $MAX_ADD_AC = 5; # weapons should rather give wc than ac
15 my $MAX_ADD_DAM = 45;
16 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 my $arch = $weapon->arch;
27 my $value = $arch->value;
28
29 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
33 my $magic_diff = $weapon->magic - $arch->magic;
34
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 if ($dam_diff > 0) { $value += $DAM_BASE_VALUE * ($dam_diff ** 2.4) * rand_range .7, 1 }
38 if ($magic_diff > 0) { $value += $MAGIC_BASE_VALUE * 1.5 * $magic_diff * rand_range .5, 1 }
39
40 #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
44 $weapon->value ($value);
45 }
46
47 cf::object->attach (
48 type => cf::WEAPON,
49 on_add_bonus => sub {
50 my ($item, $creator, $diff, $max_magic, $flags) = @_;
51 return if $flags || !$creator;
52
53 $diff /= $MAX_LEVEL;
54
55 $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
60 determine_weapon_value $item;
61
62 cf::override;
63 },
64 );
65