Initial import.
[rocl] / elite-map
1 #! /usr/bin/tclsh
2
3 package require "elite" "1.0.0"
4
5 set syms "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
6 proc symbol {i} {
7 global syms
8 if {$i < [string length $syms]} {
9 return [string index $syms $i]
10 }
11 set hi [expr {$i / [string length $syms]}]
12 set lo [expr {$i % [string length $syms]}]
13 return [string index $syms $hi][string index $syms $lo]
14 }
15
16 proc show-map {asp wx wy ww {n ""}} {
17 set minx 10000
18 set miny 10000
19 set maxx 0
20 set maxy 0
21
22 foreach {s x y} $ww {
23 if {$x < $minx} { set minx $x}
24 if {$y < $miny} { set miny $y}
25 if {$x > $maxx} { set maxx $x}
26 if {$y > $maxy} { set maxy $y}
27 }
28 set dx [expr {$maxx - $minx}]
29 set dy [expr {$maxy - $miny}]
30 if {$dx == 0} { set dx 1 }
31 if {$dy == 0} { set dy 1 }
32
33 set sc [expr {$wx/double($dx)}]
34 if {$dy * $sc/$asp > $wy} {
35 set sc [expr {$wy * $asp/double($dy)}]
36 }
37 set gw {}
38 foreach {s x y} $ww {
39 set gx [expr {int(($x - $minx) * $sc + 0.5)}]
40 set gy [expr {int(($y - $miny) * $sc/$asp + 0.5)}]
41 lappend gw [list $s $gx $gy]
42 }
43
44 set pw [lsort -index 1 -integer -increasing $gw]
45 set pw [lsort -index 2 -integer -increasing $pw]
46 set x 0
47 set y 0
48 set i 0
49 set l {}
50 foreach w $pw {
51 destructure {s px py} $w
52 if {$y < $py} {
53 puts -nonewline [string repeat "\n" [expr {$py - $y}]]
54 set x 0
55 set y $py
56 }
57 if {$x < $px} {
58 puts -nonewline [string repeat " " [expr {$px - $x}]]
59 set x $px
60 }
61 if {[string equal $s $n]} {
62 set sy "*"
63 } else {
64 set sy [symbol $i]
65 incr i
66 }
67 puts -nonewline $sy
68 incr x [string length $sy]
69 lappend l $sy $s
70 }
71 puts -nonewline "\n"
72 return $l
73 }
74
75 proc show-key {l n} {
76 global gov eco
77 if {![string equal $n ""]} {
78 elite-worldinfo p $n
79 }
80 foreach {sy s} $l {
81 elite-worldinfo pp $s
82 set out [format "%2s %s" $sy [world-summary $s]]
83 if {![string equal $n ""]} {
84 append out [format " (%.1f LY)" \
85 [expr {[world-distance $p(x) $p(y) $pp(x) $pp(y)]/10.0}]]
86 }
87 puts $out
88 }
89 }
90
91 proc local-area {g d n} {
92 set ww [worldinfo $g]
93 elite-worldinfo p $n
94
95 set w {}
96 foreach {s x y} $ww {
97 if {abs($p(x) - $x) > $d + 10 || abs($p(y) - $y) > $d + 10 ||
98 [world-distance $p(x) $p(y) $x $y] > $d} { continue }
99 lappend w $s $x $y
100 }
101 return $w
102 }
103
104 set g $galaxy1
105 set wx 72
106 set wy 10
107 set asp 2.17
108 set d 70
109 set v 1
110 set usage "usage: $argv0 \[-qv\] \[-g GAL\] \[-d DIST\] \[-w WD,HT\] \[-a ASP\] \[PLANET\]"
111 for {set i 0} {$i < [llength $argv]} {incr i} {
112 set a [lindex $argv $i]
113 switch -glob -- $a {
114 "-g" {
115 incr i
116 set a [lindex $argv $i]
117 set g [parse-galaxy-spec $a]
118 if {[string equal $g ""]} {
119 puts stderr "$argv0: bad galaxy string `$a'"
120 exit 1
121 }
122 destructure {. g} $g
123 }
124 "-d" {
125 incr i
126 set d [expr {[lindex $argv $i] * 10}]
127 }
128 "-w" {
129 incr i
130 if {![regexp {^(\d+),(\d+)$} [lindex $argv $i] . wx wy]} {
131 puts stderr "$argv0: bad window size string"
132 exit 1
133 }
134 }
135 "-a" {
136 incr i
137 set asp [lindex $argv $i]
138 }
139 "-v" {
140 incr v
141 }
142 "-q" {
143 incr v -1
144 }
145 "--" {
146 incr i
147 break
148 }
149 "-*" {
150 puts stderr $usage
151 exit 1
152 }
153 default {
154 break
155 }
156 }
157 }
158
159 set p [lrange $argv $i end]
160 switch -exact [llength $p] {
161 0 {
162 set n ""
163 set w [worldinfo $g]
164 incr v -1
165 }
166 1 {
167 set n [parse-planet-spec $g $a]
168 if {[string equal $n ""]} {
169 puts stderr "$argv0: unknown planet `$a'"
170 exit 1
171 }
172 set w [local-area $g $d $n]
173 }
174 default {
175 puts stderr $usage
176 exit 1
177 }
178 }
179 set l [show-map $asp $wx $wy $w $n]
180 if {$v > 0} {
181 puts ""
182 show-key $l $n
183 }