ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/bonus.ext
Revision: 1.8
Committed: Mon Jun 11 21:38:13 2007 UTC (16 years, 11 months ago) by root
Branch: MAIN
CVS Tags: rel-2_82, rel-2_81, rel-2_80, rel-2_6, rel-2_7, rel-2_4, rel-2_5, rel-2_2, rel-2_3, rel-2_72, rel-2_73, rel-2_71, rel-2_76, rel-2_77, rel-2_74, rel-2_75, rel-2_54, rel-2_55, rel-2_56, rel-2_79, rel-2_52, rel-2_53, rel-2_32, rel-2_90, rel-2_92, rel-2_93, rel-2_78, rel-2_61, rel-2_43, rel-2_42, rel-2_41
Changes since 1.7: +1 -0 lines
Log Message:
port micropather to c++...

File Contents

# User Rev Content
1 root 1.1 #!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 );