chiark / gitweb /
af18d36193c5a7f16ad05e38ce7a275421de566e
[ypp-sc-tools.web-live.git] / yarrg / web / query_routesearch
1 <%doc>
2
3  This is part of the YARRG website.  YARRG is a tool and website
4  for assisting players of Yohoho Puzzle Pirates.
5
6  Copyright (C) 2009 Ian Jackson <ijackson@chiark.greenend.org.uk>
7  Copyright (C) 2009 Clare Boothby
8
9   YARRG's client code etc. is covered by the ordinary GNU GPL (v3 or later).
10   The YARRG website is covered by the GNU Affero GPL v3 or later, which
11    basically means that every installation of the website will let you
12    download the source.
13
14  This program is free software: you can redistribute it and/or modify
15  it under the terms of the GNU Affero General Public License as
16  published by the Free Software Foundation, either version 3 of the
17  License, or (at your option) any later version.
18
19  This program is distributed in the hope that it will be useful,
20  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  GNU Affero General Public License for more details.
23
24  You should have received a copy of the GNU Affero General Public License
25  along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
27  Yohoho and Puzzle Pirates are probably trademarks of Three Rings and
28  are used without permission.  This program is not endorsed or
29  sponsored by Three Rings.
30
31
32  This Mason component generates the core of the `routesearch' query.
33
34
35 </%doc>
36 <%args>
37 $quri
38 $dbh
39 $islandstring => '';
40 $capacitystring => '';
41 $lossperleague => '';
42 $capitalstring => '';
43 $distance => '';
44 $someresults
45 $emsgokorprint
46 </%args>
47
48 <%perl>
49 use BSD::Resource;
50
51 my $emsg;
52 my @warningfs;
53 my @islandids;
54
55 my $qa= \%ARGS;
56 my $routeparams= { EmsgRef => \$emsg, SayRequiredCapacity => 1 };
57 my $maxdist;
58 my $maxcountea=10;
59
60 </%perl>
61
62 <h1>Find most profitable routes and trades</h1>
63
64 % if ($qa->{Dropdowns}) {
65 This feature is not available from the "drop down menus" interface.
66 % } else {
67
68 <form action="<% $quri->() |h %>" method="get">
69
70 <& enter_route, qa=>$qa, dbh=>$dbh, emsg_r=>\$emsg, warningfs_r=>\@warningfs,
71         enterwhat => 'Enter starting point(s)',
72         islandids_r => \@islandids, archipelagoes_r => undef
73  &>
74
75 <&| enter_advrouteopts, qa=>$qa, dbh=>$dbh, routeparams=>$routeparams &>
76 <td>
77 &nbsp;
78 &nbsp;
79 <td>
80  Maximum distance:
81  <&| qtextstring, qa => $qa, dbh => $dbh, prefix => 'ml',
82     thingstring => 'distance', emsgstore => \$emsg,
83     onresults => sub { ($maxdist)= @_; } &>
84    size=10
85  </&>
86 </&>
87
88 <input type=submit name=submit value="Go">
89 % my $ours= sub { $_[0] =~ m/^lossperleague|^islandstring|^capitalstring|^capacitystring|^distance/; };
90 <& "lookup:formhidden", ours => $ours &>
91
92 % }
93
94 </form>
95 <%perl>
96
97 if (!$emsg && $maxdist > 30) {
98         $emsg= "Searching for routes of more than 30 leagues is not".
99                 " supported, sorry.";
100 }
101
102 $emsgokorprint->($emsg) or return;
103 @islandids or return;
104 defined $routeparams->{MaxMass} or defined $routeparams->{MaxVolume} or return;
105
106 #---------- compute the results ----------
107
108 my @rsargs;
109
110 foreach my $k (qw(MaxMass MaxVolume MaxCapital)) {
111         my $v= $routeparams->{$k};
112         push @rsargs, (defined $v ? $v : -1);
113 }
114 push @rsargs, defined $routeparams->{LossPerLeaguePct}
115         ? $routeparams->{LossPerLeaguePct}*0.01 : 1e-9;
116 push @rsargs, 'search', $maxcountea,$maxcountea, $maxdist, 'any', @islandids;
117
118 m/[^-.0-9a-zA-Z]/ and die "$_ $& ?" foreach @rsargs;
119
120 unshift @rsargs, dbw_filename($qa->{'Ocean'});
121 unshift @rsargs, qw(-DN);
122
123 if ($qa->{'debug'}) {
124 </%perl>
125 [[ <% "@rsargs" |h %> ]]<br><pre>
126 <%perl>
127 }
128
129 unshift @rsargs, sourcebasedir().'/yarrg/routesearch';
130
131 my %results; # $results{$ap}{"5 6 9 10"} = { stuff }
132
133 my $fh= new IO::File;
134 my $child= $fh->open("-|"); defined $child or die $!;
135 if (!$child) {
136         my $cpu= BSD::Resource::RLIMIT_CPU;
137         my ($soft,$hard)= getrlimit($cpu);
138         my $max=10;
139         setrlimit($cpu,$max,$hard) or die $! if $soft>$max;
140         exec @rsargs;
141         die $!;
142 }
143
144 while (<$fh>) {
145         chomp;
146         if ($qa->{'debug'}) {
147 </%perl>
148 <% $_ |h %>
149 <%perl>
150         }
151         next unless
152   m/^ \@ *\d+ ([ap])\# *\d+ \|.*\| *\d+ +(\d+) +(\d+) *\| ([0-9 ]+)$/;
153         my ($ap,$isles) = (uc $1,$4);
154         next if $results{$ap} && %{$results{$ap}} >= $maxcountea;
155         my $item= { A => $2, P => $3 };
156 #       my @isles= map { @islenames[$_] }, split / /, @isles;
157         $results{$ap}{$isles}= $item;
158 }
159
160 if ($qa->{'debug'}) {
161         print "</pre>\n";
162 }
163
164 </%perl>
165 % foreach my $ap (qw(A P)) {
166 <h2>ap=<% $ap %></h2>
167 <table rules=all>
168 %       foreach my $isles (sort {
169 %                       $results{$ap}{$a}{Values}{$ap} <=>
170 %                       $results{$ap}{$b}{Values}{$ap}
171 %               } keys %{$results{$ap}}) {
172 %               my $item= $results{$ap}{$isles};
173 <tr>
174 <td align=right><% $item->{A} |h %>
175 <td align=right><% $item->{P} |h %>
176 <td align=center><% $isles |h %>
177 </td>
178 %       } # $isles
179 </table>
180 % } # $ap
181 <%perl>
182
183
184 </%perl>