world_in_your_terminal 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6869d27eda194e7a3ff7943230e0b9a63a4f1231d669aa3168934bc5281b8b7b
4
+ data.tar.gz: b4d40183401e2251d34d59ec57267929084e09cf3fec3bd7c96d97902b8c473a
5
+ SHA512:
6
+ metadata.gz: 8173168e07aa1f1813c7e9530865d90447d696423dfe35885dcfec40996039d7663a6894745782424d13d7adc6ee3fe61f779f5a5731ddea96a73175766db3db
7
+ data.tar.gz: 30308740445c368da0e35d7db0573aa3f89caedb3b56c2bdf8027a7070cef5a2a4e641564dbee97e4da77cbcb07a2268e388cff13d972803cabd1fcbc8253e56
data/lib/Action.rb ADDED
@@ -0,0 +1,10 @@
1
+
2
+ class Action
3
+ def initialize(callback)
4
+ @callback = callback
5
+ end
6
+
7
+ def call
8
+ @callback.call
9
+ end
10
+ end
data/lib/Display.rb ADDED
@@ -0,0 +1,31 @@
1
+ require_relative './constants/themes/default.rb'
2
+ require_relative './constants/themes/black_white.rb'
3
+ require_relative './World.rb'
4
+
5
+ class Display
6
+ def initialize(screen_size)
7
+ @screen_size = screen_size
8
+ @world = initialize_world
9
+ end
10
+
11
+ def draw
12
+ world.draw(tile_size)
13
+ end
14
+
15
+ def screen_size
16
+ @screen_size
17
+ end
18
+
19
+ def tile_size
20
+ return 1
21
+ # screen_size / world.current_matrix_width
22
+ end
23
+
24
+ def initialize_world
25
+ World.new(Constants::THEME::BLACKWHITE)
26
+ end
27
+
28
+ def world
29
+ @world
30
+ end
31
+ end
data/lib/Engine.rb ADDED
@@ -0,0 +1,142 @@
1
+ require 'tty-file'
2
+ require 'date'
3
+ require_relative './Action.rb'
4
+
5
+ class Engine
6
+ def initialize(prompt, display)
7
+ @running = false
8
+ @prompt = prompt
9
+ @display = display
10
+ end
11
+
12
+ def run
13
+ initialize_key_prompt
14
+ while is_running
15
+ display.draw
16
+ show_key_prompts
17
+ end
18
+ end
19
+
20
+ def run_v1
21
+ while is_running
22
+ display.draw
23
+ answer = get_answer
24
+ proccess_answer(answer)
25
+ end
26
+ end
27
+
28
+ def get_answer
29
+ prompt.select('', action_map.keys, cycle: true)
30
+ end
31
+
32
+ def proccess_answer(answer)
33
+ action = action_map[answer]
34
+ action.call
35
+ end
36
+
37
+ def action_map
38
+ {
39
+ 'REGENERATE' => Action.new(world.method(:regenerate)),
40
+ 'ZOOM_IN' => Action.new(world.method(:zoom_in)),
41
+ 'ZOOM_OUT' => Action.new(world.method(:zoom_out)),
42
+ 'SCROLL_UP' => Action.new(method(:default_action)),
43
+ 'SCROLL_RIGHT' => Action.new(method(:default_action)),
44
+ 'SCROLL_DOWN' => Action.new(method(:default_action)),
45
+ 'SCROLL_LEFT' => Action.new(method(:default_action)),
46
+ 'QUIT' => Action.new(method(:stop)),
47
+ }
48
+ end
49
+
50
+ def key_map
51
+ {
52
+ 'q' => Action.new(method(:stop)),
53
+ 'r' => Action.new(world.method(:regenerate)),
54
+ 'z' => Action.new(world.method(:zoom_in)),
55
+ 'x' => Action.new(world.method(:zoom_out)),
56
+ 'n' => Action.new(method(:name_world)),
57
+ 'e' => Action.new(method(:export_to_txt)),
58
+ :up => Action.new(world.method(:scroll_up)), # scroll up
59
+ :down => Action.new(world.method(:scroll_down)), # scroll down
60
+ :right => Action.new(world.method(:scroll_right)), # scroll right
61
+ :left => Action.new(world.method(:scroll_left)), # scroll left
62
+ }
63
+ end
64
+
65
+ def initialize_key_prompt
66
+ prompt.on(:keypress) { |event|
67
+ event_key = event.value
68
+ event_name = event.key.name
69
+ key_map[event_key].call if key_map.keys.include?(event_key)
70
+ key_map[event_name].call if key_map.keys.include?(event_name)
71
+ }
72
+ end
73
+
74
+ def show_key_prompts
75
+ prompt.keypress(
76
+ [
77
+ "",
78
+ "-----------------------",
79
+ "r to generate new world",
80
+ "arrow keys to explore",
81
+ "z to zoom in",
82
+ "x to zoom out",
83
+ "n to rename this world",
84
+ "e to save this world in text",
85
+ "q to quit",
86
+ ""
87
+ ].join("\n")
88
+ )
89
+ end
90
+
91
+ def name_world
92
+ new_name = prompt.ask('what do people call this world?')
93
+ world.set_name(new_name)
94
+ end
95
+
96
+ def export_to_txt
97
+ content = world.render_map_as_text(display.tile_size)
98
+
99
+ directory = "exported_worlds"
100
+ extension = 'txt'
101
+ file_name = "#{DateTime.now.strftime('%Y_%m_%d__%H%M%S')}__#{world.name}.txt".gsub!(" ","_")
102
+
103
+ TTY::File.create_file("#{directory}/#{file_name}", content)
104
+ end
105
+
106
+ def default_action
107
+ return true
108
+ end
109
+
110
+ def prompt
111
+ @prompt
112
+ end
113
+
114
+ def display
115
+ @display
116
+ end
117
+
118
+ def world
119
+ @display.world
120
+ end
121
+
122
+ def start
123
+ if is_running
124
+ throw "engine already running"
125
+ end
126
+
127
+ @running = true
128
+ run
129
+ end
130
+
131
+ def stop
132
+ @running = false
133
+ end
134
+
135
+ def is_running
136
+ @running
137
+ end
138
+
139
+ def is_stopped
140
+ !is_running
141
+ end
142
+ end
@@ -0,0 +1,54 @@
1
+ require 'perlin_noise'
2
+ require_relative './constants/tile_types.rb'
3
+
4
+ class GenerateMatrix
5
+ def two_lands_matrix
6
+ [
7
+ [Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:PLAIN]],
8
+ [Constants::TILE_TYPES[:PLAIN], Constants::TILE_TYPES[:PLAIN], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
9
+ [Constants::TILE_TYPES[:FOREST], Constants::TILE_TYPES[:PLAIN], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
10
+ [Constants::TILE_TYPES[:MOUNTAIN], Constants::TILE_TYPES[:FOREST], Constants::TILE_TYPES[:PLAIN], Constants::TILE_TYPES[:WATER]],
11
+ ]
12
+ end
13
+
14
+ def water_world_matrix
15
+ [
16
+ [Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
17
+ [Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
18
+ [Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
19
+ [Constants::TILE_TYPES[:MOUNTAIN], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER], Constants::TILE_TYPES[:WATER]],
20
+ ]
21
+ end
22
+
23
+ def perlin_matrix(size)
24
+ noises = Perlin::Noise.new(2)
25
+ contrast = Perlin::Curve.contrast(Perlin::Curve::CUBIC, 2)
26
+
27
+ bars = [
28
+ Constants::TILE_TYPES[:WATER],
29
+ Constants::TILE_TYPES[:WATER],
30
+ Constants::TILE_TYPES[:PLAIN],
31
+ Constants::TILE_TYPES[:FOREST],
32
+ Constants::TILE_TYPES[:MOUNTAIN],
33
+ ]
34
+ bar = lambda { |n|
35
+ bars[ (bars.length * n).floor ]
36
+ }
37
+
38
+ perlin_matrix = []
39
+
40
+ size.times do |x|
41
+ row = []
42
+ size.times do |y|
43
+ n = noises[x * 0.2, y * 0.2]
44
+ n = contrast.call n
45
+
46
+ row << bar.call(n)
47
+ end
48
+
49
+ perlin_matrix << row
50
+ end
51
+
52
+ perlin_matrix
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ class GenerateName
2
+ def world
3
+ name = [
4
+ 'Earth',
5
+ 'Solace',
6
+ 'Terra',
7
+ 'Nova',
8
+ 'Solida',
9
+ 'Humus',
10
+ 'Viridis',
11
+ 'Orb',
12
+ 'Solo',
13
+ 'Lutum',
14
+ 'Vita',
15
+ ].sample
16
+
17
+ adjective = [
18
+ '',
19
+ 'Red',
20
+ 'Green',
21
+ 'Blue',
22
+ 'Speckled',
23
+ 'Spotted',
24
+ ].sample
25
+
26
+ suffix = [
27
+ '',
28
+ '',
29
+ '',
30
+ 'One',
31
+ 'Two',
32
+ 'Seven',
33
+ ].sample
34
+
35
+ "#{adjective} #{name} #{suffix}"
36
+ end
37
+ end
data/lib/World.rb ADDED
@@ -0,0 +1,432 @@
1
+ require 'tty-table'
2
+ require 'tty-box'
3
+ require_relative './constants/tile_types.rb'
4
+ require_relative './constants/themes/black_white.rb'
5
+ require_relative './GenerateName.rb'
6
+ require_relative './GenerateMatrix.rb'
7
+
8
+
9
+ class Point
10
+ attr_reader :x, :y, :z
11
+
12
+ def initialize(x, y, z)
13
+ @x = x
14
+ @y = y
15
+ @z = z
16
+ end
17
+
18
+ def to_s
19
+ "#{@x},#{@y},#{@z}"
20
+ end
21
+
22
+ end
23
+
24
+ class World
25
+ attr_reader :name
26
+
27
+ def initialize(theme)
28
+ @theme = theme
29
+ @pastel = Pastel.new
30
+ @max_x = 4
31
+ @max_y = 4
32
+ @max_z = 4
33
+ regenerate
34
+ end
35
+
36
+ def regenerate
37
+ @name = initialize_name
38
+ @matrix = initialize_matrix
39
+ @current_position = Point.new(0, 0, 0)
40
+
41
+ @matrix_map = {
42
+ @current_position.to_s => @matrix
43
+ }
44
+ end
45
+
46
+ def matrix
47
+ @matrix_map[@current_position.to_s]
48
+ end
49
+
50
+ def themed_matrix(theme)
51
+ matrix.map{ |row|
52
+ row.map{ |tile|
53
+ theme.colored_tile(@pastel, tile)
54
+ }
55
+ }
56
+ end
57
+
58
+ def colored_matrix
59
+ themed_matrix(@theme)
60
+ end
61
+
62
+ def initialize_matrix
63
+ GenerateMatrix.new.perlin_matrix(4)
64
+ end
65
+
66
+ def initialize_name
67
+ GenerateName.new.world
68
+ end
69
+
70
+ def set_name(name)
71
+ @name = name
72
+ end
73
+
74
+ def draw(tile_size)
75
+ # puts render_framed_map(tile_size)
76
+ # puts render_framed_table_map(tile_size)
77
+ # puts render_map(tile_size)
78
+ puts render_map_with_info(tile_size)
79
+ # puts render_table_map(tile_size)
80
+ end
81
+
82
+ def render_map_with_info(tile_size)
83
+ [
84
+ render_map(tile_size),
85
+ world_name_display,
86
+ zoom_level_display,
87
+ coordinates_display,
88
+ ].join("\n")
89
+ end
90
+
91
+ def render_matrix(matrix_to_render, theme, tile_size)
92
+ matrix_to_render.map.with_index { |row, y|
93
+ row.map.with_index { |tile, x|
94
+ tile
95
+ }.join(
96
+ theme.colored_tile(
97
+ @pastel,
98
+ Constants::TILE_TYPES[:NONE]
99
+ ) * tile_size
100
+ )
101
+ }.join("\n" * tile_size)
102
+ end
103
+
104
+ def render_map_as_text(tile_size)
105
+ theme = Constants::THEME::BLACKWHITE
106
+ new_matrix = themed_matrix(theme)
107
+
108
+ render_matrix(new_matrix, theme, tile_size)
109
+ end
110
+
111
+ def render_map(tile_size)
112
+ render_matrix(colored_matrix, @theme, tile_size)
113
+ end
114
+
115
+ def render_table_map(tile_size)
116
+ table = TTY::Table.new({rows: colored_matrix})
117
+
118
+ table.render(
119
+ :basic,
120
+ alignments: [:center],
121
+ padding: tile_size - 1
122
+ )
123
+ end
124
+
125
+ def render_framed_map(tile_size)
126
+ map = render_map(tile_size)
127
+
128
+ render_frame_around_map(map)
129
+ end
130
+
131
+
132
+ def render_framed_table_map(tile_size)
133
+ map = render_table_map(tile_size)
134
+
135
+ render_frame_around_map(map)
136
+ end
137
+
138
+ def render_frame_around_map(map)
139
+ framed_map = TTY::Box.frame(
140
+ align: :center,
141
+ title: {
142
+ bottom_left: coordinates_display,
143
+ bottom_right: zoom_level_display
144
+ },
145
+ border: :thick
146
+ ) { map }
147
+
148
+ framed_map
149
+ end
150
+
151
+ def world_name_display
152
+ "You are exploring #{@pastel.italic(@name)}"
153
+ end
154
+
155
+ def zoom_level_display
156
+ "Zoom: #{@current_position.z}"
157
+ end
158
+
159
+ def coordinates_display
160
+ "x: #{@current_position.x}, y: #{@current_position.y}"
161
+ end
162
+
163
+ def current_matrix_width
164
+ matrix.length
165
+ end
166
+
167
+ def next_matrix_width
168
+ (current_matrix_width * 2) - 1
169
+ end
170
+
171
+ def matrix_exists_in_position(position)
172
+ @matrix_map.keys.include?(position.to_s)
173
+ end
174
+
175
+ def zoom_in
176
+ new_position = increment_z_level(@current_position)
177
+ if !matrix_exists_in_position(new_position)
178
+ generate_new_zoomed_in_map(new_position)
179
+ end
180
+
181
+ @current_position = new_position
182
+ end
183
+
184
+ def zoom_out
185
+ new_position = decrement_z_level(@current_position)
186
+ if !matrix_exists_in_position(new_position)
187
+ generate_new_zoomed_out_map(new_position)
188
+ end
189
+
190
+ @current_position = new_position
191
+ end
192
+
193
+ def scroll_right
194
+ new_position = increment_x_level(@current_position)
195
+ if !matrix_exists_in_position(new_position)
196
+ generate_new_scrolled_right_map(new_position)
197
+ end
198
+
199
+ @current_position = new_position
200
+ end
201
+
202
+ def scroll_left
203
+ new_position = decrement_x_level(@current_position)
204
+ if !matrix_exists_in_position(new_position)
205
+ generate_new_scrolled_left_map(new_position)
206
+ end
207
+
208
+ @current_position = new_position
209
+ end
210
+
211
+ def scroll_up
212
+ new_position = increment_y_level(@current_position)
213
+ if !matrix_exists_in_position(new_position)
214
+ generate_new_scrolled_up_map(new_position)
215
+ end
216
+
217
+ @current_position = new_position
218
+ end
219
+
220
+ def scroll_down
221
+ new_position = decrement_y_level(@current_position)
222
+ if !matrix_exists_in_position(new_position)
223
+ generate_new_scrolled_down_map(new_position)
224
+ end
225
+
226
+ @current_position = new_position
227
+ end
228
+
229
+ def increment_x_level(position)
230
+ add_to_x_level(1, position)
231
+ end
232
+
233
+ def decrement_x_level(position)
234
+ add_to_x_level(-1, position)
235
+ end
236
+
237
+ def increment_y_level(position)
238
+ add_to_y_level(1, position)
239
+ end
240
+
241
+ def decrement_y_level(position)
242
+ add_to_y_level(-1, position)
243
+ end
244
+
245
+ def increment_z_level(position)
246
+ add_to_z_level(1, position)
247
+ end
248
+
249
+ def decrement_z_level(position)
250
+ add_to_z_level(-1, position)
251
+ end
252
+
253
+ def add_to_x_level(amount, position)
254
+ new_x = (position.x + amount).clamp(-@max_x, @max_x)
255
+
256
+ Point.new(
257
+ new_x,
258
+ position.y,
259
+ position.z,
260
+ )
261
+ end
262
+
263
+ def add_to_y_level(amount, position)
264
+ new_y = (position.y + amount).clamp(-@max_y, @max_y)
265
+
266
+ Point.new(
267
+ position.x,
268
+ new_y,
269
+ position.z,
270
+ )
271
+ end
272
+
273
+ def add_to_z_level(amount, position)
274
+ new_z = (position.z + amount).clamp(0, @max_z)
275
+
276
+ Point.new(
277
+ position.x,
278
+ position.y,
279
+ new_z,
280
+ )
281
+ end
282
+
283
+ def generate_new_zoomed_in_map(position)
284
+ zoom_length = next_matrix_width
285
+ unfilled_new_matrix = []
286
+ matrix.each_with_index{ |row, i|
287
+ unfilled_new_matrix << expanded_row(zoom_length, matrix[i])
288
+ if unfilled_new_matrix.length < zoom_length
289
+ unfilled_new_matrix << new_row(zoom_length)
290
+ end
291
+ }
292
+
293
+ filled_new_matrix = fill_none_tiles(unfilled_new_matrix)
294
+
295
+ @matrix_map[position.to_s] = filled_new_matrix
296
+ end
297
+
298
+ def generate_new_zoomed_out_map(position)
299
+ new_matrix = []
300
+ matrix.each_with_index{ |row, i|
301
+ if i.even?
302
+ new_row = []
303
+ matrix[i].each_with_index{ |tile, j|
304
+ new_row << tile if j.even?
305
+ }
306
+ new_matrix << new_row
307
+ end
308
+ }
309
+
310
+ @matrix_map[position.to_s] = new_matrix
311
+ end
312
+
313
+ def generate_new_scrolled_right_map(position)
314
+ unfilled_new_matrix = matrix.dup.map.with_index{ |row, y|
315
+ new_row = row.dup
316
+ new_row.shift
317
+ new_row << Constants::TILE_TYPES[:NONE]
318
+
319
+ new_row
320
+ }
321
+
322
+ filled_new_matrix = fill_none_tiles(unfilled_new_matrix)
323
+
324
+ @matrix_map[position.to_s] = filled_new_matrix
325
+ end
326
+
327
+ def generate_new_scrolled_left_map(position)
328
+ unfilled_new_matrix = matrix.dup.map.with_index{ |row, y|
329
+ new_row = row.dup
330
+ new_row.pop
331
+ new_row.unshift(Constants::TILE_TYPES[:NONE])
332
+
333
+ new_row
334
+ }
335
+
336
+ filled_new_matrix = fill_none_tiles(unfilled_new_matrix)
337
+
338
+ @matrix_map[position.to_s] = filled_new_matrix
339
+ end
340
+
341
+ def generate_new_scrolled_up_map(position)
342
+ unfilled_new_matrix = []
343
+ matrix.dup.map.with_index{ |row, i|
344
+ unfilled_new_matrix << row.dup if i < (current_matrix_width - 1)
345
+ }
346
+
347
+ unfilled_new_matrix.unshift(new_row(current_matrix_width))
348
+
349
+ filled_new_matrix = fill_none_tiles(unfilled_new_matrix)
350
+
351
+ @matrix_map[position.to_s] = filled_new_matrix
352
+ end
353
+
354
+ def generate_new_scrolled_down_map(position)
355
+ unfilled_new_matrix = []
356
+ matrix.dup.map.with_index{ |row, i|
357
+ unfilled_new_matrix << row.dup if i > 0
358
+ }
359
+
360
+ unfilled_new_matrix << new_row(current_matrix_width)
361
+
362
+ filled_new_matrix = fill_none_tiles(unfilled_new_matrix)
363
+
364
+ @matrix_map[position.to_s] = filled_new_matrix
365
+ end
366
+
367
+ def expanded_row(zoom_length, current_row)
368
+ new_row = []
369
+ current_row.each_with_index{ |row, i|
370
+ new_row << current_row[i]
371
+ if new_row.length < zoom_length
372
+ new_row << Constants::TILE_TYPES[:NONE]
373
+ end
374
+ }
375
+
376
+ new_row
377
+ end
378
+
379
+ def new_row(zoom_length)
380
+ return Array.new(zoom_length, Constants::TILE_TYPES[:NONE])
381
+ end
382
+
383
+ def fill_none_tiles(unfilled_matrix)
384
+ new_matrix = []
385
+ unfilled_matrix.each_with_index { |row, y|
386
+ new_row = []
387
+ row.each_with_index { |tile, x|
388
+ new_tile = tile
389
+ if tile == Constants::TILE_TYPES[:NONE]
390
+ neighboring_tiles = get_tiles_in_neighboring_positions(x, y, unfilled_matrix);
391
+ random_neighbor_tile = neighboring_tiles.select{|tile| ![Constants::TILE_TYPES[:NONE]].include?(tile) }.sample
392
+ new_tile = random_neighbor_tile != Constants::TILE_TYPES[:NONE] ? random_neighbor_tile : Constants::TILE_TYPES.sample
393
+ end
394
+
395
+ new_row << new_tile
396
+ }
397
+
398
+ new_matrix << new_row
399
+ }
400
+
401
+ new_matrix
402
+ end
403
+
404
+ def get_tiles_in_neighboring_positions(x, y, current_matrix)
405
+ relative_neighboring_positions = [
406
+ {x: -1, y: 0},
407
+ {x: 1, y: 0},
408
+ {x: 0, y: -1},
409
+ {x: 0, y: 1},
410
+ {x: -1, y: -1},
411
+ {x: 1, y: 1},
412
+ {x: 1, y: -1},
413
+ {x: -1, y: 1},
414
+ ]
415
+
416
+ neighboring_tiles = []
417
+ relative_neighboring_positions.map { |pos|
418
+ tile = get_tile_at_position(x + pos[:x], y + pos[:y], current_matrix)
419
+ neighboring_tiles << tile if tile
420
+ }
421
+
422
+ neighboring_tiles
423
+ end
424
+
425
+ def get_tile_at_position(x, y, current_matrix)
426
+ begin
427
+ return current_matrix[y][x]
428
+ rescue => exception
429
+ return false
430
+ end
431
+ end
432
+ end
@@ -0,0 +1,29 @@
1
+ module Constants
2
+ module THEME
3
+ module BLACKWHITE
4
+ def BLACKWHITE.colored_tile(pastel_instance, tile_type)
5
+ BLACKWHITE.tile_map(pastel_instance)[tile_type][:character]
6
+ end
7
+
8
+ def BLACKWHITE.tile_map(pastel_instance)
9
+ {
10
+ Constants::TILE_TYPES[:NONE] => {
11
+ character: ' ',
12
+ },
13
+ Constants::TILE_TYPES[:WATER] => {
14
+ character: ' ',
15
+ },
16
+ Constants::TILE_TYPES[:FOREST] => {
17
+ character: 't',
18
+ },
19
+ Constants::TILE_TYPES[:MOUNTAIN] => {
20
+ character: 'M',
21
+ },
22
+ Constants::TILE_TYPES[:PLAIN] => {
23
+ character: '_',
24
+ },
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ module Constants
2
+ module THEME
3
+ module DEFAULT
4
+ def DEFAULT.colored_tile(pastel_instance, tile_type)
5
+ character = DEFAULT.tile_map(pastel_instance)[tile_type][:character]
6
+ color_method = DEFAULT.tile_map(pastel_instance)[tile_type][:color_method]
7
+
8
+ color_method.call(character)
9
+ end
10
+
11
+ def DEFAULT.tile_map(pastel_instance)
12
+ {
13
+ Constants::TILE_TYPES[:NONE] => {
14
+ character: ' ',
15
+ color_method: pastel_instance.black.method(:on_black),
16
+ },
17
+ Constants::TILE_TYPES[:WATER] => {
18
+ character: '■',
19
+ color_method: pastel_instance.blue.method(:on_black),
20
+ },
21
+ Constants::TILE_TYPES[:FOREST] => {
22
+ character: '■',
23
+ color_method: pastel_instance.green.method(:on_black),
24
+ },
25
+ Constants::TILE_TYPES[:MOUNTAIN] => {
26
+ character: '■',
27
+ color_method: pastel_instance.bright_white.method(:on_black),
28
+ },
29
+ Constants::TILE_TYPES[:PLAIN] => {
30
+ character: '■',
31
+ color_method: pastel_instance.bright_yellow.method(:on_black),
32
+ },
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module Constants
2
+ TILE_TYPES = {
3
+ NONE: 0,
4
+ FOREST: 1,
5
+ MOUNTAIN: 2,
6
+ PLAIN: 3,
7
+ WATER: 4,
8
+ }
9
+
10
+ def TILE_TYPES.sample
11
+ TILE_TYPES[TILE_TYPES.keys.select{|key| ![:NONE].include?(key) }.sample]
12
+ end
13
+ end
data/lib/run.rb ADDED
@@ -0,0 +1,3 @@
1
+ require_relative './world_in_your_terminal.rb'
2
+
3
+ WorldInYourTerminal.new.explore
@@ -0,0 +1,13 @@
1
+ require 'tty-prompt'
2
+ require_relative './Display.rb'
3
+ require_relative './Engine.rb'
4
+
5
+ class WorldInYourTerminal
6
+ def explore
7
+ display = Display.new(40)
8
+ prompt = TTY::Prompt.new
9
+
10
+ engine = Engine.new(prompt, display)
11
+ engine.start
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: world_in_your_terminal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - David Vanderhaar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pastel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.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.8.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: perlin_noise
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-box
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.7.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-color
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-file
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.10.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.10.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-prompt
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.23.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.23.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-screen
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.8.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: tty-table
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.12.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.12.0
125
+ description:
126
+ email: d.vanderhaarhunter@gmail.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - lib/Action.rb
132
+ - lib/Display.rb
133
+ - lib/Engine.rb
134
+ - lib/GenerateMatrix.rb
135
+ - lib/GenerateName.rb
136
+ - lib/World.rb
137
+ - lib/constants/themes/black_white.rb
138
+ - lib/constants/themes/default.rb
139
+ - lib/constants/tile_types.rb
140
+ - lib/run.rb
141
+ - lib/world_in_your_terminal.rb
142
+ homepage: https://rubygems.org/gems/world_in_your_terminal
143
+ licenses:
144
+ - MIT
145
+ metadata: {}
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 2.7.0
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubygems_version: 3.1.6
162
+ signing_key:
163
+ specification_version: 4
164
+ summary: Explore tiny worlds in yor terminal
165
+ test_files: []