| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Games::Baseball::Scorecard; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
32098
|
use warnings; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
40
|
|
|
4
|
1
|
|
|
1
|
|
5
|
use strict; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
55
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
require 5.006; |
|
7
|
|
|
|
|
|
|
|
|
8
|
1
|
|
|
1
|
|
6
|
use File::Path; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
106
|
|
|
9
|
1
|
|
|
1
|
|
6210
|
use File::Temp 'tempdir'; |
|
|
1
|
|
|
|
|
28006
|
|
|
|
1
|
|
|
|
|
63
|
|
|
10
|
1
|
|
|
1
|
|
797
|
use File::Spec::Functions qw(:DEFAULT rel2abs); |
|
|
1
|
|
|
|
|
855
|
|
|
|
1
|
|
|
|
|
196
|
|
|
11
|
1
|
|
|
1
|
|
785
|
use Text::ParseWords; |
|
|
1
|
|
|
|
|
1212
|
|
|
|
1
|
|
|
|
|
10308
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $VERSION = '0.03'; |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
our($SCORECARD, $TEX, $TEXD); |
|
16
|
|
|
|
|
|
|
our $MPOST = 'mpost'; |
|
17
|
|
|
|
|
|
|
our $MPTOPDF = 'mptopdf'; |
|
18
|
|
|
|
|
|
|
our $PDFTEX = 'pdftex'; |
|
19
|
|
|
|
|
|
|
our $OPEN = 'open'; |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
# default: black |
|
22
|
|
|
|
|
|
|
our @COLOR = (0, 0, 0); |
|
23
|
|
|
|
|
|
|
# others: |
|
24
|
|
|
|
|
|
|
# light cyan |
|
25
|
|
|
|
|
|
|
#@COLOR = (.10, 1, 1); |
|
26
|
|
|
|
|
|
|
# dark cyan |
|
27
|
|
|
|
|
|
|
#@COLOR = (.25, 1, 1); |
|
28
|
|
|
|
|
|
|
# grey |
|
29
|
|
|
|
|
|
|
#@COLOR = (.4, .4, .4); |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
our @FONTS = ( |
|
32
|
|
|
|
|
|
|
# defaults that look very nice |
|
33
|
|
|
|
|
|
|
[ myriadrcrrl => 9 ], |
|
34
|
|
|
|
|
|
|
[ myriadrcbrl => 14 ], |
|
35
|
|
|
|
|
|
|
[ myriadrcrrl => 14 ], |
|
36
|
|
|
|
|
|
|
[ myriadrcbrl => 22 ], |
|
37
|
|
|
|
|
|
|
); |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
# cmssdc10 is another nice one, i prefer this: it's darker and narrower |
|
40
|
|
|
|
|
|
|
@FONTS = ( |
|
41
|
|
|
|
|
|
|
# ones that should work everywhere: |
|
42
|
|
|
|
|
|
|
[ phvr8rn => 8 ], |
|
43
|
|
|
|
|
|
|
[ phvb8rn => 12 ], |
|
44
|
|
|
|
|
|
|
[ phvr8rn => 12 ], |
|
45
|
|
|
|
|
|
|
[ phvb8rn => 18 ], |
|
46
|
|
|
|
|
|
|
); |
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
=head1 NAME |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
Games::Baseball::Scorecard |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
my $score = Games::Baseball::Scorecard->new($dir, $name, { |
|
56
|
|
|
|
|
|
|
color => [ .4, .4, .4 ], # grey |
|
57
|
|
|
|
|
|
|
fonts => [ # Myriad Condensed regular/bold |
|
58
|
|
|
|
|
|
|
[ myriadrcrrl => 9 ], |
|
59
|
|
|
|
|
|
|
[ myriadrcbrl => 14 ], |
|
60
|
|
|
|
|
|
|
[ myriadrcrrl => 14 ], |
|
61
|
|
|
|
|
|
|
[ myriadrcbrl => 22 ], |
|
62
|
|
|
|
|
|
|
], |
|
63
|
|
|
|
|
|
|
}); |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# fill initial scorecard out |
|
66
|
|
|
|
|
|
|
$s->init({ |
|
67
|
|
|
|
|
|
|
scorer => 'Pudge', |
|
68
|
|
|
|
|
|
|
date => '2004-10-24, 20:05-23:25', |
|
69
|
|
|
|
|
|
|
at => 'Fenway Park, Boston', |
|
70
|
|
|
|
|
|
|
temp => '48 clear', |
|
71
|
|
|
|
|
|
|
wind => '7 to RF', |
|
72
|
|
|
|
|
|
|
att => '35,001', |
|
73
|
|
|
|
|
|
|
home => { |
|
74
|
|
|
|
|
|
|
team => 'Boston Red Sox', |
|
75
|
|
|
|
|
|
|
starter => 38, # jersey number |
|
76
|
|
|
|
|
|
|
lineup => [ |
|
77
|
|
|
|
|
|
|
# [ num, position ], |
|
78
|
|
|
|
|
|
|
[ 18, 8 ], # Damon, starting at CF |
|
79
|
|
|
|
|
|
|
# ... |
|
80
|
|
|
|
|
|
|
], |
|
81
|
|
|
|
|
|
|
roster => { |
|
82
|
|
|
|
|
|
|
# num => name |
|
83
|
|
|
|
|
|
|
18 => 'Damon, Johnny', |
|
84
|
|
|
|
|
|
|
38 => 'Schilling, Curt', |
|
85
|
|
|
|
|
|
|
# ... |
|
86
|
|
|
|
|
|
|
}, |
|
87
|
|
|
|
|
|
|
}, |
|
88
|
|
|
|
|
|
|
away => { |
|
89
|
|
|
|
|
|
|
team => 'St. Louis Cardinals', |
|
90
|
|
|
|
|
|
|
# ... |
|
91
|
|
|
|
|
|
|
} |
|
92
|
|
|
|
|
|
|
}); |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
# draw the game |
|
95
|
|
|
|
|
|
|
$s->inn; # new inning / end of last inning |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
$s->ab; # new at-bat |
|
98
|
|
|
|
|
|
|
# works to full count |
|
99
|
|
|
|
|
|
|
$s->pitches(qw(s b s b b f)); |
|
100
|
|
|
|
|
|
|
# struck out looking |
|
101
|
|
|
|
|
|
|
$s->out('!K'); |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
$s->ab; |
|
104
|
|
|
|
|
|
|
# home run to left-center |
|
105
|
|
|
|
|
|
|
$s->hit(4, 'lc'); |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
# calculate/draw stats |
|
108
|
|
|
|
|
|
|
$self->totals; |
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
# finish the job |
|
111
|
|
|
|
|
|
|
$s->generate; |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
# open final PDF |
|
114
|
|
|
|
|
|
|
$s->pdfopen; |
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
118
|
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
Games::Baseball::Scorecard is a frontend to a PDF scorecard written in Metapost by |
|
120
|
|
|
|
|
|
|
Christopher Swingley (L). |
|
121
|
|
|
|
|
|
|
That scorecard is drawn out, and has a nice API for actually drawing out the |
|
122
|
|
|
|
|
|
|
elements of the game: all the ball, strikes, outs, etc. |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
Being Metapost, it is laborious to do all this. So this module provides a nice |
|
125
|
|
|
|
|
|
|
frontend, that also keeps track of balls and strikes and hits and runs and outs |
|
126
|
|
|
|
|
|
|
and more, making input of the game quite simple and efficient. |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
This module does not include the entire API, but most of it. Patches and ideas |
|
129
|
|
|
|
|
|
|
welcome. Feel free to call C |
|
130
|
|
|
|
|
|
|
on your own, or to modify the C<$SCORECARD> variable (which contains the base |
|
131
|
|
|
|
|
|
|
Metapost code), or the C<$TEX> (single page) and C<$TEXD> (duplex) TeX files. |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
I won't give a tutorial on scoring baseball games, or on Metapost, below. Seek |
|
134
|
|
|
|
|
|
|
other resources (Swingley's URL above has a nice tutorial on scoring baseball |
|
135
|
|
|
|
|
|
|
games, using the scorecard he designed, which is what we're using here). |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=head1 SYSTEM REQUIREMENTS |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
You will need TeX and Metapost installed. F, F, and F |
|
141
|
|
|
|
|
|
|
must be in your C<$ENV{PATH}>. For opening the PDF with C, you will |
|
142
|
|
|
|
|
|
|
need C (Mac OS X) in your path. The names of these programs can be modified |
|
143
|
|
|
|
|
|
|
with the variables C<$MPOST>, C<$MPTOPDF>, C<$PDFTEX>, and C<$OPEN>. |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
Also, the font by default (in the C<$SCORECARD> variable) is Helvetica Narrow. |
|
146
|
|
|
|
|
|
|
Use whatever fonts you have installed for TeX. The original used Myriad |
|
147
|
|
|
|
|
|
|
Condensed, which I don't have (getting a decent-looking font and size, and |
|
148
|
|
|
|
|
|
|
figuring out how to use it, was the hardest part of the project for me -- as |
|
149
|
|
|
|
|
|
|
I don't know TeX -- so I picked a font everyone else could use, that should |
|
150
|
|
|
|
|
|
|
be installed by default in most TeX installations). |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
See the distribution at |
|
153
|
|
|
|
|
|
|
L for |
|
154
|
|
|
|
|
|
|
more information. |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
=head1 METHODS |
|
158
|
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
The main methods are included below. There are some other methods that are used, |
|
160
|
|
|
|
|
|
|
but you shouldn't need to call them so I won't list them all here. |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=head2 Basic Methods |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=over 4 |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
=item new([DIR, BASE, OPTS]) |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
The C method takes three optional arguments: a directory to build in, |
|
169
|
|
|
|
|
|
|
and a base name for the scorecard file, and an options hashref. Defaults are |
|
170
|
|
|
|
|
|
|
the current directory, and "scorecard". The base name is used to generate the |
|
171
|
|
|
|
|
|
|
build files and the resulting PDFs, which will be F<${base}_away.pdf>, |
|
172
|
|
|
|
|
|
|
F<${base}_home.pdf>, and F<$base.pdf> (both away and home together). |
|
173
|
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
Options can be "color", an arrayref of RGB values (0 to 1), and "fonts", |
|
175
|
|
|
|
|
|
|
an arrayref of four fonts (copyright notice font, basepath play labels, |
|
176
|
|
|
|
|
|
|
balls/strikes/outs/other labels, and outs and other large label), with |
|
177
|
|
|
|
|
|
|
the font name and size (see L). |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
Defaults are black, and Helvetica Narrow (phvr8rn/phvr8rn). |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=cut |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
sub new { |
|
184
|
1
|
|
|
1
|
1
|
34
|
my($ref, $dir, $base, $opts) = @_; |
|
185
|
1
|
|
50
|
|
|
9
|
$opts ||= {}; |
|
186
|
1
|
|
33
|
|
|
3
|
$dir ||= tempdir(); |
|
187
|
1
|
|
50
|
|
|
9
|
$base ||= 'scorecard'; |
|
188
|
1
|
|
|
|
|
4
|
$base =~ s/\W+//g; |
|
189
|
|
|
|
|
|
|
|
|
190
|
1
|
50
|
|
|
|
7
|
$dir = rel2abs($dir) unless file_name_is_absolute($dir); |
|
191
|
|
|
|
|
|
|
|
|
192
|
1
|
50
|
|
|
|
83
|
mkpath($dir) unless -e $dir; |
|
193
|
|
|
|
|
|
|
|
|
194
|
1
|
|
|
|
|
8
|
my $self = bless { |
|
195
|
|
|
|
|
|
|
debug => 0, |
|
196
|
|
|
|
|
|
|
dir => $dir, |
|
197
|
|
|
|
|
|
|
base => $base, |
|
198
|
|
|
|
|
|
|
}, __PACKAGE__; |
|
199
|
|
|
|
|
|
|
|
|
200
|
1
|
|
|
|
|
4
|
for my $which (qw(away home)) { |
|
201
|
2
|
|
|
|
|
3
|
my $fh; |
|
202
|
2
|
|
|
|
|
7
|
my $basewhich = "${base}_$which"; |
|
203
|
2
|
50
|
|
|
|
222
|
unless (open $fh, '>', catfile($dir, "$basewhich.tex")) { |
|
204
|
0
|
|
|
|
|
0
|
warn $!; |
|
205
|
0
|
|
|
|
|
0
|
return; |
|
206
|
|
|
|
|
|
|
} |
|
207
|
|
|
|
|
|
|
|
|
208
|
2
|
|
|
|
|
15
|
(my $tex = $TEX) =~ s/__BASE__/$basewhich/; |
|
209
|
2
|
|
|
|
|
34
|
print $fh $tex; |
|
210
|
2
|
|
|
|
|
75
|
close $fh; |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
|
|
213
|
2
|
50
|
|
|
|
187
|
unless (open $fh, '>', catfile($dir, "$basewhich.mp")) { |
|
214
|
0
|
|
|
|
|
0
|
warn $!; |
|
215
|
0
|
|
|
|
|
0
|
return; |
|
216
|
|
|
|
|
|
|
} |
|
217
|
|
|
|
|
|
|
|
|
218
|
2
|
|
66
|
|
|
14
|
$opts->{fonts}[0] ||= $FONTS[0]; |
|
219
|
2
|
|
66
|
|
|
10
|
$opts->{fonts}[1] ||= $FONTS[1]; |
|
220
|
2
|
|
66
|
|
|
7
|
$opts->{fonts}[2] ||= $FONTS[2]; |
|
221
|
2
|
|
66
|
|
|
9
|
$opts->{fonts}[3] ||= $FONTS[3]; |
|
222
|
|
|
|
|
|
|
|
|
223
|
2
|
100
|
|
|
|
12
|
$opts->{color}[0] = $COLOR[0] unless defined $opts->{color}[0]; |
|
224
|
2
|
100
|
|
|
|
7
|
$opts->{color}[1] = $COLOR[1] unless defined $opts->{color}[1]; |
|
225
|
2
|
100
|
|
|
|
7
|
$opts->{color}[2] = $COLOR[2] unless defined $opts->{color}[2]; |
|
226
|
|
|
|
|
|
|
|
|
227
|
2
|
|
|
|
|
4
|
my $mp = $SCORECARD; |
|
228
|
2
|
|
|
|
|
130
|
$mp =~ s/__FONTFACE0__/$opts->{fonts}[0][0]/g; |
|
229
|
2
|
|
|
|
|
131
|
$mp =~ s/__FONTFACE1__/$opts->{fonts}[1][0]/g; |
|
230
|
2
|
|
|
|
|
141
|
$mp =~ s/__FONTFACE2__/$opts->{fonts}[2][0]/g; |
|
231
|
2
|
|
|
|
|
131
|
$mp =~ s/__FONTFACE3__/$opts->{fonts}[3][0]/g; |
|
232
|
|
|
|
|
|
|
|
|
233
|
2
|
|
|
|
|
106
|
$mp =~ s/__FONTSIZE0__/$opts->{fonts}[0][1]/g; |
|
234
|
2
|
|
|
|
|
100
|
$mp =~ s/__FONTSIZE1__/$opts->{fonts}[1][1]/g; |
|
235
|
2
|
|
|
|
|
123
|
$mp =~ s/__FONTSIZE2__/$opts->{fonts}[2][1]/g; |
|
236
|
2
|
|
|
|
|
99
|
$mp =~ s/__FONTSIZE3__/$opts->{fonts}[3][1]/g; |
|
237
|
|
|
|
|
|
|
|
|
238
|
2
|
|
|
|
|
110
|
$mp =~ s/__COLOR1__/$opts->{color}[0]/g; |
|
239
|
2
|
|
|
|
|
116
|
$mp =~ s/__COLOR2__/$opts->{color}[1]/g; |
|
240
|
2
|
|
|
|
|
121
|
$mp =~ s/__COLOR3__/$opts->{color}[2]/g; |
|
241
|
|
|
|
|
|
|
|
|
242
|
2
|
|
|
|
|
373
|
print $fh $mp; |
|
243
|
|
|
|
|
|
|
|
|
244
|
2
|
|
|
|
|
26
|
$self->{$which} = { |
|
245
|
|
|
|
|
|
|
which => $which, |
|
246
|
|
|
|
|
|
|
base => $basewhich, |
|
247
|
|
|
|
|
|
|
fh => $fh, |
|
248
|
|
|
|
|
|
|
ab => 0, |
|
249
|
|
|
|
|
|
|
inn => 0, |
|
250
|
|
|
|
|
|
|
}; |
|
251
|
|
|
|
|
|
|
} |
|
252
|
|
|
|
|
|
|
|
|
253
|
1
|
|
|
|
|
2
|
my $fhd; |
|
254
|
1
|
50
|
|
|
|
90
|
unless (open $fhd, '>', catfile($dir, "$base.tex")) { |
|
255
|
0
|
|
|
|
|
0
|
warn $!; |
|
256
|
0
|
|
|
|
|
0
|
return; |
|
257
|
|
|
|
|
|
|
} |
|
258
|
|
|
|
|
|
|
|
|
259
|
1
|
|
|
|
|
3
|
my $texd = $TEXD; |
|
260
|
1
|
|
|
|
|
10
|
$texd =~ s/__BASE1__/$self->{away}{base}/; |
|
261
|
1
|
|
|
|
|
7
|
$texd =~ s/__BASE2__/$self->{home}{base}/; |
|
262
|
1
|
|
|
|
|
5
|
print $fhd $texd; |
|
263
|
1
|
|
|
|
|
35
|
close $fhd; |
|
264
|
|
|
|
|
|
|
|
|
265
|
1
|
|
|
|
|
3
|
for (qw(home away)) { |
|
266
|
2
|
|
|
|
|
9
|
$self->home_away($_); |
|
267
|
2
|
|
|
|
|
7
|
$self->begin; |
|
268
|
2
|
100
|
|
|
|
11
|
$self->top if /away/; |
|
269
|
2
|
100
|
|
|
|
11
|
$self->bottom if /home/; |
|
270
|
|
|
|
|
|
|
} |
|
271
|
|
|
|
|
|
|
|
|
272
|
1
|
|
|
|
|
8
|
return $self; |
|
273
|
|
|
|
|
|
|
} |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
=item debug([LEVEL]) |
|
277
|
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
Set debug level. 0 is off, 1 shows the commands being executed, 2 shows all |
|
279
|
|
|
|
|
|
|
output. |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
=cut |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
sub debug { |
|
284
|
0
|
|
|
0
|
1
|
0
|
my($self, $level) = @_; |
|
285
|
|
|
|
|
|
|
|
|
286
|
0
|
0
|
|
|
|
0
|
$self->{debug} = $level if defined $level; |
|
287
|
0
|
|
|
|
|
0
|
return $self->{debug}; |
|
288
|
|
|
|
|
|
|
} |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
sub death { |
|
291
|
0
|
|
|
0
|
0
|
0
|
my($self, $err) = @_; |
|
292
|
0
|
|
|
|
|
0
|
printf STDERR "die: $err\nInning: $self->{curr}{inn}, order: $self->{curr}{ab}\n"; |
|
293
|
0
|
|
|
|
|
0
|
exit; |
|
294
|
|
|
|
|
|
|
} |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
=item init(DATA) |
|
298
|
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
The method accepts a single hashref that has all the data needed to |
|
300
|
|
|
|
|
|
|
generate the initial scorecard. You can some of the methods directly on your |
|
301
|
|
|
|
|
|
|
own, but you really don't want to. |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
The hashref contains various root-level string keys: C, C, C, |
|
304
|
|
|
|
|
|
|
C, C, C. Each takes a simple string. |
|
305
|
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
It also takes two hashref keys, C and C. Each works the same way. |
|
307
|
|
|
|
|
|
|
The C key takes the team name, the C key takes the jersey number |
|
308
|
|
|
|
|
|
|
of the starter, the C key takes a hashref of jersey number/name for |
|
309
|
|
|
|
|
|
|
the entire active roster. |
|
310
|
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
The C key takes an arrayref -- in order -- of each starter, with each |
|
312
|
|
|
|
|
|
|
element as an arrayref of [ jersey number, position ]. |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
The position is standard baseball position numbering: 1 P, 2 C, |
|
315
|
|
|
|
|
|
|
3 1B, 4 2B, 5 3B, 6 SS, 7 LF, 8 CF, 9 RF. I use 0 for DH. |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
Players are thus referenced by their jersey number, when making them the |
|
318
|
|
|
|
|
|
|
starter, putting them in the starting lineup, or when adding a new player |
|
319
|
|
|
|
|
|
|
or pitcher. |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
The C key is optional; if present, it is used to determine which |
|
322
|
|
|
|
|
|
|
pitchers are lefties. It takes a simple arrayref listing the jersey numbers |
|
323
|
|
|
|
|
|
|
of the southpaws on the roster. |
|
324
|
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
If not using this module to generate the entire game, but just the initial |
|
326
|
|
|
|
|
|
|
scorecard, then the roster needs only include the players in the starting lineup. |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
=cut |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
sub init { |
|
331
|
1
|
|
|
1
|
1
|
18
|
my($self, $data) = @_; |
|
332
|
|
|
|
|
|
|
|
|
333
|
1
|
|
|
|
|
6
|
for my $which (qw(away home)) { |
|
334
|
2
|
|
|
|
|
4
|
$self->home_away($which); |
|
335
|
|
|
|
|
|
|
|
|
336
|
2
|
|
|
|
|
7
|
$self->team ( $data->{$which}{team} ); |
|
337
|
2
|
|
|
|
|
6
|
$self->date ( $data->{date} ); |
|
338
|
2
|
|
|
|
|
7
|
$self->temp ( $data->{temp} ); |
|
339
|
|
|
|
|
|
|
|
|
340
|
2
|
|
|
|
|
6
|
$self->at ( $data->{at} ); |
|
341
|
2
|
|
|
|
|
7
|
$self->att ( $data->{att} ); |
|
342
|
2
|
|
|
|
|
8
|
$self->scorer( $data->{scorer} ); |
|
343
|
2
|
|
|
|
|
6
|
$self->wind ( $data->{wind} ); |
|
344
|
|
|
|
|
|
|
|
|
345
|
2
|
|
|
|
|
5
|
my $roster = $self->{curr}{roster} = $data->{$which}{roster}; |
|
346
|
2
|
|
|
|
|
6
|
$self->{curr}{lefties} = $data->{$which}{lefties}; |
|
347
|
|
|
|
|
|
|
|
|
348
|
2
|
|
|
|
|
3
|
my $order = 0; |
|
349
|
2
|
|
|
|
|
2
|
for (@{$data->{$which}{lineup}}) { |
|
|
2
|
|
|
|
|
10
|
|
|
350
|
0
|
|
|
|
|
0
|
$self->add_player(++$order, $_->[0], $_->[1]); |
|
351
|
|
|
|
|
|
|
} |
|
352
|
|
|
|
|
|
|
} |
|
353
|
|
|
|
|
|
|
|
|
354
|
1
|
|
|
|
|
3
|
$self->home_away('away'); |
|
355
|
1
|
50
|
|
|
|
3
|
$self->add_pitcher($data->{home}{starter}) if $data->{home}{starter}; |
|
356
|
|
|
|
|
|
|
|
|
357
|
1
|
|
|
|
|
4
|
$self->home_away('home'); |
|
358
|
1
|
50
|
|
|
|
4
|
$self->add_pitcher($data->{away}{starter}) if $data->{away}{starter}; |
|
359
|
|
|
|
|
|
|
} |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
=item generate |
|
363
|
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
The C method takes the Metapost code and generates the PDFs. |
|
365
|
|
|
|
|
|
|
Call this last, after everything has been done to the scorecard. |
|
366
|
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
Calls C for you. |
|
368
|
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
Returns the path to the PDF file. |
|
370
|
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
=cut |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
sub generate { |
|
374
|
1
|
|
|
1
|
1
|
8
|
my($self) = @_; |
|
375
|
1
|
|
|
|
|
5
|
$self->close; |
|
376
|
|
|
|
|
|
|
|
|
377
|
1
|
|
|
|
|
3
|
for (qw(away home)) { |
|
378
|
2
|
|
|
|
|
15
|
my $base = $self->{$_}{base}; |
|
379
|
|
|
|
|
|
|
|
|
380
|
2
|
|
|
|
|
25
|
$self->_run($MPOST, "$base.mp"); |
|
381
|
2
|
|
|
|
|
85
|
$self->_run($MPTOPDF, "$base.0"); |
|
382
|
2
|
|
|
|
|
81
|
$self->_run($PDFTEX, "$base.tex"); |
|
383
|
|
|
|
|
|
|
} |
|
384
|
|
|
|
|
|
|
|
|
385
|
1
|
|
|
|
|
36
|
$self->_run($PDFTEX, "$self->{base}.tex"); |
|
386
|
|
|
|
|
|
|
|
|
387
|
1
|
|
|
|
|
51
|
return catfile($self->{dir}, "$self->{base}.pdf"); |
|
388
|
|
|
|
|
|
|
} |
|
389
|
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
sub _run { |
|
391
|
7
|
|
|
7
|
|
38
|
my($self, $command, $file, $abs) = @_; |
|
392
|
|
|
|
|
|
|
|
|
393
|
7
|
50
|
|
|
|
232
|
unless (chdir $self->{dir}) { |
|
394
|
0
|
|
|
|
|
0
|
die "Can't chdir $self->{dir}: $!"; |
|
395
|
|
|
|
|
|
|
} |
|
396
|
|
|
|
|
|
|
|
|
397
|
7
|
50
|
|
|
|
111
|
my $path = $abs ? $file : catfile($self->{dir}, $file); |
|
398
|
7
|
50
|
|
|
|
30
|
print "==> " if $self->{debug} > 1; |
|
399
|
7
|
50
|
|
|
|
19
|
print "$command $path\n" if $self->{debug}; |
|
400
|
7
|
|
|
|
|
28
|
local $/; |
|
401
|
7
|
|
|
|
|
42204
|
my $output = `$command $path`; |
|
402
|
|
|
|
|
|
|
|
|
403
|
7
|
50
|
|
|
|
122
|
if ($self->{debug} > 1) { |
|
404
|
0
|
0
|
|
|
|
0
|
print "<== $output" if $output; |
|
405
|
0
|
|
|
|
|
0
|
print "\n", ("-" x 73), "\n\n"; |
|
406
|
|
|
|
|
|
|
} |
|
407
|
|
|
|
|
|
|
|
|
408
|
7
|
|
|
|
|
683
|
return $output; |
|
409
|
|
|
|
|
|
|
} |
|
410
|
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
|
|
412
|
|
|
|
|
|
|
=item close |
|
413
|
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
The C method finishes up the Metapost file, and closes it for you. |
|
415
|
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
Do not call this method if you also call C, as that method calls |
|
417
|
|
|
|
|
|
|
this one. Only call this method if you do not wish to generate the PDF files, |
|
418
|
|
|
|
|
|
|
but only want to write out the Metapost file. |
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
=cut |
|
421
|
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
sub close { |
|
423
|
1
|
|
|
1
|
1
|
2
|
my($self) = @_; |
|
424
|
|
|
|
|
|
|
|
|
425
|
1
|
|
|
|
|
2
|
for (qw(away home)) { |
|
426
|
2
|
|
|
|
|
5
|
$self->home_away($_); |
|
427
|
2
|
50
|
|
|
|
6
|
if ($self->{curr}{fh}) { |
|
428
|
2
|
|
|
|
|
5
|
$self->end; |
|
429
|
2
|
|
|
|
|
4
|
$self->output("\nend\n"); |
|
430
|
|
|
|
|
|
|
|
|
431
|
2
|
|
|
|
|
86
|
close $self->{curr}{fh}; |
|
432
|
2
|
|
|
|
|
10
|
delete $self->{curr}{fh}; |
|
433
|
|
|
|
|
|
|
} |
|
434
|
|
|
|
|
|
|
} |
|
435
|
|
|
|
|
|
|
} |
|
436
|
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
=item pdfopen([FILE]) |
|
439
|
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
Opens the PDF (or filename provided) using the program specified in |
|
441
|
|
|
|
|
|
|
C<$OPEN> (default 'open', used by Mac OS X to open the document in the default |
|
442
|
|
|
|
|
|
|
PDF viewer). |
|
443
|
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
=cut |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
sub pdfopen { |
|
447
|
0
|
|
|
0
|
1
|
0
|
my($self, $file) = @_; |
|
448
|
0
|
|
|
|
|
0
|
my $abs = 1; |
|
449
|
0
|
0
|
|
|
|
0
|
if (!$file) { |
|
450
|
0
|
|
|
|
|
0
|
$abs = 0; |
|
451
|
0
|
|
|
|
|
0
|
$file = "$self->{base}.pdf"; |
|
452
|
|
|
|
|
|
|
} |
|
453
|
|
|
|
|
|
|
|
|
454
|
0
|
0
|
|
|
|
0
|
$self->_run($OPEN, $file, $abs) if $OPEN; |
|
455
|
|
|
|
|
|
|
} |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
=item home_away([WHICH]) |
|
459
|
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
Switch which team is home, and which is away. If WHICH then set specifically. |
|
461
|
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
=cut |
|
463
|
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
sub home_away { |
|
465
|
8
|
|
|
8
|
1
|
15
|
my($self, $which) = @_; |
|
466
|
|
|
|
|
|
|
|
|
467
|
8
|
50
|
|
|
|
15
|
if ($which) { |
|
468
|
8
|
|
|
|
|
17
|
$self->{curr} = $self->{$which}; |
|
469
|
|
|
|
|
|
|
$self->{other} = $self->{ |
|
470
|
8
|
100
|
|
|
|
25
|
$which eq 'home' ? 'away' : 'home' |
|
471
|
|
|
|
|
|
|
}; |
|
472
|
|
|
|
|
|
|
} else { |
|
473
|
0
|
|
|
|
|
0
|
($self->{curr}, $self->{other}) = ($self->{other}, $self->{curr}); |
|
474
|
|
|
|
|
|
|
} |
|
475
|
|
|
|
|
|
|
} |
|
476
|
|
|
|
|
|
|
|
|
477
|
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
=back |
|
479
|
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
=head2 Scoring Methods |
|
481
|
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
These are the methods for scoring an actual game. |
|
483
|
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
=head3 Setup Methods |
|
485
|
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
=over 4 |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
=item inn |
|
489
|
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
Call C to start a new half-inning, and to finish the final inning. It |
|
491
|
|
|
|
|
|
|
generates the inning stats. |
|
492
|
|
|
|
|
|
|
|
|
493
|
|
|
|
|
|
|
B: if you go to more than 11 innings, things will break. |
|
494
|
|
|
|
|
|
|
See L. |
|
495
|
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
=cut |
|
497
|
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
sub inn { |
|
499
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
500
|
|
|
|
|
|
|
|
|
501
|
0
|
|
|
|
|
0
|
$self->output("\n\n % inning end\n"); |
|
502
|
|
|
|
|
|
|
|
|
503
|
0
|
|
|
|
|
0
|
my $stats = $self->{curr}{stats}{inning}; |
|
504
|
0
|
0
|
|
|
|
0
|
if ($stats) { |
|
505
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{r} ||= 0), '1/2[(xstart,-150),(xstart+50u,-100+400)]')); |
|
506
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{h} ||= 0), '1/2[(xstart+50u,-150),(xstart+100u,-100+400)]')); |
|
507
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{e} ||= 0), '1/2[(xstart,-200),(xstart+50u,-150+400)]')); |
|
508
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{lb} ||= 0), '1/2[(xstart+50u,-200),(xstart+100u,-150+400)]')); |
|
509
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{bb} ||= 0), '1/2[(xstart,-250),(xstart+50u,-200+400)]')); |
|
510
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{k} ||= 0), '1/2[(xstart+50u,-250),(xstart+100u,-200+400)]')); |
|
511
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{strikes}||0), '1/2[(xstart,-300),(xstart+50u,-250+400)]')); |
|
512
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($stats->{pitches}||0), '1/2[(xstart+50u,-300),(xstart+100u,-250+400)]')); |
|
513
|
|
|
|
|
|
|
|
|
514
|
0
|
|
|
|
|
0
|
$self->output(" draw_inning_end(xstart,ystart,clr);\n\n"); |
|
515
|
|
|
|
|
|
|
} |
|
516
|
|
|
|
|
|
|
|
|
517
|
0
|
|
|
|
|
0
|
$self->output("\n\n % inning start\n"); |
|
518
|
|
|
|
|
|
|
|
|
519
|
0
|
|
|
|
|
0
|
$self->home_away; |
|
520
|
|
|
|
|
|
|
|
|
521
|
0
|
|
|
|
|
0
|
my $inn = $self->{curr}{inn} += 1; |
|
522
|
0
|
0
|
|
|
|
0
|
$self->{_inn_new} = 1 unless $self->{curr}{inn} == 1; |
|
523
|
0
|
|
|
|
|
0
|
$self->{out} = []; |
|
524
|
0
|
|
|
|
|
0
|
$self->{bases} = []; |
|
525
|
0
|
|
0
|
|
|
0
|
$self->{curr}{stats}{inning} = $self->{curr}{stats}{innings}{$inn} ||= {}; |
|
526
|
|
|
|
|
|
|
|
|
527
|
0
|
|
|
|
|
0
|
my $xstart = $self->{curr}{inn} * 100; |
|
528
|
0
|
|
|
|
|
0
|
$self->{curr}{xstart} = $xstart; |
|
529
|
0
|
|
|
|
|
0
|
$self->output(" xstart := $xstart;\n"); |
|
530
|
|
|
|
|
|
|
} |
|
531
|
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
=item ab |
|
534
|
|
|
|
|
|
|
|
|
535
|
|
|
|
|
|
|
Call C to start a new at-bat. B: call C and C |
|
536
|
|
|
|
|
|
|
I calling C. |
|
537
|
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
B: if you have more than 9 batters in an inning, things will break. |
|
539
|
|
|
|
|
|
|
See L. |
|
540
|
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
=cut |
|
542
|
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
sub ab { |
|
544
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
545
|
|
|
|
|
|
|
|
|
546
|
0
|
|
|
|
|
0
|
$self->{curr}{ab} += 1; |
|
547
|
0
|
0
|
|
|
|
0
|
$self->{curr}{ab} = 1 if $self->{curr}{ab} > 9; |
|
548
|
0
|
|
|
|
|
0
|
$self->{pc} = 0; |
|
549
|
|
|
|
|
|
|
|
|
550
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{bf}++; |
|
551
|
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
$self->{curr}{stats}{batter} = $self->{curr}{stats}{batters}{ |
|
553
|
0
|
|
0
|
|
|
0
|
$self->{curr}{lineup}[$self->{curr}{ab}][-1][0] |
|
554
|
|
|
|
|
|
|
} ||= {}; |
|
555
|
|
|
|
|
|
|
|
|
556
|
0
|
|
|
|
|
0
|
my $ystart = 1000 - $self->{curr}{ab} * 100; |
|
557
|
|
|
|
|
|
|
|
|
558
|
0
|
|
|
|
|
0
|
$self->output("\n\n % inning $self->{curr}{inn}, batter $self->{curr}{ab}\n"); |
|
559
|
0
|
|
|
|
|
0
|
$self->output(" ystart := $ystart;\n"); |
|
560
|
0
|
|
|
|
|
0
|
$self->output(" clr := (0,0,0);\n"); |
|
561
|
0
|
|
|
|
|
0
|
$self->output(" set_vars(xstart,ystart);\n"); |
|
562
|
|
|
|
|
|
|
# $self->output(" draw_square(xstart,ystart);\n"); |
|
563
|
0
|
0
|
|
|
|
0
|
$self->output(" draw_inning_start(xstart,ystart,clr);\n") |
|
564
|
|
|
|
|
|
|
if delete $self->{_inn_new}; |
|
565
|
|
|
|
|
|
|
|
|
566
|
0
|
0
|
|
|
|
0
|
if ($self->{curr}{lineupnew}[ $self->{curr}{ab} ]) { |
|
567
|
0
|
|
|
|
|
0
|
$self->{curr}{lineupnew}[ $self->{curr}{ab} ] = 0; |
|
568
|
0
|
|
|
|
|
0
|
$self->output(" draw(new_hitter) withcolor clr;\n"); |
|
569
|
|
|
|
|
|
|
} |
|
570
|
|
|
|
|
|
|
|
|
571
|
0
|
0
|
|
|
|
0
|
if (delete $self->{curr}{pitchernew}) { |
|
572
|
0
|
|
|
|
|
0
|
$self->output(" draw(new_pitcher) withcolor clr;\n"); |
|
573
|
|
|
|
|
|
|
} |
|
574
|
|
|
|
|
|
|
} |
|
575
|
|
|
|
|
|
|
|
|
576
|
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
=item add_player(ORDER, NUMBER, POS [, INN]) |
|
578
|
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
This adds a new player -- with the given jersey number and position -- in the |
|
580
|
|
|
|
|
|
|
given place in the batting order. If you are scoring an actual game, call |
|
581
|
|
|
|
|
|
|
this only at the point the player enters the game. The inning will be figured |
|
582
|
|
|
|
|
|
|
out automatically then. |
|
583
|
|
|
|
|
|
|
|
|
584
|
|
|
|
|
|
|
The player will be added to the lineup list on the left of the card, and |
|
585
|
|
|
|
|
|
|
stats for that lineup position will be added to that player (instead of the |
|
586
|
|
|
|
|
|
|
previous one) from that moment on, and a line will be drawn on the sheet for |
|
587
|
|
|
|
|
|
|
where that player entered. |
|
588
|
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
Call this before you call C (unless the player enters as a pinch runner). |
|
590
|
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
B: if you add more than three batters for a given position, the overflow |
|
592
|
|
|
|
|
|
|
will go to one of the six spots below the nine lineup positions. No stats |
|
593
|
|
|
|
|
|
|
will be printed for them. More than six of those, and the names will not be |
|
594
|
|
|
|
|
|
|
printed either. |
|
595
|
|
|
|
|
|
|
|
|
596
|
|
|
|
|
|
|
=cut |
|
597
|
|
|
|
|
|
|
|
|
598
|
|
|
|
|
|
|
sub add_player { |
|
599
|
0
|
|
|
0
|
1
|
0
|
my($self, $order, $number, $pos, $inn) = @_; |
|
600
|
0
|
|
0
|
|
|
0
|
$inn ||= $self->{curr}{inn} || 1; |
|
|
|
|
0
|
|
|
|
|
|
601
|
|
|
|
|
|
|
|
|
602
|
0
|
|
0
|
|
|
0
|
my $lineup = $self->{curr}{lineup} ||= []; |
|
603
|
0
|
|
0
|
|
|
0
|
my $lineupx = $self->{curr}{lineupx} ||= {}; |
|
604
|
0
|
|
|
|
|
0
|
my $name = $self->{curr}{roster}{$number}; |
|
605
|
|
|
|
|
|
|
|
|
606
|
0
|
|
|
|
|
0
|
my $rep = ''; |
|
607
|
0
|
|
|
|
|
0
|
my $rep2; |
|
608
|
0
|
|
|
|
|
0
|
my $xtra = 0; |
|
609
|
0
|
0
|
|
|
|
0
|
if ($lineup->[$order]) { |
|
610
|
0
|
|
|
|
|
0
|
$rep2 = 1 + @{$lineup->[$order]}; |
|
|
0
|
|
|
|
|
0
|
|
|
611
|
0
|
0
|
|
|
|
0
|
if ($rep2 > 3) { |
|
612
|
0
|
|
|
|
|
0
|
$rep2 = 1 + keys %$lineupx; |
|
613
|
0
|
0
|
|
|
|
0
|
if ($rep2 > 6) { |
|
614
|
0
|
|
|
|
|
0
|
warn "Too many batters\n"; |
|
615
|
|
|
|
|
|
|
} |
|
616
|
0
|
|
|
|
|
0
|
$xtra = 1; |
|
617
|
|
|
|
|
|
|
} |
|
618
|
0
|
|
|
|
|
0
|
$rep = "*$rep2"; |
|
619
|
|
|
|
|
|
|
|
|
620
|
0
|
|
|
|
|
0
|
$self->{curr}{lineupnew}[$order] = 1; |
|
621
|
|
|
|
|
|
|
|
|
622
|
|
|
|
|
|
|
my $curr_batter = $self->{curr}{stats}{batters}{ |
|
623
|
0
|
|
0
|
|
|
0
|
$lineup->[$order][-1][0] |
|
624
|
|
|
|
|
|
|
} ||= {}; |
|
625
|
|
|
|
|
|
|
|
|
626
|
0
|
0
|
0
|
|
|
0
|
if ($self->{curr}{stats}{batter} && |
|
627
|
|
|
|
|
|
|
$self->{curr}{stats}{batter} eq $curr_batter |
|
628
|
|
|
|
|
|
|
) { |
|
629
|
0
|
|
0
|
|
|
0
|
$self->{curr}{stats}{batter} = |
|
630
|
|
|
|
|
|
|
$self->{curr}{stats}{batters}{$number} ||= {}; |
|
631
|
|
|
|
|
|
|
} |
|
632
|
|
|
|
|
|
|
} |
|
633
|
|
|
|
|
|
|
|
|
634
|
0
|
|
|
|
|
0
|
push @{$lineup->[$order]}, [ $number, $pos, $inn ]; |
|
|
0
|
|
|
|
|
0
|
|
|
635
|
0
|
0
|
|
|
|
0
|
$lineupx->{$number} = $order if $xtra; |
|
636
|
|
|
|
|
|
|
|
|
637
|
0
|
0
|
|
|
|
0
|
my $ystart = 1000 - ($xtra ? 10 : $order) * 100; |
|
638
|
0
|
|
|
|
|
0
|
my $x = '100-iposwidth'; |
|
639
|
0
|
|
|
|
|
0
|
my $y = "$ystart+100u-100u/3$rep"; |
|
640
|
0
|
|
|
|
|
0
|
my $dir = 'urt'; |
|
641
|
|
|
|
|
|
|
|
|
642
|
0
|
0
|
0
|
|
|
0
|
if (!$rep2 || $rep2 <= 6) { |
|
643
|
0
|
0
|
|
|
|
0
|
if ($xtra) { |
|
644
|
0
|
|
|
|
|
0
|
my $name2 = "$name ($inn)"; |
|
645
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($order, 'sf'), '-224u', "92u-(($rep2-1)*100u/3)")); |
|
646
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($name2), "$x*2-namewidth", $y, $dir)); |
|
647
|
|
|
|
|
|
|
} else { |
|
648
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($name), "$x*2-namewidth", $y, $dir)); |
|
649
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($inn), $x, $y, $dir)); |
|
650
|
|
|
|
|
|
|
} |
|
651
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($number), "$x*3-namewidth", $y, $dir)); |
|
652
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($pos), "$x*2", $y, $dir)); |
|
653
|
|
|
|
|
|
|
} |
|
654
|
|
|
|
|
|
|
} |
|
655
|
|
|
|
|
|
|
|
|
656
|
|
|
|
|
|
|
=item add_pitcher(NUMBER, [, INN]) |
|
657
|
|
|
|
|
|
|
|
|
658
|
|
|
|
|
|
|
This adds a new pitcher -- with the given jersey number -- to the scorecard. |
|
659
|
|
|
|
|
|
|
If you are scoring an actual game, call this only at the point the pitcher |
|
660
|
|
|
|
|
|
|
enters the game. The inning will be figured out automatically then. |
|
661
|
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
The pitcher will be added to the lineup list on the left of the card, and |
|
663
|
|
|
|
|
|
|
stats for pitching will be added to that pitcher (instead of the |
|
664
|
|
|
|
|
|
|
previous one) from that moment on, and a line will be drawn on the sheet for |
|
665
|
|
|
|
|
|
|
where that pitcher entered. |
|
666
|
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
Call this before you call C. |
|
668
|
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
B: if you add more than six pitchers, the module will die. |
|
670
|
|
|
|
|
|
|
See L. |
|
671
|
|
|
|
|
|
|
|
|
672
|
|
|
|
|
|
|
=cut |
|
673
|
|
|
|
|
|
|
|
|
674
|
|
|
|
|
|
|
sub add_pitcher { |
|
675
|
0
|
|
|
0
|
1
|
0
|
my($self, $number, $inn) = @_; |
|
676
|
0
|
|
0
|
|
|
0
|
$inn ||= $self->{curr}{inn} || 1; |
|
|
|
|
0
|
|
|
|
|
|
677
|
|
|
|
|
|
|
|
|
678
|
0
|
|
|
|
|
0
|
$self->{curr}{pitcher} = $number; |
|
679
|
0
|
|
0
|
|
|
0
|
$self->{curr}{stats}{pitcher} = $self->{other}{stats}{pitchers}{$number} ||= {}; |
|
680
|
|
|
|
|
|
|
|
|
681
|
0
|
|
0
|
|
|
0
|
my $lineup = $self->{other}{plineup} ||= []; |
|
682
|
0
|
|
|
|
|
0
|
my $name = $self->{other}{roster}{$number}; |
|
683
|
|
|
|
|
|
|
|
|
684
|
0
|
|
|
|
|
0
|
my $rep = ''; |
|
685
|
0
|
|
|
|
|
0
|
my $xstart = 100; |
|
686
|
0
|
0
|
|
|
|
0
|
if (@$lineup) { |
|
687
|
0
|
|
|
|
|
0
|
my $rep2 = 1 + @$lineup; |
|
688
|
0
|
0
|
|
|
|
0
|
if ($rep2 > 10) { |
|
|
|
0
|
|
|
|
|
|
|
689
|
0
|
|
|
|
|
0
|
die "fixme!"; |
|
690
|
|
|
|
|
|
|
} elsif ($rep2 > 5) { |
|
691
|
0
|
|
|
|
|
0
|
$rep2 -= 5; |
|
692
|
0
|
|
|
|
|
0
|
$xstart = '905+100u*(2/3)'; |
|
693
|
|
|
|
|
|
|
} |
|
694
|
0
|
|
|
|
|
0
|
$rep = "*$rep2"; |
|
695
|
0
|
|
|
|
|
0
|
$self->{curr}{pitchernew} = 1; |
|
696
|
|
|
|
|
|
|
} |
|
697
|
|
|
|
|
|
|
|
|
698
|
0
|
|
|
|
|
0
|
push @$lineup, [ $number, $inn ]; |
|
699
|
|
|
|
|
|
|
|
|
700
|
0
|
|
|
|
|
0
|
my $lr; |
|
701
|
0
|
0
|
|
|
|
0
|
if ($self->{other}{lefties}) { |
|
702
|
0
|
0
|
|
|
|
0
|
$lr = (grep { $_ == $number } @{$self->{other}{lefties}}) |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
703
|
|
|
|
|
|
|
? 'L' |
|
704
|
|
|
|
|
|
|
: 'R'; |
|
705
|
|
|
|
|
|
|
} |
|
706
|
|
|
|
|
|
|
|
|
707
|
0
|
|
|
|
|
0
|
my $ystart = -200; |
|
708
|
0
|
|
|
|
|
0
|
my $x = "$xstart-iposwidth"; |
|
709
|
0
|
|
|
|
|
0
|
my $y = "$ystart+100u-100u/3$rep-100u/3"; |
|
710
|
0
|
|
|
|
|
0
|
my $dir = 'urt'; |
|
711
|
|
|
|
|
|
|
|
|
712
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($name), "$x*2-namewidth", $y, $dir)); |
|
713
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($number), "$x*3-namewidth", $y, $dir)); |
|
714
|
0
|
0
|
|
|
|
0
|
$self->output(_label(_btex($lr), "$x*2+8", $y, $dir)) if $lr; |
|
715
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($inn), $x, $y, $dir)); |
|
716
|
|
|
|
|
|
|
} |
|
717
|
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
=back |
|
719
|
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
=head3 At-Bat Methods |
|
721
|
|
|
|
|
|
|
|
|
722
|
|
|
|
|
|
|
These methods will draw in the at-bat graphic for the current at-bat, |
|
723
|
|
|
|
|
|
|
and will also keep track of stats for later drawing (per-inning stats, |
|
724
|
|
|
|
|
|
|
per-batter stats, and game totals). |
|
725
|
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
B: At-bats do not progress the way they would in a game. You put in |
|
727
|
|
|
|
|
|
|
all of the information for a given at-bat in that at-bat before moving on |
|
728
|
|
|
|
|
|
|
to the next. For example, if a runner reaches on a walk, and then is hit |
|
729
|
|
|
|
|
|
|
home by a home run, you would mark the walk, then that the runner advanced home, |
|
730
|
|
|
|
|
|
|
before moving on to the next at-bat. |
|
731
|
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
=over 4 |
|
734
|
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
=item play_ball(TEXT[, TEAMS]) |
|
736
|
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
C is a convenience method for handling input as text instead of |
|
738
|
|
|
|
|
|
|
method calls (internally, it converts the text to method calls). |
|
739
|
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
The first token on each line is the method call, and the rest are arguments |
|
741
|
|
|
|
|
|
|
to the method call. |
|
742
|
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
Shorthands include 'p' for C, 'bb' 'ibb' and 'hp' for C |
|
744
|
|
|
|
|
|
|
by BB/IBB/HBP, and '-E' for C. Any other tokens that are not |
|
745
|
|
|
|
|
|
|
method names are C. |
|
746
|
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
Example: |
|
748
|
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
$s->inn; |
|
750
|
|
|
|
|
|
|
$s->ab; |
|
751
|
|
|
|
|
|
|
$s->pitches(qw(b s b s b)); |
|
752
|
|
|
|
|
|
|
$s->out('!K'); |
|
753
|
|
|
|
|
|
|
$s->ab; |
|
754
|
|
|
|
|
|
|
$s->pitches(qw(b b b)); |
|
755
|
|
|
|
|
|
|
$s->reach('bb'); |
|
756
|
|
|
|
|
|
|
$s->advance(2); |
|
757
|
|
|
|
|
|
|
$s->ab; |
|
758
|
|
|
|
|
|
|
$s->hit(1, 'l'); |
|
759
|
|
|
|
|
|
|
|
|
760
|
|
|
|
|
|
|
Is equivalent to: |
|
761
|
|
|
|
|
|
|
|
|
762
|
|
|
|
|
|
|
$s->play_ball(<<'EOT'); |
|
763
|
|
|
|
|
|
|
inn |
|
764
|
|
|
|
|
|
|
ab |
|
765
|
|
|
|
|
|
|
p b s b s b |
|
766
|
|
|
|
|
|
|
!K |
|
767
|
|
|
|
|
|
|
ab |
|
768
|
|
|
|
|
|
|
p b b b |
|
769
|
|
|
|
|
|
|
bb |
|
770
|
|
|
|
|
|
|
-> 2 |
|
771
|
|
|
|
|
|
|
ab |
|
772
|
|
|
|
|
|
|
hit 1 l |
|
773
|
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
EOT |
|
775
|
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
Prefixing a method name with 'ha' will call C for that method |
|
777
|
|
|
|
|
|
|
(useful for adding new players, such as 'ha add_player 9 3 8' to add a |
|
778
|
|
|
|
|
|
|
player #3 to center field in the ninth spot for the fielding team, as |
|
779
|
|
|
|
|
|
|
doing it without 'ha' would make the change for the team at bat). |
|
780
|
|
|
|
|
|
|
|
|
781
|
|
|
|
|
|
|
You can also put data for C in the text, at the top. Include any |
|
782
|
|
|
|
|
|
|
of the "root-level" strings, e.g.: |
|
783
|
|
|
|
|
|
|
|
|
784
|
|
|
|
|
|
|
scorer Pudge |
|
785
|
|
|
|
|
|
|
date 2004-10-24, 20:05-23:25 |
|
786
|
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
After those, add the string 'away' or 'home', with the team name following; |
|
788
|
|
|
|
|
|
|
then 'starter' with the starer's number; then the string 'lineup' followed by |
|
789
|
|
|
|
|
|
|
the lineup data: |
|
790
|
|
|
|
|
|
|
|
|
791
|
|
|
|
|
|
|
away Boston Red Sox |
|
792
|
|
|
|
|
|
|
starter 32 |
|
793
|
|
|
|
|
|
|
lineup |
|
794
|
|
|
|
|
|
|
18 8 |
|
795
|
|
|
|
|
|
|
44 6 |
|
796
|
|
|
|
|
|
|
24 7 |
|
797
|
|
|
|
|
|
|
|
|
798
|
|
|
|
|
|
|
Then put the other string ('home'), followed by the data for that team. To |
|
799
|
|
|
|
|
|
|
complete the data, pass in a hashref with the team name (exactly the same |
|
800
|
|
|
|
|
|
|
as included following the string 'home' or 'away') as the key to a hashref, |
|
801
|
|
|
|
|
|
|
and the 'roster' / 'lefties' keys filled out (just as in C). |
|
802
|
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
See the F script and F files for an example. |
|
804
|
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
=cut |
|
806
|
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
sub play_ball { |
|
808
|
0
|
|
|
0
|
1
|
0
|
my($self, $game, $data) = @_; |
|
809
|
|
|
|
|
|
|
|
|
810
|
0
|
|
|
|
|
0
|
my @lines = grep { $_ } |
|
|
0
|
|
|
|
|
0
|
|
|
811
|
0
|
|
|
|
|
0
|
map { s/^\s+//s; s/\s+$//s; $_ } |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
812
|
0
|
|
|
|
|
0
|
grep { !/^\s*#/ } |
|
813
|
|
|
|
|
|
|
split /\n/, $game; |
|
814
|
|
|
|
|
|
|
|
|
815
|
0
|
0
|
|
|
|
0
|
if ($game =~ /\n__INIT__\n/) { |
|
816
|
0
|
|
|
|
|
0
|
my %init; |
|
817
|
|
|
|
|
|
|
|
|
818
|
0
|
|
|
|
|
0
|
while (my $l = shift @lines) { |
|
819
|
0
|
0
|
|
|
|
0
|
last if $l =~ /^__INIT__$/; |
|
820
|
|
|
|
|
|
|
|
|
821
|
0
|
|
|
|
|
0
|
my @w = split /\s+/, $l, 2; |
|
822
|
0
|
0
|
|
|
|
0
|
if ($w[0] =~ /^(?:date|temp|at|att|scorer|wind)$/) { |
|
|
|
0
|
|
|
|
|
|
|
823
|
0
|
|
|
|
|
0
|
$init{$w[0]} = $w[1]; |
|
824
|
|
|
|
|
|
|
|
|
825
|
|
|
|
|
|
|
} elsif ($w[0] =~ /^(home|away)$/) { |
|
826
|
0
|
|
0
|
|
|
0
|
my $team = $init{$1} ||= $data->{teams}{$w[1]}; |
|
827
|
0
|
|
|
|
|
0
|
$team->{team} = $w[1]; |
|
828
|
|
|
|
|
|
|
|
|
829
|
0
|
|
|
|
|
0
|
TEAM: while (my $l2 = shift @lines) { |
|
830
|
0
|
|
|
|
|
0
|
my @w2 = split /\t/, $l2; |
|
831
|
0
|
0
|
|
|
|
0
|
if ($w2[0] eq 'starter') { |
|
|
|
0
|
|
|
|
|
|
|
832
|
0
|
|
|
|
|
0
|
$team->{starter} = $w2[1]; |
|
833
|
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
} elsif ($w2[0] eq 'lineup') { |
|
835
|
0
|
|
|
|
|
0
|
while (my $l3 = shift @lines) { |
|
836
|
0
|
|
|
|
|
0
|
my @w3 = split /\s+/, $l3; |
|
837
|
0
|
0
|
|
|
|
0
|
if ($w3[0] !~ /^\d/) { |
|
838
|
0
|
|
|
|
|
0
|
unshift @lines, $l3; |
|
839
|
0
|
|
|
|
|
0
|
last TEAM; |
|
840
|
|
|
|
|
|
|
} |
|
841
|
0
|
|
|
|
|
0
|
push @{$team->{lineup}}, [$w3[0], $w3[1]]; |
|
|
0
|
|
|
|
|
0
|
|
|
842
|
|
|
|
|
|
|
} |
|
843
|
|
|
|
|
|
|
} |
|
844
|
|
|
|
|
|
|
} |
|
845
|
|
|
|
|
|
|
} |
|
846
|
|
|
|
|
|
|
|
|
847
|
|
|
|
|
|
|
} |
|
848
|
|
|
|
|
|
|
|
|
849
|
0
|
|
|
|
|
0
|
$self->init(\%init); |
|
850
|
|
|
|
|
|
|
} |
|
851
|
|
|
|
|
|
|
|
|
852
|
0
|
|
|
|
|
0
|
while (my $l = shift @lines) { |
|
853
|
0
|
0
|
|
|
|
0
|
last if $l =~ /^__GAME__$/; |
|
854
|
0
|
|
|
|
|
0
|
my @w = quotewords('\s+', 0, $l); |
|
855
|
0
|
|
|
|
|
0
|
my $m = shift @w; |
|
856
|
|
|
|
|
|
|
|
|
857
|
0
|
|
|
|
|
0
|
my $ha; |
|
858
|
0
|
0
|
|
|
|
0
|
if ($m eq 'ha') { |
|
859
|
0
|
|
|
|
|
0
|
$ha = 1; |
|
860
|
0
|
|
|
|
|
0
|
$m = shift @w; |
|
861
|
0
|
|
|
|
|
0
|
$self->home_away; |
|
862
|
|
|
|
|
|
|
} |
|
863
|
|
|
|
|
|
|
|
|
864
|
0
|
0
|
|
|
|
0
|
next unless $m; |
|
865
|
|
|
|
|
|
|
|
|
866
|
0
|
0
|
|
|
|
0
|
$m = 'tout' if $m eq 'to'; |
|
867
|
0
|
0
|
|
|
|
0
|
$m = 'reach' if $m eq 'r'; |
|
868
|
0
|
0
|
|
|
|
0
|
$m = 'advance' if $m eq '->'; |
|
869
|
0
|
0
|
|
|
|
0
|
$m = 'pitches' if $m eq 'p'; |
|
870
|
0
|
0
|
|
|
|
0
|
if ($m eq 'pitches') { |
|
871
|
0
|
|
|
|
|
0
|
@w = map { split // } @w; |
|
|
0
|
|
|
|
|
0
|
|
|
872
|
|
|
|
|
|
|
} |
|
873
|
|
|
|
|
|
|
|
|
874
|
0
|
0
|
|
|
|
0
|
if ($m =~ /^(i?bb|hp|fc)$/i) { |
|
875
|
0
|
|
|
|
|
0
|
unshift @w, $m; |
|
876
|
0
|
|
|
|
|
0
|
$m = 'reach'; |
|
877
|
|
|
|
|
|
|
} |
|
878
|
|
|
|
|
|
|
|
|
879
|
0
|
0
|
|
|
|
0
|
unless ($self->can($m)) { |
|
880
|
0
|
|
|
|
|
0
|
$m =~ s/^(\D+)/\U$1/; |
|
881
|
0
|
|
|
|
|
0
|
unshift @w, $m; |
|
882
|
0
|
|
|
|
|
0
|
$m = 'out'; |
|
883
|
|
|
|
|
|
|
} |
|
884
|
|
|
|
|
|
|
|
|
885
|
0
|
|
|
|
|
0
|
$self->$m(@w); |
|
886
|
0
|
0
|
|
|
|
0
|
$self->home_away if $ha; |
|
887
|
|
|
|
|
|
|
} |
|
888
|
|
|
|
|
|
|
} |
|
889
|
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
|
|
892
|
|
|
|
|
|
|
=item pitches(PITCHES) |
|
893
|
|
|
|
|
|
|
|
|
894
|
|
|
|
|
|
|
C records the individual pitches of the at-bat (except for the one |
|
895
|
|
|
|
|
|
|
that generates an out or puts the ball in play). It takes a list of strings, |
|
896
|
|
|
|
|
|
|
each string representing a pitch. Each pitch can be one of C, C, or C. |
|
897
|
|
|
|
|
|
|
|
|
898
|
|
|
|
|
|
|
This puts the pitch markers in the at-bat graphic, and also increments counts |
|
899
|
|
|
|
|
|
|
for the stat drawing later. |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
=cut |
|
902
|
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
sub pitches { |
|
904
|
0
|
|
|
0
|
1
|
0
|
my($self, @pitches) = @_; |
|
905
|
0
|
|
|
|
|
0
|
my($s, $b, $f) = (0, 0, 0); |
|
906
|
|
|
|
|
|
|
|
|
907
|
0
|
|
|
|
|
0
|
for (@pitches) { |
|
908
|
0
|
0
|
0
|
|
|
0
|
if (/s/i || (/f/i && $s < 2)) { |
|
|
|
0
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
909
|
0
|
|
|
|
|
0
|
$self->strike(++$s); |
|
910
|
|
|
|
|
|
|
} elsif (/f/i) { |
|
911
|
0
|
|
|
|
|
0
|
$self->foul(++$f); |
|
912
|
|
|
|
|
|
|
} elsif (/b/i) { |
|
913
|
0
|
|
|
|
|
0
|
$self->ball(++$b); |
|
914
|
|
|
|
|
|
|
} |
|
915
|
|
|
|
|
|
|
} |
|
916
|
|
|
|
|
|
|
} |
|
917
|
|
|
|
|
|
|
|
|
918
|
|
|
|
|
|
|
sub ball { |
|
919
|
0
|
|
|
0
|
0
|
0
|
my($self, $num) = @_; |
|
920
|
0
|
|
|
|
|
0
|
my $pc = $self->pc; |
|
921
|
|
|
|
|
|
|
|
|
922
|
0
|
0
|
|
|
|
0
|
$self->death("Ball $num?") if $num > 3; |
|
923
|
|
|
|
|
|
|
|
|
924
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($pc, 'sf'), 'ball' . _num($num))); |
|
925
|
|
|
|
|
|
|
} |
|
926
|
|
|
|
|
|
|
|
|
927
|
|
|
|
|
|
|
sub strike { |
|
928
|
0
|
|
|
0
|
0
|
0
|
my($self, $num) = @_; |
|
929
|
0
|
|
|
|
|
0
|
my $pc = $self->pc(1); |
|
930
|
|
|
|
|
|
|
|
|
931
|
0
|
0
|
|
|
|
0
|
$self->death("Strike $num?") if $num > 2; |
|
932
|
|
|
|
|
|
|
|
|
933
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($pc, 'sf'), 'strike' . _num($num))); |
|
934
|
|
|
|
|
|
|
} |
|
935
|
|
|
|
|
|
|
|
|
936
|
|
|
|
|
|
|
sub foul { |
|
937
|
0
|
|
|
0
|
0
|
0
|
my($self, $num) = @_; |
|
938
|
0
|
|
|
|
|
0
|
my $pc = $self->pc(1); |
|
939
|
|
|
|
|
|
|
|
|
940
|
0
|
0
|
|
|
|
0
|
$self->output(_label(_btex('x', 'sf'), 'foul' . _num($num))) |
|
941
|
|
|
|
|
|
|
unless $num > 4; |
|
942
|
|
|
|
|
|
|
} |
|
943
|
|
|
|
|
|
|
|
|
944
|
|
|
|
|
|
|
sub pc { |
|
945
|
0
|
|
|
0
|
0
|
0
|
my($self, $strike) = @_; |
|
946
|
|
|
|
|
|
|
|
|
947
|
0
|
|
0
|
|
|
0
|
my $pitcher = $self->{curr}{stats}{pitcher} ||= {}; |
|
948
|
0
|
|
0
|
|
|
0
|
my $inning = $self->{curr}{stats}{inning} ||= {}; |
|
949
|
|
|
|
|
|
|
|
|
950
|
0
|
|
|
|
|
0
|
for ($pitcher, $inning) { |
|
951
|
0
|
|
|
|
|
0
|
$_->{pitches}++; |
|
952
|
0
|
0
|
|
|
|
0
|
$_->{strikes}++ if $strike; |
|
953
|
|
|
|
|
|
|
} |
|
954
|
|
|
|
|
|
|
|
|
955
|
0
|
|
|
|
|
0
|
return ++$self->{pc}; |
|
956
|
|
|
|
|
|
|
} |
|
957
|
|
|
|
|
|
|
|
|
958
|
|
|
|
|
|
|
=item hit(BASES [, WHERE, LABEL]) |
|
959
|
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
C denotes a hit of BASES bases, to WHERE. |
|
961
|
|
|
|
|
|
|
|
|
962
|
|
|
|
|
|
|
WHERE is an optional string, for where the ball left the park or where the |
|
963
|
|
|
|
|
|
|
fielder recovered it, with these options: |
|
964
|
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
infield: |
|
966
|
|
|
|
|
|
|
il left |
|
967
|
|
|
|
|
|
|
ic center |
|
968
|
|
|
|
|
|
|
ir right |
|
969
|
|
|
|
|
|
|
|
|
970
|
|
|
|
|
|
|
outfield: |
|
971
|
|
|
|
|
|
|
l left |
|
972
|
|
|
|
|
|
|
lc left center |
|
973
|
|
|
|
|
|
|
cl center left |
|
974
|
|
|
|
|
|
|
cr center right |
|
975
|
|
|
|
|
|
|
rc right center |
|
976
|
|
|
|
|
|
|
r right |
|
977
|
|
|
|
|
|
|
|
|
978
|
|
|
|
|
|
|
LABEL is an optional label to put on the way to first base. |
|
979
|
|
|
|
|
|
|
|
|
980
|
|
|
|
|
|
|
=cut |
|
981
|
|
|
|
|
|
|
|
|
982
|
|
|
|
|
|
|
sub hit { |
|
983
|
0
|
|
|
0
|
1
|
0
|
my($self, $bases, $where, $label) = @_; |
|
984
|
0
|
|
0
|
|
|
0
|
$where ||= ''; |
|
985
|
|
|
|
|
|
|
|
|
986
|
0
|
0
|
|
|
|
0
|
if ($bases eq 'U') { |
|
|
|
0
|
|
|
|
|
|
|
987
|
0
|
|
|
|
|
0
|
$self->rbi; |
|
988
|
0
|
|
|
|
|
0
|
$bases = 4; |
|
989
|
|
|
|
|
|
|
} elsif ($bases == 4) { |
|
990
|
0
|
|
|
|
|
0
|
$self->rbi; |
|
991
|
0
|
|
|
|
|
0
|
$self->er; |
|
992
|
|
|
|
|
|
|
} |
|
993
|
|
|
|
|
|
|
|
|
994
|
0
|
|
|
|
|
0
|
$self->reach($bases, $bases); |
|
995
|
|
|
|
|
|
|
|
|
996
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{h}++; |
|
997
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{$bases}++; |
|
998
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{h}++; |
|
999
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{$bases}++; |
|
1000
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{h}++; |
|
1001
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{$bases}++; |
|
1002
|
|
|
|
|
|
|
|
|
1003
|
0
|
0
|
|
|
|
0
|
my $foo = $bases == 4 ? 'hr' : 'of'; |
|
1004
|
0
|
0
|
|
|
|
0
|
my $loc = lc $where eq 'il' ? 'ifleft' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1005
|
|
|
|
|
|
|
lc $where eq 'ic' ? 'ifcenter' : |
|
1006
|
|
|
|
|
|
|
lc $where eq 'ir' ? 'ifright' : |
|
1007
|
|
|
|
|
|
|
|
|
1008
|
|
|
|
|
|
|
lc $where eq 'l' ? "${foo}left" : |
|
1009
|
|
|
|
|
|
|
lc $where eq 'lc' ? "${foo}leftc" : |
|
1010
|
|
|
|
|
|
|
lc $where eq 'cl' ? "${foo}centerl" : |
|
1011
|
|
|
|
|
|
|
lc $where eq 'cr' ? "${foo}centerr" : |
|
1012
|
|
|
|
|
|
|
lc $where eq 'rc' ? "${foo}rightc" : |
|
1013
|
|
|
|
|
|
|
lc $where eq 'r' ? "${foo}right" : |
|
1014
|
|
|
|
|
|
|
''; |
|
1015
|
|
|
|
|
|
|
|
|
1016
|
0
|
0
|
|
|
|
0
|
$self->output(" draw($loc) withcolor clr;\n") if $loc; |
|
1017
|
0
|
0
|
|
|
|
0
|
$self->output(_label(_btex($label, 'sf'), 'wayfirst', '', 'lrt')) if $label; |
|
1018
|
|
|
|
|
|
|
|
|
1019
|
|
|
|
|
|
|
} |
|
1020
|
|
|
|
|
|
|
|
|
1021
|
|
|
|
|
|
|
=item reach(LABEL [, BASES]) |
|
1022
|
|
|
|
|
|
|
|
|
1023
|
|
|
|
|
|
|
C denotes reaching base by a method other than a hit. |
|
1024
|
|
|
|
|
|
|
LABEL is the method of reaching, and BASES is optional number |
|
1025
|
|
|
|
|
|
|
of bases reached (default is, of course, 1). |
|
1026
|
|
|
|
|
|
|
|
|
1027
|
|
|
|
|
|
|
Special LABELs include 'bb', 'ibb', 'hp', 'K', 'SAC', and 'SF'. |
|
1028
|
|
|
|
|
|
|
'K' is special in that it is added to the stats totals; the others |
|
1029
|
|
|
|
|
|
|
are not included as at-bats; and 'bb', 'ibb', and 'hp' are counted as balls, |
|
1030
|
|
|
|
|
|
|
instead of strikes. |
|
1031
|
|
|
|
|
|
|
|
|
1032
|
|
|
|
|
|
|
=cut |
|
1033
|
|
|
|
|
|
|
|
|
1034
|
|
|
|
|
|
|
sub reach { |
|
1035
|
0
|
|
|
0
|
1
|
0
|
my($self, $label, $bases) = @_; |
|
1036
|
|
|
|
|
|
|
|
|
1037
|
0
|
0
|
|
|
|
0
|
if ($label =~ /^i?bb$/i) { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1038
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{bb}++; |
|
1039
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{bb}++; |
|
1040
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{lc $label}++; |
|
1041
|
|
|
|
|
|
|
} elsif ($label =~ /^hb?p/i) { |
|
1042
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{hp}++; |
|
1043
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{hp}++; |
|
1044
|
|
|
|
|
|
|
} elsif (uc $label eq 'K') { |
|
1045
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{k}++; |
|
1046
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{k}++; |
|
1047
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{k}++; |
|
1048
|
|
|
|
|
|
|
} |
|
1049
|
|
|
|
|
|
|
|
|
1050
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{lb}++; |
|
1051
|
|
|
|
|
|
|
|
|
1052
|
0
|
0
|
|
|
|
0
|
if ($label =~ /^(?:hb?p|i?bb)$/i) { |
|
|
|
0
|
|
|
|
|
|
|
1053
|
0
|
|
|
|
|
0
|
$self->pc; |
|
1054
|
|
|
|
|
|
|
} elsif ($label =~ /^(?:SAC|SF)/i) { |
|
1055
|
0
|
|
|
|
|
0
|
$self->pc(1); |
|
1056
|
|
|
|
|
|
|
} else { |
|
1057
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{ab}++; |
|
1058
|
0
|
|
|
|
|
0
|
$self->pc(1); |
|
1059
|
|
|
|
|
|
|
} |
|
1060
|
|
|
|
|
|
|
|
|
1061
|
0
|
|
0
|
|
|
0
|
$bases ||= 1; |
|
1062
|
0
|
|
|
|
|
0
|
$self->base($bases); |
|
1063
|
0
|
0
|
|
|
|
0
|
$self->run if $bases == 4; |
|
1064
|
|
|
|
|
|
|
|
|
1065
|
0
|
0
|
|
|
|
0
|
$bases = $bases == 4 ? 'homerun' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1066
|
|
|
|
|
|
|
$bases == 3 ? 'triple' : |
|
1067
|
|
|
|
|
|
|
$bases == 2 ? 'double' : |
|
1068
|
|
|
|
|
|
|
'single'; |
|
1069
|
|
|
|
|
|
|
|
|
1070
|
0
|
0
|
|
|
|
0
|
my $circle = $label =~ /^i?bb$/i ? 'bb' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1071
|
|
|
|
|
|
|
$label =~ /^hb?p/i ? 'hp' : |
|
1072
|
|
|
|
|
|
|
$label eq 4 ? 'hr' : |
|
1073
|
|
|
|
|
|
|
$label eq 3 ? 'threeb' : |
|
1074
|
|
|
|
|
|
|
$label eq 2 ? 'twob' : |
|
1075
|
|
|
|
|
|
|
$label eq 1 ? 'oneb' : |
|
1076
|
|
|
|
|
|
|
''; |
|
1077
|
|
|
|
|
|
|
|
|
1078
|
0
|
0
|
|
|
|
0
|
if (lc($label) eq 'ibb') { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1079
|
0
|
|
|
|
|
0
|
$self->output(" draw_ibb(bb, clr);\n"); |
|
1080
|
|
|
|
|
|
|
} elsif ($circle) { |
|
1081
|
0
|
|
|
|
|
0
|
$self->output(" draw_circle($circle, clr);\n"); |
|
1082
|
|
|
|
|
|
|
} elsif ($label) { |
|
1083
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($label, 'sf'), 'wayfirst', '', 'lrt')); |
|
1084
|
|
|
|
|
|
|
} |
|
1085
|
0
|
|
|
|
|
0
|
$self->output(" draw($bases) withcolor clr;\n"); |
|
1086
|
|
|
|
|
|
|
} |
|
1087
|
|
|
|
|
|
|
|
|
1088
|
|
|
|
|
|
|
sub base { |
|
1089
|
0
|
|
|
0
|
0
|
0
|
my($self, $base) = @_; |
|
1090
|
|
|
|
|
|
|
|
|
1091
|
0
|
|
|
|
|
0
|
my $runner = $self->{curr}{ab}; |
|
1092
|
0
|
|
|
|
|
0
|
my $bases = $self->{bases}; |
|
1093
|
|
|
|
|
|
|
|
|
1094
|
0
|
0
|
|
|
|
0
|
if ($base) { |
|
1095
|
0
|
|
|
|
|
0
|
$bases->[$runner] = $base; |
|
1096
|
|
|
|
|
|
|
} |
|
1097
|
0
|
|
|
|
|
0
|
return $bases->[$runner]; |
|
1098
|
|
|
|
|
|
|
|
|
1099
|
|
|
|
|
|
|
} |
|
1100
|
|
|
|
|
|
|
|
|
1101
|
|
|
|
|
|
|
|
|
1102
|
|
|
|
|
|
|
=item out(LABEL) |
|
1103
|
|
|
|
|
|
|
|
|
1104
|
|
|
|
|
|
|
C records that the at-bat resulted in an out. LABEL is the way in |
|
1105
|
|
|
|
|
|
|
which the out was recorded, e.g., F8, 4-3, SF7, SAC4-3, DP6-4-3, K, and so on. |
|
1106
|
|
|
|
|
|
|
|
|
1107
|
|
|
|
|
|
|
SF and SAC outs will not be recorded as official at-bats. The string |
|
1108
|
|
|
|
|
|
|
'!K' is used to denote a strikeout looking. |
|
1109
|
|
|
|
|
|
|
|
|
1110
|
|
|
|
|
|
|
If you use SF, SAC, DP, K, and !K, then the stats for those can be properly |
|
1111
|
|
|
|
|
|
|
tabulated at the end. |
|
1112
|
|
|
|
|
|
|
|
|
1113
|
|
|
|
|
|
|
=cut |
|
1114
|
|
|
|
|
|
|
|
|
1115
|
|
|
|
|
|
|
sub out { |
|
1116
|
0
|
|
|
0
|
1
|
0
|
my($self, $label) = @_; |
|
1117
|
|
|
|
|
|
|
|
|
1118
|
0
|
0
|
|
|
|
0
|
if ($label =~ /^!?K/i) { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1119
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{k}++; |
|
1120
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{k}++; |
|
1121
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{k}++; |
|
1122
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{ab}++; |
|
1123
|
|
|
|
|
|
|
} elsif ($label =~ /^SAC/i) { |
|
1124
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{sac}++; |
|
1125
|
|
|
|
|
|
|
} elsif ($label =~ /^SF/i) { |
|
1126
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{sf}++; |
|
1127
|
|
|
|
|
|
|
} elsif ($label =~ /^DP/i) { |
|
1128
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{dp}++; |
|
1129
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{ab}++; |
|
1130
|
|
|
|
|
|
|
} else { |
|
1131
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{ab}++; |
|
1132
|
|
|
|
|
|
|
} |
|
1133
|
|
|
|
|
|
|
|
|
1134
|
0
|
0
|
|
|
|
0
|
if (uc $label eq '!K') { |
|
|
|
0
|
|
|
|
|
|
|
1135
|
0
|
|
|
|
|
0
|
$self->output(" draw_strikeout_looking(outlabel, clr);\n"); |
|
1136
|
|
|
|
|
|
|
} elsif ($label) { |
|
1137
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($label), 'outlabel')); |
|
1138
|
|
|
|
|
|
|
} |
|
1139
|
|
|
|
|
|
|
|
|
1140
|
0
|
|
|
|
|
0
|
$self->pc(1); |
|
1141
|
0
|
|
|
|
|
0
|
$self->_out; |
|
1142
|
|
|
|
|
|
|
} |
|
1143
|
|
|
|
|
|
|
|
|
1144
|
|
|
|
|
|
|
sub _out { |
|
1145
|
0
|
|
|
0
|
|
0
|
my($self, $num, $pitcher) = @_; |
|
1146
|
0
|
0
|
|
|
|
0
|
unless ($num) { |
|
1147
|
0
|
|
|
|
|
0
|
for (1..3) { |
|
1148
|
0
|
0
|
|
|
|
0
|
$num = $_, last if !$self->{out}[$_]; |
|
1149
|
|
|
|
|
|
|
} |
|
1150
|
|
|
|
|
|
|
} |
|
1151
|
|
|
|
|
|
|
|
|
1152
|
0
|
0
|
|
|
|
0
|
$self->death('No out number?') unless $num; |
|
1153
|
|
|
|
|
|
|
|
|
1154
|
0
|
|
|
|
|
0
|
$self->{out}[$num] = 1; |
|
1155
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{outs}++; |
|
1156
|
|
|
|
|
|
|
|
|
1157
|
0
|
0
|
|
|
|
0
|
if ($pitcher) { |
|
1158
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$pitcher}{outs}++; |
|
1159
|
|
|
|
|
|
|
} else { |
|
1160
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{outs}++; |
|
1161
|
|
|
|
|
|
|
} |
|
1162
|
|
|
|
|
|
|
|
|
1163
|
0
|
|
|
|
|
0
|
my $out = _num($num); |
|
1164
|
0
|
|
|
|
|
0
|
$self->output(" draw_out_$out(xstart,ystart,clr);\n"); |
|
1165
|
|
|
|
|
|
|
} |
|
1166
|
|
|
|
|
|
|
|
|
1167
|
|
|
|
|
|
|
|
|
1168
|
|
|
|
|
|
|
=item tout(BASE, LABEL [, NUM, PITCHER]) |
|
1169
|
|
|
|
|
|
|
|
|
1170
|
|
|
|
|
|
|
C records that the runner was thrown out at BASE. |
|
1171
|
|
|
|
|
|
|
LABEL is the way in which the out was recorded, e.g., CS2-6, FC, DP. |
|
1172
|
|
|
|
|
|
|
|
|
1173
|
|
|
|
|
|
|
PITCHER is the number of the pitcher who gets the out (for IP) if not the |
|
1174
|
|
|
|
|
|
|
one that pitched to that batter. |
|
1175
|
|
|
|
|
|
|
|
|
1176
|
|
|
|
|
|
|
It is not necessary to include the base the runner is coming from; that is |
|
1177
|
|
|
|
|
|
|
remembered for you. |
|
1178
|
|
|
|
|
|
|
|
|
1179
|
|
|
|
|
|
|
NUM is used in case the out is not in sequential order: e.g., if a batter |
|
1180
|
|
|
|
|
|
|
walks, then the next batter strikes out, then the first batter is caught stealing, |
|
1181
|
|
|
|
|
|
|
without NUM set to 2, the code would guess that it is the first out, since the |
|
1182
|
|
|
|
|
|
|
at-bat is earlier. By setting NUM to 2 for the throwout, the strikeout will |
|
1183
|
|
|
|
|
|
|
be set to out 1, and the next out after that will be out 3. |
|
1184
|
|
|
|
|
|
|
|
|
1185
|
|
|
|
|
|
|
If you use CS for LABEL, then the stats for that can be properly tabulated at |
|
1186
|
|
|
|
|
|
|
the end. |
|
1187
|
|
|
|
|
|
|
|
|
1188
|
|
|
|
|
|
|
=cut |
|
1189
|
|
|
|
|
|
|
|
|
1190
|
|
|
|
|
|
|
sub tout { |
|
1191
|
0
|
|
|
0
|
1
|
0
|
my($self, $base2, $label, $num, $pitcher) = @_; |
|
1192
|
|
|
|
|
|
|
|
|
1193
|
0
|
|
0
|
|
|
0
|
my $base1 = $self->base || 0; |
|
1194
|
|
|
|
|
|
|
|
|
1195
|
0
|
|
|
|
|
0
|
$self->_out($num, $pitcher); |
|
1196
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{lb}--; |
|
1197
|
0
|
0
|
|
|
|
0
|
$self->{curr}{stats}{game}{cs}++ if $label =~ /^CS/i; |
|
1198
|
|
|
|
|
|
|
|
|
1199
|
0
|
|
|
|
|
0
|
$self->waybase($label, $base2); |
|
1200
|
|
|
|
|
|
|
|
|
1201
|
0
|
0
|
|
|
|
0
|
my $to = $base2 == 4 ? 'to_' : 'cs_'; |
|
1202
|
0
|
0
|
|
|
|
0
|
my $base = $base2 > $base1+1 |
|
1203
|
|
|
|
|
|
|
? _base($base1) . _base($base2) |
|
1204
|
|
|
|
|
|
|
: _base($base2); |
|
1205
|
|
|
|
|
|
|
|
|
1206
|
0
|
|
|
|
|
0
|
$self->output(" draw($to$base);\n"); |
|
1207
|
|
|
|
|
|
|
} |
|
1208
|
|
|
|
|
|
|
|
|
1209
|
|
|
|
|
|
|
|
|
1210
|
|
|
|
|
|
|
=item advance(BASE [, LABEL]) |
|
1211
|
|
|
|
|
|
|
|
|
1212
|
|
|
|
|
|
|
C advances a runner to BASE. LABEL is the optional way in which |
|
1213
|
|
|
|
|
|
|
the runner advanced, e.g., SB. |
|
1214
|
|
|
|
|
|
|
|
|
1215
|
|
|
|
|
|
|
If you advance home (4), a run is recorded for that runner, and is marked as |
|
1216
|
|
|
|
|
|
|
earned for the pitcher. To advance home for an unearned run, use 'U' instead |
|
1217
|
|
|
|
|
|
|
of '4'. |
|
1218
|
|
|
|
|
|
|
|
|
1219
|
|
|
|
|
|
|
|
|
1220
|
|
|
|
|
|
|
and EARNED is true, the run is earned. |
|
1221
|
|
|
|
|
|
|
|
|
1222
|
|
|
|
|
|
|
It is not necessary to include the base the runner is coming from; that is |
|
1223
|
|
|
|
|
|
|
remembered for you. |
|
1224
|
|
|
|
|
|
|
|
|
1225
|
|
|
|
|
|
|
If you use SB, then the stats for that can be properly tabulated at the end. |
|
1226
|
|
|
|
|
|
|
|
|
1227
|
|
|
|
|
|
|
=cut |
|
1228
|
|
|
|
|
|
|
|
|
1229
|
|
|
|
|
|
|
sub advance { |
|
1230
|
0
|
|
|
0
|
1
|
0
|
my($self, $base2, $label) = @_; |
|
1231
|
|
|
|
|
|
|
|
|
1232
|
0
|
|
|
|
|
0
|
my $unearned; |
|
1233
|
0
|
0
|
|
|
|
0
|
if (uc $base2 eq 'U') { |
|
1234
|
0
|
|
|
|
|
0
|
$unearned = 1; |
|
1235
|
0
|
|
|
|
|
0
|
$base2 = 4; |
|
1236
|
|
|
|
|
|
|
} |
|
1237
|
|
|
|
|
|
|
|
|
1238
|
0
|
|
|
|
|
0
|
my $base1 = $self->base; |
|
1239
|
0
|
0
|
|
|
|
0
|
$self->waybase($label, $base1+1) if $label; |
|
1240
|
0
|
|
|
|
|
0
|
$self->base($base2); |
|
1241
|
0
|
0
|
|
|
|
0
|
$self->run if $base2 == 4; |
|
1242
|
0
|
0
|
0
|
|
|
0
|
$self->er if $base2 == 4 && !$unearned; |
|
1243
|
|
|
|
|
|
|
|
|
1244
|
0
|
0
|
0
|
|
|
0
|
if ($label && $label =~ /^SB/i) { |
|
1245
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{sb}++; |
|
1246
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{sb}++; |
|
1247
|
|
|
|
|
|
|
} |
|
1248
|
|
|
|
|
|
|
|
|
1249
|
0
|
|
|
|
|
0
|
for ($base1, $base2) { |
|
1250
|
0
|
|
|
|
|
0
|
$_ = _base($_); |
|
1251
|
|
|
|
|
|
|
} |
|
1252
|
|
|
|
|
|
|
|
|
1253
|
0
|
|
|
|
|
0
|
$self->output(" draw($base1$base2);\n"); |
|
1254
|
|
|
|
|
|
|
} |
|
1255
|
|
|
|
|
|
|
|
|
1256
|
|
|
|
|
|
|
|
|
1257
|
|
|
|
|
|
|
=back |
|
1258
|
|
|
|
|
|
|
|
|
1259
|
|
|
|
|
|
|
=head3 At-Bat Stat Methods |
|
1260
|
|
|
|
|
|
|
|
|
1261
|
|
|
|
|
|
|
These methods add additional stats (and in some cases, graphics) that are |
|
1262
|
|
|
|
|
|
|
not easily decipherable from the other at-bat events, so we need them |
|
1263
|
|
|
|
|
|
|
explicitly. |
|
1264
|
|
|
|
|
|
|
|
|
1265
|
|
|
|
|
|
|
=over 4 |
|
1266
|
|
|
|
|
|
|
|
|
1267
|
|
|
|
|
|
|
=item rbi([RBIS]) |
|
1268
|
|
|
|
|
|
|
|
|
1269
|
|
|
|
|
|
|
Add RBI number of RBIs to current batter's totals (default is 1). |
|
1270
|
|
|
|
|
|
|
Don't include RBIs added by a hit(4), as that is added automatically. |
|
1271
|
|
|
|
|
|
|
|
|
1272
|
|
|
|
|
|
|
=cut |
|
1273
|
|
|
|
|
|
|
|
|
1274
|
|
|
|
|
|
|
sub rbi { |
|
1275
|
0
|
|
|
0
|
1
|
0
|
my($self, $rbis) = @_; |
|
1276
|
0
|
|
0
|
|
|
0
|
$rbis ||= 1; |
|
1277
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{rbi} += $rbis; |
|
1278
|
0
|
|
|
|
|
0
|
for (1 .. $rbis) { |
|
1279
|
0
|
|
|
|
|
0
|
my $rbi = 'rbi' . _num($_); |
|
1280
|
0
|
|
|
|
|
0
|
$self->output(" draw_dot($rbi, clr);\n"); |
|
1281
|
|
|
|
|
|
|
} |
|
1282
|
|
|
|
|
|
|
} |
|
1283
|
|
|
|
|
|
|
|
|
1284
|
|
|
|
|
|
|
# called automatically when runner advances home |
|
1285
|
|
|
|
|
|
|
|
|
1286
|
|
|
|
|
|
|
sub run { |
|
1287
|
0
|
|
|
0
|
0
|
0
|
my($self) = @_; |
|
1288
|
|
|
|
|
|
|
|
|
1289
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{r}++; |
|
1290
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{batter}{r}++; |
|
1291
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{r}++; |
|
1292
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{lb}--; |
|
1293
|
|
|
|
|
|
|
|
|
1294
|
0
|
|
|
|
|
0
|
$self->output(" draw_dot(rundot, clr);\n"); |
|
1295
|
|
|
|
|
|
|
} |
|
1296
|
|
|
|
|
|
|
|
|
1297
|
|
|
|
|
|
|
sub er { |
|
1298
|
0
|
|
|
0
|
0
|
0
|
my($self) = @_; |
|
1299
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{er}++; |
|
1300
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{er}++; |
|
1301
|
|
|
|
|
|
|
} |
|
1302
|
|
|
|
|
|
|
|
|
1303
|
|
|
|
|
|
|
|
|
1304
|
|
|
|
|
|
|
|
|
1305
|
|
|
|
|
|
|
=item error(POSITION) |
|
1306
|
|
|
|
|
|
|
|
|
1307
|
|
|
|
|
|
|
Notes that an error was committed by the player at POSITION. |
|
1308
|
|
|
|
|
|
|
(Keeping track of error by POSITION not yet implemented, but feel free to |
|
1309
|
|
|
|
|
|
|
include it anyway, for when it is implemented.) |
|
1310
|
|
|
|
|
|
|
|
|
1311
|
|
|
|
|
|
|
=cut |
|
1312
|
|
|
|
|
|
|
|
|
1313
|
|
|
|
|
|
|
sub error { |
|
1314
|
0
|
|
|
0
|
1
|
0
|
my($self, $pos) = @_; |
|
1315
|
|
|
|
|
|
|
# XXX not implemented |
|
1316
|
|
|
|
|
|
|
# $self->{other}{stats}{$POSITION}{pb}++; |
|
1317
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{inning}{e}++; |
|
1318
|
|
|
|
|
|
|
} |
|
1319
|
|
|
|
|
|
|
|
|
1320
|
|
|
|
|
|
|
|
|
1321
|
|
|
|
|
|
|
=item balk |
|
1322
|
|
|
|
|
|
|
|
|
1323
|
|
|
|
|
|
|
Notes that there was a balk. |
|
1324
|
|
|
|
|
|
|
|
|
1325
|
|
|
|
|
|
|
=cut |
|
1326
|
|
|
|
|
|
|
|
|
1327
|
|
|
|
|
|
|
sub balk { |
|
1328
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
1329
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{bk}++; |
|
1330
|
|
|
|
|
|
|
} |
|
1331
|
|
|
|
|
|
|
|
|
1332
|
|
|
|
|
|
|
|
|
1333
|
|
|
|
|
|
|
=item wp |
|
1334
|
|
|
|
|
|
|
|
|
1335
|
|
|
|
|
|
|
Notes that there was a wild pitch. |
|
1336
|
|
|
|
|
|
|
|
|
1337
|
|
|
|
|
|
|
=cut |
|
1338
|
|
|
|
|
|
|
|
|
1339
|
|
|
|
|
|
|
sub wp { |
|
1340
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
1341
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{pitcher}{wp}++; |
|
1342
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{wp}++; |
|
1343
|
|
|
|
|
|
|
} |
|
1344
|
|
|
|
|
|
|
|
|
1345
|
|
|
|
|
|
|
|
|
1346
|
|
|
|
|
|
|
=item pb |
|
1347
|
|
|
|
|
|
|
|
|
1348
|
|
|
|
|
|
|
Notes that there was a passed ball. |
|
1349
|
|
|
|
|
|
|
|
|
1350
|
|
|
|
|
|
|
=cut |
|
1351
|
|
|
|
|
|
|
|
|
1352
|
|
|
|
|
|
|
sub pb { |
|
1353
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
1354
|
|
|
|
|
|
|
# XXX not implemented |
|
1355
|
|
|
|
|
|
|
# $self->{other}{stats}{2}{pb}++; |
|
1356
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{pb}++; |
|
1357
|
|
|
|
|
|
|
} |
|
1358
|
|
|
|
|
|
|
|
|
1359
|
|
|
|
|
|
|
|
|
1360
|
|
|
|
|
|
|
=item dp |
|
1361
|
|
|
|
|
|
|
|
|
1362
|
|
|
|
|
|
|
Notes that a double play was executed. Do not use if the batter was out by |
|
1363
|
|
|
|
|
|
|
double play, but only if there was a double play in which the batter was safe, |
|
1364
|
|
|
|
|
|
|
as calling C already records the double play for you. |
|
1365
|
|
|
|
|
|
|
|
|
1366
|
|
|
|
|
|
|
=cut |
|
1367
|
|
|
|
|
|
|
|
|
1368
|
|
|
|
|
|
|
sub dp { |
|
1369
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
1370
|
0
|
|
|
|
|
0
|
$self->{curr}{stats}{game}{dp}++; |
|
1371
|
|
|
|
|
|
|
} |
|
1372
|
|
|
|
|
|
|
|
|
1373
|
|
|
|
|
|
|
|
|
1374
|
|
|
|
|
|
|
=back |
|
1375
|
|
|
|
|
|
|
|
|
1376
|
|
|
|
|
|
|
=head3 At-Bat Label Methods |
|
1377
|
|
|
|
|
|
|
|
|
1378
|
|
|
|
|
|
|
These methods are simply for adding additional labels in the at-bat graphic, |
|
1379
|
|
|
|
|
|
|
for whatever you wish. |
|
1380
|
|
|
|
|
|
|
|
|
1381
|
|
|
|
|
|
|
=over 4 |
|
1382
|
|
|
|
|
|
|
|
|
1383
|
|
|
|
|
|
|
=item waybase(LABEL [, BASE, BIG]) |
|
1384
|
|
|
|
|
|
|
|
|
1385
|
|
|
|
|
|
|
Add label LABEL on the way to BASE. If BASE is excluded, notes it on way |
|
1386
|
|
|
|
|
|
|
to the next base after the one the runner is currently at. |
|
1387
|
|
|
|
|
|
|
|
|
1388
|
|
|
|
|
|
|
=cut |
|
1389
|
|
|
|
|
|
|
|
|
1390
|
|
|
|
|
|
|
sub waybase { |
|
1391
|
0
|
|
|
0
|
1
|
0
|
my($self, $label, $base, $big) = @_; |
|
1392
|
|
|
|
|
|
|
|
|
1393
|
0
|
0
|
|
|
|
0
|
my $size = $big ? 'bigsf' : 'sf'; |
|
1394
|
0
|
|
0
|
|
|
0
|
$base ||= $self->base + 1; |
|
1395
|
|
|
|
|
|
|
|
|
1396
|
0
|
0
|
|
|
|
0
|
my $dir = $base == 4 ? 'lft' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1397
|
|
|
|
|
|
|
$base == 3 ? 'ulft' : |
|
1398
|
|
|
|
|
|
|
$base == 2 ? 'urt' : |
|
1399
|
|
|
|
|
|
|
'lrt'; |
|
1400
|
|
|
|
|
|
|
|
|
1401
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($label, $size), 'way' . _base($base), '', $dir)); |
|
1402
|
|
|
|
|
|
|
} |
|
1403
|
|
|
|
|
|
|
|
|
1404
|
|
|
|
|
|
|
=item atbase(LABEL [, BASE, BIG]) |
|
1405
|
|
|
|
|
|
|
|
|
1406
|
|
|
|
|
|
|
Add label LABEL at BASE. If BASE is excluded, notes it |
|
1407
|
|
|
|
|
|
|
at the base the runner is currently at. |
|
1408
|
|
|
|
|
|
|
|
|
1409
|
|
|
|
|
|
|
=cut |
|
1410
|
|
|
|
|
|
|
|
|
1411
|
|
|
|
|
|
|
sub atbase { |
|
1412
|
0
|
|
|
0
|
1
|
0
|
my($self, $label, $base, $big) = @_; |
|
1413
|
|
|
|
|
|
|
|
|
1414
|
0
|
0
|
|
|
|
0
|
my $size = $big ? 'bigsf' : 'sf'; |
|
1415
|
0
|
|
0
|
|
|
0
|
$base ||= $self->base; |
|
1416
|
|
|
|
|
|
|
|
|
1417
|
0
|
0
|
|
|
|
0
|
my $dir = $base == 4 ? 'bot' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1418
|
|
|
|
|
|
|
$base == 3 ? 'lft' : |
|
1419
|
|
|
|
|
|
|
$base == 2 ? 'top' : |
|
1420
|
|
|
|
|
|
|
'rt'; |
|
1421
|
|
|
|
|
|
|
|
|
1422
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($label, $size), _base($base), '', $dir)); |
|
1423
|
|
|
|
|
|
|
} |
|
1424
|
|
|
|
|
|
|
|
|
1425
|
|
|
|
|
|
|
|
|
1426
|
|
|
|
|
|
|
=back |
|
1427
|
|
|
|
|
|
|
|
|
1428
|
|
|
|
|
|
|
=head2 Stat Totals Methods |
|
1429
|
|
|
|
|
|
|
|
|
1430
|
|
|
|
|
|
|
=over 4 |
|
1431
|
|
|
|
|
|
|
|
|
1432
|
|
|
|
|
|
|
=item win(NUMBER) |
|
1433
|
|
|
|
|
|
|
|
|
1434
|
|
|
|
|
|
|
=item loss(NUMBER) |
|
1435
|
|
|
|
|
|
|
|
|
1436
|
|
|
|
|
|
|
=item save(NUMBER) |
|
1437
|
|
|
|
|
|
|
|
|
1438
|
|
|
|
|
|
|
=item blown_save(NUMBER) |
|
1439
|
|
|
|
|
|
|
|
|
1440
|
|
|
|
|
|
|
NUMBER is the jersey number of the pitcher who got the (win, loss, save, blown save). |
|
1441
|
|
|
|
|
|
|
Call these methods while the pitcher's team is still on the field (while |
|
1442
|
|
|
|
|
|
|
the opposing team is still at bat), any time before the totals are calculated. |
|
1443
|
|
|
|
|
|
|
|
|
1444
|
|
|
|
|
|
|
=cut |
|
1445
|
|
|
|
|
|
|
|
|
1446
|
|
|
|
|
|
|
sub win { |
|
1447
|
0
|
|
|
0
|
1
|
0
|
my($self, $number) = @_; |
|
1448
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$number}{record}{w} = 1; |
|
1449
|
|
|
|
|
|
|
} |
|
1450
|
|
|
|
|
|
|
|
|
1451
|
|
|
|
|
|
|
sub loss { |
|
1452
|
0
|
|
|
0
|
1
|
0
|
my($self, $number) = @_; |
|
1453
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$number}{record}{l} = 1; |
|
1454
|
|
|
|
|
|
|
} |
|
1455
|
|
|
|
|
|
|
|
|
1456
|
|
|
|
|
|
|
sub hold { |
|
1457
|
0
|
|
|
0
|
0
|
0
|
my($self, $number) = @_; |
|
1458
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$number}{record}{h} = 1; |
|
1459
|
|
|
|
|
|
|
} |
|
1460
|
|
|
|
|
|
|
|
|
1461
|
|
|
|
|
|
|
sub save { |
|
1462
|
0
|
|
|
0
|
1
|
0
|
my($self, $number) = @_; |
|
1463
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$number}{record}{'s'} = 1; |
|
1464
|
|
|
|
|
|
|
} |
|
1465
|
|
|
|
|
|
|
|
|
1466
|
|
|
|
|
|
|
sub blown_save { |
|
1467
|
0
|
|
|
0
|
1
|
0
|
my($self, $number) = @_; |
|
1468
|
0
|
|
|
|
|
0
|
$self->{other}{stats}{pitchers}{$number}{record}{bs} = 1; |
|
1469
|
|
|
|
|
|
|
} |
|
1470
|
|
|
|
|
|
|
|
|
1471
|
|
|
|
|
|
|
|
|
1472
|
|
|
|
|
|
|
|
|
1473
|
|
|
|
|
|
|
=item totals |
|
1474
|
|
|
|
|
|
|
|
|
1475
|
|
|
|
|
|
|
This generates the stat totals for the game, batters, and pitchers. Call it after the |
|
1476
|
|
|
|
|
|
|
finall C method call, if you wish to generate the stat totals. |
|
1477
|
|
|
|
|
|
|
|
|
1478
|
|
|
|
|
|
|
=cut |
|
1479
|
|
|
|
|
|
|
|
|
1480
|
|
|
|
|
|
|
sub totals { |
|
1481
|
0
|
|
|
0
|
1
|
0
|
my($self) = @_; |
|
1482
|
|
|
|
|
|
|
|
|
1483
|
0
|
0
|
|
|
|
0
|
return if $self->{_totals}; |
|
1484
|
|
|
|
|
|
|
|
|
1485
|
0
|
|
|
|
|
0
|
for (qw(away home)) { |
|
1486
|
0
|
|
|
|
|
0
|
$self->home_away($_); |
|
1487
|
0
|
|
|
|
|
0
|
$self->_totals; |
|
1488
|
|
|
|
|
|
|
} |
|
1489
|
|
|
|
|
|
|
|
|
1490
|
0
|
|
|
|
|
0
|
$self->{_totals} = 1; |
|
1491
|
|
|
|
|
|
|
} |
|
1492
|
|
|
|
|
|
|
|
|
1493
|
|
|
|
|
|
|
sub _totals { |
|
1494
|
0
|
|
|
0
|
|
0
|
my($self) = @_; |
|
1495
|
|
|
|
|
|
|
|
|
1496
|
0
|
|
|
|
|
0
|
my $game = $self->{curr}{stats}{game}; |
|
1497
|
0
|
|
|
|
|
0
|
my $innings = $self->{curr}{stats}{innings}; |
|
1498
|
0
|
|
|
|
|
0
|
my(%tstats, %pstats); |
|
1499
|
0
|
|
|
|
|
0
|
for my $n (qw(r h e lb bb k strikes pitches)) { |
|
1500
|
0
|
|
0
|
|
|
0
|
$tstats{$n} += $innings->{$_}{$n} ||= 0 for keys %$innings; |
|
1501
|
|
|
|
|
|
|
} |
|
1502
|
|
|
|
|
|
|
|
|
1503
|
0
|
|
|
|
|
0
|
$self->output("\n\n\n %totals\n nudge := 10u;\n"); |
|
1504
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{r}), '1/2[(1200,-150+nudge),(1200+100u/3,-100+400)]')); |
|
1505
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{h}), '1/2[(1200+100u/3,-150),(1200+100u/3*2,-100+400-nudge)]')); |
|
1506
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{e}), '1/2[(1200,-200+nudge),(1200+100u/3,-150+400)]')); |
|
1507
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{lb}), '1/2[(1200+100u/3,-200),(1200+100u/3*2,-150+400-nudge)]')); |
|
1508
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{bb}), '1/2[(1200,-250+nudge),(1200+100u/3,-200+400)]')); |
|
1509
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{k}), '1/2[(1200+100u/3,-250),(1200+100u/3*2,-200+400-nudge)]')); |
|
1510
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{strikes}), '1/2[(1200,-300+nudge),(1200+100u/3,-250+400)]')); |
|
1511
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($tstats{pitches}), '1/2[(1200+100u/3,-300),(1200+100u/3*2,-250+400-nudge)]')); |
|
1512
|
|
|
|
|
|
|
|
|
1513
|
0
|
|
|
|
|
0
|
my $lineup = $self->{curr}{lineup}; |
|
1514
|
0
|
|
|
|
|
0
|
for my $i (0 .. $#$lineup) { |
|
1515
|
0
|
0
|
|
|
|
0
|
next unless $lineup->[$i]; |
|
1516
|
|
|
|
|
|
|
|
|
1517
|
0
|
|
|
|
|
0
|
for my $j (0 .. $#{$lineup->[$i]}) { |
|
|
0
|
|
|
|
|
0
|
|
|
1518
|
0
|
|
|
|
|
0
|
my $bstats = $self->{curr}{stats}{batters}{$lineup->[$i][$j][0]}; |
|
1519
|
0
|
|
|
|
|
0
|
for (qw(ab r h rbi bb k)) { |
|
1520
|
0
|
|
0
|
|
|
0
|
$pstats{$_} += $bstats->{$_} ||= 0; |
|
1521
|
|
|
|
|
|
|
} |
|
1522
|
0
|
0
|
|
|
|
0
|
next if $j > 2; |
|
1523
|
|
|
|
|
|
|
|
|
1524
|
0
|
|
|
|
|
0
|
my $rep = ''; |
|
1525
|
0
|
0
|
|
|
|
0
|
$rep = sprintf('*%d', 1+$j) if $j; |
|
1526
|
|
|
|
|
|
|
|
|
1527
|
0
|
|
|
|
|
0
|
my $ystart = 1000 - $i * 100; |
|
1528
|
0
|
|
|
|
|
0
|
my $x = '1200+10'; |
|
1529
|
0
|
|
|
|
|
0
|
my $y = "$ystart+100u-100u/3$rep"; |
|
1530
|
0
|
|
|
|
|
0
|
my $dir = 'urt'; |
|
1531
|
|
|
|
|
|
|
|
|
1532
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{ab}), $x, $y, $dir)); |
|
1533
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{r}), "$x+(100u/3)", $y, $dir)); |
|
1534
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{h}), "$x+((100u/3)*2)", $y, $dir)); |
|
1535
|
|
|
|
|
|
|
|
|
1536
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{rbi}), "$x+((100u/3)*3)", $y, $dir)); |
|
1537
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{bb}), "$x+((100u/3)*4)", $y, $dir)); |
|
1538
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($bstats->{k}), "$x+((100u/3)*5)", $y, $dir)); |
|
1539
|
|
|
|
|
|
|
} |
|
1540
|
|
|
|
|
|
|
} |
|
1541
|
|
|
|
|
|
|
|
|
1542
|
0
|
|
|
|
|
0
|
my $plineup = $self->{other}{plineup}; |
|
1543
|
0
|
|
|
|
|
0
|
for my $j (0 .. $#$plineup) { |
|
1544
|
0
|
|
|
|
|
0
|
my $kstats = $self->{other}{stats}{pitchers}{$plineup->[$j][0]}; |
|
1545
|
|
|
|
|
|
|
|
|
1546
|
0
|
|
|
|
|
0
|
my $rep = ''; |
|
1547
|
0
|
0
|
|
|
|
0
|
$rep = sprintf('*%d', ($j<5 ? $j+1 : $j-4)) if $j; |
|
|
|
0
|
|
|
|
|
|
|
1548
|
|
|
|
|
|
|
|
|
1549
|
0
|
|
|
|
|
0
|
my $ystart = -200; |
|
1550
|
0
|
0
|
|
|
|
0
|
my $x = $j < 5 ? '100+5' : '900+5+100u*(2/3)'; |
|
1551
|
0
|
|
|
|
|
0
|
my $y = "$ystart+5+100u-100u/3$rep-100u/3"; |
|
1552
|
0
|
|
|
|
|
0
|
my $dir = 'urt'; |
|
1553
|
|
|
|
|
|
|
|
|
1554
|
0
|
|
|
|
|
0
|
my $wls = uc join ',', grep $kstats->{record}{$_}, qw(w l h s bs); |
|
1555
|
0
|
|
0
|
|
|
0
|
my $remainder = ( ($kstats->{outs} ||= 0) % 3) || 0; |
|
1556
|
0
|
|
|
|
|
0
|
$kstats->{ip} = ( ($kstats->{outs} - $remainder) / 3 ) . ".$remainder"; |
|
1557
|
|
|
|
|
|
|
|
|
1558
|
0
|
0
|
|
|
|
0
|
$self->output(_label(_btex($wls), $x, $y, $dir)) if $wls; |
|
1559
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{bf}||0), "$x+(100u/3)", $y, $dir)); |
|
1560
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{ip}||0), "$x+((100u/3)*2)", $y, $dir)); |
|
1561
|
|
|
|
|
|
|
|
|
1562
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{h}||0), "$x+((100u/3)*3)", $y, $dir)); |
|
1563
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{r}||0), "$x+((100u/3)*4)", $y, $dir)); |
|
1564
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{er}||0), "$x+((100u/3)*5)", $y, $dir)); |
|
1565
|
|
|
|
|
|
|
|
|
1566
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{bb}||0), "$x+((100u/3)*6)", $y, $dir)); |
|
1567
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{k}||0), "$x+((100u/3)*7)", $y, $dir)); |
|
1568
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{ibb}||0), "$x+((100u/3)*8)", $y, $dir)); |
|
1569
|
|
|
|
|
|
|
|
|
1570
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{hp}||0), "$x+((100u/3)*9)", $y, $dir)); |
|
1571
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{bk}||0), "$x+((100u/3)*10)", $y, $dir)); |
|
1572
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{wp}||0), "$x+((100u/3)*11)", $y, $dir)); |
|
1573
|
|
|
|
|
|
|
|
|
1574
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{4}||0), "$x+((100u/3)*12)", $y, $dir)); |
|
1575
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{strikes}||0), "$x+((100u/3)*13)", $y, $dir)); |
|
1576
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($kstats->{pitches}||0), "$x+((100u/3)*14)", $y, $dir)); |
|
1577
|
|
|
|
|
|
|
} |
|
1578
|
|
|
|
|
|
|
|
|
1579
|
0
|
|
|
|
|
0
|
$self->output(" nudge := 5u;\n"); |
|
1580
|
|
|
|
|
|
|
|
|
1581
|
0
|
|
|
|
|
0
|
my $xstart = '1200+100u/3*2+40u'; |
|
1582
|
0
|
|
|
|
|
0
|
my $ystart = '+25u+nudge'; |
|
1583
|
0
|
|
|
|
|
0
|
my $dir = 'urt'; |
|
1584
|
|
|
|
|
|
|
|
|
1585
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{1}||0, 'sf'), $xstart, "-150+200$ystart", $dir)); |
|
1586
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{2}||0, 'sf'), $xstart, "-175+200$ystart", $dir)); |
|
1587
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{3}||0, 'sf'), $xstart, "-200+200$ystart", $dir)); |
|
1588
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{4}||0, 'sf'), $xstart, "-225+200$ystart", $dir)); |
|
1589
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{sf}||0, 'sf'), $xstart, "-250+200$ystart", $dir)); |
|
1590
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{sac}||0, 'sf'), $xstart, "-275+200$ystart", $dir)); |
|
1591
|
|
|
|
|
|
|
|
|
1592
|
0
|
|
|
|
|
0
|
$xstart = '1200+100u/3*2+150u'; |
|
1593
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{dp}||0, 'sf'), $xstart, "-150+200$ystart", $dir)); |
|
1594
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{hp}||0, 'sf'), $xstart, "-175+200$ystart", $dir)); |
|
1595
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{wp}||0, 'sf'), $xstart, "-200+200$ystart", $dir)); |
|
1596
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{pb}||0, 'sf'), $xstart, "-225+200$ystart", $dir)); |
|
1597
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{sb}||0, 'sf'), $xstart, "-250+200$ystart", $dir)); |
|
1598
|
0
|
|
0
|
|
|
0
|
$self->output(_label(_btex($game->{cs}||0, 'sf'), $xstart, "-275+200$ystart", $dir)); |
|
1599
|
|
|
|
|
|
|
|
|
1600
|
|
|
|
|
|
|
|
|
1601
|
0
|
0
|
|
|
|
0
|
my @nums = map { $_ || 0 } ($pstats{ab}, $pstats{bb}, $game->{hp}, $game->{sac}, $game->{sf}); |
|
|
0
|
|
|
|
|
0
|
|
|
1602
|
0
|
|
|
|
|
0
|
my $numt = 0; |
|
1603
|
0
|
|
|
|
|
0
|
$numt += $_ for @nums; |
|
1604
|
0
|
|
|
|
|
0
|
my $nums = sprintf('%s~~=~~%s', join('+', @nums), $numt); |
|
1605
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($nums, 'sf', 1), '1200+100u/3*2+110u', '-300+200+25u+nudge', $dir)); |
|
1606
|
|
|
|
|
|
|
|
|
1607
|
0
|
0
|
|
|
|
0
|
@nums = map { $_ || 0 } ($tstats{r}, $tstats{lb}, $game->{outs}); |
|
|
0
|
|
|
|
|
0
|
|
|
1608
|
0
|
|
|
|
|
0
|
$numt = 0; |
|
1609
|
0
|
|
|
|
|
0
|
$numt += $_ for @nums; |
|
1610
|
0
|
|
|
|
|
0
|
$nums = sprintf('%s~~=~~%s', join('+', @nums), $numt); |
|
1611
|
0
|
|
|
|
|
0
|
$self->output(_label(_btex($nums, 'sf', 1), '1200+100u/3*2+110u', '-300+200+nudge', $dir)); |
|
1612
|
|
|
|
|
|
|
} |
|
1613
|
|
|
|
|
|
|
|
|
1614
|
|
|
|
|
|
|
|
|
1615
|
|
|
|
|
|
|
|
|
1616
|
|
|
|
|
|
|
=back |
|
1617
|
|
|
|
|
|
|
|
|
1618
|
|
|
|
|
|
|
=cut |
|
1619
|
|
|
|
|
|
|
|
|
1620
|
|
|
|
|
|
|
|
|
1621
|
|
|
|
|
|
|
#### misc output methods |
|
1622
|
|
|
|
|
|
|
|
|
1623
|
|
|
|
|
|
|
sub output { |
|
1624
|
26
|
|
|
26
|
0
|
47
|
my($self, @lines) = @_; |
|
1625
|
26
|
|
|
|
|
45
|
my $fh = $self->{curr}{fh}; |
|
1626
|
26
|
|
|
|
|
53
|
print $fh @lines; |
|
1627
|
|
|
|
|
|
|
} |
|
1628
|
|
|
|
|
|
|
|
|
1629
|
|
|
|
|
|
|
sub begin { |
|
1630
|
2
|
|
|
2
|
0
|
3
|
my($self) = @_; |
|
1631
|
2
|
|
|
|
|
7
|
$self->output("beginfig(0);\n"); |
|
1632
|
2
|
|
|
|
|
4
|
$self->output(" draw_full_scorecard;\n\n"); |
|
1633
|
2
|
|
|
|
|
5
|
$self->output(" clr:=scoring;\n\n"); |
|
1634
|
|
|
|
|
|
|
} |
|
1635
|
|
|
|
|
|
|
|
|
1636
|
|
|
|
|
|
|
|
|
1637
|
|
|
|
|
|
|
sub end { |
|
1638
|
2
|
|
|
2
|
0
|
3
|
my($self) = @_; |
|
1639
|
2
|
|
|
|
|
5
|
$self->output("endfig;\n"); |
|
1640
|
|
|
|
|
|
|
} |
|
1641
|
|
|
|
|
|
|
|
|
1642
|
|
|
|
|
|
|
sub top { |
|
1643
|
1
|
|
|
1
|
0
|
3
|
my($self) = @_; |
|
1644
|
1
|
|
|
|
|
3
|
$self->output(_label(_btex('TOP'), 1431, 1020)); |
|
1645
|
|
|
|
|
|
|
} |
|
1646
|
|
|
|
|
|
|
|
|
1647
|
|
|
|
|
|
|
sub bottom { |
|
1648
|
1
|
|
|
1
|
0
|
2
|
my($self) = @_; |
|
1649
|
1
|
|
|
|
|
6
|
$self->output(_label(_btex('BOTTOM'), 1433, 1020)); |
|
1650
|
|
|
|
|
|
|
} |
|
1651
|
|
|
|
|
|
|
|
|
1652
|
|
|
|
|
|
|
# label(btex {\bigsf Team} etex rotated 90, (1416,130)) withcolor clr; |
|
1653
|
|
|
|
|
|
|
# label(btex {\bigsf FP} etex rotated 90, (1416,614)) withcolor clr; |
|
1654
|
|
|
|
|
|
|
# label(btex {\bigsf Temp} etex rotated 90, (1416,900)) withcolor clr; |
|
1655
|
|
|
|
|
|
|
# label(btex {\bigsf At} etex rotated 90, (1448,142)) withcolor clr; |
|
1656
|
|
|
|
|
|
|
# label(btex {\bigsf Att} etex rotated 90, (1448,450)) withcolor clr; |
|
1657
|
|
|
|
|
|
|
# label(btex {\bigsf Scorer} etex rotated 90, (1448,600)) withcolor clr; |
|
1658
|
|
|
|
|
|
|
|
|
1659
|
|
|
|
|
|
|
# label(btex {\bigsf Team:} etex rotated 90, (1420,-50)) withcolor clr; |
|
1660
|
|
|
|
|
|
|
# label(btex {\bigsf Date:} etex rotated 90, (1420,600)) withcolor clr; |
|
1661
|
|
|
|
|
|
|
# label(btex {\bigsf At:} etex rotated 90, (1450,-50)) withcolor clr; |
|
1662
|
|
|
|
|
|
|
# label(btex {\bigsf Scorer:} etex rotated 90, (1450,600)) withcolor clr; |
|
1663
|
|
|
|
|
|
|
|
|
1664
|
|
|
|
|
|
|
sub team { |
|
1665
|
2
|
|
|
2
|
0
|
4
|
my($self, $info) = @_; |
|
1666
|
2
|
50
|
|
|
|
9
|
$self->output(_label(_btex($info), 1416+13, 280, 'lft', 'rotated 90')) |
|
1667
|
|
|
|
|
|
|
if $info; |
|
1668
|
|
|
|
|
|
|
} |
|
1669
|
|
|
|
|
|
|
|
|
1670
|
|
|
|
|
|
|
sub date { |
|
1671
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1672
|
2
|
50
|
|
|
|
9
|
$self->output(_label(_btex($info), 1416+13, 714, 'lft', 'rotated 90')) |
|
1673
|
|
|
|
|
|
|
if $info; |
|
1674
|
|
|
|
|
|
|
} |
|
1675
|
|
|
|
|
|
|
|
|
1676
|
|
|
|
|
|
|
sub temp { |
|
1677
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1678
|
2
|
50
|
|
|
|
7
|
$self->output(_label(_btex($info), 1416+13, 940, 'lft', 'rotated 90')) |
|
1679
|
|
|
|
|
|
|
if $info; |
|
1680
|
|
|
|
|
|
|
} |
|
1681
|
|
|
|
|
|
|
|
|
1682
|
|
|
|
|
|
|
sub at { |
|
1683
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1684
|
2
|
50
|
|
|
|
8
|
$self->output(_label(_btex($info), 1448+13, 292, 'lft', 'rotated 90')) |
|
1685
|
|
|
|
|
|
|
if $info; |
|
1686
|
|
|
|
|
|
|
} |
|
1687
|
|
|
|
|
|
|
|
|
1688
|
|
|
|
|
|
|
sub att { |
|
1689
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1690
|
2
|
50
|
|
|
|
7
|
$self->output(_label(_btex($info), 1448+13, 500, 'lft', 'rotated 90')) |
|
1691
|
|
|
|
|
|
|
if $info; |
|
1692
|
|
|
|
|
|
|
} |
|
1693
|
|
|
|
|
|
|
|
|
1694
|
|
|
|
|
|
|
sub scorer { |
|
1695
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1696
|
2
|
50
|
|
|
|
6
|
$self->output(_label(_btex($info), 1448+13, 700, 'lft', 'rotated 90')) |
|
1697
|
|
|
|
|
|
|
if $info; |
|
1698
|
|
|
|
|
|
|
} |
|
1699
|
|
|
|
|
|
|
|
|
1700
|
|
|
|
|
|
|
sub wind { |
|
1701
|
2
|
|
|
2
|
0
|
3
|
my($self, $info) = @_; |
|
1702
|
2
|
50
|
|
|
|
11
|
$self->output(_label(_btex($info), 1448+13, 940, 'lft', 'rotated 90')) |
|
1703
|
|
|
|
|
|
|
if $info; |
|
1704
|
|
|
|
|
|
|
} |
|
1705
|
|
|
|
|
|
|
|
|
1706
|
|
|
|
|
|
|
|
|
1707
|
|
|
|
|
|
|
#### helper functions |
|
1708
|
|
|
|
|
|
|
|
|
1709
|
|
|
|
|
|
|
sub _num { |
|
1710
|
0
|
|
|
0
|
|
0
|
my($num) = @_; |
|
1711
|
0
|
0
|
|
|
|
0
|
return $num == 4 ? 'four' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1712
|
|
|
|
|
|
|
$num == 3 ? 'three' : |
|
1713
|
|
|
|
|
|
|
$num == 2 ? 'two' : |
|
1714
|
|
|
|
|
|
|
'one'; |
|
1715
|
|
|
|
|
|
|
} |
|
1716
|
|
|
|
|
|
|
|
|
1717
|
|
|
|
|
|
|
sub _base { |
|
1718
|
0
|
|
|
0
|
|
0
|
my($num) = @_; |
|
1719
|
0
|
0
|
|
|
|
0
|
return $num == 4 ? 'home' : |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
1720
|
|
|
|
|
|
|
$num == 3 ? 'third' : |
|
1721
|
|
|
|
|
|
|
$num == 2 ? 'second' : |
|
1722
|
|
|
|
|
|
|
'first'; |
|
1723
|
|
|
|
|
|
|
} |
|
1724
|
|
|
|
|
|
|
|
|
1725
|
|
|
|
|
|
|
sub _label { |
|
1726
|
16
|
|
|
16
|
|
25
|
my($label, $x, $y, $direction, $extra) = @_; |
|
1727
|
|
|
|
|
|
|
|
|
1728
|
16
|
|
100
|
|
|
37
|
$direction ||= ''; |
|
1729
|
16
|
|
66
|
|
|
52
|
$direction &&= ".$direction"; |
|
1730
|
|
|
|
|
|
|
|
|
1731
|
16
|
|
100
|
|
|
32
|
$extra ||= ''; |
|
1732
|
16
|
|
66
|
|
|
50
|
$extra &&= " $extra"; |
|
1733
|
|
|
|
|
|
|
|
|
1734
|
16
|
50
|
33
|
|
|
87
|
my $xy = defined $y && length $y ? "($x,$y)" : $x; |
|
1735
|
|
|
|
|
|
|
|
|
1736
|
16
|
|
|
|
|
63
|
return " label$direction($label$extra, $xy) withcolor clr;\n"; |
|
1737
|
|
|
|
|
|
|
} |
|
1738
|
|
|
|
|
|
|
|
|
1739
|
|
|
|
|
|
|
sub _btex { |
|
1740
|
16
|
|
|
16
|
|
25
|
my($string, $font, $lit) = @_; |
|
1741
|
16
|
|
50
|
|
|
52
|
$font ||= 'bigsf'; |
|
1742
|
16
|
50
|
33
|
|
|
56
|
if (!defined $string || !length $string) { |
|
1743
|
|
|
|
|
|
|
# print join "|", caller(0), "\n"; |
|
1744
|
0
|
|
|
|
|
0
|
return; |
|
1745
|
|
|
|
|
|
|
} |
|
1746
|
|
|
|
|
|
|
|
|
1747
|
16
|
50
|
|
|
|
35
|
unless ($lit) { |
|
1748
|
16
|
|
|
|
|
24
|
$string =~ s/\\/--BACKSLASH--/g; |
|
1749
|
16
|
|
|
|
|
16
|
$string =~ s/{/--LBRACE--/g; |
|
1750
|
16
|
|
|
|
|
18
|
$string =~ s/}/--RBRACE--/g; |
|
1751
|
|
|
|
|
|
|
|
|
1752
|
16
|
|
|
|
|
23
|
$string =~ s/( [\#\$\%\&\_\{\}] )/\\$1/gx; |
|
1753
|
16
|
|
|
|
|
20
|
$string =~ s/( [\^~] )/\\$1\{\}/gx; |
|
1754
|
|
|
|
|
|
|
|
|
1755
|
16
|
|
|
|
|
16
|
$string =~ s/--BACKSLASH--/\$\\backslash\$/g; |
|
1756
|
16
|
|
|
|
|
17
|
$string =~ s/--LBRACE--/\$\\lbrace\$/g; |
|
1757
|
16
|
|
|
|
|
20
|
$string =~ s/--RBRACE--/\$\\rbrace\$/g; |
|
1758
|
|
|
|
|
|
|
} |
|
1759
|
|
|
|
|
|
|
|
|
1760
|
16
|
|
|
|
|
66
|
return "btex {\\$font $string} etex"; |
|
1761
|
|
|
|
|
|
|
} |
|
1762
|
|
|
|
|
|
|
|
|
1763
|
|
|
|
|
|
|
|
|
1764
|
|
|
|
|
|
|
$SCORECARD = <<'EOT'; |
|
1765
|
|
|
|
|
|
|
%prologues:=2; |
|
1766
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1767
|
|
|
|
|
|
|
% |
|
1768
|
|
|
|
|
|
|
% Copyright (C) 2005, Christopher Swingley |
|
1769
|
|
|
|
|
|
|
% |
|
1770
|
|
|
|
|
|
|
% Licensed under the terms of the GNU General Public License, Version 2 |
|
1771
|
|
|
|
|
|
|
% available from http://www.gnu.org/copyleft/gpl.html |
|
1772
|
|
|
|
|
|
|
% |
|
1773
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1774
|
|
|
|
|
|
|
% |
|
1775
|
|
|
|
|
|
|
% The following Metapost program draws baseball scorecards as well as |
|
1776
|
|
|
|
|
|
|
% allows you to record plays on the same card. It contains two figures. |
|
1777
|
|
|
|
|
|
|
% Figure 0 is a complete, unfilled scorecard that can be converted to PDF |
|
1778
|
|
|
|
|
|
|
% and printed. |
|
1779
|
|
|
|
|
|
|
% |
|
1780
|
|
|
|
|
|
|
% Figure 2 is an example, showing the Cardinals scoring from the game |
|
1781
|
|
|
|
|
|
|
% where Mark McGwire broke Roger Maris' home run record. |
|
1782
|
|
|
|
|
|
|
% |
|
1783
|
|
|
|
|
|
|
% Figure 1 is the Cubs scoring from the same game |
|
1784
|
|
|
|
|
|
|
% |
|
1785
|
|
|
|
|
|
|
% A few variables can be set at the beginning of the card to adjust |
|
1786
|
|
|
|
|
|
|
% colors and line thicknesses and other parameters. Also note that |
|
1787
|
|
|
|
|
|
|
% I am using Adobe's Myriad Condensed fonts for the scorecard, so |
|
1788
|
|
|
|
|
|
|
% you will need to modify the font names to suit your own preferences |
|
1789
|
|
|
|
|
|
|
% and fonts. |
|
1790
|
|
|
|
|
|
|
% |
|
1791
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1792
|
|
|
|
|
|
|
% |
|
1793
|
|
|
|
|
|
|
% Manual for metapost: |
|
1794
|
|
|
|
|
|
|
% $ texdoc mpman |
|
1795
|
|
|
|
|
|
|
% |
|
1796
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1797
|
|
|
|
|
|
|
% |
|
1798
|
|
|
|
|
|
|
% Locations for stuff: |
|
1799
|
|
|
|
|
|
|
% |
|
1800
|
|
|
|
|
|
|
% ballone, balltwo, ballthree, strikeone, striketwo, foulone, foultwo, |
|
1801
|
|
|
|
|
|
|
% foulthree, foulfour |
|
1802
|
|
|
|
|
|
|
% |
|
1803
|
|
|
|
|
|
|
% These are the locations for writing in the pitch counts to each |
|
1804
|
|
|
|
|
|
|
% batter: |
|
1805
|
|
|
|
|
|
|
% label(btex {\sf 1} etex, ballone) withcolor clr; |
|
1806
|
|
|
|
|
|
|
% label(btex {\sf 2} etex, strikeone) withcolor clr; |
|
1807
|
|
|
|
|
|
|
% |
|
1808
|
|
|
|
|
|
|
% rbione, rbitwo, rbithree, rbifour, rundot, outlabel |
|
1809
|
|
|
|
|
|
|
% |
|
1810
|
|
|
|
|
|
|
% These are the locations for RBI dots, run dots (in the middle |
|
1811
|
|
|
|
|
|
|
% of the diamond), and the out labels (which also go in the middle |
|
1812
|
|
|
|
|
|
|
% of the diamond): |
|
1813
|
|
|
|
|
|
|
% draw_dot(rbione, clr); |
|
1814
|
|
|
|
|
|
|
% draw_dot(rbitwo, clr); |
|
1815
|
|
|
|
|
|
|
% draw_dot(rundot, clr); |
|
1816
|
|
|
|
|
|
|
% label(btex {\bigsf 6-3} etex, outlabel) withcolor clr; |
|
1817
|
|
|
|
|
|
|
% |
|
1818
|
|
|
|
|
|
|
% first, second, third, home |
|
1819
|
|
|
|
|
|
|
% |
|
1820
|
|
|
|
|
|
|
% Locations of the bases. Mostly used for building the paths, |
|
1821
|
|
|
|
|
|
|
% but also useful for pinch runners: |
|
1822
|
|
|
|
|
|
|
% label.top(btex {\sf PR} etex, second) withcolor clr; |
|
1823
|
|
|
|
|
|
|
% |
|
1824
|
|
|
|
|
|
|
% hr, threeb, twob, oneb, bb, hp |
|
1825
|
|
|
|
|
|
|
% |
|
1826
|
|
|
|
|
|
|
% Locations for the hit / walk / HBP text on the right side of |
|
1827
|
|
|
|
|
|
|
% the box. Circled to indicate the result of the at bat: |
|
1828
|
|
|
|
|
|
|
% draw_circle(twob, clr); |
|
1829
|
|
|
|
|
|
|
% |
|
1830
|
|
|
|
|
|
|
% wayfirst, waysecond, waythird, wayhome |
|
1831
|
|
|
|
|
|
|
% |
|
1832
|
|
|
|
|
|
|
% The half-way points between bases. Used as part of the CS and |
|
1833
|
|
|
|
|
|
|
% TO paths, but also useful for labelling CS and TO plays: |
|
1834
|
|
|
|
|
|
|
% label.lft(btex {\sf TO 7-2} etex, wayhome) withcolor clr; |
|
1835
|
|
|
|
|
|
|
% |
|
1836
|
|
|
|
|
|
|
% Paths available: |
|
1837
|
|
|
|
|
|
|
% single, double, triple, homerun |
|
1838
|
|
|
|
|
|
|
% |
|
1839
|
|
|
|
|
|
|
% Paths showing a runner's progress on the bases: |
|
1840
|
|
|
|
|
|
|
% draw(double) withcolor clr; |
|
1841
|
|
|
|
|
|
|
% |
|
1842
|
|
|
|
|
|
|
% firstsecond, firstthird, firsthome, secondthird, secondhome, |
|
1843
|
|
|
|
|
|
|
% thirdhome |
|
1844
|
|
|
|
|
|
|
% |
|
1845
|
|
|
|
|
|
|
% Paths for runners along the bases: |
|
1846
|
|
|
|
|
|
|
% draw(secondhome) withcolor clr; |
|
1847
|
|
|
|
|
|
|
% |
|
1848
|
|
|
|
|
|
|
% ifleft, ifright, ifcenter, ofleft, ofleftc, ofcenterl, ofcenterr, |
|
1849
|
|
|
|
|
|
|
% ofrightc, ofright |
|
1850
|
|
|
|
|
|
|
% |
|
1851
|
|
|
|
|
|
|
% Paths for various type of hits (infield, outfield): |
|
1852
|
|
|
|
|
|
|
% draw(ofleftc) withcolor clr; |
|
1853
|
|
|
|
|
|
|
% |
|
1854
|
|
|
|
|
|
|
% hrleft, hrleftc, hrcenterl, hrcenterr, hrrightc, hrright; |
|
1855
|
|
|
|
|
|
|
% |
|
1856
|
|
|
|
|
|
|
% Paths for home runs: |
|
1857
|
|
|
|
|
|
|
% draw(hrleftc) withcolor clr; |
|
1858
|
|
|
|
|
|
|
% |
|
1859
|
|
|
|
|
|
|
% cs_second, cs_third, to_home, |
|
1860
|
|
|
|
|
|
|
% cs_firstthird, to_firsthome, to_secondhome, |
|
1861
|
|
|
|
|
|
|
% |
|
1862
|
|
|
|
|
|
|
% Paths for caught stealing and thrown out: |
|
1863
|
|
|
|
|
|
|
% draw(cs_second) withcolor clr; |
|
1864
|
|
|
|
|
|
|
% |
|
1865
|
|
|
|
|
|
|
% new_hitter, new_pitcher |
|
1866
|
|
|
|
|
|
|
% |
|
1867
|
|
|
|
|
|
|
% Paths for new hitters (left side of box) and pitchers |
|
1868
|
|
|
|
|
|
|
% (top of box) |
|
1869
|
|
|
|
|
|
|
% draw(new_hitter) withcolor clr; |
|
1870
|
|
|
|
|
|
|
% draw(new_pitcher) withcolor clr; |
|
1871
|
|
|
|
|
|
|
% |
|
1872
|
|
|
|
|
|
|
% Fonts: |
|
1873
|
|
|
|
|
|
|
% |
|
1874
|
|
|
|
|
|
|
% \tiny - used for the Copyright line |
|
1875
|
|
|
|
|
|
|
% \tnsf - used for the basepath plays |
|
1876
|
|
|
|
|
|
|
% \sf - used for balls and strikes, outs, various labelling |
|
1877
|
|
|
|
|
|
|
% \bigsf - used for out labels |
|
1878
|
|
|
|
|
|
|
% |
|
1879
|
|
|
|
|
|
|
% Normal functions: |
|
1880
|
|
|
|
|
|
|
% |
|
1881
|
|
|
|
|
|
|
% draw(path) withcolor clr; - stroke a path |
|
1882
|
|
|
|
|
|
|
% label(btex {\sf 1} etex, pair) withcolor clr; - label |
|
1883
|
|
|
|
|
|
|
% directional suffixes: lft,rt,top,bot,ulft,urt,llft,lrt |
|
1884
|
|
|
|
|
|
|
% label(btex {\sf (6 empty boxes)} etex, \ |
|
1885
|
|
|
|
|
|
|
% 1/2[(xstart, ystart-25u),(xstart+100u,ystart-25u)]) \ |
|
1886
|
|
|
|
|
|
|
% withcolor clr; - use this when the lineup turns over |
|
1887
|
|
|
|
|
|
|
% |
|
1888
|
|
|
|
|
|
|
% User functions: |
|
1889
|
|
|
|
|
|
|
% |
|
1890
|
|
|
|
|
|
|
% |
|
1891
|
|
|
|
|
|
|
% def set_vars(expr xstart, ystart) = |
|
1892
|
|
|
|
|
|
|
% |
|
1893
|
|
|
|
|
|
|
% Used to initialize all the locations and paths for a new |
|
1894
|
|
|
|
|
|
|
% starting locations. Needs to be called right after setting |
|
1895
|
|
|
|
|
|
|
% xstart and ystart. These should be multiples of 100u |
|
1896
|
|
|
|
|
|
|
% |
|
1897
|
|
|
|
|
|
|
% def draw_square(expr xstart, ystart) = |
|
1898
|
|
|
|
|
|
|
% |
|
1899
|
|
|
|
|
|
|
% Draws an at-bat box in cyan |
|
1900
|
|
|
|
|
|
|
% |
|
1901
|
|
|
|
|
|
|
% def draw_out_[one|two|three](expr xstart, ystart, clr) = |
|
1902
|
|
|
|
|
|
|
% |
|
1903
|
|
|
|
|
|
|
% Indicates the first (second or third) out with the out number |
|
1904
|
|
|
|
|
|
|
% in a circle. |
|
1905
|
|
|
|
|
|
|
% |
|
1906
|
|
|
|
|
|
|
% def draw_dot(expr loc, clr) = |
|
1907
|
|
|
|
|
|
|
% |
|
1908
|
|
|
|
|
|
|
% Draws a 5pt dot at the location indicated. Used for RBI's, |
|
1909
|
|
|
|
|
|
|
% and runs scored |
|
1910
|
|
|
|
|
|
|
% |
|
1911
|
|
|
|
|
|
|
% def draw_circle(expr centerpoint, clr) = |
|
1912
|
|
|
|
|
|
|
% |
|
1913
|
|
|
|
|
|
|
% Draws a circle around a location. Used to circle the plays |
|
1914
|
|
|
|
|
|
|
% on the right of the at-bat box. |
|
1915
|
|
|
|
|
|
|
% |
|
1916
|
|
|
|
|
|
|
% def draw_inning_end(expr xstart, ystart, clr) = |
|
1917
|
|
|
|
|
|
|
% |
|
1918
|
|
|
|
|
|
|
% Draws the slash in the lower right that signals the end of |
|
1919
|
|
|
|
|
|
|
% the inning. |
|
1920
|
|
|
|
|
|
|
% |
|
1921
|
|
|
|
|
|
|
% def draw_inning_start(expr xstart, ystart, clr) = |
|
1922
|
|
|
|
|
|
|
% |
|
1923
|
|
|
|
|
|
|
% Draws the slash in the upper left that signals the start of |
|
1924
|
|
|
|
|
|
|
% the inning. |
|
1925
|
|
|
|
|
|
|
% |
|
1926
|
|
|
|
|
|
|
% def draw_strikeout_looking(expr outlabel, clr) = |
|
1927
|
|
|
|
|
|
|
% |
|
1928
|
|
|
|
|
|
|
% Draws a backwards K |
|
1929
|
|
|
|
|
|
|
% |
|
1930
|
|
|
|
|
|
|
% def draw_ibb(expr bb, clr)= |
|
1931
|
|
|
|
|
|
|
% |
|
1932
|
|
|
|
|
|
|
% Adds 'I' in front of BB and circles it for an intentional walk |
|
1933
|
|
|
|
|
|
|
% |
|
1934
|
|
|
|
|
|
|
% Consult the Makefile for the commands used to turn the code in this |
|
1935
|
|
|
|
|
|
|
% file into PDF, EPS or PNG files. |
|
1936
|
|
|
|
|
|
|
% |
|
1937
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1938
|
|
|
|
|
|
|
% |
|
1939
|
|
|
|
|
|
|
% Wed Apr 20 07:58:23 AKDT 2005 |
|
1940
|
|
|
|
|
|
|
% * Reversed figures 1 and 2 so the scoring of the game is in |
|
1941
|
|
|
|
|
|
|
% order |
|
1942
|
|
|
|
|
|
|
% * Added more comments to the beginning of the file |
|
1943
|
|
|
|
|
|
|
% * Christopher Swingley, cswingle@iarc.uaf.edu |
|
1944
|
|
|
|
|
|
|
% |
|
1945
|
|
|
|
|
|
|
% Sat Apr 16 13:33:14 AKDT 2005 |
|
1946
|
|
|
|
|
|
|
% * scoring.mp Version 0.2 |
|
1947
|
|
|
|
|
|
|
% * Pulled out a bunch of variables |
|
1948
|
|
|
|
|
|
|
% * Finished the full scorecard code |
|
1949
|
|
|
|
|
|
|
% * Christopher Swingley, cswingle@iarc.uaf.edu |
|
1950
|
|
|
|
|
|
|
% |
|
1951
|
|
|
|
|
|
|
% Thu Apr 14 14:37:29 AKDT 2005 |
|
1952
|
|
|
|
|
|
|
% * scoring.mp Version 0.1 |
|
1953
|
|
|
|
|
|
|
% * Initial release |
|
1954
|
|
|
|
|
|
|
% * Christopher Swingley, cswingle@iarc.uaf.edu |
|
1955
|
|
|
|
|
|
|
% |
|
1956
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1957
|
|
|
|
|
|
|
|
|
1958
|
|
|
|
|
|
|
% FONTS |
|
1959
|
|
|
|
|
|
|
verbatimtex \font\tiny __FONTFACE0__ at __FONTSIZE0__pt etex |
|
1960
|
|
|
|
|
|
|
verbatimtex \font\sf __FONTFACE1__ at __FONTSIZE1__pt etex |
|
1961
|
|
|
|
|
|
|
verbatimtex \font\tnsf __FONTFACE2__ at __FONTSIZE2__pt etex |
|
1962
|
|
|
|
|
|
|
verbatimtex \font\bigsf __FONTFACE3__ at __FONTSIZE3__pt etex |
|
1963
|
|
|
|
|
|
|
|
|
1964
|
|
|
|
|
|
|
% VARIABLES |
|
1965
|
|
|
|
|
|
|
color card; |
|
1966
|
|
|
|
|
|
|
color scoring; |
|
1967
|
|
|
|
|
|
|
% Cyan card - modify first number to control lightness |
|
1968
|
|
|
|
|
|
|
% (0 - 1, dark - light): |
|
1969
|
|
|
|
|
|
|
% card:=(0.10,1,1); % Darker |
|
1970
|
|
|
|
|
|
|
% card:=(0.25,1,1); % Lighter |
|
1971
|
|
|
|
|
|
|
% Grey card: |
|
1972
|
|
|
|
|
|
|
% card:=(0.4,0.4,0.4); |
|
1973
|
|
|
|
|
|
|
% Black card: |
|
1974
|
|
|
|
|
|
|
% card:=(0.0,0.0,0.0); |
|
1975
|
|
|
|
|
|
|
card:=(__COLOR1__,__COLOR2__,__COLOR3__); |
|
1976
|
|
|
|
|
|
|
% Black scoring color |
|
1977
|
|
|
|
|
|
|
scoring:=(0,0,0); |
|
1978
|
|
|
|
|
|
|
% Diameter of circles (outs) |
|
1979
|
|
|
|
|
|
|
outcircle_d := 7; |
|
1980
|
|
|
|
|
|
|
% Size of dots (rbi, runs scored) |
|
1981
|
|
|
|
|
|
|
dotsize := 7pt; |
|
1982
|
|
|
|
|
|
|
% Diameter of play circles |
|
1983
|
|
|
|
|
|
|
playcircle_d := 9; |
|
1984
|
|
|
|
|
|
|
% Thickness of play lines |
|
1985
|
|
|
|
|
|
|
playline_t := 1.5pt; |
|
1986
|
|
|
|
|
|
|
% Thickness of thick card lines |
|
1987
|
|
|
|
|
|
|
thickline_t := 0.5pt; |
|
1988
|
|
|
|
|
|
|
% Thickness of thin card lines |
|
1989
|
|
|
|
|
|
|
thinline_t := 0.05pt; |
|
1990
|
|
|
|
|
|
|
|
|
1991
|
|
|
|
|
|
|
def draw_square(expr xstart, ystart) = |
|
1992
|
|
|
|
|
|
|
begingroup |
|
1993
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
1994
|
|
|
|
|
|
|
% Outer box |
|
1995
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart,ystart+100u)--(xstart+100u,ystart+100u)--(xstart+100u,ystart)--cycle withcolor card; |
|
1996
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
1997
|
|
|
|
|
|
|
% Pitches |
|
1998
|
|
|
|
|
|
|
pbsize := 15u; |
|
1999
|
|
|
|
|
|
|
pbstart := 50u; |
|
2000
|
|
|
|
|
|
|
draw (xstart+pbstart,ystart)--(xstart+pbstart,ystart+pbsize)--(xstart+pbstart+(1*pbsize),ystart+pbsize)--(xstart+pbstart+pbsize,ystart)--cycle withcolor card; |
|
2001
|
|
|
|
|
|
|
pbstart := pbstart + pbsize; |
|
2002
|
|
|
|
|
|
|
draw (xstart+pbstart,ystart)--(xstart+pbstart,ystart+pbsize)--(xstart+pbstart+(1*pbsize),ystart+pbsize)--(xstart+pbstart+pbsize,ystart)--cycle withcolor card; |
|
2003
|
|
|
|
|
|
|
pbstart := pbstart + pbsize; |
|
2004
|
|
|
|
|
|
|
draw (xstart+pbstart,ystart)--(xstart+pbstart,ystart+pbsize)--(xstart+pbstart+(1*pbsize),ystart+pbsize)--(xstart+pbstart+pbsize,ystart)--cycle withcolor card; |
|
2005
|
|
|
|
|
|
|
pbstart := 50u; |
|
2006
|
|
|
|
|
|
|
draw (xstart+pbstart,ystart+pbsize)--(xstart+pbstart,ystart+pbsize*2)--(xstart+pbstart+(1*pbsize),ystart+pbsize*2)--(xstart+pbstart+pbsize,ystart+pbsize)--cycle withcolor card; |
|
2007
|
|
|
|
|
|
|
pbstart := pbstart + pbsize; |
|
2008
|
|
|
|
|
|
|
draw (xstart+pbstart,ystart+pbsize)--(xstart+pbstart,ystart+pbsize*2)--(xstart+pbstart+(1*pbsize),ystart+pbsize*2)--(xstart+pbstart+pbsize,ystart+pbsize)--cycle withcolor card; |
|
2009
|
|
|
|
|
|
|
% Diamond |
|
2010
|
|
|
|
|
|
|
dsize := 24u; |
|
2011
|
|
|
|
|
|
|
dxstart := xstart+40u; |
|
2012
|
|
|
|
|
|
|
dystart := ystart+pbsize*1.7; |
|
2013
|
|
|
|
|
|
|
ofactor := 1.5; |
|
2014
|
|
|
|
|
|
|
draw (dxstart,dystart)--(dxstart+dsize,dystart+dsize)--(dxstart,dystart+dsize*2)--(dxstart-dsize,dystart+dsize)--cycle withcolor card; |
|
2015
|
|
|
|
|
|
|
% Outfield |
|
2016
|
|
|
|
|
|
|
draw (dxstart+dsize,dystart+dsize)--(dxstart+(dsize*ofactor),dystart+(dsize*ofactor))..(dxstart,dystart+(2*dsize*ofactor))..(dxstart-(dsize*ofactor),dystart+(dsize*ofactor))--(dxstart-dsize,dystart+dsize) withcolor card; |
|
2017
|
|
|
|
|
|
|
% Labels |
|
2018
|
|
|
|
|
|
|
lxstart := xstart+90u; |
|
2019
|
|
|
|
|
|
|
lystart := ystart+92u; |
|
2020
|
|
|
|
|
|
|
lsize := (lystart-ystart+(fsize/2)-pbsize)/6; |
|
2021
|
|
|
|
|
|
|
label(btex {\tnsf HR} etex, (lxstart,lystart)) withcolor card; |
|
2022
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2023
|
|
|
|
|
|
|
label(btex {\tnsf 3B} etex, (lxstart,lystart)) withcolor card; |
|
2024
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2025
|
|
|
|
|
|
|
label(btex {\tnsf 2B} etex, (lxstart,lystart)) withcolor card; |
|
2026
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2027
|
|
|
|
|
|
|
label(btex {\tnsf 1B} etex, (lxstart,lystart)) withcolor card; |
|
2028
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2029
|
|
|
|
|
|
|
label(btex {\tnsf BB} etex, (lxstart,lystart)) withcolor card; |
|
2030
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2031
|
|
|
|
|
|
|
label(btex {\tnsf HP} etex, (lxstart,lystart)) withcolor card; |
|
2032
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2033
|
|
|
|
|
|
|
endgroup |
|
2034
|
|
|
|
|
|
|
enddef; |
|
2035
|
|
|
|
|
|
|
|
|
2036
|
|
|
|
|
|
|
def draw_out_one(expr xstart, ystart, clr) = |
|
2037
|
|
|
|
|
|
|
begingroup |
|
2038
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2039
|
|
|
|
|
|
|
label(btex {\sf 1} etex, (xstart+25u, ystart+10u)) withcolor clr; |
|
2040
|
|
|
|
|
|
|
draw (xstart+25u,ystart+10u-outcircle_d)..(xstart+25u+outcircle_d,ystart+10u).. |
|
2041
|
|
|
|
|
|
|
(xstart+25u,ystart+10u+outcircle_d)..(xstart+25u-outcircle_d,ystart+10u)..cycle withcolor clr; |
|
2042
|
|
|
|
|
|
|
endgroup |
|
2043
|
|
|
|
|
|
|
enddef; |
|
2044
|
|
|
|
|
|
|
|
|
2045
|
|
|
|
|
|
|
def draw_out_two(expr xstart, ystart, clr) = |
|
2046
|
|
|
|
|
|
|
begingroup |
|
2047
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2048
|
|
|
|
|
|
|
label(btex {\sf 2} etex, (xstart+25u, ystart+10u)) withcolor clr; |
|
2049
|
|
|
|
|
|
|
draw (xstart+25u,ystart+10u-outcircle_d)..(xstart+25u+outcircle_d,ystart+10u).. |
|
2050
|
|
|
|
|
|
|
(xstart+25u,ystart+10u+outcircle_d)..(xstart+25u-outcircle_d,ystart+10u)..cycle withcolor clr; |
|
2051
|
|
|
|
|
|
|
endgroup |
|
2052
|
|
|
|
|
|
|
enddef; |
|
2053
|
|
|
|
|
|
|
|
|
2054
|
|
|
|
|
|
|
def draw_out_three(expr xstart, ystart, clr) = |
|
2055
|
|
|
|
|
|
|
begingroup |
|
2056
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2057
|
|
|
|
|
|
|
label(btex {\sf 3} etex, (xstart+25u, ystart+10u)) withcolor clr; |
|
2058
|
|
|
|
|
|
|
draw (xstart+25u,ystart+10u-outcircle_d)..(xstart+25u+outcircle_d,ystart+10u).. |
|
2059
|
|
|
|
|
|
|
(xstart+25u,ystart+10u+outcircle_d)..(xstart+25u-outcircle_d,ystart+10u)..cycle withcolor clr; |
|
2060
|
|
|
|
|
|
|
endgroup |
|
2061
|
|
|
|
|
|
|
enddef; |
|
2062
|
|
|
|
|
|
|
|
|
2063
|
|
|
|
|
|
|
def draw_dot(expr loc, clr) = |
|
2064
|
|
|
|
|
|
|
begingroup |
|
2065
|
|
|
|
|
|
|
pickup pencircle scaled dotsize; |
|
2066
|
|
|
|
|
|
|
draw(loc) withcolor clr; |
|
2067
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2068
|
|
|
|
|
|
|
endgroup |
|
2069
|
|
|
|
|
|
|
enddef; |
|
2070
|
|
|
|
|
|
|
|
|
2071
|
|
|
|
|
|
|
def draw_circle(expr centerpoint, clr) = |
|
2072
|
|
|
|
|
|
|
begingroup |
|
2073
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2074
|
|
|
|
|
|
|
draw (centerpoint+(0,-playcircle_d))..(centerpoint+(playcircle_d,0))..(centerpoint+(0,playcircle_d)).. |
|
2075
|
|
|
|
|
|
|
(centerpoint+(-playcircle_d,0))..cycle withcolor clr; |
|
2076
|
|
|
|
|
|
|
endgroup |
|
2077
|
|
|
|
|
|
|
enddef; |
|
2078
|
|
|
|
|
|
|
|
|
2079
|
|
|
|
|
|
|
def draw_inning_end(expr xstart, ystart, clr) = |
|
2080
|
|
|
|
|
|
|
begingroup |
|
2081
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2082
|
|
|
|
|
|
|
draw (xstart+95u,ystart-5u)--(xstart+105u,ystart+5u) withcolor clr; |
|
2083
|
|
|
|
|
|
|
endgroup |
|
2084
|
|
|
|
|
|
|
enddef; |
|
2085
|
|
|
|
|
|
|
|
|
2086
|
|
|
|
|
|
|
def draw_inning_start(expr xstart, ystart, clr) = |
|
2087
|
|
|
|
|
|
|
begingroup |
|
2088
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2089
|
|
|
|
|
|
|
draw (xstart-5u,ystart+95u)--(xstart+5u,ystart+105u) withcolor (0,0,0); |
|
2090
|
|
|
|
|
|
|
endgroup |
|
2091
|
|
|
|
|
|
|
enddef; |
|
2092
|
|
|
|
|
|
|
|
|
2093
|
|
|
|
|
|
|
def draw_strikeout_looking(expr outlabel, clr) = |
|
2094
|
|
|
|
|
|
|
begingroup |
|
2095
|
|
|
|
|
|
|
label(btex {\bigsf K} etex, outlabel) reflectedabout (outlabel+(0,1u), outlabel+(0,-1u)) withcolor clr; |
|
2096
|
|
|
|
|
|
|
endgroup |
|
2097
|
|
|
|
|
|
|
enddef; |
|
2098
|
|
|
|
|
|
|
|
|
2099
|
|
|
|
|
|
|
def draw_ibb(expr bb, clr)= |
|
2100
|
|
|
|
|
|
|
begingroup |
|
2101
|
|
|
|
|
|
|
label(btex {\sf I} etex, bb+(-9u,0)) withcolor clr; |
|
2102
|
|
|
|
|
|
|
draw (bb+(-3u,-playcircle_d))..(bb+(playcircle_d+3u,0))..(bb+(-3u,playcircle_d))..(bb+(-playcircle_d-6u,0))..cycle withcolor clr; |
|
2103
|
|
|
|
|
|
|
endgroup |
|
2104
|
|
|
|
|
|
|
enddef; |
|
2105
|
|
|
|
|
|
|
|
|
2106
|
|
|
|
|
|
|
def draw_player_box(expr xstart, ystart, clr, inncol) = |
|
2107
|
|
|
|
|
|
|
% Intended to draw to the *left* of xstart, ystart |
|
2108
|
|
|
|
|
|
|
begingroup |
|
2109
|
|
|
|
|
|
|
iposwidth := 40u; |
|
2110
|
|
|
|
|
|
|
namewidth := 250u; |
|
2111
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2112
|
|
|
|
|
|
|
% Inning and Position box |
|
2113
|
|
|
|
|
|
|
if inncol: |
|
2114
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart-iposwidth*2u,ystart)--(xstart-iposwidth*2u,ystart+100u)--(xstart,ystart+100u)--cycle withcolor clr; |
|
2115
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart)--(xstart-iposwidth,ystart+100u) withcolor clr; |
|
2116
|
|
|
|
|
|
|
else: |
|
2117
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart)--(xstart-iposwidth*2u,ystart)--(xstart-iposwidth*2u,ystart+100u)--(xstart-iposwidth,ystart+100u)--cycle withcolor clr; |
|
2118
|
|
|
|
|
|
|
fi |
|
2119
|
|
|
|
|
|
|
% Player name box |
|
2120
|
|
|
|
|
|
|
draw (xstart-iposwidth*2,ystart)--(xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*2-namewidth,ystart+100u)-- |
|
2121
|
|
|
|
|
|
|
(xstart-iposwidth*2,ystart+100u)--cycle withcolor clr; |
|
2122
|
|
|
|
|
|
|
% Number box |
|
2123
|
|
|
|
|
|
|
draw (xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart+100u)-- |
|
2124
|
|
|
|
|
|
|
(xstart-iposwidth*2-namewidth,ystart+100u)--cycle withcolor clr; |
|
2125
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2126
|
|
|
|
|
|
|
% other player lines |
|
2127
|
|
|
|
|
|
|
if inncol: |
|
2128
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3) withcolor clr; |
|
2129
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3+100u/3) withcolor clr; |
|
2130
|
|
|
|
|
|
|
else: |
|
2131
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3) withcolor clr; |
|
2132
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart+100u/3+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3+100u/3) withcolor clr; |
|
2133
|
|
|
|
|
|
|
fi |
|
2134
|
|
|
|
|
|
|
endgroup |
|
2135
|
|
|
|
|
|
|
enddef; |
|
2136
|
|
|
|
|
|
|
|
|
2137
|
|
|
|
|
|
|
def draw_pitcher_box(expr xstart, ystart, clr) = |
|
2138
|
|
|
|
|
|
|
% Intended to draw to the *left* of xstart, ystart |
|
2139
|
|
|
|
|
|
|
begingroup |
|
2140
|
|
|
|
|
|
|
iposwidth := 40u; |
|
2141
|
|
|
|
|
|
|
namewidth := 250u; |
|
2142
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2143
|
|
|
|
|
|
|
% Inning and Position box |
|
2144
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart-iposwidth*2u,ystart)--(xstart-iposwidth*2u,ystart+100u)--(xstart,ystart+100u)--cycle withcolor clr; |
|
2145
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart)--(xstart-iposwidth,ystart+100u) withcolor clr; |
|
2146
|
|
|
|
|
|
|
% Player name box |
|
2147
|
|
|
|
|
|
|
draw (xstart-iposwidth*2,ystart)--(xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*2-namewidth,ystart+100u)--(xstart-iposwidth*2,ystart+100u)--cycle withcolor clr; |
|
2148
|
|
|
|
|
|
|
% Number box |
|
2149
|
|
|
|
|
|
|
draw (xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart+100u)--(xstart-iposwidth*2-namewidth,ystart+100u)--cycle withcolor clr; |
|
2150
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2151
|
|
|
|
|
|
|
% other player lines |
|
2152
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3) withcolor clr; |
|
2153
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart+100u/3+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3+100u/3) withcolor clr; |
|
2154
|
|
|
|
|
|
|
endgroup |
|
2155
|
|
|
|
|
|
|
enddef; |
|
2156
|
|
|
|
|
|
|
|
|
2157
|
|
|
|
|
|
|
def draw_column_totals_key(expr xstart, ystart, clr) = |
|
2158
|
|
|
|
|
|
|
begingroup |
|
2159
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2160
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart,ystart+100u)--(xstart-iposwidth,ystart+100u)--(xstart-iposwidth,ystart)--cycle withcolor clr; |
|
2161
|
|
|
|
|
|
|
draw (xstart,ystart+100u/2)--(xstart-iposwidth,ystart+100u/2)--(xstart,ystart+100u) withcolor clr; |
|
2162
|
|
|
|
|
|
|
draw (xstart,ystart+100u/2)--(xstart-iposwidth,ystart) withcolor clr; |
|
2163
|
|
|
|
|
|
|
endgroup |
|
2164
|
|
|
|
|
|
|
enddef; |
|
2165
|
|
|
|
|
|
|
|
|
2166
|
|
|
|
|
|
|
def draw_totals_box(expr xstart, ystart, clr) = |
|
2167
|
|
|
|
|
|
|
begingroup |
|
2168
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2169
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart,ystart+50u)--(xstart+100u,ystart+50u)--(xstart+100u,ystart)--cycle withcolor clr; |
|
2170
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2171
|
|
|
|
|
|
|
draw 1/3[(xstart,ystart),(xstart+100u,ystart)]-- 2/3[(xstart,ystart+50u),(xstart+100u,ystart+50u)] withcolor clr; |
|
2172
|
|
|
|
|
|
|
endgroup |
|
2173
|
|
|
|
|
|
|
enddef; |
|
2174
|
|
|
|
|
|
|
|
|
2175
|
|
|
|
|
|
|
def draw_row_summary_box(expr xstart,ystart,clr) = |
|
2176
|
|
|
|
|
|
|
begingroup |
|
2177
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2178
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart,ystart+100u)--(xstart+100u,ystart+100u)--(xstart+100u,ystart)--cycle withcolor clr; |
|
2179
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2180
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3)--(xstart+100u,ystart+100u/3) withcolor clr; |
|
2181
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3*2)--(xstart+100u,ystart+100u/3*2) withcolor clr; |
|
2182
|
|
|
|
|
|
|
draw (xstart+100u/3,ystart)--(xstart+100u/3,ystart+100u) withcolor clr; |
|
2183
|
|
|
|
|
|
|
draw (xstart+100u/3*2,ystart)--(xstart+100u/3*2,ystart+100u) withcolor clr; |
|
2184
|
|
|
|
|
|
|
endgroup |
|
2185
|
|
|
|
|
|
|
enddef; |
|
2186
|
|
|
|
|
|
|
|
|
2187
|
|
|
|
|
|
|
def draw_game_summary_box(expr xstart,ystart,clr) = |
|
2188
|
|
|
|
|
|
|
begingroup |
|
2189
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2190
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart,ystart+50u)--(xstart+100u/3*2,ystart+50u)--(xstart+100u/3*2,ystart)--cycle withcolor clr; |
|
2191
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2192
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart+100u/3*2,ystart+50u) withcolor clr; |
|
2193
|
|
|
|
|
|
|
endgroup |
|
2194
|
|
|
|
|
|
|
enddef; |
|
2195
|
|
|
|
|
|
|
|
|
2196
|
|
|
|
|
|
|
def draw_play_total_box(expr xstart,ystart,clr) = |
|
2197
|
|
|
|
|
|
|
begingroup |
|
2198
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2199
|
|
|
|
|
|
|
draw (xstart+100u/3*2,ystart)--(xstart+100u/3*2,ystart+50u)--(xstart+100u/3*2+200.3u,ystart+50u)--(xstart+100u/3*2+200.3u,ystart)--cycle withcolor clr; |
|
2200
|
|
|
|
|
|
|
draw (xstart+100u/3*2,ystart+25u)--(xstart+100u/3*2+200u,ystart+25u) withcolor clr; |
|
2201
|
|
|
|
|
|
|
endgroup |
|
2202
|
|
|
|
|
|
|
enddef; |
|
2203
|
|
|
|
|
|
|
|
|
2204
|
|
|
|
|
|
|
def draw_pitcher_row(expr xstart,ystart,clr,leftish) = |
|
2205
|
|
|
|
|
|
|
begingroup |
|
2206
|
|
|
|
|
|
|
if leftish: |
|
2207
|
|
|
|
|
|
|
iposwidth := 40u; |
|
2208
|
|
|
|
|
|
|
namewidth := 250u; |
|
2209
|
|
|
|
|
|
|
else: |
|
2210
|
|
|
|
|
|
|
iposwidth := 100u/3; |
|
2211
|
|
|
|
|
|
|
namewidth := 200u+100u*(2/3)+1u; |
|
2212
|
|
|
|
|
|
|
fi |
|
2213
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2214
|
|
|
|
|
|
|
% Inning and Position box |
|
2215
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart-iposwidth*2u,ystart)--(xstart-iposwidth*2u,ystart+100u)--(xstart,ystart+100u)--cycle withcolor clr; |
|
2216
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart)--(xstart-iposwidth,ystart+100u) withcolor clr; |
|
2217
|
|
|
|
|
|
|
% Player name box |
|
2218
|
|
|
|
|
|
|
draw (xstart-iposwidth*2,ystart)--(xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*2-namewidth,ystart+100u)-- |
|
2219
|
|
|
|
|
|
|
(xstart-iposwidth*2,ystart+100u)--cycle withcolor clr; |
|
2220
|
|
|
|
|
|
|
% Number box |
|
2221
|
|
|
|
|
|
|
draw (xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart+100u)-- |
|
2222
|
|
|
|
|
|
|
(xstart-iposwidth*2-namewidth,ystart+100u)--cycle withcolor clr; |
|
2223
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2224
|
|
|
|
|
|
|
% other player lines |
|
2225
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3) withcolor clr; |
|
2226
|
|
|
|
|
|
|
draw (xstart,ystart+100u/3+100u/3)--(xstart-iposwidth*3-namewidth,ystart+100u/3+100u/3) withcolor clr; |
|
2227
|
|
|
|
|
|
|
% Now draw stats boxes |
|
2228
|
|
|
|
|
|
|
for nxstart := xstart step 100 until xstart+400: |
|
2229
|
|
|
|
|
|
|
draw_row_summary_box(nxstart,ystart,clr); |
|
2230
|
|
|
|
|
|
|
endfor |
|
2231
|
|
|
|
|
|
|
endgroup |
|
2232
|
|
|
|
|
|
|
enddef; |
|
2233
|
|
|
|
|
|
|
|
|
2234
|
|
|
|
|
|
|
def draw_pitcher_labels(expr xstart,ystart,clr,leftish) = |
|
2235
|
|
|
|
|
|
|
begingroup |
|
2236
|
|
|
|
|
|
|
if leftish: |
|
2237
|
|
|
|
|
|
|
iposwidth := 40u; |
|
2238
|
|
|
|
|
|
|
namewidth := 250u; |
|
2239
|
|
|
|
|
|
|
else: |
|
2240
|
|
|
|
|
|
|
iposwidth := 100u/3; |
|
2241
|
|
|
|
|
|
|
namewidth := 200u+100u*(2/3); |
|
2242
|
|
|
|
|
|
|
fi |
|
2243
|
|
|
|
|
|
|
statboxwidth := 100u/3; |
|
2244
|
|
|
|
|
|
|
label(btex {\bigsf \#} etex, 1/2[(xstart-iposwidth*2-namewidth,ystart),(xstart-iposwidth*3-namewidth,ystart-(100u/3))]) withcolor clr; |
|
2245
|
|
|
|
|
|
|
label(btex {\bigsf Pitcher} etex, 1/2[(xstart-iposwidth*2,ystart),(xstart-iposwidth*2-namewidth,ystart-100u/3)]) withcolor clr; |
|
2246
|
|
|
|
|
|
|
label(btex {\bigsf L/R} etex, 1/2[(xstart-iposwidth,ystart),(xstart-iposwidth*2,ystart-100u/3)]) withcolor clr; |
|
2247
|
|
|
|
|
|
|
label(btex {\bigsf Inn} etex, 1/2[(xstart,ystart),(xstart-iposwidth,ystart-100u/3)]) withcolor clr; |
|
2248
|
|
|
|
|
|
|
% |
|
2249
|
|
|
|
|
|
|
label(btex {\bigsf WLS} etex, 1/2[(xstart+statboxwidth,ystart),(xstart,ystart-100u/3)]) withcolor clr; |
|
2250
|
|
|
|
|
|
|
label(btex {\bigsf BF} etex, 1/2[(xstart+statboxwidth*2,ystart),(xstart+statboxwidth,ystart-100u/3)]) withcolor clr; |
|
2251
|
|
|
|
|
|
|
label(btex {\bigsf IP} etex, 1/2[(xstart+statboxwidth*3,ystart),(xstart+statboxwidth*2,ystart-100u/3)]) withcolor clr; |
|
2252
|
|
|
|
|
|
|
% |
|
2253
|
|
|
|
|
|
|
label(btex {\bigsf H} etex, 1/2[(xstart+statboxwidth*4,ystart),(xstart+statboxwidth*3,ystart-100u/3)]) withcolor clr; |
|
2254
|
|
|
|
|
|
|
label(btex {\bigsf R} etex, 1/2[(xstart+statboxwidth*5,ystart),(xstart+statboxwidth*4,ystart-100u/3)]) withcolor clr; |
|
2255
|
|
|
|
|
|
|
label(btex {\bigsf ER} etex, 1/2[(xstart+statboxwidth*6,ystart),(xstart+statboxwidth*5,ystart-100u/3)]) withcolor clr; |
|
2256
|
|
|
|
|
|
|
% |
|
2257
|
|
|
|
|
|
|
label(btex {\bigsf BB} etex, 1/2[(xstart+statboxwidth*7,ystart),(xstart+statboxwidth*6,ystart-100u/3)]) withcolor clr; |
|
2258
|
|
|
|
|
|
|
label(btex {\bigsf SO} etex, 1/2[(xstart+statboxwidth*8,ystart),(xstart+statboxwidth*7,ystart-100u/3)]) withcolor clr; |
|
2259
|
|
|
|
|
|
|
label(btex {\bigsf IBB} etex, 1/2[(xstart+statboxwidth*9,ystart),(xstart+statboxwidth*8,ystart-100u/3)]) withcolor clr; |
|
2260
|
|
|
|
|
|
|
% |
|
2261
|
|
|
|
|
|
|
label(btex {\bigsf HBP} etex, 1/2[(xstart+statboxwidth*10+1,ystart),(xstart+statboxwidth*9+1,ystart-100u/3)]) withcolor clr; |
|
2262
|
|
|
|
|
|
|
label(btex {\bigsf BLK} etex, 1/2[(xstart+statboxwidth*11+1,ystart),(xstart+statboxwidth*10+1,ystart-100u/3)]) withcolor clr; |
|
2263
|
|
|
|
|
|
|
label(btex {\bigsf WP} etex, 1/2[(xstart+statboxwidth*12+1,ystart),(xstart+statboxwidth*11+1,ystart-100u/3)]) withcolor clr; |
|
2264
|
|
|
|
|
|
|
% |
|
2265
|
|
|
|
|
|
|
label(btex {\bigsf HR} etex, 1/2[(xstart+statboxwidth*13,ystart),(xstart+statboxwidth*12,ystart-100u/3)]) withcolor clr; |
|
2266
|
|
|
|
|
|
|
label(btex {\bigsf S} etex, 1/2[(xstart+statboxwidth*14,ystart),(xstart+statboxwidth*13,ystart-100u/3)]) withcolor clr; |
|
2267
|
|
|
|
|
|
|
label(btex {\bigsf P} etex, 1/2[(xstart+statboxwidth*15,ystart),(xstart+statboxwidth*14,ystart-100u/3)]) withcolor clr; |
|
2268
|
|
|
|
|
|
|
endgroup |
|
2269
|
|
|
|
|
|
|
enddef; |
|
2270
|
|
|
|
|
|
|
|
|
2271
|
|
|
|
|
|
|
def set_vars(expr xstart, ystart) = |
|
2272
|
|
|
|
|
|
|
begingroup |
|
2273
|
|
|
|
|
|
|
% locations |
|
2274
|
|
|
|
|
|
|
pair ballone, balltwo, ballthree, strikeone, striketwo, foulone, foultwo, foulthree, foulfour; |
|
2275
|
|
|
|
|
|
|
ballone := (xstart+50u+(15u/2),ystart+(15u/2)); |
|
2276
|
|
|
|
|
|
|
balltwo := (xstart+50u+(15u/2)+15u,ystart+(15u/2)); |
|
2277
|
|
|
|
|
|
|
ballthree := (xstart+50u+(15u/2)+30u,ystart+(15u/2)); |
|
2278
|
|
|
|
|
|
|
strikeone := (xstart+50u+(15u/2),ystart+(15u/2)+15u); |
|
2279
|
|
|
|
|
|
|
striketwo := (xstart+50u+(15u/2)+15u,ystart+(15u/2)+15u); |
|
2280
|
|
|
|
|
|
|
foulone := (xstart+5u,ystart+9u); |
|
2281
|
|
|
|
|
|
|
foultwo := (xstart+8u,ystart+5u); |
|
2282
|
|
|
|
|
|
|
foulthree := (xstart+10u,ystart+11u); |
|
2283
|
|
|
|
|
|
|
foulfour := (xstart+13u,ystart+7u); |
|
2284
|
|
|
|
|
|
|
pair rbione, rbitwo, rbithree, rbifour, rundot, outlabel; |
|
2285
|
|
|
|
|
|
|
rundot := (xstart+40u,ystart+49.5u); |
|
2286
|
|
|
|
|
|
|
outlabel := (xstart+40u,ystart+49.5u); |
|
2287
|
|
|
|
|
|
|
rbione := (xstart+5u,ystart+25u); |
|
2288
|
|
|
|
|
|
|
rbitwo := (xstart+9u,ystart+20u); |
|
2289
|
|
|
|
|
|
|
rbithree := (xstart+11u,ystart+28u); |
|
2290
|
|
|
|
|
|
|
rbifour := (xstart+15u,ystart+23u); |
|
2291
|
|
|
|
|
|
|
pair first, second, third, home; |
|
2292
|
|
|
|
|
|
|
path single, double, triple, homerun; |
|
2293
|
|
|
|
|
|
|
pbsize := 15u; |
|
2294
|
|
|
|
|
|
|
dsize := 24u; |
|
2295
|
|
|
|
|
|
|
dxstart := xstart+40u; |
|
2296
|
|
|
|
|
|
|
dystart := ystart+pbsize*1.7; |
|
2297
|
|
|
|
|
|
|
home := (dxstart,dystart); |
|
2298
|
|
|
|
|
|
|
first := (dxstart+dsize,dystart+dsize); |
|
2299
|
|
|
|
|
|
|
second := (dxstart,dystart+dsize*2); |
|
2300
|
|
|
|
|
|
|
third := (dxstart-dsize,dystart+dsize); |
|
2301
|
|
|
|
|
|
|
single := home--first--(first+(-7u,0)); |
|
2302
|
|
|
|
|
|
|
double := home--first--second--(second+(0,-7u)); |
|
2303
|
|
|
|
|
|
|
triple := home--first--second--third--(third+(7u,0)); |
|
2304
|
|
|
|
|
|
|
homerun := home--first--second--third--cycle; |
|
2305
|
|
|
|
|
|
|
path firstsecond, firstthird, firsthome, secondthird, secondhome, thirdhome; |
|
2306
|
|
|
|
|
|
|
firstsecond := first--second--(second+(0,-7u)); |
|
2307
|
|
|
|
|
|
|
firstthird := first--second--third--(third+(7u,0)); |
|
2308
|
|
|
|
|
|
|
firsthome := first--second--third--home; |
|
2309
|
|
|
|
|
|
|
secondthird := second--third--(third+(7u,0)); |
|
2310
|
|
|
|
|
|
|
secondhome := second--third--home; |
|
2311
|
|
|
|
|
|
|
thirdhome := third--home; |
|
2312
|
|
|
|
|
|
|
path ifleft, ifright, ifcenter, ofleft, ofleftc, ofcenterl, ofcenterr, ofrightc, ofright; |
|
2313
|
|
|
|
|
|
|
ifleft := home--(home+(-13u,18u)); |
|
2314
|
|
|
|
|
|
|
ifright := home--(home+(13u,18u)); |
|
2315
|
|
|
|
|
|
|
ifcenter := home--(home+(0,18u)); |
|
2316
|
|
|
|
|
|
|
ofleft := home--(home+(-32u, 36u)); |
|
2317
|
|
|
|
|
|
|
ofleftc := home--(home+(-20u, 60u)); |
|
2318
|
|
|
|
|
|
|
ofright := home--(home+(32u, 36u)); |
|
2319
|
|
|
|
|
|
|
ofrightc := home--(home+(20u, 60u)); |
|
2320
|
|
|
|
|
|
|
ofcenterl := home--(home+(-5u, 65u)); |
|
2321
|
|
|
|
|
|
|
ofcenterr := home--(home+(5u, 65u)); |
|
2322
|
|
|
|
|
|
|
path hrleft, hrleftc, hrcenterl, hrcenterr, hrrightc, hrright; |
|
2323
|
|
|
|
|
|
|
hrleft := home--(home+(-37u, 41u)); |
|
2324
|
|
|
|
|
|
|
hrleftc := home--(home+(-27u, 67u)); |
|
2325
|
|
|
|
|
|
|
hrright := home--(home+(37u, 41u)); |
|
2326
|
|
|
|
|
|
|
hrrightc := home--(home+(27u, 67u)); |
|
2327
|
|
|
|
|
|
|
hrcenterl := home--(home+(-5u, 75u)); |
|
2328
|
|
|
|
|
|
|
hrcenterr := home--(home+(5u, 75u)); |
|
2329
|
|
|
|
|
|
|
lxstart := xstart+90u; |
|
2330
|
|
|
|
|
|
|
lystart := ystart+92u; |
|
2331
|
|
|
|
|
|
|
lsize := (lystart-ystart+(fsize/2)-pbsize)/6; |
|
2332
|
|
|
|
|
|
|
pair hr, threeb, twob, oneb, bb, hp; |
|
2333
|
|
|
|
|
|
|
hr := (lxstart,lystart); |
|
2334
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2335
|
|
|
|
|
|
|
threeb := (lxstart,lystart); |
|
2336
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2337
|
|
|
|
|
|
|
twob := (lxstart,lystart); |
|
2338
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2339
|
|
|
|
|
|
|
oneb := (lxstart,lystart); |
|
2340
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2341
|
|
|
|
|
|
|
bb := (lxstart,lystart); |
|
2342
|
|
|
|
|
|
|
lystart := lystart - lsize; |
|
2343
|
|
|
|
|
|
|
hp := (lxstart,lystart); |
|
2344
|
|
|
|
|
|
|
pair wayfirst, waysecond, waythird, wayhome; |
|
2345
|
|
|
|
|
|
|
path cs_second, cs_third, to_home; |
|
2346
|
|
|
|
|
|
|
path cs_firstthird, to_firsthome, to_secondhome; |
|
2347
|
|
|
|
|
|
|
wayfirst := 1/2[home,first]; |
|
2348
|
|
|
|
|
|
|
waysecond := 1/2[first,second]; |
|
2349
|
|
|
|
|
|
|
waythird := 1/2[second,third]; |
|
2350
|
|
|
|
|
|
|
wayhome := 1/2[third,home]; |
|
2351
|
|
|
|
|
|
|
cs_second := first--waysecond--(waysecond+(3u,3u))--(waysecond-(3u,3u)); |
|
2352
|
|
|
|
|
|
|
cs_third := second--waythird--(waythird+(-3u,3u))--(waythird-(-3u,3u)); |
|
2353
|
|
|
|
|
|
|
to_home := third--wayhome--(wayhome+(3u,3u))--(wayhome-(3u,3u)); |
|
2354
|
|
|
|
|
|
|
cs_firstthird := first--second--waythird--(waythird+(-3u,3u))--(waythird-(-3u,3u)); |
|
2355
|
|
|
|
|
|
|
to_firsthome := first--second--third--wayhome--(wayhome+(3u,3u))--(wayhome-(3u,3u)); |
|
2356
|
|
|
|
|
|
|
to_secondhome := second--third--wayhome--(wayhome+(3u,3u))--(wayhome-(3u,3u)); |
|
2357
|
|
|
|
|
|
|
path new_hitter, new_pitcher; |
|
2358
|
|
|
|
|
|
|
new_hitter := (xstart-3u,ystart-3u)--(xstart+3u,ystart+3u)--(xstart,ystart)--(xstart+3u,ystart-3u)--(xstart-3u,ystart+3u)--(xstart,ystart)--(xstart,ystart+100u)--(xstart-3u,ystart+97u)--(xstart+3u,ystart+103u)--(xstart,ystart+100u)--(xstart+3u,ystart+97u)--(xstart-3u,ystart+103u); |
|
2359
|
|
|
|
|
|
|
new_pitcher := (xstart-3u,ystart+97u)--(xstart+3u,ystart+103u)--(xstart,ystart+100u)--(xstart+3u,ystart+97u)--(xstart-3u,ystart+103u)--(xstart,ystart+100u)--(xstart+100u,ystart+100u)--(xstart+97u,ystart+97u)--(xstart+103u,ystart+103u)--(xstart+100u,ystart+100u)--(xstart+103u,ystart+97u)--(xstart+97u,ystart+103u); |
|
2360
|
|
|
|
|
|
|
endgroup |
|
2361
|
|
|
|
|
|
|
enddef; |
|
2362
|
|
|
|
|
|
|
|
|
2363
|
|
|
|
|
|
|
def draw_full_scorecard = |
|
2364
|
|
|
|
|
|
|
begingroup |
|
2365
|
|
|
|
|
|
|
% Draw the player boxes |
|
2366
|
|
|
|
|
|
|
color clr; |
|
2367
|
|
|
|
|
|
|
clr:=card; |
|
2368
|
|
|
|
|
|
|
u := 1.0pt; |
|
2369
|
|
|
|
|
|
|
size := 100u; |
|
2370
|
|
|
|
|
|
|
fsize := 11u; |
|
2371
|
|
|
|
|
|
|
xstart := 100; |
|
2372
|
|
|
|
|
|
|
% Draw first nine position boxes |
|
2373
|
|
|
|
|
|
|
for ystart := 100 step 100 until 900: |
|
2374
|
|
|
|
|
|
|
draw_player_box(xstart,ystart,clr,true); |
|
2375
|
|
|
|
|
|
|
endfor |
|
2376
|
|
|
|
|
|
|
% Draw extra player boxes (without an inning column) |
|
2377
|
|
|
|
|
|
|
for ystart := -100 step 100 until 0: |
|
2378
|
|
|
|
|
|
|
draw_player_box(xstart,ystart,clr,false); |
|
2379
|
|
|
|
|
|
|
endfor |
|
2380
|
|
|
|
|
|
|
% Draw key for column totals |
|
2381
|
|
|
|
|
|
|
for ystart := -100 step 100 until 0: |
|
2382
|
|
|
|
|
|
|
draw_column_totals_key(xstart,ystart,clr); |
|
2383
|
|
|
|
|
|
|
endfor |
|
2384
|
|
|
|
|
|
|
% Draw all the at-bat boxes |
|
2385
|
|
|
|
|
|
|
for ystart := 100 step 100 until 900: |
|
2386
|
|
|
|
|
|
|
for xstart := 100 step 100 until 1100: |
|
2387
|
|
|
|
|
|
|
draw_square(xstart, ystart); |
|
2388
|
|
|
|
|
|
|
endfor |
|
2389
|
|
|
|
|
|
|
endfor |
|
2390
|
|
|
|
|
|
|
% Draw the totals boxes |
|
2391
|
|
|
|
|
|
|
clr:=card; |
|
2392
|
|
|
|
|
|
|
for ystart := -100 step 50 until 50: |
|
2393
|
|
|
|
|
|
|
for xstart := 100 step 100 until 1100: |
|
2394
|
|
|
|
|
|
|
draw_totals_box(xstart,ystart,clr); |
|
2395
|
|
|
|
|
|
|
endfor |
|
2396
|
|
|
|
|
|
|
endfor |
|
2397
|
|
|
|
|
|
|
% Pitcher Rows |
|
2398
|
|
|
|
|
|
|
for ystart := -300 step 100 until -200: |
|
2399
|
|
|
|
|
|
|
draw_pitcher_row(100,ystart,clr,true); |
|
2400
|
|
|
|
|
|
|
draw_pitcher_row(900+100u*(2/3),ystart,clr,false); |
|
2401
|
|
|
|
|
|
|
endfor |
|
2402
|
|
|
|
|
|
|
% Label pitcher rows (key on top line, numbers) |
|
2403
|
|
|
|
|
|
|
draw_pitcher_labels(100,-100,clr,true); |
|
2404
|
|
|
|
|
|
|
draw_pitcher_labels(900+100u*(2/3)-1,-100,clr,false); |
|
2405
|
|
|
|
|
|
|
% Draw a thick line below the pitcher row label |
|
2406
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2407
|
|
|
|
|
|
|
draw (100-iposwidth*3-namewidth,-100-100u/3)--(900+100u*2/3+400+100u,-100-100u/3) withcolor clr; |
|
2408
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t; |
|
2409
|
|
|
|
|
|
|
% Put key into column totals |
|
2410
|
|
|
|
|
|
|
iposwidth := 40u; |
|
2411
|
|
|
|
|
|
|
namewidth := 250u; |
|
2412
|
|
|
|
|
|
|
label(btex {\bigsf R} etex, 1/2[1/2[(100u,100u),(100u-iposwidth,50u)],(100u-iposwidth,100u)]) withcolor clr; |
|
2413
|
|
|
|
|
|
|
label(btex {\bigsf H} etex, 1/2[1/2[(100u,100u),(100u-iposwidth,50u)],(100u,50u)]) withcolor clr; |
|
2414
|
|
|
|
|
|
|
label(btex {\bigsf E} etex, 1/2[1/2[(100u,50u),(100u-iposwidth,0u)],(100u-iposwidth,50u)]) withcolor clr; |
|
2415
|
|
|
|
|
|
|
label(btex {\bigsf LB} etex, 1/2[1/2[(100u,50u),(100u-iposwidth,0u)],(100u,0u)]) withcolor clr; |
|
2416
|
|
|
|
|
|
|
label(btex {\bigsf BB} etex, 1/2[1/2[(100u,0u),(100u-iposwidth,-50u)],(100u-iposwidth,0u)]) withcolor clr; |
|
2417
|
|
|
|
|
|
|
label(btex {\bigsf K} etex, 1/2[1/2[(100u,0u),(100u-iposwidth,-50u)],(100u,-50u)]) withcolor clr; |
|
2418
|
|
|
|
|
|
|
label(btex {\bigsf S} etex, 1/2[1/2[(100u,-50u),(100u-iposwidth,-100u)],(100u-iposwidth,-50u)]) withcolor clr; |
|
2419
|
|
|
|
|
|
|
label(btex {\bigsf P} etex, 1/2[1/2[(100u,-50u),(100u-iposwidth,-100u)],(100u,-100u)]) withcolor clr; |
|
2420
|
|
|
|
|
|
|
% Draw all the row totals boxes |
|
2421
|
|
|
|
|
|
|
for ystart := 100 step 100 until 900: |
|
2422
|
|
|
|
|
|
|
for xstart := 1200 step 100 until 1300: |
|
2423
|
|
|
|
|
|
|
draw_row_summary_box(xstart,ystart,clr); |
|
2424
|
|
|
|
|
|
|
endfor |
|
2425
|
|
|
|
|
|
|
endfor |
|
2426
|
|
|
|
|
|
|
% Draw the game and play total boxes |
|
2427
|
|
|
|
|
|
|
for ystart := -100 step 50 until 50: |
|
2428
|
|
|
|
|
|
|
xstart := 1200; |
|
2429
|
|
|
|
|
|
|
draw_game_summary_box(xstart,ystart,clr); |
|
2430
|
|
|
|
|
|
|
draw_play_total_box(xstart,ystart,clr); |
|
2431
|
|
|
|
|
|
|
endfor |
|
2432
|
|
|
|
|
|
|
% Put the key on the play total boxes |
|
2433
|
|
|
|
|
|
|
nudge := 5u; |
|
2434
|
|
|
|
|
|
|
label.urt(btex {\sf 1B} etex, (1200+100u/3*2,50+25u+nudge)) withcolor clr; |
|
2435
|
|
|
|
|
|
|
label.urt(btex {\sf 2B} etex, (1200+100u/3*2,50+nudge)) withcolor clr; |
|
2436
|
|
|
|
|
|
|
label.urt(btex {\sf DP} etex, (1200+100u/3*2+100u,50+25u+nudge)) withcolor clr; |
|
2437
|
|
|
|
|
|
|
label.urt(btex {\sf HBP} etex, (1200+100u/3*2+100u,50+nudge)) withcolor clr; |
|
2438
|
|
|
|
|
|
|
label.urt(btex {\sf 3B} etex, (1200+100u/3*2,0+25u+nudge)) withcolor clr; |
|
2439
|
|
|
|
|
|
|
label.urt(btex {\sf HR} etex, (1200+100u/3*2,0+nudge)) withcolor clr; |
|
2440
|
|
|
|
|
|
|
label.urt(btex {\sf WP} etex, (1200+100u/3*2+100u,0+25u+nudge)) withcolor clr; |
|
2441
|
|
|
|
|
|
|
label.urt(btex {\sf PB} etex, (1200+100u/3*2+100u,0+nudge)) withcolor clr; |
|
2442
|
|
|
|
|
|
|
label.urt(btex {\sf SF} etex, (1200+100u/3*2,-50+25u+nudge)) withcolor clr; |
|
2443
|
|
|
|
|
|
|
label.urt(btex {\sf SAC} etex, (1200+100u/3*2,-50+nudge)) withcolor clr; |
|
2444
|
|
|
|
|
|
|
label.urt(btex {\sf SB} etex, (1200+100u/3*2+100u,-50+25u+nudge)) withcolor clr; |
|
2445
|
|
|
|
|
|
|
label.urt(btex {\sf CS} etex, (1200+100u/3*2+100u,-50+nudge)) withcolor clr; |
|
2446
|
|
|
|
|
|
|
% Proof |
|
2447
|
|
|
|
|
|
|
label.urt(btex {\sf AB+BB+HBP+SAC+SF} etex, (1200+100u/3*2,-100+25u+nudge)) withcolor clr; |
|
2448
|
|
|
|
|
|
|
label.urt(btex {\sf =\quad R+LOB+OPO} etex, (1200+100u/3*2+24u,-100+nudge)) withcolor clr; |
|
2449
|
|
|
|
|
|
|
% Side information |
|
2450
|
|
|
|
|
|
|
% pickup pencircle scaled thickline_t; |
|
2451
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2452
|
|
|
|
|
|
|
draw (1400,100)--(1400,1000)--(1466,1000)--(1466,100)--cycle withcolor clr; |
|
2453
|
|
|
|
|
|
|
draw (1399,1000)--(1399,1033.3)--(1466,1033.3)--(1466,1000)--cycle withcolor clr; |
|
2454
|
|
|
|
|
|
|
pickup pencircle scaled thinline_t;; |
|
2455
|
|
|
|
|
|
|
draw (1433.3,100)--(1433.3,1000) withcolor clr; |
|
2456
|
|
|
|
|
|
|
label(btex {\bigsf Team} etex rotated 90, (1416,130)) withcolor clr; |
|
2457
|
|
|
|
|
|
|
label(btex {\bigsf FP} etex rotated 90, (1416,614)) withcolor clr; |
|
2458
|
|
|
|
|
|
|
label(btex {\bigsf Temp} etex rotated 90, (1416,870)) withcolor clr; |
|
2459
|
|
|
|
|
|
|
label(btex {\bigsf At} etex rotated 90, (1448,142)) withcolor clr; |
|
2460
|
|
|
|
|
|
|
label(btex {\bigsf Att} etex rotated 90, (1448,450)) withcolor clr; |
|
2461
|
|
|
|
|
|
|
label(btex {\bigsf Scorer} etex rotated 90, (1448,600)) withcolor clr; |
|
2462
|
|
|
|
|
|
|
label(btex {\bigsf Wind} etex rotated 90, (1448,870)) withcolor clr; |
|
2463
|
|
|
|
|
|
|
label(btex {\tiny Copyright \char'251 2005, Christopher Swingley, cswingle@iarc.uaf.edu} etex rotated 90, (1472,-210)) withcolor clr; |
|
2464
|
|
|
|
|
|
|
% Little numbers for first nine in batting order |
|
2465
|
|
|
|
|
|
|
label(btex {\sf 1} etex, (-224u, 995u)) withcolor clr; |
|
2466
|
|
|
|
|
|
|
label(btex {\sf 2} etex, (-224u, 895u)) withcolor clr; |
|
2467
|
|
|
|
|
|
|
label(btex {\sf 3} etex, (-224u, 795u)) withcolor clr; |
|
2468
|
|
|
|
|
|
|
label(btex {\sf 4} etex, (-224u, 694u)) withcolor clr; |
|
2469
|
|
|
|
|
|
|
label(btex {\sf 5} etex, (-224u, 594u)) withcolor clr; |
|
2470
|
|
|
|
|
|
|
label(btex {\sf 6} etex, (-224u, 494u)) withcolor clr; |
|
2471
|
|
|
|
|
|
|
label(btex {\sf 7} etex, (-224u, 393u)) withcolor clr; |
|
2472
|
|
|
|
|
|
|
label(btex {\sf 8} etex, (-224u, 293u)) withcolor clr; |
|
2473
|
|
|
|
|
|
|
label(btex {\sf 9} etex, (-224u, 193u)) withcolor clr; |
|
2474
|
|
|
|
|
|
|
% Numbers for pitchers |
|
2475
|
|
|
|
|
|
|
label(btex {\sf 1} etex, (-224u, -141u)) withcolor clr; |
|
2476
|
|
|
|
|
|
|
label(btex {\sf 2} etex, (-224u, -174u)) withcolor clr; |
|
2477
|
|
|
|
|
|
|
label(btex {\sf 3} etex, (-224u, -208u)) withcolor clr; |
|
2478
|
|
|
|
|
|
|
label(btex {\sf 4} etex, (-224u, -241u)) withcolor clr; |
|
2479
|
|
|
|
|
|
|
label(btex {\sf 5} etex, (-224u, -274u)) withcolor clr; |
|
2480
|
|
|
|
|
|
|
% second column of pitchers |
|
2481
|
|
|
|
|
|
|
label(btex {\sf 6} etex, (640u, -141u)) withcolor clr; |
|
2482
|
|
|
|
|
|
|
label(btex {\sf 7} etex, (640u, -174u)) withcolor clr; |
|
2483
|
|
|
|
|
|
|
label(btex {\sf 8} etex, (640u, -208u)) withcolor clr; |
|
2484
|
|
|
|
|
|
|
label(btex {\sf 9} etex, (640u, -241u)) withcolor clr; |
|
2485
|
|
|
|
|
|
|
label(btex {\sf 10} etex, (643u, -274u)) withcolor clr; |
|
2486
|
|
|
|
|
|
|
% Title boxes |
|
2487
|
|
|
|
|
|
|
xstart:=100; |
|
2488
|
|
|
|
|
|
|
ystart:=1000; |
|
2489
|
|
|
|
|
|
|
pickup pencircle scaled thickline_t; |
|
2490
|
|
|
|
|
|
|
% Inning and Position box |
|
2491
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart-iposwidth*2u,ystart)--(xstart-iposwidth*2u,ystart+100u/3)--(xstart,ystart+100u/3)--cycle withcolor clr; |
|
2492
|
|
|
|
|
|
|
draw (xstart-iposwidth,ystart)--(xstart-iposwidth,ystart+100u/3) withcolor clr; |
|
2493
|
|
|
|
|
|
|
label(btex {\bigsf Pos} etex, 1/2[(xstart-iposwidth*2u,ystart),(xstart-iposwidth,ystart+100u/3)]) withcolor clr; |
|
2494
|
|
|
|
|
|
|
label(btex {\bigsf Inn} etex, 1/2[(xstart-iposwidth,ystart),(xstart,ystart+100u/3)]) withcolor clr; |
|
2495
|
|
|
|
|
|
|
% Player name box |
|
2496
|
|
|
|
|
|
|
draw (xstart-iposwidth*2,ystart)--(xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*2-namewidth,ystart+100u/3)-- |
|
2497
|
|
|
|
|
|
|
(xstart-iposwidth*2,ystart+100u/3)--cycle withcolor clr; |
|
2498
|
|
|
|
|
|
|
label(btex {\bigsf Batter} etex, 1/2[(xstart-iposwidth*2-namewidth,ystart),(xstart-iposwidth*2,ystart+100u/3)]) withcolor clr; |
|
2499
|
|
|
|
|
|
|
% Number box |
|
2500
|
|
|
|
|
|
|
draw (xstart-iposwidth*2-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart)--(xstart-iposwidth*3-namewidth,ystart+100u/3)-- |
|
2501
|
|
|
|
|
|
|
(xstart-iposwidth*2-namewidth,ystart+100u/3)--cycle withcolor clr; |
|
2502
|
|
|
|
|
|
|
label(btex {\bigsf \#} etex, 1/2[(xstart-iposwidth*2-namewidth,ystart),(xstart-iposwidth*3-namewidth,ystart+100u/3)]) withcolor clr; |
|
2503
|
|
|
|
|
|
|
% Inning boxes |
|
2504
|
|
|
|
|
|
|
ystart:=1000; |
|
2505
|
|
|
|
|
|
|
for xstart := 100 step 100 until 1100: |
|
2506
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart+100u,ystart)--(xstart+100u,ystart+100u/3)--(xstart,ystart+100u/3)--cycle withcolor clr; |
|
2507
|
|
|
|
|
|
|
endfor |
|
2508
|
|
|
|
|
|
|
label(btex {\bigsf 1} etex, 1/2[(100,ystart),(200,ystart+100u/3)]) withcolor clr; |
|
2509
|
|
|
|
|
|
|
label(btex {\bigsf 2} etex, 1/2[(200,ystart),(300,ystart+100u/3)]) withcolor clr; |
|
2510
|
|
|
|
|
|
|
label(btex {\bigsf 3} etex, 1/2[(300,ystart),(400,ystart+100u/3)]) withcolor clr; |
|
2511
|
|
|
|
|
|
|
label(btex {\bigsf 4} etex, 1/2[(400,ystart),(500,ystart+100u/3)]) withcolor clr; |
|
2512
|
|
|
|
|
|
|
label(btex {\bigsf 5} etex, 1/2[(500,ystart),(600,ystart+100u/3)]) withcolor clr; |
|
2513
|
|
|
|
|
|
|
label(btex {\bigsf 6} etex, 1/2[(600,ystart),(700,ystart+100u/3)]) withcolor clr; |
|
2514
|
|
|
|
|
|
|
label(btex {\bigsf 7} etex, 1/2[(700,ystart),(800,ystart+100u/3)]) withcolor clr; |
|
2515
|
|
|
|
|
|
|
label(btex {\bigsf 8} etex, 1/2[(800,ystart),(900,ystart+100u/3)]) withcolor clr; |
|
2516
|
|
|
|
|
|
|
label(btex {\bigsf 9} etex, 1/2[(900,ystart),(1000,ystart+100u/3)]) withcolor clr; |
|
2517
|
|
|
|
|
|
|
label(btex {\bigsf 10} etex, 1/2[(1000,ystart),(1100,ystart+100u/3)]) withcolor clr; |
|
2518
|
|
|
|
|
|
|
label(btex {\bigsf 11} etex, 1/2[(1100,ystart),(1200,ystart+100u/3)]) withcolor clr; |
|
2519
|
|
|
|
|
|
|
% Player totals |
|
2520
|
|
|
|
|
|
|
ystart:=1000; |
|
2521
|
|
|
|
|
|
|
for xstart := 1200 step 100u/3 until 1300+100u/3*2: |
|
2522
|
|
|
|
|
|
|
draw (xstart,ystart)--(xstart+100u/3,ystart)--(xstart+100u/3,ystart+100u/3)--(xstart,ystart+100u/3)--cycle withcolor clr; |
|
2523
|
|
|
|
|
|
|
endfor |
|
2524
|
|
|
|
|
|
|
% On the top |
|
2525
|
|
|
|
|
|
|
label(btex {\bigsf AB} etex, 1/2[(1200,1000),(1200+100u/3,1000+100u/3)]) withcolor clr; |
|
2526
|
|
|
|
|
|
|
label(btex {\bigsf R} etex, 1/2[(1200+100u/3,1000),(1200+100u/3*2,1000+100u/3)]) withcolor clr; |
|
2527
|
|
|
|
|
|
|
label(btex {\bigsf H} etex, 1/2[(1200+100u/3*2,1000),(1300,1000+100u/3)]) withcolor clr; |
|
2528
|
|
|
|
|
|
|
label(btex {\bigsf RBI} etex, 1/2[(1300,1000),(1300+100u/3,1000+100u/3)]) withcolor clr; |
|
2529
|
|
|
|
|
|
|
label(btex {\bigsf BB} etex, 1/2[(1300+100u/3,1000),(1300+100u/3*2,1000+100u/3)]) withcolor clr; |
|
2530
|
|
|
|
|
|
|
label(btex {\bigsf SO} etex, 1/2[(1300+100u/3*2,1000),(1400,1000+100u/3)]) withcolor clr; |
|
2531
|
|
|
|
|
|
|
pickup pencircle scaled playline_t; |
|
2532
|
|
|
|
|
|
|
endgroup |
|
2533
|
|
|
|
|
|
|
enddef; |
|
2534
|
|
|
|
|
|
|
|
|
2535
|
|
|
|
|
|
|
EOT |
|
2536
|
|
|
|
|
|
|
|
|
2537
|
|
|
|
|
|
|
|
|
2538
|
|
|
|
|
|
|
$TEX = <<'EOT'; |
|
2539
|
|
|
|
|
|
|
\pdfinfo |
|
2540
|
|
|
|
|
|
|
{ /Title (scorecard.pdf) |
|
2541
|
|
|
|
|
|
|
/Creator (Metapost, TeX) |
|
2542
|
|
|
|
|
|
|
/Author (Christopher Swingley) } |
|
2543
|
|
|
|
|
|
|
\input miniltx |
|
2544
|
|
|
|
|
|
|
\input graphicx.sty |
|
2545
|
|
|
|
|
|
|
\input eplain |
|
2546
|
|
|
|
|
|
|
\resetatcatcode |
|
2547
|
|
|
|
|
|
|
\paperheight 11 true in |
|
2548
|
|
|
|
|
|
|
\paperwidth 8.5 true in |
|
2549
|
|
|
|
|
|
|
\topmargin 0.75cm |
|
2550
|
|
|
|
|
|
|
\bottommargin 0.75cm |
|
2551
|
|
|
|
|
|
|
\leftmargin 1.00cm |
|
2552
|
|
|
|
|
|
|
\rightmargin 0.75cm |
|
2553
|
|
|
|
|
|
|
\nopagenumbers |
|
2554
|
|
|
|
|
|
|
\parindent=0pt\parskip=8pt |
|
2555
|
|
|
|
|
|
|
\vfill |
|
2556
|
|
|
|
|
|
|
\includegraphics[height=\hsize,angle=90]{__BASE__-0.pdf} |
|
2557
|
|
|
|
|
|
|
\vfill\eject |
|
2558
|
|
|
|
|
|
|
\bye |
|
2559
|
|
|
|
|
|
|
EOT |
|
2560
|
|
|
|
|
|
|
|
|
2561
|
|
|
|
|
|
|
|
|
2562
|
|
|
|
|
|
|
$TEXD = <<'EOT'; |
|
2563
|
|
|
|
|
|
|
\pdfinfo |
|
2564
|
|
|
|
|
|
|
{ /Title (metapost_scorecard.pdf) |
|
2565
|
|
|
|
|
|
|
/Creator (Metapost, TeX) |
|
2566
|
|
|
|
|
|
|
/Author (Christopher Swingley) } |
|
2567
|
|
|
|
|
|
|
\input miniltx |
|
2568
|
|
|
|
|
|
|
\input graphicx.sty |
|
2569
|
|
|
|
|
|
|
\input eplain |
|
2570
|
|
|
|
|
|
|
\resetatcatcode |
|
2571
|
|
|
|
|
|
|
\paperheight 11 true in |
|
2572
|
|
|
|
|
|
|
\paperwidth 8.5 true in |
|
2573
|
|
|
|
|
|
|
\topmargin 0.85cm |
|
2574
|
|
|
|
|
|
|
\bottommargin 0.65cm |
|
2575
|
|
|
|
|
|
|
\leftmargin 1.00cm |
|
2576
|
|
|
|
|
|
|
\rightmargin 0.75cm |
|
2577
|
|
|
|
|
|
|
\nopagenumbers |
|
2578
|
|
|
|
|
|
|
\parindent=0pt\parskip=8pt |
|
2579
|
|
|
|
|
|
|
\vfill |
|
2580
|
|
|
|
|
|
|
\includegraphics[height=\hsize,angle=90]{__BASE1__-0.pdf} |
|
2581
|
|
|
|
|
|
|
\vfill\eject |
|
2582
|
|
|
|
|
|
|
\includegraphics[height=\hsize,angle=90]{__BASE2__-0.pdf} |
|
2583
|
|
|
|
|
|
|
\vfill\eject |
|
2584
|
|
|
|
|
|
|
\bye |
|
2585
|
|
|
|
|
|
|
EOT |
|
2586
|
|
|
|
|
|
|
|
|
2587
|
|
|
|
|
|
|
|
|
2588
|
|
|
|
|
|
|
=head1 LIMITATIONS |
|
2589
|
|
|
|
|
|
|
|
|
2590
|
|
|
|
|
|
|
This module makes no attempt to try to work around the physical limitations |
|
2591
|
|
|
|
|
|
|
of the scorecard. So if there are more than 11 innings, more than nine batters |
|
2592
|
|
|
|
|
|
|
in an inning, more than three players in a lineup position, or more than |
|
2593
|
|
|
|
|
|
|
ten pitchers, it will fail, either by dying, or just screwing up the output. |
|
2594
|
|
|
|
|
|
|
|
|
2595
|
|
|
|
|
|
|
More than four foul balls will not be recorded for a given at-bat in the graphic |
|
2596
|
|
|
|
|
|
|
(but the pitch counts will still be incremented appropriately). |
|
2597
|
|
|
|
|
|
|
|
|
2598
|
|
|
|
|
|
|
Also, no attempt is made to make sure you have the right number of outs in an |
|
2599
|
|
|
|
|
|
|
innings, balls/strikes in a walk/strikeout, and so on. We don't even necessarily |
|
2600
|
|
|
|
|
|
|
check to make sure you've called inn() before you call your first ab(), or that |
|
2601
|
|
|
|
|
|
|
you don't use an incorrect base number, and so on. Or that David Ortiz isn't |
|
2602
|
|
|
|
|
|
|
pitching, or playing all positions at once. Just don't record something |
|
2603
|
|
|
|
|
|
|
illegal in a baseball game, and you likely won't run into problems here, |
|
2604
|
|
|
|
|
|
|
either. |
|
2605
|
|
|
|
|
|
|
|
|
2606
|
|
|
|
|
|
|
There are also likely things that happen in the game that the API here does |
|
2607
|
|
|
|
|
|
|
not well-address. |
|
2608
|
|
|
|
|
|
|
|
|
2609
|
|
|
|
|
|
|
Patches are welcome for all of this, if you want it. |
|
2610
|
|
|
|
|
|
|
|
|
2611
|
|
|
|
|
|
|
|
|
2612
|
|
|
|
|
|
|
=head1 TODO |
|
2613
|
|
|
|
|
|
|
|
|
2614
|
|
|
|
|
|
|
Automatically, or otherwise, handle more than 9 batters per inning, or more |
|
2615
|
|
|
|
|
|
|
than 11 innings, perhaps by adding a new scorecard, or by re-using existing |
|
2616
|
|
|
|
|
|
|
innings for overflow. |
|
2617
|
|
|
|
|
|
|
|
|
2618
|
|
|
|
|
|
|
|
|
2619
|
|
|
|
|
|
|
=head1 AUTHOR |
|
2620
|
|
|
|
|
|
|
|
|
2621
|
|
|
|
|
|
|
Chris Nandor Eprojects@pudge.netE, http://projects.pudge.net/ |
|
2622
|
|
|
|
|
|
|
|
|
2623
|
|
|
|
|
|
|
Copyright (c) 2005 Chris Nandor. Licensed under the terms of the GNU General |
|
2624
|
|
|
|
|
|
|
Public License, Version 2 available from http://www.gnu.org/copyleft/gpl.html. |
|
2625
|
|
|
|
|
|
|
|
|
2626
|
|
|
|
|
|
|
Front end to mpost_scorecard by Christopher Swingley, also licensed under |
|
2627
|
|
|
|
|
|
|
the GPL. |
|
2628
|
|
|
|
|
|
|
|
|
2629
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
2630
|
|
|
|
|
|
|
|
|
2631
|
|
|
|
|
|
|
http://www.frontier.iarc.uaf.edu/~cswingle/baseball/scorecards.php |
|
2632
|
|
|
|
|
|
|
|
|
2633
|
|
|
|
|
|
|
|
|
2634
|
|
|
|
|
|
|
=head1 VERSION |
|
2635
|
|
|
|
|
|
|
|
|
2636
|
|
|
|
|
|
|
$Id: Scorecard.pm,v 1.5 2005/10/21 04:48:58 pudge Exp $ |
|
2637
|
|
|
|
|
|
|
|
|
2638
|
|
|
|
|
|
|
__END__ |