chiark / gitweb /
yppedia chart parser gets chart from yppedia
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 31 Aug 2009 16:34:01 +0000 (17:34 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 31 Aug 2009 16:34:01 +0000 (17:34 +0100)
yarrg/yppedia-chart-parser

index 3f773a3..df350a7 100755 (executable)
@@ -1,5 +1,31 @@
 #!/usr/bin/perl
 
+# Updater for island topology
+
+# 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 <ijackson@chiark.greenend.org.uk>
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+# 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.
+
+# usage: ./yppedia-chart-parser OCEAN
+
 use strict (qw(vars));
 use warnings;
 
@@ -7,9 +33,6 @@ use Graph::Undirected;
 use Commods;
 use CommodsDatabase;
 
-my $ocean= 'Midnight';
-
-
 my $widists= Graph::Undirected->new();
 my $wiarchs= Graph::Undirected->new();
 my $wispr;
@@ -48,6 +71,11 @@ if (@ARGV && $ARGV[0] eq '--debug') {
 }
 select(STDOUT); $|=1;
 
+@ARGV==1 or die;
+$ARGV[0] =~ m/^\-/ and die;
+my $ocean= shift @ARGV;
+
+
 my $parity;
 sub nn_xy ($$) {
     my ($x,$y) = @_;
@@ -62,7 +90,7 @@ sub nn_xy ($$) {
 sub yppedia_chart_parse () {
     # We don't even bother with tag soup; instead we do line-oriented parsing.
 
-    while (<>) {
+    while (<OCEAN>) {
        s/\<--.*--\>//g;
        s/^\s*//; chomp; s/\s+$//; s/\s+/ /g;
        s/\<\/?(?:b|em)\>//g;
@@ -516,8 +544,25 @@ sub yppedia_graph_spr () {
     $wispr= shortest_path_reduction('wi',$base);
 }
 
-sub yppedia_ocean_fetch () {
-    open OCEAN, '-|', "./yppedia-ocean-scraper", $ocean or die $!;
+sub yppedia_ocean_fetch_start ($) {
+    my ($chart) = @_;
+    my @args= ();
+    push @args, '--chart' if $chart;
+    push @args, $ocean;
+    open OCEAN, '-|', "./yppedia-ocean-scraper", @args or die $!;
+}
+sub yppedia_ocean_fetch_done () {
+    $?=0; $!=0; close OCEAN; $? and die $?; $! and die $!;
+}
+
+sub yppedia_ocean_fetch_chart () {
+    yppedia_ocean_fetch_start(1);
+    yppedia_chart_parse();
+    yppedia_ocean_fetch_done();
+}
+
+sub yppedia_ocean_fetch_text () {
+    yppedia_ocean_fetch_start(0);
     my $arch;
     while (<OCEAN>) {
        chomp;
@@ -532,7 +577,7 @@ sub yppedia_ocean_fetch () {
            die;
        }
     }
-    $?=0; $!=0; close OCEAN; $? and die $?; $! and die $!;
+    yppedia_ocean_fetch_done();
 }
 
 sub compare_distances () {
@@ -569,7 +614,7 @@ database_fetch_ocean();
 
 progress("computing database spr");         database_graph_spr();
 
-progress("reading yppedia chart");          yppedia_chart_parse();
+progress("fetching yppedia chart");         yppedia_ocean_fetch_chart();
 progress("adding shortcuts");               yppedia_graphs_add_shortcuts();
 progress("pruning boring vertices");        yppedia_graphs_prune_boring();
 progress("checking yppedia graphs");        yppedia_graphs_check();
@@ -579,7 +624,7 @@ progress("setting archs from labels");      yppedia_archs_chart_labels();
 progress("setting archs from nearby");      yppedia_archs_fillbynearest();
 progress("computing yppedia spr");          yppedia_graph_spr();
 
-progress("fetching yppedia ocean text");    yppedia_ocean_fetch();
+progress("fetching yppedia ocean text");    yppedia_ocean_fetch_text();
 
 progress("comparing islands");              compare_island_lists();
 progress("comparing distances");            compare_distances();