gaminator 0.0.5

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in gaminator.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Tomasz Werbicki
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,80 @@
1
+ # Gaminator
2
+
3
+ A simple wrapper around Curses intended for writing ASCII games
4
+
5
+ Post game submissions here: https://gist.github.com/4684252
6
+
7
+ ## Usage
8
+
9
+ The Gaminator::Runner class implements the base methods used to
10
+ run the game, the event loop being the most important. Initialize
11
+ it like so:
12
+
13
+ ```
14
+ # If you want the game to fill the whole screen
15
+ Gaminator::Runner.new(SkiGame).run
16
+
17
+ # If you want the game to have a set size (in rows/cols)
18
+ Gaminator::Runner.new(SkiGame, :rows => 30, :cols => 80).run
19
+ ```
20
+
21
+ The Game that is run by the GameRunner has to implement the
22
+ following methods:
23
+
24
+ * objects - the array of objects that are displayed on the screen
25
+ * input_map - the mapping between the keyboard keys and game actions
26
+ * tick - the method that is called for every loop cycle
27
+ * exit_message - the message displayed when the game is finished
28
+ * textbox_content - the message displayed at the bottom of the game window
29
+ * wait? - determine whether to wait for input before next tick
30
+ * sleep_time - the time interval beteen two event loop cycles
31
+
32
+ The objects that are displayed on the screen have to implement the following
33
+ interface:
34
+
35
+ * x - the x position of the object
36
+ * y - the y position of the object
37
+ * char (optional) - the text representation of the object
38
+ * color (optional) - the color of the object
39
+ * texture (optional) - an array of string representing a row in a bigger shape
40
+ * colors (optional) - an array of arrays (rows) of Curses color constants,
41
+ the texture will be colored accordingly
42
+
43
+ You have to define either char or texture method on each object.
44
+
45
+ Available colors:
46
+
47
+ ```
48
+ Curses::COLOR_WHITE
49
+ Curses::COLOR_RED
50
+ Curses::COLOR_BLUE
51
+ Curses::COLOR_GREEN
52
+ Curses::COLOR_CYAN
53
+ Curses::COLOR_MAGENTA
54
+ Curses::COLOR_YELLOW
55
+ ```
56
+
57
+ ## Installation
58
+
59
+ Add this line to your application's Gemfile:
60
+
61
+ gem "gaminator", :git => "git://github.com/futuresimple/gaminator.git"
62
+
63
+ Execute:
64
+
65
+ $ bundle
66
+
67
+ And put following lines on top of your script file:
68
+
69
+ require "bundler/setup"
70
+ require "gaminator"
71
+
72
+
73
+
74
+ ## Contributing
75
+
76
+ 1. Fork it
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gaminator/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "gaminator"
8
+ gem.version = Gaminator::VERSION
9
+ gem.authors = ["Tomasz Werbicki", "Pawel Obrok"]
10
+ gem.email = ["tomasz@werbicki.net", "pawel.obrok@gmail.com"]
11
+ gem.description = "A simple wrapper around Curses for writing ASCII-art games"
12
+ gem.summary = "See https://github.com/futuresimple/gaminator/blob/master/README.md"
13
+ gem.homepage = "https://github.com/futuresimple/gaminator"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,5 @@
1
+ require "gaminator/version"
2
+ require "gaminator/runner"
3
+
4
+ module Gaminator
5
+ end
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+
3
+ require "curses"
4
+
5
+ module Gaminator
6
+ class Runner
7
+ include Curses
8
+
9
+ def initialize(game_class, options = {})
10
+ if options[:rows] && options[:cols]
11
+ resizeterm(options[:rows], options[:cols])
12
+ end
13
+
14
+ init_screen
15
+ start_color
16
+ cbreak
17
+ noecho
18
+ stdscr.nodelay = 1
19
+ curs_set(0)
20
+
21
+ [
22
+ COLOR_WHITE, COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN,
23
+ COLOR_MAGENTA, COLOR_YELLOW
24
+ ].each do |color|
25
+ init_pair(color, color, COLOR_BLACK)
26
+ end
27
+
28
+ @plane_width = cols
29
+ @plane_height = lines - 5
30
+ @plane = Window.new(@plane_height, @plane_width, 0, 0)
31
+ @plane.box("|", "-")
32
+
33
+ @textbox_width = cols
34
+ @textbox_height = 5
35
+ @textbox = Window.new(@textbox_height, @textbox_width, @plane_height, 0)
36
+ @textbox.box("|", "-")
37
+
38
+ @game = game_class.new(@plane_width - 2, @plane_height - 2)
39
+ end
40
+
41
+ def run
42
+ begin
43
+ loop do
44
+ tick_game
45
+
46
+ render_objects
47
+ render_textbox
48
+
49
+ @plane.refresh
50
+ @textbox.refresh
51
+
52
+ handle_input
53
+
54
+ clear_plane
55
+ clear_textbox
56
+
57
+ sleep(@game.sleep_time)
58
+ end
59
+ ensure
60
+ close_screen
61
+ puts
62
+ puts @game.exit_message
63
+ puts
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def handle_input
70
+ if @game.wait?
71
+ @textbox.timeout = -1
72
+ else
73
+ @textbox.timeout = 0
74
+ end
75
+ char = @textbox.getch
76
+ action = @game.input_map[char]
77
+ if action && @game.respond_to?(action)
78
+ @game.send(action)
79
+ end
80
+ end
81
+
82
+ def tick_game
83
+ @game.tick
84
+ end
85
+
86
+ def render_objects
87
+ @game.objects.each do |object|
88
+ render_object(object)
89
+ end
90
+ end
91
+
92
+ def render_object(object)
93
+ color = object.respond_to?(:color) ? object.color : COLOR_WHITE
94
+ texture = object.texture if object.respond_to?(:texture)
95
+ texture ||= [object.char]
96
+
97
+ texture.each.with_index do |row,row_index|
98
+ row.each_char.with_index do |pixel,pixel_index|
99
+ x = object.x + 1 + pixel_index
100
+ y = object.y + 1 + row_index
101
+ next if x < 1 || x >= @plane_width
102
+ next if y < 1 || y >= @plane_height
103
+
104
+ if object.respond_to?(:colors) && object.colors
105
+ color = object.colors[row_index][pixel_index]
106
+ end
107
+
108
+ @plane.setpos(y,x)
109
+ @plane.attron(color_pair(color) | A_NORMAL) do
110
+ @plane.addstr(pixel)
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ def render_textbox
117
+ @textbox.setpos(2, 3)
118
+ @textbox.addstr(@game.textbox_content)
119
+ end
120
+
121
+ def clear_plane
122
+ 1.upto(@plane_height - 2) do |y|
123
+ 1.upto(@plane_width - 2) do |x|
124
+ @plane.setpos(y, x)
125
+ @plane.addstr(" ")
126
+ end
127
+ end
128
+ end
129
+
130
+ def clear_textbox
131
+ 1.upto(@textbox_height - 2) do |y|
132
+ 1.upto(@textbox_width - 2) do |x|
133
+ @textbox.setpos(y, x)
134
+ @textbox.addstr(" ")
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,3 @@
1
+ module Gaminator
2
+ VERSION = "0.0.5"
3
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gaminator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tomasz Werbicki
9
+ - Pawel Obrok
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-03-23 00:00:00.000000000 Z
14
+ dependencies: []
15
+ description: A simple wrapper around Curses for writing ASCII-art games
16
+ email:
17
+ - tomasz@werbicki.net
18
+ - pawel.obrok@gmail.com
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - Gemfile
25
+ - LICENSE.txt
26
+ - README.md
27
+ - Rakefile
28
+ - gaminator.gemspec
29
+ - lib/gaminator.rb
30
+ - lib/gaminator/runner.rb
31
+ - lib/gaminator/version.rb
32
+ homepage: https://github.com/futuresimple/gaminator
33
+ licenses: []
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project:
52
+ rubygems_version: 1.8.24
53
+ signing_key:
54
+ specification_version: 3
55
+ summary: See https://github.com/futuresimple/gaminator/blob/master/README.md
56
+ test_files: []
57
+ has_rdoc: