#! /usr/bin/perl -w # wrangle # A script for figuring drains and wrangles in Anarchy Online # Originally by David Lawrence , December 2003 # AKA Bima, Laslingis, Whatsamatta, Golly, Trif and too many others. # Distributed under the terms of the GNU General Public License. # If someone wants to turn this into a nice little Windows application, # that would be great. use Getopt::Std; $0 =~ s%.*/%%; $usage = "Usage: $0 [-w desired-wrangle] starting-skill Starting skill is lower of PsyMod or Time&Space\n"; # # Nano Name PM/TS Amt NCU # my @wrangle_target = ( ["Skill Wrangler (Weak)", 47, 3, 3], ["Skill Wrangler (Patchy)", 74, 9, 5], ["Skill Wrangler (Minor)", 104, 13, 7], ["Skill Wrangler (Commonplace)", 167, 22, 11], ["Skill Wrangler (Lossy)", 203, 27, 13], ["Skill Wrangler Lesser", 258, 37, 17], ["Skill Wrangler (Inferior)", 330, 46, 22], ["Skill Wrangler", 398, 56, 26], ["Skill Wrangler (Major)", 448, 65, 30], ["Skill Wrangler (Advanced)", 519, 74, 35], ["Skill Wrangler (Superior)", 590, 85, 39], ["Skill Wrangler (Greater)", 690, 99, 46], ["Skill Wrangler (Sophisticated)", 717, 106, 48], ["Skill Wrangler (Superb)", 751, 112, 50], ["Skill Wrangler (Exceptional)", 807, 121, 54], ["Skill Wrangler (Premium)", 865, 131, 58] ); my @wrangle_team = ( # # With Umbrals, the benefit provided is +1 point for every level of # the Distill Life perk line trained above level 4; that is, +1 for level 5 # to a maximum of +6 for level 10. Most Umbrals are consistent in having the # same PM/TS requirements, except for Premium which needs only 1646 PM versus # 1050 TS. Also, most require the recipient to be of the level # of the caster requirement for the previous nano in the line; eg, the # benefactor of Minor needs to be level 25. Patchy has no target level # requirement, and Premium requires 205 (instead of 204). # ["Team Skill Wrangler (Weak)", 84, 10, 6], ["Team Skill Wrangler (Patchy)", 138, 18, 9], # "Umbral Wrangler (Patchy)", 152, 18, 6, 25, ["Team Skill Wrangler (Minor)", 183, 24, 12], ["Team Skill Wrangler (Commonplace)", 229, 32, 15], ["Team Skill Wrangler (Lossy)", 284, 40, 19], # "Umbral Wrangler (Minor)", 326, 40, 14, 50, ["Team Skill Wrangler (Lesser)", 364, 50, 24], ["Team Skill Wrangler", 431, 62, 29], ["Team Skill Wrangler (Major)", 494, 71, 33], # "Umbral Wrangler (Commonplace)", 496, 62, 20, 75, ["Team Skill Wrangler (Advanced)", 567, 82, 38], ["Team Skill Wrangler (Superior)", 639, 93, 43], # "Umbral Wrangler (Lesser)", 666, 82, 25, 100, ["Team Skill Wrangler (Greater)", 700, 102, 47], ["Team Skill Wrangler (Sophisticated)", 736, 109, 49], ["Team Skill Wrangler (Exceptional)", 786, 118, 52], # "Umbral Wrangler", 809, 94, 32, 125, ["Team Skill Wrangler (Premium)", 871, 132, 58] # "Umbral Wrangler (Major)", p 885, 106, 37, 145, # "Umbral Wrangler (Advanced)", 962, 117, 43, 165, # "Umbral Wrangler (Superior)", 1026, 125, 47, 185, # "Umbral Wrangler (Greater)", 1052, 132, 50, 195, # "Umbral Wrangler (Exceptional)", 1194, 140, 51, 204, # "Umbral Wrangler (Premium))", 1650, 147, 43, 217 ); my @ransack_plunder = ( ["Ransack Skills (Weak)", 58, 9, 3], ["Ransack Skills (Minor)", 99, 16, 5], ["Ransack Skills (Average)", 148, 25, 8], ["Ransack Skills (Lesser)", 191, 34, 10], ["Ransack Skills", 241, 47, 13], ["Ransack Skills (Major)", 324, 63, 17], ["Ransack Skills (Advanced)", 402, 79, 20], ["Plunder Skills (Weak)", 474, 97, 25], ["Plunder Skills (Minor)", 572, 115, 29], ["Plunder Skills (Average)", 669, 132, 34], ["Plunder Skills (Lesser)", 711, 143, 35], ["Plunder Skills", 745, 151, 37], ["Plunder Skills (Major)", 795, 163, 39], ["Plunder Skills (Advanced)", 853, 178, 41] ); my @deprive_divest = ( ["Deprive Skills (Weak)", 36, 5, 2], ["Deprive Skills (Minor)", 79, 13, 4], ["Deprive Skills (Average)", 123, 21, 6], ["Deprive Skills (Lesser)", 171, 29, 9], ["Deprive Skills", 216, 40, 11], ["Deprive Skills (Major)", 278, 55, 14], ["Deprive Skills (Advanced)", 371, 72, 19], ["Divest Skills (Weak)", 435, 88, 23], ["Divest Skills (Minor)", 526, 106, 27], ["Divest Skills (Average)", 621, 124, 32], ["Divest Skills (Lesser)", 694, 137, 35], ["Divest Skills", 728, 146, 36], ["Divest Skills (Major)", 769, 157, 38], ["Divest Skills (Advanced)", 827, 170, 40] ); my $divest = -1; my $plunder = -1; getopts("w:") or die $usage; @ARGV == 1 or die $usage; my $pmts = shift(@ARGV); if (defined($opt_w)) { $opt_w >= 1 && $opt_w <= 132 or die qq($0: "$opt_w" needs to be >= 1 and <= 132\n); $wrangle = $opt_w; } while (1) { show_wrangle($pmts, $wrangle) if $wrangle; $divest_next = find_best($pmts, $divest, \@deprive_divest); $plunder_next = find_best($pmts, $plunder, \@ransack_plunder); $divest_step = step($divest, $divest_next, \@deprive_divest); $plunder_step = step($plunder, $plunder_next, \@ransack_plunder); if ($divest_step) { if ($plunder_step) { # >= to favour lower resistance divestiture if ($divest_step >= $plunder_step) { $do_divest = 1; } else { $do_divest = 0; } } else { $do_divest = 1; } } elsif ($plunder_step) { $do_divest = 0; } else { last; } if ($do_divest) { $nano = $deprive_divest[$divest_next][0]; $step = $divest_step; $divest = $divest_next; } else { $nano = $ransack_plunder[$plunder_next][0]; $step = $plunder_step; $plunder = $plunder_next; } $pmts += $step; my $total = 0; $total += $deprive_divest[$divest][2] if $divest != -1; $total += $ransack_plunder[$plunder][2] if $plunder != -1; printf "%25s raises PM/TS by %d to %d", $nano, $step, $pmts; print " ($total total gain)" unless $total == $step; print "\n"; } if ($wrangle) { print "\nDesired wrangle of $wrangle can't be done. Best wrangles are:\n"; } show_wrangle($pmts, 0); sub find_best { my $pmts = shift; my $current = shift; my $nanos = shift; my $i = $current; while (++$i < @$nanos) { if ($pmts < $nanos->[$i]->[1]) { last; } } if (--$i != $current) { return $i; } else { return undef; } } sub step { my $old = shift; my $new = shift; my $nanos = shift; my $step = undef; if (defined($new)) { if ($old == -1) { $step = $nanos->[$new]->[2]; } else { $step = $nanos->[$new]->[2] - $nanos->[$old]->[2]; } } return $step; } sub show_wrangle { my $pmts = shift; my $desired = shift; return if ! defined($desired); my $target_wrangle = find_best($pmts, -1, \@wrangle_target); my $team_wrangle = find_best($pmts, -1, \@wrangle_team); my $target_amt = defined($target_wrangle) ? $wrangle_target[$target_wrangle]->[2] : -1; my $team_amt = defined($team_wrangle) ? $wrangle_team[$team_wrangle]->[2] : -1; return if $desired > $target_amt && $desired > $team_amt && $desired != 0; print "\n"; if ($target_amt >= $desired) { print "Single target wrangle: ", $target_amt, ", $wrangle_target[$target_wrangle]->[0]", ", $wrangle_target[$target_wrangle]->[3] NCU\n"; } elsif ($desired == 0) { print "No target wrangle can be run with $pmts PM/TS\n"; } if ($team_amt >= $desired) { print "Team wrangle: ", $team_amt, ", $wrangle_team[$team_wrangle]->[0]", ", $wrangle_team[$team_wrangle]->[3] NCU\n"; } elsif ($desired == 0) { print "No team wrangle can be run with $pmts PM/TS\n"; } exit(0); }