ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/bonus.ext
Revision: 1.3
Committed: Thu Jan 4 00:53:53 2007 UTC (17 years, 4 months ago) by root
Branch: MAIN
Changes since 1.2: +3 -6 lines
Log Message:
- implement mlockall option
- expanded config file documentation
- make perl-weapon boni mandatory

File Contents

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