pitchcar 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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