ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/bonus.ext
(Generate patch)

Comparing deliantra/maps/perl/bonus.ext (file contents):
Revision 1.1 by elmex, Mon Dec 11 15:59:08 2006 UTC vs.
Revision 1.4 by root, Wed Dec 13 02:59:50 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines