pitchcar 0.4.1 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f22bc650c3c257b2f0700196641f230ba7c55ed3
4
- data.tar.gz: 3924972fa79c85155e5880a08e63c1d8db83fb11
3
+ metadata.gz: d6753a63fdf5f4abfdb83330fba95107c143997b
4
+ data.tar.gz: 6120074fe200a104e94338f1a05a27132481be7d
5
5
  SHA512:
6
- metadata.gz: 4acf0b3d220da24a52cbf78cf4b81f41e44bd46a916d50d23aa6d74d099b11352867767c0d8efcebc0d13a42c477cc9c29c955b5793976de00db6250923689c1
7
- data.tar.gz: 3b922ade1d8f9c0143263df490054201f6811dcb37df2009b9e67cd5b74a18826c1b7710c34b069b42b0a252f7d661037cf0d843856d005577c57174081e5c0a
6
+ metadata.gz: 9aa37062956eb9f3822517ee9782b683afda541a9c96262525cd2b7dd53a71c3904b5c32a9bc15376d9033921ae19c2456e939a86e9a758752fec27a848813bc
7
+ data.tar.gz: 8e7b56d1a5ad4bbc6ecb676db707518fea0184b5e50fd47860d70a1d7e24fc97631b2bf6f983f33bf63eacd6fcf687d8291e5516de65f2c2b706b6c25891dc1c
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pitchcar (0.4.1)
5
+ bazaar
6
+ rmagick
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ bazaar (0.0.2)
12
+ rmagick (2.16.0)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ pitchcar!
19
+
20
+ BUNDLED WITH
21
+ 1.12.5
Binary file
Binary file
data/lib/piece.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'json'
2
+ require 'rmagick'
2
3
 
3
4
  module Pitchcar
4
5
  class Piece
5
6
  TYPES = { STRAIGHT: 0, LEFT: 1, RIGHT: 2, STRAIGHT_LEFT_WALL: 3, STRAIGHT_RIGHT_WALL: 4 }
6
7
  DIRECTIONS = { NORTH: 0, EAST: 1, WEST: 2, SOUTH: 3 }
8
+ STRAIGHT_IMAGE, CURVE_IMAGE = Magick::ImageList.new('images/straight_tile.png', 'images/curve_tile.png').to_a
7
9
  attr_accessor :direction, :x, :y, :type
8
10
 
9
11
  def self.starting_piece
@@ -62,5 +64,35 @@ module Pitchcar
62
64
  def to_h
63
65
  { x: x, y: y, type: TYPES.key(type).downcase, direction: DIRECTIONS.key(direction).downcase }
64
66
  end
67
+
68
+ def image
69
+ case type
70
+ when TYPES[:STRAIGHT], TYPES[:STRAIGHT_LEFT_WALL], TYPES[:STRAIGHT_RIGHT_WALL]
71
+ return STRAIGHT_IMAGE.rotate(90) if direction == DIRECTIONS[:NORTH] || direction == DIRECTIONS[:SOUTH]
72
+ return STRAIGHT_IMAGE
73
+ when TYPES[:LEFT]
74
+ case direction
75
+ when DIRECTIONS[:NORTH]
76
+ CURVE_IMAGE.rotate(270)
77
+ when DIRECTIONS[:EAST]
78
+ CURVE_IMAGE
79
+ when DIRECTIONS[:WEST]
80
+ CURVE_IMAGE.rotate(180)
81
+ when DIRECTIONS[:SOUTH]
82
+ CURVE_IMAGE.rotate(90)
83
+ end
84
+ when TYPES[:RIGHT]
85
+ case direction
86
+ when DIRECTIONS[:NORTH]
87
+ CURVE_IMAGE
88
+ when DIRECTIONS[:EAST]
89
+ CURVE_IMAGE.rotate(90)
90
+ when DIRECTIONS[:WEST]
91
+ CURVE_IMAGE.rotate(270)
92
+ when DIRECTIONS[:SOUTH]
93
+ CURVE_IMAGE.rotate(180)
94
+ end
95
+ end
96
+ end
65
97
  end
66
98
  end
data/lib/track.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'csv'
2
+ require 'bazaar'
2
3
  require_relative 'piece'
4
+ require_relative 'track_image'
3
5
  require_relative 'boyermoore'
4
6
 
5
7
  module Pitchcar
@@ -52,6 +54,11 @@ module Pitchcar
52
54
  pieces.map(&:to_h).to_json
53
55
  end
54
56
 
57
+ def to_png
58
+ TrackImage.new(self).render
59
+ puts "Track image saved to #{Dir.pwd}/track.png"
60
+ end
61
+
55
62
  def size
56
63
  x_coords = pieces.map(&:x)
57
64
  y_coords = pieces.map(&:y)
@@ -78,6 +85,29 @@ module Pitchcar
78
85
  end
79
86
  end
80
87
 
88
+ # Returns pieces list sorted from in a top-bottom left-right manner
89
+ def graph_sorted
90
+ pieces.sort do |piece, other_piece|
91
+ if piece.y == other_piece.y
92
+ piece.x <=> other_piece.x
93
+ else
94
+ other_piece.y <=> piece.y
95
+ end
96
+ end
97
+ end
98
+
99
+ def title
100
+ results = { nouns: [], adjs: [] }
101
+ [{ name: :nouns, types: %w(items superitems) }, {name: :adjs, types: %w(adj superadj) }].each do |part|
102
+ part[:types].each do |type|
103
+ Random.srand(hash.hex)
104
+ results[part[:name]] << Bazaar.get_item(type).capitalize
105
+ end
106
+ end
107
+ Random.srand(hash.hex)
108
+ "#{results[:adjs].sample} #{results[:nouns].sample}"
109
+ end
110
+
81
111
  private
82
112
 
83
113
  def rotation_exists?(tracks)
@@ -95,6 +125,10 @@ module Pitchcar
95
125
  def within_size_restrictions?
96
126
  size[:x].between?(self.min_size[:x], self.max_size[:x]) && size[:y].between?(self.min_size[:y], self.max_size[:y])
97
127
  end
128
+
129
+ def hash
130
+ Digest::SHA256.hexdigest(to_s)
131
+ end
98
132
  end
99
133
 
100
134
  class PieceList < Array
@@ -0,0 +1,64 @@
1
+ require 'rmagick'
2
+
3
+ module Pitchcar
4
+ class TrackImage
5
+ attr_accessor :track
6
+ TILE_SIZE = 570
7
+ OFFSET_SIZE = -46
8
+ TITLE_OFFSET = 200
9
+ BLANK_TILE = Magick::Image.new(TILE_SIZE, TILE_SIZE) { |canvas| canvas.background_color = 'white' }
10
+
11
+ def initialize(track)
12
+ self.track = track
13
+ end
14
+
15
+ def render
16
+ track_image = render_track(build_tiles)
17
+ add_title_to(track_image)
18
+ track_image.write('track.png')
19
+ end
20
+
21
+ private
22
+
23
+ def build_tiles
24
+ min_x = track.pieces.map(&:x).min
25
+ coordinate = { x: min_x, y: track.pieces.map(&:y).max }
26
+ sorted_pieces = track.graph_sorted
27
+ tiles = sorted_pieces.map(&:image)
28
+ index = 0
29
+ insert_index = 0
30
+ while index < track.pieces.size - 1 do
31
+ piece = sorted_pieces[index]
32
+ if piece.x == coordinate[:x] && piece.y == coordinate[:y]
33
+ index += 1
34
+ else
35
+ tiles.insert(insert_index, BLANK_TILE)
36
+ end
37
+ insert_index += 1
38
+ new_x = (coordinate[:x] + min_x.abs + 1 ) % track.size[:x] - min_x.abs
39
+ coordinate[:y] = new_x <= coordinate[:x] ? coordinate[:y] - 1 : coordinate[:y]
40
+ coordinate[:x] = new_x
41
+ end
42
+ pieces = Magick::ImageList.new
43
+ pieces += tiles
44
+ end
45
+
46
+ def render_track(piece_images)
47
+ size = track.size
48
+ track_montage = piece_images.montage do |montage|
49
+ montage.tile = Magick::Geometry.new(size[:x], size[:y])
50
+ montage.geometry = Magick::Geometry.new(TILE_SIZE, TILE_SIZE, OFFSET_SIZE, OFFSET_SIZE)
51
+ end
52
+ track_montage.extent(track_montage.columns, track_montage.rows + TITLE_OFFSET, 0, -TITLE_OFFSET)
53
+ end
54
+
55
+ def add_title_to(track_image)
56
+ Magick::Draw.new.annotate(track_image, 0, 0, 0, 40, track.title) do
57
+ self.font_family = 'Helvetica'
58
+ self.pointsize = 60
59
+ self.font_weight = Magick::BoldWeight
60
+ self.gravity = Magick::NorthGravity
61
+ end
62
+ end
63
+ end
64
+ end
data/pitchcar.gemspec CHANGED
@@ -1,12 +1,15 @@
1
- Gem::Specification.new do |s|
2
- s.name = 'pitchcar'
3
- s.version = '0.4.1'
4
- s.date = '2017-02-23'
5
- s.summary = 'Pitchcar Track Generator'
6
- s.description = 'Generates tracks for pitchcar'
7
- s.authors = ['Jonah Hirsch']
8
- s.email = 'jhirsch@rmn.com'
9
- s.homepage = 'https://github.com/jonahwh/pitchcar_track_generator'
10
- s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
11
- s.license = 'MIT'
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'pitchcar'
3
+ spec.version = '0.5.0'
4
+ spec.date = '2017-02-23'
5
+ spec.summary = 'Pitchcar Track Generator'
6
+ spec.description = 'Generates tracks for pitchcar'
7
+ spec.authors = ['Jonah Hirsch']
8
+ spec.email = 'jhirsch@rmn.com'
9
+ spec.homepage = 'https://github.com/jonahwh/pitchcar_track_generator'
10
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
11
+ spec.license = 'MIT'
12
+
13
+ spec.add_runtime_dependency 'bazaar'
14
+ spec.add_runtime_dependency 'rmagick'
12
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pitchcar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonah Hirsch
@@ -9,23 +9,52 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2017-02-23 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bazaar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rmagick
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  description: Generates tracks for pitchcar
14
42
  email: jhirsch@rmn.com
15
43
  executables: []
16
44
  extensions: []
17
45
  extra_rdoc_files: []
18
46
  files:
47
+ - Gemfile
48
+ - Gemfile.lock
19
49
  - LICENSE.md
20
50
  - Readme.md
21
51
  - images/curve_tile.png
22
- - images/pitchcar_curve.png
23
- - images/pitchcar_straight.png
24
52
  - images/straight_tile.png
25
53
  - lib/boyermoore.rb
26
54
  - lib/piece.rb
27
55
  - lib/pitchcar.rb
28
56
  - lib/track.rb
57
+ - lib/track_image.rb
29
58
  - pitchcar.gemspec
30
59
  - pitchcar_tracks
31
60
  homepage: https://github.com/jonahwh/pitchcar_track_generator
Binary file
Binary file