conjuration 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1a2cd4153fd1fe67cf858245a3337a12f28e3bf0383a14c4ca5a98021eb446e6
4
+ data.tar.gz: 0b1975cf3fb9baf67802f204faaef6a91e71a2d080064eb922d22cee2ffc78ec
5
+ SHA512:
6
+ metadata.gz: f655cf37edfa05b1ab4b6256a19486b31c3a406ae68c8447f02683b1b946fc13a34266c88017f6c5c332b4603187b2346e58e5988ffde8f41f8009aef4064446
7
+ data.tar.gz: cecba3e7696c57a11662dce317652bae03b6be7c0addd4d71ac0a2c11a1875de083709305eba38df6a22e3343f4a09fa4a44fa40841e3c0679e4668a2e823364
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,28 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-rake
5
+ - rubocop-rspec
6
+
7
+ AllCops:
8
+ NewCops: disable
9
+ TargetRubyVersion: 3.3.0
10
+
11
+ Metrics/AbcSize:
12
+ AllowedPatterns:
13
+ - draw_
14
+
15
+ Naming/AccessorMethodName:
16
+ Enabled: false
17
+
18
+ Naming/MethodParameterName:
19
+ AllowedNames:
20
+ - x
21
+ - y
22
+ - id
23
+
24
+ Style/StringLiterals:
25
+ EnforcedStyle: double_quotes
26
+
27
+ Style/StringLiteralsInInterpolation:
28
+ EnforcedStyle: double_quotes
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,21 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2024-05-16 10:06:07 UTC using RuboCop version 1.63.5.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 7
10
+ # Configuration parameters: AllowedConstants.
11
+ Style/Documentation:
12
+ Exclude:
13
+ - 'spec/**/*'
14
+ - 'test/**/*'
15
+ - 'lib/conjuration/concerns/attributes.rb'
16
+ - 'lib/conjuration/game.rb'
17
+ - 'lib/conjuration/game_object.rb'
18
+ - 'lib/conjuration/managers/asset_manager.rb'
19
+ - 'lib/conjuration/managers/debug_manager.rb'
20
+ - 'lib/conjuration/managers/input_manager.rb'
21
+ - 'lib/conjuration/managers/scene_manager.rb'
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2024-05-15
4
+
5
+ - Initial release
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2024 Daniel Dye
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # Conjuration
2
+
3
+ A Ruby 2d game engine built on [gosu/gosu](https://github.com/gosu/gosu).
4
+
5
+ ## Inspiration & Goals
6
+
7
+ As a Ruby developer, I want a toolset that allows me to prototype games quickly and easily. I want to be able to experiment with game mechanics and ideas without having to worry about the complexities of a full game engine.
8
+
9
+ - Provide a opinionated set of tools to build 2d games in Ruby.
10
+ - Focus on simplicity and ease of experimentation.
11
+ - Provide clear examples and documentation to help new developers get started.
12
+
13
+ ## Installation
14
+
15
+ As the gem is based on gosu, you will need to install the gosu dependencies.
16
+
17
+ - [Gosu: Getting Started on OS X](https://github.com/gosu/gosu/wiki/Getting-Started-on-OS-X)
18
+ - [Gosu: Getting Started on Windows](https://github.com/gosu/gosu/wiki/Getting-Started-on-Windows)
19
+ - [Gosu: Getting Started on Linux](https://github.com/gosu/gosu/wiki/Getting-Started-on-Linux)
20
+
21
+ Add this line to your application's Gemfile:
22
+
23
+ ```ruby
24
+ gem "conjuration"
25
+ ```
26
+
27
+ > TODO: Add project generator. `conjuration new my_game`
28
+
29
+ ## Usage
30
+
31
+ You should setup your project with the following file structure:
32
+
33
+ ```
34
+ .
35
+ ├── src/
36
+ │ ├── assets
37
+ │ ├── game_objects
38
+ │ ├── scenes
39
+ │ └── game.rb
40
+ └── main.rb
41
+ ```
42
+
43
+ - `main.rb`
44
+
45
+ The entrypoint for your game. This is where you require the game file and start the game.
46
+
47
+ > TODO: Pull this into a bin script. `conjuration run`
48
+
49
+ - `src/game.rb`
50
+
51
+ The main game class. This is where you add your initial scene.
52
+
53
+ ```ruby
54
+ class Game < Conjuration::Game
55
+ def initialize
56
+ super(title: "My Game")
57
+
58
+ scene_manager.add_scene(:main_menu, MainMenuScene)
59
+ scene_manager.set_scene(:main_menu)
60
+ end
61
+ end
62
+ ```
63
+
64
+ - `src/scenes`
65
+
66
+ This is where you define each of your game scenes. Each scene should inherit from `Conjuration::Scene`.
67
+
68
+ - `src/game_objects`
69
+
70
+ This is where you define your game objects. Each game object should inherit from `Conjuration::GameObject`.
71
+
72
+ - `src/assets`
73
+
74
+ This is where you store your game assets. This can include images, sounds, and other resources.
75
+
76
+ ## Contributing
77
+
78
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Nitemaeric/conjuration.
79
+
80
+ ## License
81
+
82
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Attributes
4
+ #
5
+ # This module provides a way to define inspectable attributes for a class.
6
+ # It provides readers and writers for each attribute, and an inspect method that
7
+ # displays only defined attributes.
8
+ #
9
+ # Instance variables are not added to the inspect output.
10
+ #
11
+ # Usage:
12
+ #
13
+ # class Person
14
+ # include Attributes
15
+ #
16
+ # attribute :name
17
+ # attribute :age
18
+ # end
19
+ #
20
+ # person = Person.new
21
+ # person.name = "Alice"
22
+ # person.age = 30
23
+ # person.inspect # => "<Person name: \"Alice\", age: 30>"
24
+ #
25
+ module Attributes
26
+ def self.included(base)
27
+ base.extend(ClassMethods)
28
+ end
29
+
30
+ def initialize(...)
31
+ super()
32
+
33
+ @attributes = {}
34
+ end
35
+
36
+ def inspect
37
+ "<#{self.class} #{@attributes.map { |attribute_name, value| "#{attribute_name}: #{value.inspect}" }.join(", ")}>"
38
+ end
39
+
40
+ module ClassMethods
41
+ def attribute(attribute_name)
42
+ define_method(attribute_name) do
43
+ @attributes[attribute_name]
44
+ end
45
+
46
+ define_method("#{attribute_name}=") do |value|
47
+ @attributes[attribute_name] = value
48
+ end
49
+ end
50
+
51
+ def boolean_attribute(attribute_name)
52
+ attribute(attribute_name)
53
+
54
+ define_method("#{attribute_name}?") do
55
+ !!@attributes[attribute_name]
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class Game < ::Gosu::Window
5
+ attr_reader :debug_manager, :scene_manager, :input_manager, :target_fps
6
+
7
+ def initialize(title:, target_fps: 120, **options)
8
+ super(1920, 1080, update_interval: 1000.0 / target_fps, **options)
9
+
10
+ self.caption = title
11
+
12
+ @debug_manager = DebugManager.new
13
+ @scene_manager = SceneManager.new(self)
14
+ @input_manager = InputManager.new
15
+
16
+ @target_fps = target_fps
17
+ end
18
+
19
+ def update
20
+ @scene_manager.update(self)
21
+ end
22
+
23
+ def draw
24
+ @scene_manager.draw(self)
25
+ @debug_manager.draw(self)
26
+ end
27
+
28
+ def button_down(id)
29
+ @scene_manager.button_down(self, @input_manager.map_button(id))
30
+ @debug_manager.button_down(self, id)
31
+ end
32
+
33
+ def button_up(id)
34
+ @scene_manager.button_up(self, @input_manager.map_button(id))
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class GameObject
5
+ include Attributes
6
+
7
+ attribute :name
8
+ attribute :x
9
+ attribute :y
10
+ attribute :width
11
+ attribute :height
12
+
13
+ boolean_attribute :hovering
14
+ attribute :clicking
15
+
16
+ boolean_attribute :visible
17
+
18
+ def initialize(x:, y:, width:, height:)
19
+ super
20
+
21
+ self.x = x
22
+ self.y = y
23
+ self.width = width
24
+ self.height = height
25
+ self.hovering = false
26
+ self.clicking = Hash.new(false)
27
+ end
28
+
29
+ def self.create(*args, scene:, **kwargs, &block)
30
+ game_object = new(*args, **kwargs, &block)
31
+ scene.add_object(game_object)
32
+ game_object
33
+ end
34
+
35
+ def mouse_position(context)
36
+ mouse_exited(context)
37
+ mouse_entered(context)
38
+ end
39
+
40
+ # =====
41
+ # Helpers
42
+ # =====
43
+
44
+ def in_bounds?(context)
45
+ context.mouse_x >= x &&
46
+ context.mouse_x <= x + width &&
47
+ context.mouse_y >= y &&
48
+ context.mouse_y <= y + height
49
+ end
50
+
51
+ # ==========
52
+ # Abstract Methods
53
+ # ==========
54
+
55
+ def draw(context); end
56
+ def on_click(context, key); end
57
+ def on_mouse_down(context, key); end
58
+ def on_mouse_up(context, key); end
59
+
60
+ # ==========
61
+ # Hovering
62
+ # ==========
63
+
64
+ def mouse_exited(context)
65
+ return unless hovering && !in_bounds?(context)
66
+
67
+ self.hovering = false
68
+ end
69
+
70
+ def mouse_entered(context)
71
+ return unless !hovering && in_bounds?(context)
72
+
73
+ self.hovering = true
74
+ end
75
+
76
+ # ==========
77
+ # Clicking
78
+ # ==========
79
+
80
+ def mouse_down(context, key)
81
+ on_mouse_down(context, key)
82
+
83
+ return unless !clicking[key] && context.input_manager.button_down?(key) && in_bounds?(context)
84
+
85
+ clicking[key] = true
86
+ end
87
+
88
+ def mouse_up(context, key)
89
+ on_mouse_up(context, key)
90
+
91
+ on_click(context, key) if clicking[key] && !context.input_manager.button_down?(key) && in_bounds?(context)
92
+
93
+ clicking[key] = false
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class AssetManager
5
+ def self.load_image(asset_path)
6
+ Gosu::Image.new(asset_path)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class DebugManager
5
+ include Attributes
6
+
7
+ boolean_attribute :enabled
8
+
9
+ boolean_attribute :show_fps
10
+ boolean_attribute :show_grid
11
+ boolean_attribute :show_coordinates
12
+
13
+ def initialize
14
+ super
15
+
16
+ self.enabled = false
17
+
18
+ self.show_fps = false
19
+ self.show_grid = false
20
+ self.show_coordinates = false
21
+ end
22
+
23
+ def draw(window)
24
+ return unless enabled?
25
+
26
+ draw_menu(window)
27
+
28
+ draw_fps(window) if show_fps?
29
+ draw_grid(window) if show_grid?
30
+ draw_coordinates(window) if show_coordinates?
31
+ end
32
+
33
+ def button_down(_window, id)
34
+ self.enabled = !enabled if id == Gosu::KB_F12
35
+
36
+ return unless enabled?
37
+
38
+ case id
39
+ when Gosu::KB_F1
40
+ self.show_fps = !show_fps
41
+ when Gosu::KB_F2
42
+ self.show_grid = !show_grid
43
+ when Gosu::KB_F3
44
+ self.show_coordinates = !show_coordinates
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def font
51
+ @font ||= Gosu::Font.new(12)
52
+ end
53
+
54
+ def draw_menu(window)
55
+ font.draw_text("Debug Menu", window.width - 5 - font.text_width("Debug Menu"), 20, 1, 1, 1, Gosu::Color::GREEN)
56
+ font.draw_text("F1: Toggle FPS", window.width - 5 - font.text_width("F1: Toggle FPS"), 35, 1, 1, 1,
57
+ Gosu::Color::GREEN)
58
+ font.draw_text("F2: Toggle Grid", window.width - 5 - font.text_width("F2: Toggle Grid"), 50, 1, 1, 1,
59
+ Gosu::Color::GREEN)
60
+ font.draw_text("F3: Toggle Coordinates", window.width - 5 - font.text_width("F3: Toggle Coordinates"), 65, 1, 1,
61
+ 1, Gosu::Color::GREEN)
62
+ end
63
+
64
+ def draw_fps(window)
65
+ font.draw_text(Gosu.fps, window.width - 5 - font.text_width(Gosu.fps), 5, 1, 1, 1, Gosu::Color::GREEN)
66
+ end
67
+
68
+ def draw_grid(window)
69
+ (window.width / 20).times do |column|
70
+ window.draw_line(column * 20, 0, Gosu::Color::GREEN, column * 20, window.height, Gosu::Color::GREEN)
71
+ end
72
+
73
+ (window.height / 20).times do |row|
74
+ window.draw_line(0, row * 20, Gosu::Color::GREEN, window.width, row * 20, Gosu::Color::GREEN)
75
+ end
76
+ end
77
+
78
+ def draw_coordinates(window)
79
+ label = "#{window.mouse_x.to_i}, #{window.mouse_y.to_i}"
80
+ label_width = font.text_width(label)
81
+
82
+ label_x = if window.mouse_x + 5 + label_width > window.width
83
+ window.mouse_x - 5 - label_width
84
+ else
85
+ window.mouse_x + 5
86
+ end
87
+
88
+ label_y = window.mouse_y - 5
89
+
90
+ font.draw_text(label, label_x, label_y, 1, 1, 1, Gosu::Color::GREEN)
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class InputManager
5
+ LEFT_CLICK = :left_click
6
+ RIGHT_CLICK = :right_click
7
+
8
+ UP = :up
9
+ LEFT = :left
10
+ DOWN = :down
11
+ RIGHT = :right
12
+
13
+ def map_button(key_id)
14
+ input_map[key_id]
15
+ end
16
+
17
+ def button_down?(action)
18
+ action_map[action].any? { |key_id| Gosu.button_down?(key_id) }
19
+ end
20
+
21
+ # Returns a hash of actions mapped to key bindings.
22
+ #
23
+ # { action => [key_id] }
24
+ def action_map
25
+ @action_map ||= {
26
+ LEFT_CLICK => [Gosu::MsLeft],
27
+ RIGHT_CLICK => [Gosu::MsRight],
28
+
29
+ UP => [Gosu::KbUp, Gosu::GpUp, Gosu::KB_W],
30
+ LEFT => [Gosu::KbLeft, Gosu::GpLeft, Gosu::KB_A],
31
+ DOWN => [Gosu::KbDown, Gosu::GpDown, Gosu::KB_S],
32
+ RIGHT => [Gosu::KbRight, Gosu::GpRight, Gosu::KB_D]
33
+ }
34
+ end
35
+
36
+ # Returns a hash of key bindings mapped to actions.
37
+ #
38
+ # { key_id => action }
39
+ def input_map
40
+ @input_map ||= action_map.each_with_object({}) do |(action, key_ids), hash|
41
+ key_ids.each do |key_id|
42
+ hash[key_id] = action
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ class SceneManager
5
+ def initialize(window)
6
+ @scenes = {}
7
+ @window = window
8
+ end
9
+
10
+ def add_scene(key, scene_class)
11
+ @scenes[key] = scene_class
12
+ end
13
+
14
+ def set_scene(_scene_class, options = {})
15
+ @current_scene = @scenes[key].new(@window, options)
16
+ end
17
+
18
+ attr_reader :current_scene
19
+
20
+ # ====================
21
+
22
+ def update(window)
23
+ current_scene.update(window)
24
+ end
25
+
26
+ def draw(window)
27
+ current_scene.draw(window)
28
+ end
29
+
30
+ def button_down(window, id)
31
+ current_scene.button_down(window, id)
32
+ end
33
+
34
+ def button_up(window, id)
35
+ current_scene.button_up(window, id)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ # Keeps track of game objects and manages their updates, draws, mouse, and keyboard events.
5
+ class Scene
6
+ include Attributes
7
+
8
+ attr_reader :window
9
+
10
+ def initialize(window, options = {})
11
+ super
12
+
13
+ @window = window
14
+ @game_objects = []
15
+ @asset_manager = AssetManager.new
16
+ end
17
+
18
+ def add_object(game_object)
19
+ @game_objects << game_object
20
+ end
21
+
22
+ def set_background(asset_path)
23
+ @background_image = AssetManager.load_image(asset_path)
24
+ end
25
+
26
+ # ==========
27
+ # Abstract Methods
28
+ # ==========
29
+
30
+ def update(context)
31
+ @game_objects.each { |game_object| game_object.mouse_position(context) }
32
+ end
33
+
34
+ def draw(context)
35
+ @background_image&.draw(0, 0, 0, context.width.to_f / @background_image.width,
36
+ context.height.to_f / @background_image.height)
37
+ @game_objects.each { |game_object| game_object.draw(context) }
38
+ end
39
+
40
+ def button_down(context, key)
41
+ @game_objects.each { |game_object| game_object.mouse_down(context, key) }
42
+ end
43
+
44
+ def button_up(context, key)
45
+ @game_objects.each { |game_object| game_object.mouse_up(context, key) }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjuration
4
+ VERSION = "0.1.2"
5
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "gosu"
4
+ require "zeitwerk"
5
+
6
+ loader = Zeitwerk::Loader.for_gem
7
+ loader.setup
8
+
9
+ module Conjuration
10
+ class Error < StandardError; end
11
+ # Your code goes here...
12
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: conjuration
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Dye
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gosu
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: zeitwerk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.6.14
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.6.14
41
+ description:
42
+ email:
43
+ - dnitemaeric@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".rspec"
49
+ - ".rubocop.yml"
50
+ - ".rubocop_todo.yml"
51
+ - CHANGELOG.md
52
+ - LICENSE.txt
53
+ - README.md
54
+ - Rakefile
55
+ - lib/conjuration.rb
56
+ - lib/conjuration/concerns/attributes.rb
57
+ - lib/conjuration/game.rb
58
+ - lib/conjuration/game_object.rb
59
+ - lib/conjuration/managers/asset_manager.rb
60
+ - lib/conjuration/managers/debug_manager.rb
61
+ - lib/conjuration/managers/input_manager.rb
62
+ - lib/conjuration/managers/scene_manager.rb
63
+ - lib/conjuration/scene.rb
64
+ - lib/conjuration/version.rb
65
+ homepage: https://github.com/nitemaeric/conjuration
66
+ licenses:
67
+ - MIT
68
+ metadata:
69
+ homepage_uri: https://github.com/nitemaeric/conjuration
70
+ source_code_uri: https://github.com/nitemaeric/conjuration
71
+ changelog_uri: https://github.com/nitemaeric/conjuration/blob/main/CHANGELOG.md
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 3.3.0
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubygems_version: 3.5.9
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: A Ruby game engine built on top of Gosu.
91
+ test_files: []