squib 0.13.4 → 0.14.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -4
  3. data/CHANGELOG.md +19 -3
  4. data/README.md +1 -1
  5. data/bin/squib +1 -16
  6. data/lib/squib.rb +1 -1
  7. data/lib/squib/api/data.rb +29 -0
  8. data/lib/squib/api/save.rb +23 -2
  9. data/lib/squib/api/shapes.rb +37 -0
  10. data/lib/squib/api/text.rb +1 -1
  11. data/lib/squib/api/units.rb +5 -0
  12. data/lib/squib/args/arg_loader.rb +1 -1
  13. data/lib/squib/args/coords.rb +3 -1
  14. data/lib/squib/args/dir_validator.rb +1 -1
  15. data/lib/squib/args/sheet.rb +9 -2
  16. data/lib/squib/args/sprue_file.rb +44 -0
  17. data/lib/squib/args/unit_conversion.rb +2 -0
  18. data/lib/squib/{layouts → builtin/layouts}/economy.yml +5 -5
  19. data/lib/squib/{layouts → builtin/layouts}/fantasy.yml +4 -4
  20. data/lib/squib/{layouts → builtin/layouts}/hand.yml +0 -0
  21. data/lib/squib/builtin/layouts/party.yml +94 -0
  22. data/lib/squib/{layouts → builtin/layouts}/playing-card.yml +0 -0
  23. data/lib/squib/{layouts → builtin/layouts}/tuck_box.yml +1 -1
  24. data/lib/squib/{project_template → builtin/projects/advanced}/.gitignore +0 -0
  25. data/lib/squib/{project_template → builtin/projects/advanced}/ABOUT.md +0 -0
  26. data/lib/squib/builtin/projects/advanced/Gemfile +11 -0
  27. data/lib/squib/builtin/projects/advanced/Guardfile +21 -0
  28. data/lib/squib/{project_template → builtin/projects/advanced}/IDEAS.md +0 -0
  29. data/lib/squib/{project_template → builtin/projects/advanced}/PLAYTESTING.md +0 -0
  30. data/lib/squib/builtin/projects/advanced/Rakefile +27 -0
  31. data/lib/squib/{project_template → builtin/projects/advanced}/_output/gitkeep.txt +0 -0
  32. data/lib/squib/builtin/projects/advanced/config.yml +49 -0
  33. data/lib/squib/builtin/projects/advanced/data/game.xlsx +0 -0
  34. data/lib/squib/project_template/PNP NOTES.md b/data/lib/squib/builtin/projects/advanced/docs/PNP → NOTES.md +0 -0
  35. data/lib/squib/{project_template → builtin/projects/advanced/docs}/RULES.md +0 -0
  36. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -0
  37. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -0
  38. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -0
  39. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -0
  40. data/lib/squib/builtin/projects/basic/.gitignore +4 -0
  41. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -0
  42. data/lib/squib/{project_template → builtin/projects/basic}/Gemfile +0 -0
  43. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -0
  44. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -0
  45. data/lib/squib/builtin/projects/basic/PNP NOTES.md +4 -0
  46. data/lib/squib/builtin/projects/basic/RULES.md +21 -0
  47. data/lib/squib/{project_template → builtin/projects/basic}/Rakefile +0 -0
  48. data/lib/squib/builtin/projects/basic/_output/gitkeep.txt +1 -0
  49. data/lib/squib/{project_template → builtin/projects/basic}/config.yml +0 -0
  50. data/lib/squib/{project_template → builtin/projects/basic}/deck.rb +0 -0
  51. data/lib/squib/{project_template → builtin/projects/basic}/layout.yml +0 -0
  52. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -0
  53. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -0
  54. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -0
  55. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -0
  56. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -0
  57. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -0
  58. data/lib/squib/card.rb +1 -1
  59. data/lib/squib/commands/cli.rb +39 -0
  60. data/lib/squib/commands/data/template_option.rb +109 -0
  61. data/lib/squib/commands/make_sprue.rb +275 -0
  62. data/lib/squib/commands/new.rb +37 -4
  63. data/lib/squib/constants.rb +6 -1
  64. data/lib/squib/graphics/cairo_context_wrapper.rb +1 -1
  65. data/lib/squib/graphics/image.rb +6 -1
  66. data/lib/squib/graphics/save_doc.rb +6 -4
  67. data/lib/squib/graphics/save_pdf.rb +13 -8
  68. data/lib/squib/graphics/save_sprue.rb +228 -0
  69. data/lib/squib/graphics/shapes.rb +8 -2
  70. data/lib/squib/graphics/text.rb +4 -3
  71. data/lib/squib/layout_parser.rb +17 -1
  72. data/lib/squib/sample_helpers.rb +1 -1
  73. data/lib/squib/sprues/crop_line.rb +28 -0
  74. data/lib/squib/sprues/crop_line_dash.rb +35 -0
  75. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -0
  76. data/lib/squib/sprues/sprue.rb +203 -0
  77. data/lib/squib/sprues/sprue_schema.rb +48 -0
  78. data/lib/squib/version.rb +1 -1
  79. data/samples/autoscale_font/_autoscale_font.rb +3 -3
  80. data/samples/backend/_backend.rb +1 -1
  81. data/samples/basic.rb +2 -2
  82. data/samples/colors/_colors.rb +1 -1
  83. data/samples/colors/_gradients.rb +1 -1
  84. data/samples/config/config_text_markup.rb +3 -3
  85. data/samples/config/custom_config.rb +1 -1
  86. data/samples/data/_csv.rb +3 -3
  87. data/samples/data/_excel.rb +4 -4
  88. data/samples/data/_yaml.rb +12 -0
  89. data/samples/images/_images.rb +2 -2
  90. data/samples/images/_more_load_images.rb +3 -0
  91. data/samples/images/_unicode.rb +2 -2
  92. data/samples/intro/02_options.rb +2 -2
  93. data/samples/layouts/builtin_layouts.rb +27 -4
  94. data/samples/layouts/layouts.rb +2 -2
  95. data/samples/proofs/_tgc_proofs.rb +2 -2
  96. data/samples/ranges/_ranges.rb +3 -3
  97. data/samples/saves/_hand.rb +1 -1
  98. data/samples/saves/_save_pdf.rb +4 -0
  99. data/samples/saves/_saves.rb +7 -1
  100. data/samples/saves/_showcase.rb +1 -1
  101. data/samples/shapes/_draw_shapes.rb +5 -1
  102. data/samples/shapes/_proofs.rb +22 -0
  103. data/samples/sprues/_builtin_sprues.rb +19 -0
  104. data/samples/sprues/_fold_sheet.rb +27 -0
  105. data/samples/sprues/_hex_tiles.rb +15 -0
  106. data/samples/sprues/_mints.rb +11 -0
  107. data/samples/sprues/_sprue_example.rb +11 -0
  108. data/samples/text/_embed_text.rb +14 -14
  109. data/samples/text/_text.rb +8 -8
  110. data/samples/text/_text_options.rb +17 -17
  111. data/squib.gemspec +18 -17
  112. metadata +126 -44
@@ -0,0 +1,4 @@
1
+ Print and Play Notes
2
+ ====================
3
+
4
+ Fill this out to give tips on how to play this with print and play.
@@ -0,0 +1,21 @@
1
+ # Intro
2
+
3
+ What is this game about? How many players?
4
+
5
+ # Objective
6
+
7
+ What is the object of the game?
8
+
9
+ # Components
10
+
11
+ What are the components? List them out.
12
+
13
+ # Gameplay
14
+
15
+ What does each turn look like? Describe a turn.
16
+
17
+ # Scoring
18
+
19
+ How is victory assigned?
20
+
21
+
@@ -0,0 +1 @@
1
+ Keep this here so that Git knows to keep the _output directory on a fresh clone
@@ -0,0 +1,42 @@
1
+ ---
2
+ sheet_width: 210mm
3
+ sheet_height: 297mm
4
+ card_width: 59.0mm
5
+ card_height: 92.0mm
6
+ cards:
7
+ - x: 16.5mm
8
+ y: 10.0mm
9
+ - x: 75.5mm
10
+ y: 10.0mm
11
+ - x: 134.5mm
12
+ y: 10.0mm
13
+ - x: 16.5mm
14
+ y: 102.0mm
15
+ - x: 75.5mm
16
+ y: 102.0mm
17
+ - x: 134.5mm
18
+ y: 102.0mm
19
+ - x: 16.5mm
20
+ y: 194.0mm
21
+ - x: 75.5mm
22
+ y: 194.0mm
23
+ - x: 134.5mm
24
+ y: 194.0mm
25
+ crop_line:
26
+ lines:
27
+ - type: :vertical
28
+ position: 16.5mm
29
+ - type: :vertical
30
+ position: 75.5mm
31
+ - type: :vertical
32
+ position: 134.5mm
33
+ - type: :vertical
34
+ position: 193.5mm
35
+ - type: :horizontal
36
+ position: 10.0mm
37
+ - type: :horizontal
38
+ position: 102.0mm
39
+ - type: :horizontal
40
+ position: 194.0mm
41
+ - type: :horizontal
42
+ position: 286.0mm
@@ -0,0 +1,40 @@
1
+ ---
2
+ sheet_width: 297mm
3
+ sheet_height: 210mm
4
+ card_width: 63.0mm
5
+ card_height: 88.0mm
6
+ cards:
7
+ - x: 22.5mm
8
+ y: 10.0mm
9
+ - x: 85.5mm
10
+ y: 10.0mm
11
+ - x: 148.5mm
12
+ y: 10.0mm
13
+ - x: 211.5mm
14
+ y: 10.0mm
15
+ - x: 22.5mm
16
+ y: 98.0mm
17
+ - x: 85.5mm
18
+ y: 98.0mm
19
+ - x: 148.5mm
20
+ y: 98.0mm
21
+ - x: 211.5mm
22
+ y: 98.0mm
23
+ crop_line:
24
+ lines:
25
+ - type: :vertical
26
+ position: 22.5mm
27
+ - type: :vertical
28
+ position: 85.5mm
29
+ - type: :vertical
30
+ position: 148.5mm
31
+ - type: :vertical
32
+ position: 211.5mm
33
+ - type: :vertical
34
+ position: 274.5mm
35
+ - type: :horizontal
36
+ position: 10.0mm
37
+ - type: :horizontal
38
+ position: 98.0mm
39
+ - type: :horizontal
40
+ position: 186.0mm
@@ -0,0 +1,42 @@
1
+ ---
2
+ sheet_width: 210mm
3
+ sheet_height: 297mm
4
+ card_width: 63.0mm
5
+ card_height: 88.0mm
6
+ cards:
7
+ - x: 10.5mm
8
+ y: 10.0mm
9
+ - x: 73.5mm
10
+ y: 10.0mm
11
+ - x: 136.5mm
12
+ y: 10.0mm
13
+ - x: 10.5mm
14
+ y: 98.0mm
15
+ - x: 73.5mm
16
+ y: 98.0mm
17
+ - x: 136.5mm
18
+ y: 98.0mm
19
+ - x: 10.5mm
20
+ y: 186.0mm
21
+ - x: 73.5mm
22
+ y: 186.0mm
23
+ - x: 136.5mm
24
+ y: 186.0mm
25
+ crop_line:
26
+ lines:
27
+ - type: :vertical
28
+ position: 10.5mm
29
+ - type: :vertical
30
+ position: 73.5mm
31
+ - type: :vertical
32
+ position: 136.5mm
33
+ - type: :vertical
34
+ position: 199.5mm
35
+ - type: :horizontal
36
+ position: 10.0mm
37
+ - type: :horizontal
38
+ position: 98.0mm
39
+ - type: :horizontal
40
+ position: 186.0mm
41
+ - type: :horizontal
42
+ position: 274.0mm
@@ -0,0 +1,42 @@
1
+ ---
2
+ sheet_width: 210mm
3
+ sheet_height: 297mm
4
+ card_width: 56.0mm
5
+ card_height: 87.0mm
6
+ cards:
7
+ - x: 21.0mm
8
+ y: 10.0mm
9
+ - x: 77.0mm
10
+ y: 10.0mm
11
+ - x: 133.0mm
12
+ y: 10.0mm
13
+ - x: 21.0mm
14
+ y: 97.0mm
15
+ - x: 77.0mm
16
+ y: 97.0mm
17
+ - x: 133.0mm
18
+ y: 97.0mm
19
+ - x: 21.0mm
20
+ y: 184.0mm
21
+ - x: 77.0mm
22
+ y: 184.0mm
23
+ - x: 133.0mm
24
+ y: 184.0mm
25
+ crop_line:
26
+ lines:
27
+ - type: :vertical
28
+ position: 21.0mm
29
+ - type: :vertical
30
+ position: 77.0mm
31
+ - type: :vertical
32
+ position: 133.0mm
33
+ - type: :vertical
34
+ position: 189.0mm
35
+ - type: :horizontal
36
+ position: 10.0mm
37
+ - type: :horizontal
38
+ position: 97.0mm
39
+ - type: :horizontal
40
+ position: 184.0mm
41
+ - type: :horizontal
42
+ position: 271.0mm
@@ -0,0 +1,25 @@
1
+ ---
2
+ sheet_width: 8.5in
3
+ sheet_height: 11in
4
+ card_width: 2.5in
5
+ card_height: 3.5in
6
+ position_reference: :center
7
+ cards:
8
+ - x: 1.75in
9
+ y: 2.000in
10
+ - x: 4.250in
11
+ y: 2.000in
12
+ - x: 6.750in
13
+ y: 2.000in
14
+ - x: 1.75in
15
+ y: 5.500in
16
+ - x: 4.250in
17
+ y: 5.500in
18
+ - x: 6.750in
19
+ y: 5.500in
20
+ - x: 1.75in
21
+ y: 9.000in
22
+ - x: 4.250in
23
+ y: 9.000in
24
+ - x: 6.750in
25
+ y: 9.000in
@@ -0,0 +1,52 @@
1
+ ---
2
+ sheet_width: 11in
3
+ sheet_height: 8.5in
4
+ card_width: 2.5in
5
+ card_height: 3.5in
6
+ cards:
7
+ - x: 0.35in
8
+ y: 0.225in
9
+ - x: 0.35in
10
+ y: 4.800in
11
+ rotate: :turnaround
12
+ - x: 2.95in
13
+ y: 0.225in
14
+ - x: 2.95in
15
+ y: 4.800in
16
+ rotate: :turnaround
17
+ - x: 5.55in
18
+ y: 0.225in
19
+ - x: 5.55in
20
+ y: 4.800in
21
+ rotate: :turnaround
22
+ - x: 8.15in
23
+ y: 0.225in
24
+ - x: 8.15in
25
+ y: 4.800in
26
+ rotate: :turnaround
27
+ crop_line:
28
+ lines:
29
+ - type: :vertical
30
+ position: 0.35in
31
+ - type: :vertical
32
+ position: 2.85in
33
+ - type: :vertical
34
+ position: 2.95in
35
+ - type: :vertical
36
+ position: 5.45in
37
+ - type: :vertical
38
+ position: 5.55in
39
+ - type: :vertical
40
+ position: 8.05in
41
+ - type: :vertical
42
+ position: 8.15in
43
+ - type: :vertical
44
+ position: 10.65in
45
+ - type: :horizontal
46
+ position: 0.225in
47
+ - type: :horizontal
48
+ position: 3.725in
49
+ - type: :horizontal
50
+ position: 3.825in
51
+ - type: :horizontal
52
+ position: 7.325in
@@ -34,7 +34,7 @@ module Squib
34
34
  when :memory
35
35
  Cairo::ImageSurface.new(@width, @height)
36
36
  when :svg
37
- Dir.mkdir @deck.dir unless Dir.exists?(@deck.dir)
37
+ FileUtils.mkdir_p @deck.dir unless Dir.exists?(@deck.dir)
38
38
  Cairo::SVGSurface.new(svgfile, @width, @height)
39
39
  else
40
40
  Squib.logger.fatal "Back end not recognized: '#{backend}'"
@@ -0,0 +1,39 @@
1
+ require 'mercenary'
2
+ require_relative 'make_sprue'
3
+ require_relative 'new'
4
+
5
+ module Squib
6
+ class CLI
7
+
8
+ def run
9
+ Mercenary.program(:squib) do |p|
10
+ p.version Squib::VERSION
11
+ p.description 'A Ruby DSL for prototyping card games'
12
+ p.syntax 'squib <subcommand> [options]'
13
+
14
+ p.command(:new) do |c|
15
+ c.syntax 'new PATH'
16
+ c.description 'Creates a new basic Squib project scaffolding in PATH. Must be a new directory or already empty.'
17
+
18
+ c.option 'advanced', '--advanced', 'Create the advanced layout'
19
+
20
+ c.action do |args, options|
21
+ advanced = options.key? 'advanced'
22
+ Squib::Commands::New.new.process(args, advanced)
23
+ end
24
+ end
25
+
26
+ p.command(:make_sprue) do |c|
27
+ c.syntax 'make_sprue'
28
+ c.description 'Creates a sprue definition file.'
29
+
30
+ c.action do |args, options|
31
+ Squib::Commands::MakeSprue.new.process(args)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,109 @@
1
+ module Squib
2
+ class Margin
3
+ attr_reader :top
4
+ attr_reader :right
5
+ attr_reader :bottom
6
+ attr_reader :left
7
+
8
+ ##
9
+ # Create a new margin definition.
10
+ #
11
+ # Takes +definition+ which can either be a space-separated +String+ or an
12
+ # +Array+ of +Float+ and will translate it to the top, right, bottom and
13
+ # left members.
14
+ #
15
+ # The syntax follows how CSS parses margin shorthand strings.
16
+ def initialize(definition)
17
+ if definition.instance_of? String
18
+ @top, @right, @bottom, @left = expand_shorthand(
19
+ definition.split(/\s+/).map!(&:to_f))
20
+ elsif definition.is_a? Numeric
21
+ @top, @right, @bottom, @left = expand_shorthand [definition]
22
+ elsif definition.instance_of? Array
23
+ @top, @right, @bottom, @left = expand_shorthand definition
24
+ else
25
+ raise ArgumentError, 'Invalid value, must be either string or array'
26
+ end
27
+ end
28
+
29
+ ##
30
+ # Map out the margin array.
31
+ #
32
+ # Takes +margin_arr+ and attempt to expand it to a strict [top, right,
33
+ # bottom, left] array.
34
+ private def expand_shorthand(margin_arr)
35
+ if margin_arr.size == 1
36
+ all = margin_arr[0]
37
+ [all, all, all, all]
38
+ elsif margin_arr.size == 2
39
+ margin_arr + margin_arr
40
+ elsif margin_arr.size == 3
41
+ margin_arr + [margin_arr[1]]
42
+ elsif margin_arr.size >= 4
43
+ margin_arr[0..3]
44
+ else
45
+ raise ArgumentError, 'Invalid array'
46
+ end
47
+ end
48
+ end
49
+
50
+
51
+ class Gap
52
+ attr_reader :horizontal
53
+ attr_reader :vertical
54
+
55
+ def initialize(definition)
56
+ if definition.instance_of? String
57
+ @horizontal, @vertical = expand_shorthand(
58
+ definition.split(/\s+/).map!(&:to_f))
59
+ elsif definition.instance_of? Array
60
+ @horizontal, @vertical = expand_shorthand definition
61
+ elsif definition.is_a? Numeric
62
+ @horizontal, @vertical = definition, definition
63
+ else
64
+ raise ArgumentError, 'Invalid value, must be either string or array'
65
+ end
66
+ end
67
+
68
+ private def expand_shorthand(gap_arr)
69
+ if gap_arr.size >= 2
70
+ gap_arr[0..1]
71
+ elsif gap_arr.size == 1
72
+ gap_arr + gap_arr
73
+ else
74
+ raise ArgumentError, 'Invalid array'
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ class TemplateOption
81
+ attr_accessor :unit
82
+ attr_accessor :sheet_width
83
+ attr_accessor :sheet_height
84
+ attr_writer :sheet_margin
85
+ attr_accessor :sheet_align
86
+ attr_accessor :card_width
87
+ attr_accessor :card_height
88
+ attr_writer :card_gap
89
+ attr_accessor :card_ordering
90
+ attr_accessor :output_file
91
+ attr_accessor :crop_lines
92
+
93
+ def sheet_margin
94
+ if not @sheet_margin.instance_of? Margin
95
+ @sheet_margin = Margin.new @sheet_margin
96
+ else
97
+ @sheet_margin
98
+ end
99
+ end
100
+
101
+ def card_gap
102
+ if not @card_gap.instance_of? Gap
103
+ @card_gap = Gap.new @card_gap
104
+ else
105
+ @card_gap
106
+ end
107
+ end
108
+ end
109
+ end