Skip to content

Commit

Permalink
Minor fixes (#51)
Browse files Browse the repository at this point in the history
  • Loading branch information
slshen authored Oct 23, 2024
1 parent 885b567 commit d2eb4ff
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 27 deletions.
2 changes: 2 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
* Implment sub, hsub, vsub

* Verify stats for games in tests

* Check for runners advancing past other runners, disappearing runners
Expand Down
8 changes: 4 additions & 4 deletions pkg/game/gamemachine.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ func (m *gameMachine) handlePlayCode(play gamefile.Play, state *State) error {
}
state.Complete = true
state.recordOut()
return m.handleCaughtStealing(play, state, pp, CaughtStealing, NoError)
return m.handleCaughtStealing(play, state, pp, NoError)
case pp.playIs("K+PO%($$)") || pp.playIs("K+PO%(E$)"):
from := pp.playMatches[0]
if !(from == "1" || from == "2" || from == "3") {
Expand Down Expand Up @@ -502,9 +502,9 @@ func (m *gameMachine) handlePlayCode(play gamefile.Play, state *State) error {
fieldingError := FieldingError{
Fielder: pp.getFielder(1),
}
return m.handleCaughtStealing(play, state, pp, PickedOff, fieldingError)
return m.handleCaughtStealing(play, state, pp, fieldingError)
case pp.playIs("CS%($$)") || pp.playIs("CS%($$$)") || pp.playIs("CS%($$$$)"):
return m.handleCaughtStealing(play, state, pp, CaughtStealing, NoError)
return m.handleCaughtStealing(play, state, pp, NoError)
case pp.playIs("FLE$"):
state.Play = Play{
Type: FoulFlyError,
Expand Down Expand Up @@ -549,7 +549,7 @@ func (m *gameMachine) handleGroundBallDoublePlay(play gamefile.Play, state *Stat
return nil
}

func (m *gameMachine) handleCaughtStealing(play gamefile.Play, state *State, pp playCodeParser, playType PlayType, fieldingError FieldingError) error {
func (m *gameMachine) handleCaughtStealing(play gamefile.Play, state *State, pp playCodeParser, fieldingError FieldingError) error {
to := pp.playMatches[0]
if !(to == "2" || to == "3" || to == "H") {
return fmt.Errorf("illegal caught stealing base code %s", pp.playCode)
Expand Down
37 changes: 20 additions & 17 deletions pkg/gamefile/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,25 +39,28 @@ type Property struct {

type Event struct {
Pos Position
Alternative *Alternative `parser:"'alt' @@ (NL|EOF)"`
Pitcher string `parser:"| ('pitcher'|'pitching') @Token (NL|EOF)"`
RAdjRunner Numbers `parser:"| 'radj' @Token"`
RAdjBase string `parser:" @Token (NL|EOF)"`
Score string `parser:"| 'score' @Token (NL|EOF)"`
Final string `parser:"| 'final' @Token (NL|EOF)"`
HSubEnter string `parser:"| 'hsub' @Token"`
HSubFor string `parser:" 'for' @Token (NL|EOF)"`
VSubEnter string `parser:"| 'vsub' @Token"`
VSubFor string `parser:" 'for' @Token (NL|EOF)"`
Play *ActualPlay `parser:"| @@"`
Afters []*After `parser:" @@*"`
Comment string `parser:" @Comment? (NL|EOF)"`
Empty bool `parser:"| @NL"`
Alternative *Alternative `parser:"'alt' @@ (NL|EOF)"`
Pitcher string `parser:"| ('pitcher'|'pitching') @Token (NL|EOF)"`
RAdjRunner Numbers `parser:"| 'radj' @Token"`
RAdjBase string `parser:" @Token (NL|EOF)"`
Score string `parser:"| 'score' @Token (NL|EOF)"`
Final string `parser:"| 'final' @Token (NL|EOF)"`
Sub *LineupChange `parser:"| @@"`
Play *ActualPlay `parser:"| @@"`
Afters []*LineupChange `parser:" @@*"`
Comment string `parser:" @Comment? (NL|EOF)"`
Empty bool `parser:"| @NL"`
}

type After struct {
type LineupChange struct {
CourtesyRunner *string `parser:"'cr' @Token"`
Conference *bool `parser:"| @'conf'"`
SubEnter string `parser:"| 'sub' @Token"`
SubExit string `parser:"| 'for' @Token"`
HSubEnter string `parser:"| 'hsub' @Token"`
HSubExit string `parser:" 'for' @Token (NL|EOF)"`
VSubEnter string `parser:"| 'vsub' @Token"`
VSubExit string `parser:" 'for' @Token (NL|EOF)"`
}

type Play interface {
Expand Down Expand Up @@ -220,7 +223,7 @@ func (f *File) writeEvents(w io.Writer, name string, events []*Event) {
f.writeCodeAdvancesComment(w, play.Code, play.Advances, event.Afters, event.Comment)
case event.Alternative != nil:
alt := event.Alternative
fmt.Fprintf(w, " alt")
fmt.Fprintf(w, " alt ")
f.writeCodeAdvancesComment(w, alt.Code, alt.Advances, nil, alt.Comment)
case event.Pitcher != "":
fmt.Fprintf(w, "pitching %s\n", event.Pitcher)
Expand All @@ -235,7 +238,7 @@ func (f *File) writeEvents(w io.Writer, name string, events []*Event) {
fmt.Fprintln(w)
}

func (f *File) writeCodeAdvancesComment(w io.Writer, code string, advances []string, afters []*After, comment string) {
func (f *File) writeCodeAdvancesComment(w io.Writer, code string, advances []string, afters []*LineupChange, comment string) {
fmt.Fprintf(w, "%s", code)
for _, adv := range advances {
fmt.Fprintf(w, " %s", adv)
Expand Down
2 changes: 1 addition & 1 deletion pkg/gamefile/lexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var gameFileDef = lexer.MustStateful(
rule("comment", `//.*[\n\r]`, nil),
},
"PA": {
rule("Advance", `[Bb123][-Xx][123H]([^ \t\n\r]*)`, nil),
rule("Advance", `[Bb123][-Xx][123Hh]([^ \t\n\r]*)`, nil),
rule("colon", `(:|--)[ \t]*`, lexer.Push("PAComment")),
rule("NL", `[\n\r]`, lexer.Pop()),
rule("Token", `[^ \t\n\r]+`, nil),
Expand Down
18 changes: 18 additions & 0 deletions pkg/gamefile/newgame.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,24 @@ func (f *File) WriteNewGame(nextDay bool) (*File, error) {
})
}
}
ng.HomeEvents = []*Event{
{Pitcher: "0"},
{Play: &ActualPlay{
PlateAppearance: "1",
Batter: "1",
PitchSequence: ".",
Code: "NP",
}},
}
ng.VisitorEvents = []*Event{
{Pitcher: "0"},
{Play: &ActualPlay{
PlateAppearance: "1",
Batter: "1",
PitchSequence: ".",
Code: "NP",
}},
}
if err := ng.Validate(); err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/gamefile/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestParser(t *testing.T) {
event = events[3]
assert.Equal("9", *event.Afters[0].CourtesyRunner)
event = events[20]
assert.Equal("3", event.VSubEnter)
assert.Equal("2", event.VSubFor)
assert.Equal("3", event.Sub.VSubEnter)
assert.Equal("2", event.Sub.VSubExit)
}
}
7 changes: 4 additions & 3 deletions pkg/ui/ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -376,14 +376,15 @@ func (ui *UI) newGame(gamePath string) {
if newGamePath == "" {
newGamePath = path.Join(path.Dir(gamePath), time.Now().Format(gamefile.GameDateFormat)+"-1.gm")
}
ui.homePlays.SetText("", false)
ui.visitorPlays.SetText("", false)
ui.parseGame(newGamePath)
}

func (ui *UI) save() {
text := ui.getGameText()
var canonName string
gf, _ := gamefile.ParseString(ui.path, text)
if gf != nil {
if gf, err := gamefile.ParseString(ui.path, text); err == nil {
gm, _ := game.NewGame(gf)
if gm != nil && gm.GetDate().Unix() != 0 && gm.Number != "" {
canonName = fmt.Sprintf("%s-%s.gm", gm.GetDate().Format("20060102"), gm.Number)
Expand All @@ -400,7 +401,7 @@ func (ui *UI) save() {
if canonName != "" {
ui.path = path.Join(path.Dir(ui.path), canonName)
}
f, err := os.CreateTemp(path.Dir(ui.path), fmt.Sprintf("%s*", ui.path))
f, err := os.CreateTemp(path.Dir(ui.path), fmt.Sprintf("%s*", path.Base(ui.path)))
if err != nil {
msg := fmt.Sprintf("cannot save %s [yellow:red]%s", ui.path, err.Error())
ui.messages.SetText(msg)
Expand Down

0 comments on commit d2eb4ff

Please sign in to comment.