chione 0.0.2
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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gemtest +0 -0
- data/.rdoc_options +22 -0
- data/.simplecov +14 -0
- data/ChangeLog +114 -0
- data/History.rdoc +9 -0
- data/Manifest.txt +27 -0
- data/README.rdoc +96 -0
- data/Rakefile +92 -0
- data/lib/chione.rb +37 -0
- data/lib/chione/aspect.rb +163 -0
- data/lib/chione/assemblage.rb +64 -0
- data/lib/chione/behaviors.rb +31 -0
- data/lib/chione/component.rb +43 -0
- data/lib/chione/entity.rb +80 -0
- data/lib/chione/manager.rb +44 -0
- data/lib/chione/mixins.rb +91 -0
- data/lib/chione/system.rb +69 -0
- data/lib/chione/world.rb +358 -0
- data/spec/chione/aspect_spec.rb +143 -0
- data/spec/chione/assemblage_spec.rb +60 -0
- data/spec/chione/component_spec.rb +54 -0
- data/spec/chione/entity_spec.rb +109 -0
- data/spec/chione/manager_spec.rb +39 -0
- data/spec/chione/mixins_spec.rb +94 -0
- data/spec/chione/system_spec.rb +72 -0
- data/spec/chione/world_spec.rb +451 -0
- data/spec/chione_spec.rb +11 -0
- data/spec/spec_helper.rb +34 -0
- metadata +250 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a4db53fed99c571b08d2413fc895bc32eef38194
|
4
|
+
data.tar.gz: 17972162d89c66ebc0d4e1f35aa2af2c667c6437
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e0e7538d0a928b90104586a5d70ee46068c2d8b8999b940e40a0f342720ec33c8f3407eea3a9baab2ae244330314175438a4975c32e3ba0486f09522a5c5d09b
|
7
|
+
data.tar.gz: 8af6a0b44089392eee195ea85fbdc57a9bc9f69f3b5cab431a7321185a1afcc84ce7d99a304a9c7f9de12f74c49a9da182912a70f42968ae6ce60e11723274b5
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/.gemtest
ADDED
File without changes
|
data/.rdoc_options
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
--- !ruby/object:RDoc::Options
|
2
|
+
encoding: UTF-8
|
3
|
+
static_path: []
|
4
|
+
rdoc_include:
|
5
|
+
- "."
|
6
|
+
charset: UTF-8
|
7
|
+
exclude:
|
8
|
+
hyperlink_all: false
|
9
|
+
line_numbers: true
|
10
|
+
locale:
|
11
|
+
locale_dir: locale
|
12
|
+
locale_name:
|
13
|
+
main_page:
|
14
|
+
markup: markdown
|
15
|
+
output_decoration: true
|
16
|
+
page_dir:
|
17
|
+
show_hash: true
|
18
|
+
tab_width: 4
|
19
|
+
template_stylesheets: []
|
20
|
+
title:
|
21
|
+
visibility: :protected
|
22
|
+
webcvs:
|
data/.simplecov
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Simplecov config
|
2
|
+
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter 'spec'
|
5
|
+
add_filter 'integration'
|
6
|
+
add_group "Needing tests" do |file|
|
7
|
+
file.covered_percent < 90
|
8
|
+
end
|
9
|
+
|
10
|
+
if ENV['CIRCLE_ARTIFACTS']
|
11
|
+
dir = ENV['CIRCLE_ARTIFACTS'] + "/coverage"
|
12
|
+
coverage_dir( dir )
|
13
|
+
end
|
14
|
+
end
|
data/ChangeLog
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
2015-07-13 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
* lib/chione/behaviors.rb:
|
4
|
+
Add a shared-behaviors collection
|
5
|
+
[5ac263b85052] [github/master, tip]
|
6
|
+
|
7
|
+
* lib/chione/world.rb, spec/chione/world_spec.rb:
|
8
|
+
Add support for more than one GameWorld callback per event pattern
|
9
|
+
[bd5d3d7c9a25]
|
10
|
+
|
11
|
+
* lib/chione/entity.rb, spec/chione/entity_spec.rb:
|
12
|
+
Add an error-checking method for fetching components from entities
|
13
|
+
[e05eecf441a9]
|
14
|
+
|
15
|
+
2015-07-06 Michael Granger <ged@FaerieMUD.org>
|
16
|
+
|
17
|
+
* lib/chione/world.rb, spec/chione/world_spec.rb:
|
18
|
+
Send the System or Manager class instead of its name in added events
|
19
|
+
[8b8c61d98bbe]
|
20
|
+
|
21
|
+
2015-07-03 Michael Granger <ged@FaerieMUD.org>
|
22
|
+
|
23
|
+
* Manifest.txt, chione.gemspec, circle.yml:
|
24
|
+
Switch to Semaphore CI.
|
25
|
+
[0c557d993116]
|
26
|
+
|
27
|
+
* README.md:
|
28
|
+
Add some ECS resources to the README
|
29
|
+
[e52690bee302]
|
30
|
+
|
31
|
+
2015-07-02 Michael Granger <ged@FaerieMUD.org>
|
32
|
+
|
33
|
+
* .simplecov:
|
34
|
+
Trying a different coverage artifact path
|
35
|
+
[4608ebd79e6d]
|
36
|
+
|
37
|
+
* .simplecov, circle.yml:
|
38
|
+
Attempting to get coverage artifacts working
|
39
|
+
[645d40b6661d]
|
40
|
+
|
41
|
+
* spec/chione/world_spec.rb:
|
42
|
+
Fix some world specs
|
43
|
+
[4a0c788679d9]
|
44
|
+
|
45
|
+
* .circle.yml, circle.yml:
|
46
|
+
Rename .circle.yml to circle.yml. Ugh.
|
47
|
+
[b601a62a3282]
|
48
|
+
|
49
|
+
* Rakefile:
|
50
|
+
Add `test` alias for `spec` task
|
51
|
+
[1bc69f3c5f84]
|
52
|
+
|
53
|
+
* .circle.yml:
|
54
|
+
Trying out circleci for CI
|
55
|
+
[ddf85c924542]
|
56
|
+
|
57
|
+
* lib/chione/world.rb, spec/chione/world_spec.rb:
|
58
|
+
Start Systems and Managers added to running worlds.
|
59
|
+
[413fa0a7e63b]
|
60
|
+
|
61
|
+
2015-06-26 Michael Granger <ged@FaerieMUD.org>
|
62
|
+
|
63
|
+
* lib/chione/manager.rb, lib/chione/system.rb, lib/chione/world.rb,
|
64
|
+
spec/chione/world_spec.rb:
|
65
|
+
Add system/manager start/stop to the World, distinguish between
|
66
|
+
#started? and #running?
|
67
|
+
[4e8b849d2465]
|
68
|
+
|
69
|
+
2015-06-24 Michael Granger <ged@FaerieMUD.org>
|
70
|
+
|
71
|
+
* Rakefile, chione.gemspec:
|
72
|
+
Fix version of fivefish generator
|
73
|
+
[c6e04d3d5e33]
|
74
|
+
|
75
|
+
* lib/chione/manager.rb, lib/chione/system.rb, lib/chione/world.rb,
|
76
|
+
spec/chione/world_spec.rb:
|
77
|
+
Allow systems/managers to be created with args, start them if added
|
78
|
+
when the world is already running
|
79
|
+
[38215d3ce09a]
|
80
|
+
|
81
|
+
* .rdoc_options, Rakefile:
|
82
|
+
Include .md files in docs generation
|
83
|
+
[6f5aae40418c]
|
84
|
+
|
85
|
+
* README.md:
|
86
|
+
Fix up the README formatting
|
87
|
+
[eaf39049bdba]
|
88
|
+
|
89
|
+
2015-06-23 Michael Granger <ged@FaerieMUD.org>
|
90
|
+
|
91
|
+
* History.md, History.rdoc, Manifest.txt, README.md, README.rdoc,
|
92
|
+
Rakefile:
|
93
|
+
Convert README and History to markdown
|
94
|
+
[b2b9437fce76]
|
95
|
+
|
96
|
+
2015-06-22 Michael Granger <ged@FaerieMUD.org>
|
97
|
+
|
98
|
+
* .travis.yml, Gemfile, History.rdoc, Manifest.txt, README.rdoc,
|
99
|
+
Rakefile, cert/ged.pem, chione.gemspec:
|
100
|
+
Update build system stuff.
|
101
|
+
[89e6682e9be9]
|
102
|
+
|
103
|
+
* .gems, .hgignore, .pryrc, .rvmrc, .simplecov, .tm_properties,
|
104
|
+
History.rdoc, Manifest.txt, README.rdoc, Rakefile, experiments
|
105
|
+
/fnmatch-vs-regex.rb, lib/chione.rb, lib/chione/aspect.rb,
|
106
|
+
lib/chione/assemblage.rb, lib/chione/component.rb,
|
107
|
+
lib/chione/entity.rb, lib/chione/manager.rb, lib/chione/mixins.rb,
|
108
|
+
lib/chione/system.rb, lib/chione/world.rb,
|
109
|
+
spec/chione/aspect_spec.rb, spec/chione/assemblage_spec.rb,
|
110
|
+
spec/chione/component_spec.rb, spec/chione/entity_spec.rb,
|
111
|
+
spec/chione/manager_spec.rb, spec/chione/system_spec.rb,
|
112
|
+
spec/chione/world_spec.rb, spec/chione_spec.rb, spec/spec_helper.rb:
|
113
|
+
Initial implementation
|
114
|
+
[a566bf207cc5]
|
data/History.rdoc
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
.rdoc_options
|
2
|
+
.simplecov
|
3
|
+
ChangeLog
|
4
|
+
History.rdoc
|
5
|
+
Manifest.txt
|
6
|
+
README.rdoc
|
7
|
+
Rakefile
|
8
|
+
lib/chione.rb
|
9
|
+
lib/chione/aspect.rb
|
10
|
+
lib/chione/assemblage.rb
|
11
|
+
lib/chione/behaviors.rb
|
12
|
+
lib/chione/component.rb
|
13
|
+
lib/chione/entity.rb
|
14
|
+
lib/chione/manager.rb
|
15
|
+
lib/chione/mixins.rb
|
16
|
+
lib/chione/system.rb
|
17
|
+
lib/chione/world.rb
|
18
|
+
spec/chione/aspect_spec.rb
|
19
|
+
spec/chione/assemblage_spec.rb
|
20
|
+
spec/chione/component_spec.rb
|
21
|
+
spec/chione/entity_spec.rb
|
22
|
+
spec/chione/manager_spec.rb
|
23
|
+
spec/chione/mixins_spec.rb
|
24
|
+
spec/chione/system_spec.rb
|
25
|
+
spec/chione/world_spec.rb
|
26
|
+
spec/chione_spec.rb
|
27
|
+
spec/spec_helper.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
= Chione
|
2
|
+
|
3
|
+
home :: http://faelidth.org/chione
|
4
|
+
code :: http://bitbucket.org/ged/chione
|
5
|
+
github :: http://github.com/ged/chione
|
6
|
+
docs :: http://faelidth.org/chione/docs
|
7
|
+
|
8
|
+
|
9
|
+
== Description
|
10
|
+
|
11
|
+
An Entity/Component System framework inspired by Artemis.
|
12
|
+
|
13
|
+
This library is still experimental. I am writing it by extracting out ideas from
|
14
|
+
a multi-user game I'm working on, and things may change radically if I find
|
15
|
+
that parts of it don't work or could be done a better way.
|
16
|
+
|
17
|
+
That said, let me know if you're using it for anything and I'll try to keep
|
18
|
+
you abreast of any changes I'm considering, and I'm happy to chat about ideas
|
19
|
+
for making it better via email or the project's Gitter channel:
|
20
|
+
|
21
|
+
{rdoc-image:https://badges.gitter.im/Join%20Chat.svg}[https://gitter.im/ged/chione]
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
== Prerequisites
|
26
|
+
|
27
|
+
* Ruby 2.2
|
28
|
+
|
29
|
+
|
30
|
+
== Installation
|
31
|
+
|
32
|
+
$ gem install chione
|
33
|
+
|
34
|
+
|
35
|
+
== Resources
|
36
|
+
|
37
|
+
Articles/posts on ECS:
|
38
|
+
|
39
|
+
* http://gameprogrammingpatterns.com/component.html
|
40
|
+
* http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
|
41
|
+
* http://www.richardlord.net/blog/what-is-an-entity-framework
|
42
|
+
* http://www.richardlord.net/blog/why-use-an-entity-framework
|
43
|
+
* http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
|
44
|
+
|
45
|
+
Other ECS Frameworks:
|
46
|
+
|
47
|
+
* https://github.com/junkdog/artemis-odb (Java)
|
48
|
+
* https://github.com/libgdx/ashley (Java)
|
49
|
+
* http://www.ashframework.org/ (ActionScript)
|
50
|
+
|
51
|
+
|
52
|
+
== Contributing
|
53
|
+
|
54
|
+
You can check out the current development source with Mercurial via its
|
55
|
+
{project page}[http://bitbucket.org/ged/chione]. Or if you prefer Git, via
|
56
|
+
{its Github mirror}[https://github.com/ged/chione].
|
57
|
+
|
58
|
+
After checking out the source, run:
|
59
|
+
|
60
|
+
$ rake newb
|
61
|
+
|
62
|
+
This task will install any missing dependencies, run the tests/specs,
|
63
|
+
and generate the API documentation.
|
64
|
+
|
65
|
+
|
66
|
+
== License
|
67
|
+
|
68
|
+
Copyright (c) 2015, Michael Granger
|
69
|
+
All rights reserved.
|
70
|
+
|
71
|
+
Redistribution and use in source and binary forms, with or without
|
72
|
+
modification, are permitted provided that the following conditions are met:
|
73
|
+
|
74
|
+
* Redistributions of source code must retain the above copyright notice,
|
75
|
+
this list of conditions and the following disclaimer.
|
76
|
+
|
77
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
78
|
+
this list of conditions and the following disclaimer in the documentation
|
79
|
+
and/or other materials provided with the distribution.
|
80
|
+
|
81
|
+
* Neither the name of the author/s, nor the names of the project's
|
82
|
+
contributors may be used to endorse or promote products derived from this
|
83
|
+
software without specific prior written permission.
|
84
|
+
|
85
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
86
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
87
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
88
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
89
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
90
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
91
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
92
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
93
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
94
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
95
|
+
|
96
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'rake/clean'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'hoe'
|
7
|
+
rescue LoadError
|
8
|
+
abort "This Rakefile requires 'hoe' (gem install hoe)"
|
9
|
+
end
|
10
|
+
|
11
|
+
GEMSPEC = 'chione.gemspec'
|
12
|
+
|
13
|
+
|
14
|
+
Hoe.plugin :mercurial
|
15
|
+
Hoe.plugin :signing
|
16
|
+
Hoe.plugin :deveiate
|
17
|
+
|
18
|
+
Hoe.plugins.delete :rubyforge
|
19
|
+
|
20
|
+
hoespec = Hoe.spec 'chione' do |spec|
|
21
|
+
spec.readme_file = 'README.rdoc'
|
22
|
+
spec.history_file = 'History.rdoc'
|
23
|
+
spec.license 'BSD'
|
24
|
+
|
25
|
+
spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
26
|
+
|
27
|
+
spec.dependency 'loggability', '~> 0.11'
|
28
|
+
spec.dependency 'configurability', '~> 2.2'
|
29
|
+
spec.dependency 'uuid', '~> 2.3'
|
30
|
+
|
31
|
+
spec.dependency 'hoe-deveiate', '~> 0.3', :developer
|
32
|
+
spec.dependency 'simplecov', '~> 0.7', :developer
|
33
|
+
spec.dependency 'rdoc-generator-fivefish', '~> 0.1', :developer
|
34
|
+
|
35
|
+
spec.require_ruby_version( '>=2.2.1' )
|
36
|
+
spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
|
37
|
+
spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
|
38
|
+
|
39
|
+
spec.rdoc_locations << "yhaliwell:/usr/local/www/public/chione/docs"
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
45
|
+
|
46
|
+
# Ensure the specs pass before checking in
|
47
|
+
task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
|
48
|
+
|
49
|
+
task :test => :spec
|
50
|
+
|
51
|
+
# Rebuild the ChangeLog immediately before release
|
52
|
+
task :prerelease => 'ChangeLog'
|
53
|
+
CLOBBER.include( 'ChangeLog' )
|
54
|
+
|
55
|
+
desc "Build a coverage report"
|
56
|
+
task :coverage do
|
57
|
+
ENV["COVERAGE"] = 'yes'
|
58
|
+
Rake::Task[:spec].invoke
|
59
|
+
end
|
60
|
+
CLOBBER.include( 'coverage' )
|
61
|
+
|
62
|
+
|
63
|
+
# Use the fivefish formatter for docs generated from development checkout
|
64
|
+
if File.directory?( '.hg' )
|
65
|
+
require 'rdoc/task'
|
66
|
+
|
67
|
+
Rake::Task[ 'docs' ].clear
|
68
|
+
RDoc::Task.new( 'docs' ) do |rdoc|
|
69
|
+
rdoc.main = "README.rdoc"
|
70
|
+
rdoc.markup = 'markdown'
|
71
|
+
rdoc.rdoc_files.include( "*.rdoc", "ChangeLog", "lib/**/*.rb" )
|
72
|
+
rdoc.generator = :fivefish
|
73
|
+
rdoc.title = 'Chione'
|
74
|
+
rdoc.rdoc_dir = 'doc'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
task :gemspec => GEMSPEC
|
80
|
+
file GEMSPEC => __FILE__
|
81
|
+
task GEMSPEC do |task|
|
82
|
+
spec = $hoespec.spec
|
83
|
+
spec.files.delete( '.gemtest' )
|
84
|
+
spec.signing_key = nil
|
85
|
+
spec.cert_chain = ['certs/ged.pem']
|
86
|
+
spec.version = "#{spec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
87
|
+
File.open( task.name, 'w' ) do |fh|
|
88
|
+
fh.write( spec.to_ruby )
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
CLOBBER.include( GEMSPEC.to_s )
|
data/lib/chione.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
#encoding: utf-8
|
3
|
+
|
4
|
+
require 'uuid'
|
5
|
+
require 'loggability'
|
6
|
+
|
7
|
+
# An Entity/Component System inspired by Artemis
|
8
|
+
module Chione
|
9
|
+
extend Loggability
|
10
|
+
|
11
|
+
# Loggability API -- set up a log host
|
12
|
+
log_as :chione
|
13
|
+
|
14
|
+
|
15
|
+
# Gem version
|
16
|
+
VERSION = '0.0.2'
|
17
|
+
|
18
|
+
|
19
|
+
require 'chione/mixins'
|
20
|
+
|
21
|
+
autoload :Aspect, 'chione/aspect'
|
22
|
+
autoload :Assemblage, 'chione/assemblage'
|
23
|
+
autoload :Component, 'chione/component'
|
24
|
+
autoload :Entity, 'chione/entity'
|
25
|
+
autoload :Manager, 'chione/manager'
|
26
|
+
autoload :System, 'chione/system'
|
27
|
+
autoload :World, 'chione/world'
|
28
|
+
|
29
|
+
##
|
30
|
+
# The global UUID object for generating new UUIDs
|
31
|
+
class << self; attr_reader :uuid ; end
|
32
|
+
@uuid = UUID.new
|
33
|
+
|
34
|
+
end # module Chione
|
35
|
+
|
36
|
+
# vim: set nosta noet ts=4 sw=4:
|
37
|
+
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
#encoding: utf-8
|
3
|
+
|
4
|
+
require 'set'
|
5
|
+
require 'loggability'
|
6
|
+
|
7
|
+
require 'chione' unless defined?( Chione )
|
8
|
+
|
9
|
+
|
10
|
+
# An expression of component-matching criteria used to find entities that should be
|
11
|
+
# processed by a System.
|
12
|
+
class Chione::Aspect
|
13
|
+
extend Loggability
|
14
|
+
|
15
|
+
|
16
|
+
# Loggability API -- log to the chione logger
|
17
|
+
log_to :chione
|
18
|
+
|
19
|
+
|
20
|
+
### Return a new Aspect that will match entities with at least one of the specified
|
21
|
+
### +component_types+.
|
22
|
+
def self::with_one_of( *component_types )
|
23
|
+
return self.new( one_of: component_types.flatten )
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
### Return a new Aspect that will match entities with all of the specified
|
28
|
+
### +component_types+.
|
29
|
+
def self::with_all_of( *component_types )
|
30
|
+
return self.new( all_of: component_types.flatten )
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
### Return a new Aspect that will match entities with none of the specified
|
35
|
+
### +component_types+.
|
36
|
+
def self::with_none_of( *component_types )
|
37
|
+
return self.new( none_of: component_types.flatten )
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
### Create a new empty Aspect
|
42
|
+
def initialize( one_of: [], all_of: [], none_of: [] )
|
43
|
+
@one_of = Set.new( one_of )
|
44
|
+
@all_of = Set.new( all_of )
|
45
|
+
@none_of = Set.new( none_of )
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
### Copy constructor.
|
50
|
+
def initialize_copy( other )
|
51
|
+
super
|
52
|
+
@one_of = @one_of.dup
|
53
|
+
@all_of = @all_of.dup
|
54
|
+
@none_of = @none_of.dup
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
######
|
59
|
+
public
|
60
|
+
######
|
61
|
+
|
62
|
+
# The Set of component types which matching entities must have at least one of.
|
63
|
+
attr_reader :one_of
|
64
|
+
|
65
|
+
# The Set of component types which matching entities must have all of.
|
66
|
+
attr_reader :all_of
|
67
|
+
|
68
|
+
# The Set of component types which matching entities must not have any of.
|
69
|
+
attr_reader :none_of
|
70
|
+
|
71
|
+
|
72
|
+
### Return a dup of this Aspect that also requires that matching entities have at least
|
73
|
+
### one of the given +component_types+.
|
74
|
+
def with_one_of( *component_types )
|
75
|
+
return self.dup_with( one_of: component_types.flatten )
|
76
|
+
end
|
77
|
+
alias_method :and_one_of, :with_one_of
|
78
|
+
|
79
|
+
|
80
|
+
### Return a dup of this Aspect that also requires that matching entities have all
|
81
|
+
### of the given +component_types+.
|
82
|
+
def with_all_of( *component_types )
|
83
|
+
return self.dup_with( all_of: component_types.flatten )
|
84
|
+
end
|
85
|
+
alias_method :and_all_of, :with_all_of
|
86
|
+
|
87
|
+
|
88
|
+
### Return a dup of this Aspect that also requires that matching entities have none
|
89
|
+
### of the given +component_types+.
|
90
|
+
def with_none_of( *component_types )
|
91
|
+
return self.dup_with( none_of: component_types.flatten )
|
92
|
+
end
|
93
|
+
alias_method :and_none_of, :with_none_of
|
94
|
+
|
95
|
+
|
96
|
+
### Returns true if the receiver is an empty aspect, i.e., matches all entities.
|
97
|
+
def empty?
|
98
|
+
return [ self.one_of, self.all_of, self.none_of ].all?( &:empty? )
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
### Return a human-readable String representation of the Aspect.
|
103
|
+
def inspect
|
104
|
+
parts = []
|
105
|
+
parts << self.one_of_description
|
106
|
+
parts << self.all_of_description
|
107
|
+
parts << self.none_of_description
|
108
|
+
parts.compact!
|
109
|
+
|
110
|
+
str = "#<%p:%#0x matching entities" % [ self.class, self.object_id * 2 ]
|
111
|
+
if parts.empty?
|
112
|
+
str << " with any components"
|
113
|
+
else
|
114
|
+
str << parts.join( ', ' )
|
115
|
+
end
|
116
|
+
str << ">"
|
117
|
+
|
118
|
+
return str
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
#########
|
123
|
+
protected
|
124
|
+
#########
|
125
|
+
|
126
|
+
### Return a String describing the components matching entities must have at
|
127
|
+
### least one of.
|
128
|
+
def one_of_description
|
129
|
+
return nil if self.one_of.empty?
|
130
|
+
return " with at least one of: %s" % [ self.one_of.map(&:name).join(', ') ]
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
### Return a String describing the components matching entities must have all of.
|
135
|
+
def all_of_description
|
136
|
+
return nil if self.all_of.empty?
|
137
|
+
return " with all of: %s" % [ self.all_of.map(&:name).join(', ') ]
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
### Return a String describing the components matching entities must not have any of.
|
142
|
+
def none_of_description
|
143
|
+
return nil if self.none_of.empty?
|
144
|
+
return " with none of: %s" % [ self.none_of.map(&:name).join(', ') ]
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
### Return a copy of the receiver with the specified additional +required+ and
|
149
|
+
### +excluded+ components.
|
150
|
+
def dup_with( one_of: [], all_of: [], none_of: [] )
|
151
|
+
self.log.debug "Making dup of %p with one_of: %p, all_of: %p, none_of: %p" %
|
152
|
+
[ self, one_of, all_of, none_of ]
|
153
|
+
|
154
|
+
copy = self.dup
|
155
|
+
copy.one_of.merge( one_of )
|
156
|
+
copy.all_of.merge( all_of )
|
157
|
+
copy.none_of.merge( none_of )
|
158
|
+
|
159
|
+
self.log.debug " dup is: %p" % [ copy ]
|
160
|
+
return copy
|
161
|
+
end
|
162
|
+
|
163
|
+
end # class Chione::Aspect
|