Skip to content

Commit 315508a

Browse files
author
Takumasa Sakao
committed
Add file option
1 parent f11c46b commit 315508a

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

main.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/gdamore/tcell"
1010
"github.com/gdamore/tcell/encoding"
11+
"github.com/sachaos/go-life/format/rle"
1112
"github.com/sachaos/go-life/preset"
1213
"github.com/urfave/cli"
1314
"log"
@@ -30,7 +31,7 @@ func initScreen() tcell.Screen {
3031
return s
3132
}
3233

33-
func startGame(themes []Theme, presets []preset.Preset, themeIndex int, pattern *preset.Preset) error {
34+
func startGame(themes []Theme, presets []preset.Preset, themeIndex int, defaultCells [][]bool) error {
3435
rand.Seed(time.Now().Unix())
3536

3637
s := initScreen()
@@ -40,15 +41,16 @@ func startGame(themes []Theme, presets []preset.Preset, themeIndex int, pattern
4041
width, height := s.Size()
4142
b := NewBoard(height, width/2)
4243

43-
if pattern == nil {
44+
if len(defaultCells) == 0 {
4445
b.Random()
4546
} else {
46-
pwidth, pheight := pattern.Size()
47+
pheight := len(defaultCells)
48+
pwidth := len(defaultCells[0])
4749
if pwidth > width || pheight > height {
4850
return fmt.Errorf("Specified pattern is too big\n")
4951
}
5052

51-
b.Set((width/2-pwidth)/2, (height-pheight)/2, pattern.Cells)
53+
b.Set((width/2-pwidth)/2, (height-pheight)/2, defaultCells)
5254
}
5355

5456
// init ticker
@@ -119,6 +121,10 @@ func main() {
119121
Name: "pattern",
120122
Usage: "Pattern name (e.g. glider, glider-gun)",
121123
},
124+
cli.StringFlag{
125+
Name: "file",
126+
Usage: "Pattern file",
127+
},
122128
}
123129

124130
app.Before = func(c *cli.Context) error {
@@ -152,6 +158,10 @@ func main() {
152158
}
153159

154160
app.Action = func(c *cli.Context) error {
161+
if c.String("pattern") != "" && c.String("file") != "" {
162+
return fmt.Errorf("Using pattern and file option is not permitted")
163+
}
164+
155165
themeIndex := -1
156166
for i, theme := range themes {
157167
if theme.Name == c.String("theme") {
@@ -163,21 +173,31 @@ func main() {
163173
return fmt.Errorf("Invalid theme name: %s\n", c.String("theme"))
164174
}
165175

166-
var pattern *preset.Preset
176+
var defaultCells [][]bool
167177
specifiedPattern := c.String("pattern")
168178
if specifiedPattern != "" {
169179
for _, p := range presets {
170180
if p.Name == specifiedPattern {
171-
pattern = &p
181+
defaultCells = p.Cells
172182
break
173183
}
174184
}
175-
if pattern.Name == "" {
185+
if len(defaultCells) == 0 {
176186
return fmt.Errorf("Invalid pattern name: %s\n", specifiedPattern)
177187
}
178188
}
179189

180-
return startGame(themes, presets, themeIndex, pattern)
190+
fileName := c.String("file")
191+
if fileName != "" {
192+
file, err := os.Open(fileName)
193+
if err != nil {
194+
return err
195+
}
196+
197+
defaultCells = rle.Parse(file)
198+
}
199+
200+
return startGame(themes, presets, themeIndex, defaultCells)
181201
}
182202

183203
if err := app.Run(os.Args); err != nil {

0 commit comments

Comments
 (0)