X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=ypp-restock-rum;h=1b0a11f48cfaee7ad58c46def2192031cebcbf2e;hp=ce76aa794d8eeb11189b0c5d4a8a8e05df829e6f;hb=7b9827e150247334fab73e7667cfa02105e2db05;hpb=ed817cf1be071a52992d8dd9fabc2437472d8085 diff --git a/ypp-restock-rum b/ypp-restock-rum index ce76aa7..1b0a11f 100755 --- a/ypp-restock-rum +++ b/ypp-restock-rum @@ -1,4 +1,26 @@ #!/usr/bin/perl -w +# This is part of ypp-sc-tools, a set of third-party tools for assisting +# players of Yohoho Puzzle Pirates. +# +# Copyright (C) 2009 Ian Jackson +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Yohoho and Puzzle Pirates are probably trademarks of Three Rings and +# are used without permission. This program is not endorsed or +# sponsored by Three Rings. + use strict qw(vars); use IO::Handle; use POSIX; @@ -14,15 +36,20 @@ where is price [] Each of which may appear only once, except \`have' which may appear -more than once which case we calculate the differences and the profit -for each one. - -If / is not specified at all, relevant information about shot is -not reported. For have and want, specifying an empty string means -zero. Entirely Missing // is taken as if both were -specified and zero. - -In price, missing entries mean the commodity is unavailable. +more than once which case we calculate the financial implications +at each stage. + +Missing entries count as zero (and zeroes are not displayed in the output). +In price, \`x' means the commodity is unavailable. + +The intended use is that at the start of the pillage you run: + ypp-restock-rum have ... want ... +to check that stocks are sufficient, or perhaps: + ypp-restock-rum have ... want ... price ... +if you want to stock up some more. At the end of the pillage, +run the same thing again with some extra parameters: + ypp-restock-rum have .. want ... have ... price ... +and it will tell you how you did and what the restock should be like. END ; @@ -35,7 +62,7 @@ sub parse_info ($$$\@$) { badusage("$what: specified more than once") if defined $storeary->[2]; my (@v) = (); - while (@ARGV and $ARGV[0] =~ m/^\d/) { + while (@ARGV and $ARGV[0] =~ m/^\d|^x$/) { $_ = shift @ARGV; push @v, $_; } @@ -53,13 +80,17 @@ sub parse_info ($$$\@$) { push @v, $default; } if (@v != 4) { - badusage("$what: invalid syntax (wrong number of /s)"); + badusage("$what: invalid syntax (wrong number of parameters)"); } my $i=0; foreach $_ (@v) { - $_ = $default if !length; - m/^0*(\d+)$/ or badusage("$what: $kinds[$i] \`$_': bad syntax"); - $_= $1; + if ($default>0 and m/^x$/) { + $_ = $default; + } elsif (m/^0*(\d+)$/) { + $_= $1; + } else { + badusage("$what: $kinds[$i] \`$_': bad syntax"); + } $i++; } @$storeary = @v; @@ -68,14 +99,23 @@ sub parse_info ($$$\@$) { our (@have,@want,@price); sub parse_args () { - @ARGV or badusage("need some information to go on"); + if (!@ARGV) { + print STDERR <1 ? <[3]; + print ' ' if @have==1; + printf "%6s", $stocks->[3] ? $stocks->[3] : ''; pr1s($shot_value); pr1s($total_value); @@ -223,21 +270,13 @@ END $last_value= $total_value; print "\n"; } - print <1; + print "\n"; } sub pr2 ($$$) { my ($k,$v1,$v2) = @_; - printf "%-20s %-23s %s\n", "$k:", $v1, $v2; -} - -sub pr3 ($$$$) { - my ($k,$v1,$v2,$v3) = @_; - printf "%-20s %-23s %-20s %s\n", "$k:", $v1, $v2, $v3; + printf "%-25s %-23s %s\n", "$k:", $v1, $v2; } sub pr2rs ($$$) { @@ -269,21 +308,34 @@ sub compute_restock_requirements () { if (@price) { my ($rum_buy,$shot_buy) = ('',''); my ($rum_bill,$shot_bill) = qw(0 0); - if (defined $best and $rum_need > 0) { - my $rum_qty= $rum_need * 100 / $proofs[$best]; - $rum_qty= ceil($rum_qty); - $rum_buy= sprintf('%12s %-11s ',"** $rum_qty","$kinds[$best] **"); - $rum_bill= $rum_qty * $price[$best]; + my $ok=1; + if ($rum_need > 0) { + if (defined $best) { + my $rum_qty= $rum_need * 100 / $proofs[$best]; + $rum_qty= ceil($rum_qty); + $rum_buy= sprintf('%12s %-11s ', + "** $rum_qty","$kinds[$best] **"); + $rum_bill= $rum_qty * $price[$best]; + } else { + $rum_buy= ' (rum unavailable)'; + $ok= 0; + } } - if ($shot_need > 0 and valid($price[3])) { - $shot_buy= sprintf('%7s shot **', "** $shot_need"); - $shot_bill= $shot_need * $price[3]; + if ($shot_need > 0) { + if (valid($price[3])) { + $shot_buy= sprintf('%7s shot **', "** $shot_need"); + $shot_bill= $shot_need * $price[3]; + } else { + $shot_buy= ' (shot unavailable)'; + $ok= 0; + } } if (length($rum_buy) or length($shot_buy)) { - pr3('for', + pr2($ok + ? sprintf('for a total of %d poe', $rum_bill + $shot_bill) + : 'for', $rum_bill ? sprintf("%12d poe ", $rum_bill) : '', - $shot_bill ? sprintf("%10d poe", $shot_bill) : '', - sprintf("%7d total", $rum_bill + $shot_bill)); + $shot_bill ? sprintf("%10d poe", $shot_bill) : ''); pr2('BUY', $rum_buy, $shot_buy); } else { print "stocks are sufficient.\n"; @@ -298,38 +350,5 @@ compute_cheapest_rum(); compute_stock_values(); compute_restock_requirements(); -__DATA__ - -# if (defined $price{Swill}) { -# map { $price{$_}= undef if $price{$_} eq 'x' } @rums; -# } -# if (defined $have{Swill}) { -# $have_proof= 0; -# map { $have_proof += $have{$_} * $proof{$_} } @rums; -# } - -our ($best); - -our $have_proof; - -our ($need_proof, %need, %buy); - - -sub compute_restock_cheapest_rum() { - my %bill; - map { - $bill{$_} = $buy{$_} * $price{$_} if defined $price{$_}; - } @rums; - prf('nominal bill', %bill, 'poe'); - print "\n"; - if ($need_proof < 0) { - printf "stocks are sufficient"; - } else { - my $buy= ceil($buy{$best}); - printf "buy %d %s at %d poe each for %d poe", - $buy, $best, $price{$best}, $buy * $price{$best}; - } - print "\n\n"; -} - -main(); +STDOUT->error and die $!; +close STDOUT or die $!;