--- deliantra/server/ext/jeweler.ext 2007/01/31 15:53:17 1.4 +++ deliantra/server/ext/jeweler.ext 2007/02/01 01:46:45 1.5 @@ -40,14 +40,7 @@ sub merge { my ($chdl, $sk, $pl, $do_analyze) = @_; - my $ingred = eval { $chdl->extract_jeweler_ingredients }; - if ($@ =~ /cursed/) { - $pl->reply ("There are cursed items in the workbench, take them out before you do anything."). - return - } elsif ($@) { - warn "error in jeweler ingredient extraction: $@"; - return; - } + my $ingred = get_ingred ($pl, $chdl) || return; my @ring = $ingred->get_ring; my @rings = map { Jeweler::Object->new (object => $_) } @ring; @@ -55,6 +48,9 @@ @rings >= 2 or return $pl->reply (undef, "You slap yourself, you forgot to put at least 2 jewels in!"); + my $input_level; + $input_level = max ($_->power_to_level, $input_level) for @rings; + my $ring = shift @rings; $ring->improve_by_ring (@rings); @@ -65,11 +61,11 @@ return; } - make_ring ($chdl, $ingred, $ring, $sk, $pl); + make_ring ($chdl, $ingred, $ring, $sk, $pl, $input_level); } sub make_ring { - my ($chdl, $ingred, $ring, $sk, $pl) = @_; + my ($chdl, $ingred, $ring, $sk, $pl, $input_level) = @_; if (!$pl->flag (cf::FLAG_WIZ)) { $ingred->remove ('rings'); @@ -79,9 +75,21 @@ my $ch = $ring->get_chance_perc ($sk); my $succ = 0; my $r = cf::random_roll (0, 100, $pl, cf::PREFER_HIGH); + if ($r <= $ch or $pl->flag (cf::FLAG_WIZ)) { my $lvl = max ($ring->power_to_level, 1); my $exp = (cf::level_to_min_exp ($lvl) - cf::level_to_min_exp ($lvl - 1)) / 100; + + if (defined $input_level) { + my $subexp = + (cf::level_to_min_exp ($input_level) + - cf::level_to_min_exp ($input_level - 1)) + / 100; + warn "INPUT: $lvl <-> $input_level ($exp <-> $subexp)\n"; + $exp -= $subexp; + $exp = max ($exp, 0); + } + $pl->change_exp ($exp, "jeweler", cf::SK_EXP_SKILL_ONLY); $pl->message ("You succeed and get $exp experience."); } else { @@ -91,6 +99,22 @@ $chdl->put ($ring->to_object); } +sub get_ingred { + my ($pl, $chdl) = @_; + my $ingred = eval { $chdl->extract_jeweler_ingredients }; + if ($@ =~ /cursed/) { + $pl->message ("There are cursed items in the workbench, take them out before you do anything."). + return + } elsif ($@ =~ /unidentified/) { + $pl->message ("There are unidentified items in the workbench, identify them before you do anything."). + return + } elsif ($@) { + warn "error in jeweler ingredient extraction: $@"; + return; + } + $ingred; +} + cf::object->attach ( type => cf::SKILL, subtype => cf::SK_JEWELER, @@ -121,14 +145,7 @@ $pl->message ("You can make: " . (join ', ', keys %{Jeweler::getcfg ('conversions') || {}})); } elsif ($msg =~ m/^\s*make\s+(\S+)\s*$/i) { - my $ingred = eval { $chdl->extract_jeweler_ingredients }; - if ($@ =~ /cursed/) { - $pl->message ("There are cursed items in the workbench, take them out before you do anything."). - return - } elsif ($@) { - warn "error in jeweler ingredient extraction: $@"; - return; - } + my $ingred = get_ingred ($pl, $chdl) || return; unless ($Jeweler::CFG->{conversions}->{lc $1}) { $pl->message ("You don't know how to make '$1', is does such a thing even exist?"); @@ -144,14 +161,7 @@ merge ($chdl, $sk, $pl, 0); } else { - my $ingred = eval { $chdl->extract_jeweler_ingredients }; - if ($@ =~ /cursed/) { - $pl->message ("There are cursed items in the workbench, take them out before you do anything."). - return - } elsif ($@) { - warn "error in jeweler ingredient extraction: $@"; - return; - } + my $ingred = get_ingred ($pl, $chdl) || return; my $plan = $ingred->get_plan;