errexpect-error "undefined $key"
}
+proc errexpect-arrayget-boolean {arrayvar key} {
+ switch -exact [uplevel 1 [list errexpect-arrayget $arrayvar $key]] {
+ true { return 1 }
+ false { return 0 }
+ default { errexpect-error "unexpected $key" }
+ }
+}
+
proc errexpect-catch {code} {
global errorInfo errorCode
set rc [catch {
}
}
-proc note-info {lno vid name description} {
+proc note-info {lno vid name island description} {
global note_infos
- lappend note_infos [list $lno $vid $name $description]
+ lappend note_infos [list $lno $vid $name $island $description]
}
proc display-note-infos {} {
set infodata {}
foreach info $note_infos {
- manyset $info lno vid name description
+ manyset $info lno vid name island description
append infodata "vessel"
append infodata " $vid"
if {[string length $name]} { append infodata " $name" }
+ if {[string length $island]} { append infodata " ($island)" }
append infodata ": " $description "\n"
}
if {$nmissing} {
- append infodata "$nmissing vessels not mentioned in notes:\n"
+ if {[string length $infodata]} { append infodata "\n" }
+ append infodata "$nmissing vessel(s) not mentioned in notes:\n"
set last_island {}
foreach info [lsort $note_missings] {
manyset $info island name vid
parser-control-failed-core .ctrl.notes notes \
white blue 0 \
$tiny \
- "[llength $note_infos] warnings;\
- $nmissing vessels missing" \
+ "[llength $note_infos] warning(s);\
+ $nmissing vessel(s) missing" \
"Full description of warnings and missing vessels:" \
$infodata
}
+#---------- vessel properties ----------
+
+proc vesselclasses-init {} {
+ global vc_game2code vc_code2abbrev vc_code2full
+ foreach {game code abbrev full} {
+ smsloop am sl Sloop
+ lgsloop bm ct Cutter
+ dhow cm dh Dhow
+ longship dm ls Longship
+ baghlah em bg Baghlah
+ merchbrig fm mb {Merchant Brig}
+ warbrig gm wb {War Brig}
+ xebec hm xe Xebec
+ warfrig im wf {War Frigate}
+ merchgal jm mg {Merchant Galleon}
+ grandfrig km gf {Grand Frigate}
+ } {
+ set vc_game2code($game) $code
+ set vc_code2abbrev($code) $abbrev
+ set vc_code2full($code) $full
+ }
+}
+
+proc code2abbrev {code} {
+ global vc_code2abbrev
+
+ manyset [split $code _] inport class subclass lockown xabbrev
+ manyset [split $lockown ""] lock notown
+
+ set abbrev {}
+ append abbrev [lindex {? {}} $inport]
+ append abbrev $vc_code2abbrev($class)
+ append abbrev $subclass
+ append abbrev [lindex {* + -} $lock]
+ append abbrev [lindex {= - ?} [regsub {\D} $notown 2]]
+ append abbrev $xabbrev
+
+ debug "CODE2ABBREV $code $abbrev"
+ return $abbrev
+}
+
+proc show-report {islandname code} {
+ global vc_code2full
+
+ .report.island configure -text $islandname
+ glset report_code $code
+ glset report_abbrev [code2abbrev $code]
+
+ manyset [split $code _] inport classcode subclass lockown xabbrev
+ manyset [split $lockown ""] lock notown
+
+ report-set inport [lindex {{At Sea} {In port}} $inport]
+ report-set class $vc_code2full($classcode)
+
+ switch -exact $subclass {
+ {} { report-set subclass {Ordinary} }
+ F { report-set subclass {"Frost class"} }
+ default { report-set subclass "Subclass \"$subclass\"" }
+ }
+
+ report-set lock [lindex {
+ {Battle ready} {Unlocked} {Locked}
+ } $lock]
+
+ switch -exact $notown {
+ 0 { report-set own "Yours" }
+ 1 { report-set own "Other pirate's" }
+ U { report-set own "Owner not known" }
+ M { report-set own "Missing from notes" }
+ default { report-set own "?? $notown" }
+ }
+
+ if {[string length $xabbrev]} {
+ report-set xabbrev "Notes flags: $xabbrev"
+ } else {
+ report-set xabbrev "No flags in notes"
+ }
+}
+
#---------- loading and parsing the clipboard (vessel locations) ----------
proc vessel {vin} {
global pirate notes_used note_missings newnotes
upvar 1 $vin vi
- set abbrev {}
- switch -exact [errexpect-arrayget vi inPort] {
- true { }
- false { append abbrev ? }
- default { errexpect-error "unexpected inPort" }
- }
- switch -exact [errexpect-arrayget vi vesselClass] {
- smsloop { set sz 00sl }
- lgsloop { set sz 01ct }
- dhow { set sz 02dh }
- longship { set sz 03ls }
- baghlah { set sz 04bg }
- merchbrig { set sz 05mb }
- warbrig { set sz 06wb }
- xebec { set sz 07xe }
- warfrig { set sz 08wf }
- merchgal { set sz 09mg }
- grandfrig { set sz 10gf }
- default { errexpect-error "unknown class" }
- }
- append abbrev $sz
- switch -exact [errexpect-arrayget vi vesselSubclass] {
- null { }
- icy { append abbrev F }
- default { errexpect-error "unknown subclass ?" }
+
+ set codel {}
+ lappend codel [errexpect-arrayget-boolean vi inPort]
+
+ set gameclass [errexpect-arrayget vi vesselClass]
+ upvar #0 vc_game2code($gameclass) class
+ if {![info exists class]} { errexpect-error "unexpected vesselClass"}
+ lappend codel $class
+
+ set subclass [errexpect-arrayget vi vesselSubclass]
+ switch -exact $subclass {
+ null { lappend codel {} }
+ icy { lappend codel F }
+ default { lappend codel ($subclass) }
}
+
switch -exact [errexpect-arrayget vi isLocked]/[ \
errexpect-arrayget vi isBattleReady] {
- true/false { append abbrev 2- }
- false/false { append abbrev 1+ }
- false/true { append abbrev 0* }
+ true/false { set lock 2 }
+ false/false { set lock 1 }
+ false/true { set lock 0 }
default { errexpect-error "unexpected isLocked/isBattleReady" }
}
+
set vid [errexpect-arrayget vi vesselId]
upvar #0 notes($vid) note
set realname [errexpect-arrayget vi vesselName]
if {[info exists note]} {
manyset $note lno notename owner xabbrev
if {[string compare -nocase $realname $notename]} {
- note-info $lno $vid $realname \
- "notes say name is $notename - perhaps renamed"
+ note-info $lno $vid $realname $island \
+ "notes say name is $notename"
}
if {[string length $owner]} {
if {![string compare $owner $pirate]} {
- append abbrev =
+ set notown 0
} else {
- append abbrev -
+ set notown 1
}
+ } else {
+ set notown U
}
append abbrev $xabbrev
set notes_used($vid) 1
} else {
+ set notown M
lappend note_missings [list $island $realname $vid]
}
+
+ lappend codel "$lock$notown" $xabbrev
lappend newnotes [list $vid $realname $owner $xabbrev]
-
- set kk "$island $abbrev"
+ set kk "$island [join $codel _]"
upvar #0 count($kk) k
if {![info exists k]} { set k 0 }
incr k
+
+ debug "CODED $kk $vid $realname"
}
set clipboard {}
foreach vid [lsort [array names notes]] {
if {![info exists notes_used($vid)]} {
manyset $notes($vid) lno notename
- note-info $lno $vid $notename \
+ note-info $lno $vid $notename {} \
"vessel in notes no longer found"
}
}
foreach key [lsort [array names count]] {
set c $count($key)
# debug "SHOWING $key $c"
- regexp {^(.*) (\S+)$} $key dummy islandname abbrev
+ regexp {^(.*) (\S+)$} $key dummy islandname code
+
+ set abbrev [code2abbrev $code]
+
if {[string compare $lastislandname $islandname]} {
manyset $isleloc($islandname) x y
set x [coord $x]
set bbox [$canvas bbox $id]
set bid [eval $canvas create rectangle $bbox -fill white]
$canvas lower $bid $id
+ $canvas bind $id <ButtonPress> [list show-report $islandname $code]
+ $canvas bind $bid <ButtonPress> [list show-report $islandname $code]
manyset $bbox dummy dummy dummy y
# debug "NEW Y $y"
}
proc widgets-setup {} {
global canvas debug pirate ocean
+ wm geometry . 1024x480
+ wm title . "where-vessels - $pirate on the $ocean ocean"
+
+ #----- map -----
+
frame .f -border 1 -relief groove
set canvas .f.c
canvas $canvas
pack $canvas -expand 1 -fill both
pack .f -expand 1 -fill both -side left
+ #----- control panel -----
+
frame .ctrl
- pack .ctrl -side right
+ pack .ctrl -side left -anchor n
debug "BBOX [$canvas bbox all]"
pack .ctrl.notes -side top -pady 2
- wm geometry . 1024x480
- wm title . "where-vessels - $pirate on the $ocean ocean"
+ #----- decoding etc. report -----
+
+ frame .report
+ pack .report -side left -anchor n
+
+ label .report.island -text { }
+
+ frame .report.abbrev -background black
+ glset report_abbrev { }
+ entry .report.abbrev.abbrev -state readonly \
+ -textvariable report_abbrev \
+ -borderwidth 0 -relief flat -width 0 \
+ -highlightbackground white \
+ -readonlybackground white -foreground black
+ pack .report.abbrev.abbrev -side left -padx 1 -pady 1
+
+ frame .report.code
+ label .report.code.lab -text Code:
+ glset report_code { }
+ entry .report.code.code -state readonly -textvariable report_code -width 15
+ pack .report.code.lab .report.code.code -side left
+ frame .report.details -bd 2 -relief groove -padx 2 -pady 2
+
+ listbox .report.list -height 5
+
+ pack .report.island .report.abbrev .report.details \
+ .report.list .report.code -side top
+ pack configure .report.details -fill x
+
+ foreach sw {inport class subclass lock own xabbrev} {
+ label .report.details.$sw -text { }
+ pack .report.details.$sw -side top -anchor w
+ }
}
+proc report-set {sw val} { .report.details.$sw configure -text $val }
+
proc zoom {extail} {
global scale canvas
set nscale [expr "\$scale $extail"]
#---------- main program ----------
+vesselclasses-init
+
parseargs
argdefaults
httpclientsetup where-vessels
widgets-setup
set notes_data {}
+if {[catch { parse-clipboard } emsg]} {
+ puts stderr "$emsg\n$errorInfo"
+ exit 1
+}
after idle invoke_notes
draw