drsi 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/drsi/dci/context.rb +30 -7
- data/lib/drsi/rolable.rb +12 -6
- data/lib/drsi/version.rb +1 -1
- data/spec/multiplayers_spec.rb +14 -16
- data/spec/roleplayers_spec.rb +8 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f34d6bd83bc21f9c63c83c31c552e1f48dc42acf
|
4
|
+
data.tar.gz: 28785a5247013c7ddf5d0da3bae4d01f60308c42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b422c3925e5055ddf1053684ec51220d7580a0c67cb0c0f2788d42864f5937a44d80f7f74421330b19a4bc304ca1b0f25a96633692962c786b6a237c72d08de
|
7
|
+
data.tar.gz: a099dbfa5b9de7ded07c1aed28487ef3242d9eaf9374229ad11a48b53140833ef512cbb5a477f643db089670c2c78ec17c6335e2b58c36b5b4b727933213f50e
|
data/lib/drsi/dci/context.rb
CHANGED
@@ -97,8 +97,12 @@ module DCI
|
|
97
97
|
class_eval do
|
98
98
|
method_object = instance_method(methodname)
|
99
99
|
define_method(methodname) do |*args, &block|
|
100
|
-
|
101
|
-
|
100
|
+
# puts "Context: #{self} - in method #{methodname} - #{do_play_unplay_p} assigning_roles"
|
101
|
+
extending_ticker = players_play_role!
|
102
|
+
method_object.bind(self).call(*args, &block).tap do
|
103
|
+
# puts "Context: #{self} - in method #{methodname} - #{do_play_unplay_p} un-assigning_roles"
|
104
|
+
players_unplay_role!(extending_ticker)
|
105
|
+
end
|
102
106
|
end
|
103
107
|
end
|
104
108
|
end
|
@@ -141,11 +145,19 @@ module DCI
|
|
141
145
|
(roles.keys - players.keys)
|
142
146
|
end
|
143
147
|
|
148
|
+
def player_already_playing_role_in_this_context?(player, rolekey)
|
149
|
+
context = player.send(:context)
|
150
|
+
return false unless player.send(:rolekey) == rolekey
|
151
|
+
context == self or context.class == self.class
|
152
|
+
end
|
153
|
+
|
144
154
|
# Associates every role to the intended player.
|
145
155
|
def players_play_role!
|
156
|
+
extending_ticker = {}
|
146
157
|
roles.keys.each do |rolekey|
|
147
|
-
assign_role_to_player!(rolekey, @_players[rolekey])
|
158
|
+
assign_role_to_player!(rolekey, @_players[rolekey], extending_ticker: extending_ticker)
|
148
159
|
end
|
160
|
+
extending_ticker
|
149
161
|
end
|
150
162
|
|
151
163
|
# Associates a role to an intended player:
|
@@ -153,16 +165,27 @@ module DCI
|
|
153
165
|
# - The player get access to the context it is playing.
|
154
166
|
# - The player get access to the rest of players in its context through instance methods named after their role keys.
|
155
167
|
# - This context instance get access to this new role player through an instance method named after the role key.
|
156
|
-
def assign_role_to_player!(rolekey, player)
|
168
|
+
def assign_role_to_player!(rolekey, player, extending_ticker:{})
|
157
169
|
role_mod = roles[rolekey]
|
158
|
-
|
170
|
+
# puts " Context: #{self} - assigning role #{rolekey} to #{player}"
|
171
|
+
::DCI::Multiplayer(player).each do |roleplayer|
|
172
|
+
if player_already_playing_role_in_this_context?(roleplayer, rolekey)
|
173
|
+
extending_ticker.merge!("#{roleplayer.object_id}_#{rolekey}" => false)
|
174
|
+
else
|
175
|
+
extending_ticker.merge!("#{roleplayer.object_id}_#{rolekey}" => true)
|
176
|
+
roleplayer.__play_role!(rolekey, role_mod, self)
|
177
|
+
end
|
178
|
+
end
|
159
179
|
instance_variable_set(:"@#{rolekey}", player)
|
160
180
|
end
|
161
181
|
|
162
182
|
# Disassociates every role from the playing object.
|
163
|
-
def players_unplay_role!
|
183
|
+
def players_unplay_role!(extending_ticker)
|
164
184
|
roles.keys.each do |rolekey|
|
165
|
-
::DCI::Multiplayer(@_players[rolekey]).each
|
185
|
+
::DCI::Multiplayer(@_players[rolekey]).each do |roleplayer|
|
186
|
+
# puts " Context: #{self} - un-assigning role #{rolekey} to #{roleplayer}"
|
187
|
+
roleplayer.__unplay_last_role! if extending_ticker["#{roleplayer.object_id}_#{rolekey}"]
|
188
|
+
end
|
166
189
|
# 'instance_variable_set(:"@#{rolekey}", nil)
|
167
190
|
end
|
168
191
|
end
|
data/lib/drsi/rolable.rb
CHANGED
@@ -12,11 +12,12 @@ module Rolable
|
|
12
12
|
# - Get or extend a new empty role module,
|
13
13
|
# - Copy role_mod instance_methods into it,
|
14
14
|
# - Inject context and settings methods.
|
15
|
-
def __play_role!(role_mod, a_context)
|
15
|
+
def __play_role!(a_rolekey, role_mod, a_context)
|
16
16
|
new_role = __next_empty_role
|
17
17
|
new_role.__copy_instance_methods_from(role_mod)
|
18
|
-
new_role.class_exec(a_context) do |the_context|
|
18
|
+
new_role.class_exec(a_context, a_rolekey) do |the_context, the_rolekey|
|
19
19
|
private
|
20
|
+
define_method(:rolekey) {the_rolekey}
|
20
21
|
define_method(:context) {the_context}
|
21
22
|
define_method(:settings) {|*keys| context.send(:settings, *keys)}
|
22
23
|
end
|
@@ -61,8 +62,13 @@ module Rolable
|
|
61
62
|
__roles << role
|
62
63
|
end
|
63
64
|
|
64
|
-
# The context
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
# The context within this object is playing its last role. This method must be overidden in every __role definition module.
|
66
|
+
def context
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
# The rolekey this object is playing its last role. This method must be overidden in every __role definition module.
|
71
|
+
def rolekey
|
72
|
+
nil
|
73
|
+
end
|
68
74
|
end
|
data/lib/drsi/version.rb
CHANGED
data/spec/multiplayers_spec.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'ostruct'
|
3
2
|
|
4
3
|
describe 'Role MultiPlayers' do
|
5
4
|
|
6
5
|
context "A role can be played by many objects in the same context at the same time" do
|
7
6
|
before(:all) do
|
8
|
-
class
|
7
|
+
class TestingMultiplayersContext < DCI::Context
|
9
8
|
role :role1 do
|
10
9
|
def role1method1; :role1method1_executed end
|
11
10
|
def role1self; self end
|
@@ -71,14 +70,15 @@ describe 'Role MultiPlayers' do
|
|
71
70
|
|
72
71
|
end
|
73
72
|
|
74
|
-
|
73
|
+
Player = Struct.new(:name)
|
74
|
+
@player1, @player2, @player22 = Player.new('player1'), Player.new('player2'), Player.new('player22')
|
75
75
|
@multiplayer = DCI::Multiplayer[@player2, @player22]
|
76
76
|
#puts @multiplayer.instance_variable_get(:@players)
|
77
|
-
@testing_roleplayers_context =
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
@testing_roleplayers_context = TestingMultiplayersContext.new(:role1 => @player1,
|
78
|
+
:role2 => @multiplayer,
|
79
|
+
:setting1 => :one,
|
80
|
+
:setting2 => :two,
|
81
|
+
:setting3 => :three)
|
82
82
|
end
|
83
83
|
|
84
84
|
it("For it to work, the developer has to give a rolekey the value of a DCI::Multiplayer instance when instantiating the context...") do
|
@@ -112,14 +112,12 @@ describe 'Role MultiPlayers' do
|
|
112
112
|
@player22.private_methods.map(&:to_s).should_not include(:private_role2method2)
|
113
113
|
@player2.name.should eq('player2')
|
114
114
|
@player22.name.should eq('player22')
|
115
|
-
@player2.
|
116
|
-
@player22.
|
117
|
-
@player2.
|
118
|
-
@player22.
|
119
|
-
@player2.
|
120
|
-
@player22.
|
121
|
-
(@player2.private_methods.map(&:to_s) & ['role1', 'context', 'settings']).should be_empty
|
122
|
-
(@player22.private_methods.map(&:to_s) & ['role1', 'context', 'settings']).should be_empty
|
115
|
+
expect{@player2.send(:role1)}.to raise_error
|
116
|
+
expect{@player22.send(:role1)}.to raise_error
|
117
|
+
@player2.send(:context).should be_nil
|
118
|
+
@player22.send(:context).should be_nil
|
119
|
+
expect{@player2.send(:settings)}.to raise_error
|
120
|
+
expect{@player22.send(:settings)}.to raise_error
|
123
121
|
end
|
124
122
|
|
125
123
|
end
|
data/spec/roleplayers_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'ostruct'
|
3
2
|
|
4
3
|
describe 'RolePlayers' do
|
5
4
|
|
@@ -39,7 +38,7 @@ describe 'RolePlayers' do
|
|
39
38
|
role1.name
|
40
39
|
end
|
41
40
|
|
42
|
-
def
|
41
|
+
def check_role1_private_context_access
|
43
42
|
[!role1.respond_to?(:context), role1.private_methods.map(&:to_s).include?('context'), role1.send(:context) == self].uniq == [true]
|
44
43
|
end
|
45
44
|
|
@@ -49,7 +48,8 @@ describe 'RolePlayers' do
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
|
51
|
+
Player = Struct.new(:name)
|
52
|
+
@player1, @player2 = Player.new('player1'), Player.new('player2')
|
53
53
|
@testing_roleplayers_context = TestingRoleplayersContext.new(:role1 => @player1,
|
54
54
|
:role2 => @player2,
|
55
55
|
:setting1 => :one,
|
@@ -74,8 +74,8 @@ describe 'RolePlayers' do
|
|
74
74
|
it("Inside the context, roleplayers have private access to other roleplayers through methods named after their keys.") do
|
75
75
|
@testing_roleplayers_context.check_role_interaccess.should be_true
|
76
76
|
end
|
77
|
-
it("...
|
78
|
-
@testing_roleplayers_context.
|
77
|
+
it("...as well as private access to the context.") do
|
78
|
+
@testing_roleplayers_context.check_role1_private_context_access.should be_true
|
79
79
|
end
|
80
80
|
|
81
81
|
it("They also have private access to extra args received in the instantiation of its context...") do
|
@@ -95,14 +95,11 @@ describe 'RolePlayers' do
|
|
95
95
|
@player1.should_not respond_to(:role1method1)
|
96
96
|
@player2.private_methods.map(&:to_s).should_not include(:private_role2method2)
|
97
97
|
@player1.name.should eq('player1')
|
98
|
-
@player2.
|
99
|
-
@player2.
|
100
|
-
@player2.
|
101
|
-
(@player2.private_methods.map(&:to_s) & ['role1', 'context', 'settings']).should be_empty
|
98
|
+
@player2.send(:context).should be_nil
|
99
|
+
expect {@player2.send(:settings)}.to raise_error
|
100
|
+
expect {@player2.send(:role1)}.to raise_error
|
102
101
|
end
|
103
102
|
|
104
|
-
|
105
|
-
|
106
103
|
end
|
107
104
|
|
108
105
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drsi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorenzo Tello
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|