chiark / gitweb /
WIP where-vessels tuning
[ypp-sc-tools.main.git] / yarrg / where-vessels
1 #!/usr/bin/wish
2
3 pkg_mkIndex .
4 set auto_path [concat . $auto_path]
5
6 package require panner
7
8 set us Aristarchus
9
10 proc manyset {list args} {
11     foreach val $list var $args {
12         upvar 1 $var my
13         set my $val
14     }
15 }
16
17 set itemre { (\w+) = ([^=]*) }
18 set manyitemre "^\\\[ $itemre ( (?: ,\\ $itemre)* ) \\]\$"
19 puts $manyitemre
20
21 set vn [open vessel-notes]
22 while {[gets $vn l] >= 0} {
23         regsub -all {\t+} $l "\t" l
24         manyset [split $l "\t"] vname vid owner note
25         set nk $vid.$vname
26         puts "SET NOTE $nk"
27         set notes($nk) [list $owner $note]
28 }
29 close $vn
30
31 proc vessel {vin} {
32         global us
33         upvar #0 $vin vi
34         switch -exact $vi(vesselClass) {
35                 smsloop         { set sz 00sl }
36                 lgsloop         { set sz 01ct }
37                 dhow            { set sz 02dh }
38                 longship        { set sz 03ls }
39                 baghlah         { set sz 04bg }
40                 merchbrig       { set sz 05mb }
41                 warbrig         { set sz 06wb }
42                 xebec           { set sz 07xe }
43                 warfrig         { set sz 08wf }
44                 merchgal        { set sz 09mg }
45                 grandfrig       { set sz 10gf }
46                 default         { error "$vi(vesselClass) ?" }
47         }
48         set abbrev $sz
49         switch -exact $vi(vesselSubclass) {
50                 null            { }
51                 icy             { append abbrev F }
52                 default         { error "$vi(vesselSubclass) ?" }
53         }
54         switch -exact $vi(isLocked)/$vi(isBattleReady) {
55                 true/false      { append abbrev 2- }
56                 false/false     { append abbrev 1+ }
57                 false/true      { append abbrev 0* }
58                 default         { error "$vi(isLocked)/$vi(isBattleReady) ?" }
59         }
60         switch -exact $vi(inPort) {
61                 true            { }
62                 false           { append abbrev ? }
63                 default         { error "$vi(inPort) ?" }
64         }
65         set nk $vi(vesselId).$vi(vesselName)
66         upvar #0 notes($nk) note
67         if {[info exists note]} {
68                 manyset $note owner xabbrev
69                 if {![string compare $owner $us]} {
70                         append abbrev =
71                 } else {
72                         append abbrev -
73                 }
74                 append abbrev $xabbrev
75                 unset note
76         } else {
77 #               puts "UNKNOWN $nk"
78         }
79         set kk "$vi(islandName) $abbrev"
80         upvar #0 count($kk) k
81         if {![info exists k]} { set k 0 }
82         incr k
83 }
84
85 set cl [open clipboard]
86 while {[gets $cl l] >= 0} {
87 #       puts "========"
88         catch { unset vi }
89         while 1 {
90                 if {![regexp -expanded $manyitemre $l dummy \
91                         thiskey thisval rhs]} { error "$l ?" }
92 #               puts "KEY $thiskey VAL $thisval"
93                 set vi($thiskey) $thisval
94                 if {![string length $rhs]} break
95                 regsub {^, } $rhs {} rhs
96                 set l "\[$rhs\]"
97         }
98         vessel vi
99 }
100 close $cl
101
102 set chart [open |[list perl -we {
103         use strict;
104         use CommodsScrape;
105         use IO::File;
106         use IO::Handle;
107         yppedia_chart_parse(\*STDIN, (new IO::File ">/dev/null"),
108                 sub { sprintf "%d %d", @_; },
109                 sub { printf "archlabel %d %d %s\n", @_; },
110                 sub { printf "island %s %s\n", @_; },
111                 sub { printf "league %s %s %s.\n", @_; },
112                 sub { printf STDERR "warning: %s: incomprehensible: %s", @_; }
113                         );
114         STDOUT->error and die $!;
115 }] r]
116
117 frame .f -border 1 -relief groove
118 set canvas .f.c
119 canvas $canvas
120 #$canvas configure -width 1000 -height 800
121 pack $canvas -expand 1 -fill both
122 pack .f -expand 1 -fill both -side left
123
124 set scale 16
125
126 proc coord {c} {
127         global scale
128         return [expr {$c * $scale}]
129 }
130
131 proc chart-got/archlabel {args} { }
132 proc chart-got/island {x y args} {
133 #       puts "ISLE $x $y $args"
134         global canvas isleloc
135         set isleloc($args) [list $x $y]
136         set sz 5
137 #       $canvas create oval \
138 #               [expr {[coord $x] - $sz}] [expr {[coord $y] - $sz}] \
139 #               [expr {[coord $x] + $sz}] [expr {[coord $y] + $sz}] \
140 #               -fill blue
141         $canvas create text [coord $x] [coord $y] \
142                 -text $args -anchor s
143 }
144 proc chart-got/league {x1 y1 x2 y2 kind} {
145 #       puts "LEAGUE $x1 $y1 $x2 $y2 $kind"
146         global canvas
147         set l [$canvas create line \
148                 [coord $x1] [coord $y1] \
149                 [coord $x2] [coord $y2]]
150         if {![string compare $kind .]} {
151                 $canvas itemconfigure $l -dash .
152         }
153 }
154
155 while {[gets $chart l] >= 0} {
156 #       puts "CHART-GOT $l"
157         set proc [lindex $l 0]
158         eval chart-got/$proc [lrange $l 1 end]
159 }
160
161 puts WILLSHOW
162
163 set lastislandname {}
164 foreach key [lsort [array names count]] {
165         set c $count($key)
166 #       puts "SHOWING $key $c"
167         regexp {^(.*) (\S+)$} $key dummy islandname abbrev
168         if {[string compare $lastislandname $islandname]} {
169                 manyset $isleloc($islandname) x y
170                 set x [coord $x]
171                 set y [coord $y]
172                 set lastislandname $islandname
173 #               puts "START Y $y"
174         }
175         set text $abbrev
176         regsub -all {[0-9]} $text {} text
177         if {$c > 1} {
178                 set text [format "%2d%s" $c $text]
179         } else {
180                 set text [format "  %s" $text]
181         }
182         set id [$canvas create text $x $y \
183                 -anchor nw -font fixed \
184                 -text $text]
185         set bbox [$canvas bbox $id]
186         set bid [eval $canvas create rectangle $bbox -fill white]
187         $canvas lower $bid $id
188         manyset $bbox dummy dummy dummy y
189 #       puts "NEW Y $y"
190 }
191
192 foreach nk [lsort [array names $note]] {
193         puts "IGNORED NOTE $nk"
194 }
195
196 frame .ctrl
197 pack .ctrl -side right
198
199 panner::canvas-scroll-bbox .f.c
200 panner::create .ctrl.pan .f.c 120 120
201
202 pack .ctrl.pan -side top -pady 10 -padx 5
203 frame .ctrl.zoom
204 pack .ctrl.zoom -side top
205
206 button .ctrl.zoom.out -text - -font {Courier 16}
207 button .ctrl.zoom.in  -text + -font  {Courier 16}
208 pack .ctrl.zoom.out .ctrl.zoom.in -side left
209
210 #. configure -width 640 -height 480
211 wm geometry . 1024x480
212
213 #puts "[$canvas bbox all]"