Module: TwentyFortyEight::Cli

Defined in:
lib/TwentyFortyEight/cli.rb

Overview

Cli

Defined Under Namespace

Classes: UnknownModeError

Class Method Summary collapse

Class Method Details

.defaults_for(mode) ⇒ Object



74
75
76
77
78
79
80
81
82
83
# File 'lib/TwentyFortyEight/cli.rb', line 74

def self.defaults_for(mode)
  case mode.to_sym
  when :endless
    { verbose: true, delay: 100, history: true }
  when :play
    { verbose: true, delay: 100 }
  else
    { verbose: true, interactive: true, delay: 10 }
  end
end

.parse!(**user_defaults) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/TwentyFortyEight/cli.rb', line 5

def self.parse!(**user_defaults)
  mode     = ARGV[0].to_s.downcase.to_sym
  settings = defaults_for(mode).merge user_defaults
  settings[:mode] = mode
  settings[:mode] = :play unless TwentyFortyEight::MODES.include? mode

  OptionParser.new do |cli|
    cli.banner = ''
    cli.separator "options:"

    cli.on('-i', '--interactive', 'Can you reach the 2048 tile?') do
      settings[:interactive] = true
    end

    cli.on('-eX,Y,Z', '--exclude=X,Y,Z', Array,
           'Exclude directions') do |list|
      settings[:except] = list.map(&:to_sym)
    end

    cli.on('-oX,Y,Z', '--only=X,Y,Z', Array,
           'Include directions') do |list|
      settings[:only] = list.map(&:to_sym)
    end

    cli.on('-dMS', '--delay=MS', Float,
           'Delay in ms, applied after each move') do |ms|
      settings[:delay] = ms
    end

    cli.on('-sSIZE', '--size=SIZE', Integer,
           'Set grid size of the board') do |size|
      settings[:size] = size
    end

    cli.on('-l', '--log', 'Log game moves in json format') do |v|
      settings[:log] = v
    end

    cli.on('-h', '--history', 'Show game history') do |v|
      settings[:history] = v
    end

    cli.on('-v', '--[no-]verbose', 'Toggles printing the game') do |v|
      settings[:verbose] = v
    end

    cli.on('--help', 'Display this help') do
      puts 'usage: 2048 [mode] [options]'
      puts 'controls:'
      puts '     W A S D'
      puts '     K J H L'
      puts '     ARROW KEYS'
      puts ''
      puts 'modes:'
      puts '     play'    + (' ' * 28) + 'Plays the game automatically in order :down, :left, :right, :up'
      puts '     endless' + (' ' * 25) + 'Loops play until ctrl+C'
      puts ''
      puts '     When no mode is supplied, it will default to: 2048 play -i -s 4'
      puts cli
      exit 0
    end
  end.parse!

  settings.delete :only if settings[:except]
  settings.delete :except if settings[:only]

  Options.new settings
end