game_machine 0.0.8

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.
Files changed (273) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +72 -0
  4. data/Rakefile +38 -0
  5. data/bin/game_machine +79 -0
  6. data/config/cluster.conf +65 -0
  7. data/config/config.example.yml +93 -0
  8. data/config/game_messages.proto +45 -0
  9. data/config/messages.proto +339 -0
  10. data/config/regions.example.yml +9 -0
  11. data/config/standalone.conf +36 -0
  12. data/db/do_not_delete +0 -0
  13. data/game_machine.gemspec +38 -0
  14. data/games/example/boot.rb +6 -0
  15. data/games/example/data/game_data.yml +13 -0
  16. data/games/example/lib/aggressive_npc.rb +176 -0
  17. data/games/example/lib/authentication_handler.rb +69 -0
  18. data/games/example/lib/chatbot.rb +61 -0
  19. data/games/example/lib/combat_controller.rb +145 -0
  20. data/games/example/lib/example_controller.rb +21 -0
  21. data/games/example/lib/game.rb +85 -0
  22. data/games/example/lib/models/attack.rb +9 -0
  23. data/games/example/lib/models/combat_update.rb +11 -0
  24. data/games/example/lib/models/player_command.rb +7 -0
  25. data/games/example/lib/models/user.rb +11 -0
  26. data/games/example/lib/models/vitals.rb +17 -0
  27. data/games/example/lib/npc.rb +111 -0
  28. data/games/example/lib/npc_group.rb +42 -0
  29. data/games/example/lib/npc_movement.rb +116 -0
  30. data/games/example/lib/player_manager.rb +58 -0
  31. data/games/example/lib/player_register.rb +80 -0
  32. data/games/example/lib/tracking_handler.rb +17 -0
  33. data/games/example/lib/zone_manager.rb +57 -0
  34. data/games/preload.rb +8 -0
  35. data/integration_tests/basic_spec.rb +68 -0
  36. data/integration_tests/bot_spec.rb +18 -0
  37. data/integration_tests/chat_spec.rb +45 -0
  38. data/integration_tests/distributed_spec.rb +34 -0
  39. data/integration_tests/entity_tracking_spec.rb +48 -0
  40. data/integration_tests/mono_spec.rb +16 -0
  41. data/integration_tests/objectdb_spec.rb +55 -0
  42. data/integration_tests/tcp_client_spec.rb +71 -0
  43. data/integration_tests/udp_client_spec.rb +61 -0
  44. data/integration_tests/udp_spec.rb +20 -0
  45. data/integration_tests/udt_client_spec.rb +23 -0
  46. data/integration_tests/udt_spec.rb +31 -0
  47. data/java/.gitignore +1 -0
  48. data/java/build.gradle +93 -0
  49. data/java/component.erb +396 -0
  50. data/java/gradle.properties +6 -0
  51. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  52. data/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  53. data/java/gradlew +164 -0
  54. data/java/gradlew.bat +90 -0
  55. data/java/local_lib/protostuff-compiler-1.0.7-jarjar.jar +0 -0
  56. data/java/settings.gradle +2 -0
  57. data/java/src/main/java/com/game_machine/core/ActorFactory.java +25 -0
  58. data/java/src/main/java/com/game_machine/core/ActorUtil.java +39 -0
  59. data/java/src/main/java/com/game_machine/core/CommandProxy.java +9 -0
  60. data/java/src/main/java/com/game_machine/core/EntitySerializer.java +66 -0
  61. data/java/src/main/java/com/game_machine/core/EventStreamHandler.java +43 -0
  62. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +25 -0
  63. data/java/src/main/java/com/game_machine/core/Grid.java +195 -0
  64. data/java/src/main/java/com/game_machine/core/GridValue.java +30 -0
  65. data/java/src/main/java/com/game_machine/core/IActorFactory.java +7 -0
  66. data/java/src/main/java/com/game_machine/core/NetMessage.java +28 -0
  67. data/java/src/main/java/com/game_machine/core/UdpServer.java +97 -0
  68. data/java/src/main/java/com/game_machine/core/UdpServerHandler.java +90 -0
  69. data/java/src/main/resources/game_machine.java.stg +738 -0
  70. data/java/src/main/resources/logback.xml +14 -0
  71. data/java/src/main/resources/logging.properties +3 -0
  72. data/java/src/main/resources/protostuff.properties +7 -0
  73. data/lib/game_machine.rb +85 -0
  74. data/lib/game_machine/actor.rb +7 -0
  75. data/lib/game_machine/actor/base.rb +184 -0
  76. data/lib/game_machine/actor/builder.rb +108 -0
  77. data/lib/game_machine/actor/development.rb +31 -0
  78. data/lib/game_machine/actor/factory.rb +35 -0
  79. data/lib/game_machine/actor/mono_actor.rb +89 -0
  80. data/lib/game_machine/actor/ref.rb +81 -0
  81. data/lib/game_machine/actor/reloadable.rb +98 -0
  82. data/lib/game_machine/actor/system.rb +32 -0
  83. data/lib/game_machine/akka.rb +98 -0
  84. data/lib/game_machine/app_config.rb +49 -0
  85. data/lib/game_machine/application.rb +181 -0
  86. data/lib/game_machine/auth_handlers/base.rb +21 -0
  87. data/lib/game_machine/auth_handlers/public.rb +34 -0
  88. data/lib/game_machine/bot/chat.rb +66 -0
  89. data/lib/game_machine/bot/client.rb +54 -0
  90. data/lib/game_machine/client_manager.rb +204 -0
  91. data/lib/game_machine/clients.rb +4 -0
  92. data/lib/game_machine/clients/client.rb +45 -0
  93. data/lib/game_machine/clients/tcp_client.rb +25 -0
  94. data/lib/game_machine/clients/test_client.rb +151 -0
  95. data/lib/game_machine/clients/udp_client.rb +25 -0
  96. data/lib/game_machine/clients/udt_client.rb +34 -0
  97. data/lib/game_machine/cluster_monitor.rb +115 -0
  98. data/lib/game_machine/commands.rb +23 -0
  99. data/lib/game_machine/commands/base.rb +21 -0
  100. data/lib/game_machine/commands/chat_commands.rb +88 -0
  101. data/lib/game_machine/commands/datastore_commands.rb +60 -0
  102. data/lib/game_machine/commands/grid_commands.rb +35 -0
  103. data/lib/game_machine/commands/message_helper.rb +25 -0
  104. data/lib/game_machine/commands/misc_commands.rb +29 -0
  105. data/lib/game_machine/commands/navigation_commands.rb +24 -0
  106. data/lib/game_machine/commands/player_commands.rb +28 -0
  107. data/lib/game_machine/commands/proxy.rb +16 -0
  108. data/lib/game_machine/console.rb +3 -0
  109. data/lib/game_machine/console/build.rb +74 -0
  110. data/lib/game_machine/console/install.rb +92 -0
  111. data/lib/game_machine/console/server.rb +120 -0
  112. data/lib/game_machine/data_store.rb +52 -0
  113. data/lib/game_machine/data_stores/couchbase.rb +18 -0
  114. data/lib/game_machine/data_stores/mapdb.rb +49 -0
  115. data/lib/game_machine/data_stores/memory.rb +35 -0
  116. data/lib/game_machine/data_stores/redis.rb +46 -0
  117. data/lib/game_machine/endpoints.rb +6 -0
  118. data/lib/game_machine/endpoints/mono_gateway.rb +87 -0
  119. data/lib/game_machine/endpoints/tcp.rb +51 -0
  120. data/lib/game_machine/endpoints/tcp_handler.rb +75 -0
  121. data/lib/game_machine/endpoints/udp.rb +88 -0
  122. data/lib/game_machine/endpoints/udp_incoming.rb +113 -0
  123. data/lib/game_machine/endpoints/udp_outgoing.rb +46 -0
  124. data/lib/game_machine/game_loader.rb +46 -0
  125. data/lib/game_machine/game_systems.rb +14 -0
  126. data/lib/game_machine/game_systems/agents/controller.rb +118 -0
  127. data/lib/game_machine/game_systems/chat.rb +256 -0
  128. data/lib/game_machine/game_systems/chat_manager.rb +108 -0
  129. data/lib/game_machine/game_systems/chat_topic.rb +36 -0
  130. data/lib/game_machine/game_systems/devnull.rb +13 -0
  131. data/lib/game_machine/game_systems/entity_loader.rb +12 -0
  132. data/lib/game_machine/game_systems/entity_tracking.rb +133 -0
  133. data/lib/game_machine/game_systems/local_echo.rb +16 -0
  134. data/lib/game_machine/game_systems/objectdb_proxy.rb +61 -0
  135. data/lib/game_machine/game_systems/private_chat.rb +20 -0
  136. data/lib/game_machine/game_systems/region_manager.rb +91 -0
  137. data/lib/game_machine/game_systems/region_service.rb +94 -0
  138. data/lib/game_machine/game_systems/region_settings.rb +13 -0
  139. data/lib/game_machine/game_systems/remote_echo.rb +14 -0
  140. data/lib/game_machine/game_systems/stress_test.rb +21 -0
  141. data/lib/game_machine/grid.rb +60 -0
  142. data/lib/game_machine/grid_replicator.rb +31 -0
  143. data/lib/game_machine/handlers/authentication.rb +55 -0
  144. data/lib/game_machine/handlers/game.rb +63 -0
  145. data/lib/game_machine/handlers/request.rb +80 -0
  146. data/lib/game_machine/hashring.rb +48 -0
  147. data/lib/game_machine/helpers/game_message.rb +159 -0
  148. data/lib/game_machine/helpers/state_machine.rb +29 -0
  149. data/lib/game_machine/java_lib.rb +51 -0
  150. data/lib/game_machine/logger.rb +39 -0
  151. data/lib/game_machine/message_buffer.rb +58 -0
  152. data/lib/game_machine/message_queue.rb +63 -0
  153. data/lib/game_machine/model.rb +125 -0
  154. data/lib/game_machine/models.rb +3 -0
  155. data/lib/game_machine/models/player_status_update.rb +8 -0
  156. data/lib/game_machine/models/region.rb +9 -0
  157. data/lib/game_machine/mono_server.rb +20 -0
  158. data/lib/game_machine/navigation.rb +4 -0
  159. data/lib/game_machine/navigation/detour.rb +20 -0
  160. data/lib/game_machine/navigation/detour_navmesh.rb +53 -0
  161. data/lib/game_machine/navigation/detour_path.rb +53 -0
  162. data/lib/game_machine/navigation/path.rb +31 -0
  163. data/lib/game_machine/object_db.rb +67 -0
  164. data/lib/game_machine/protobuf.rb +6 -0
  165. data/lib/game_machine/protobuf/game_messages.rb +24 -0
  166. data/lib/game_machine/protobuf/generate.rb +113 -0
  167. data/lib/game_machine/protobuf_extensions/entity_helper.rb +11 -0
  168. data/lib/game_machine/reloadable_monitor.rb +26 -0
  169. data/lib/game_machine/restart_watcher.rb +17 -0
  170. data/lib/game_machine/ruby_extensions/nilclass.rb +10 -0
  171. data/lib/game_machine/ruby_extensions/string.rb +17 -0
  172. data/lib/game_machine/scheduler.rb +23 -0
  173. data/lib/game_machine/securerandom.rb +6 -0
  174. data/lib/game_machine/settings.rb +11 -0
  175. data/lib/game_machine/system_monitor.rb +19 -0
  176. data/lib/game_machine/system_stats.rb +24 -0
  177. data/lib/game_machine/uniqueid.rb +23 -0
  178. data/lib/game_machine/vector.rb +95 -0
  179. data/lib/game_machine/version.rb +3 -0
  180. data/lib/game_machine/write_behind_cache.rb +164 -0
  181. data/mono/bin/csharp/common.xslt +109 -0
  182. data/mono/bin/csharp/csharp.xslt +628 -0
  183. data/mono/bin/csharp/descriptor.proto +533 -0
  184. data/mono/bin/csharp/protobuf-net.dll +0 -0
  185. data/mono/bin/csharp/protobuf-net.pdb +0 -0
  186. data/mono/bin/csharp/protobuf-net.xml +2879 -0
  187. data/mono/bin/csharp/protogen.exe.config +3 -0
  188. data/mono/bin/csharp/protogen.pdb +0 -0
  189. data/mono/bin/csharp/protogen_csharp.exe +0 -0
  190. data/mono/bin/csharp/vb.xslt +745 -0
  191. data/mono/bin/csharp/xml.xslt +26 -0
  192. data/mono/server/Makefile +6 -0
  193. data/mono/server/NLog.config +12 -0
  194. data/mono/server/NLog.dll +0 -0
  195. data/mono/server/actor.cs +37 -0
  196. data/mono/server/build.bat +3 -0
  197. data/mono/server/cscompmgd.dll +0 -0
  198. data/mono/server/iactor.cs +11 -0
  199. data/mono/server/message_router.cs +67 -0
  200. data/mono/server/message_util.cs +29 -0
  201. data/mono/server/messages.cs +1888 -0
  202. data/mono/server/protobuf-net.dll +0 -0
  203. data/mono/server/proxy_client.cs +73 -0
  204. data/mono/server/proxy_server.cs +30 -0
  205. data/mono/server/test_actor.cs +33 -0
  206. data/pathfinding/bin/premake4 +0 -0
  207. data/pathfinding/include/mesh_loader.h +28 -0
  208. data/pathfinding/include/pathfind.h +167 -0
  209. data/pathfinding/main.cpp +39 -0
  210. data/pathfinding/mesh_loader.cpp +108 -0
  211. data/pathfinding/pathfind.cpp +174 -0
  212. data/pathfinding/pathfinder.cs +66 -0
  213. data/pathfinding/premake4.lua +109 -0
  214. data/script/server.sh +109 -0
  215. data/script/watch.sh +11 -0
  216. data/spec/actor/actor_spec.rb +73 -0
  217. data/spec/actor/builder_spec.rb +56 -0
  218. data/spec/actor/ref_spec.rb +83 -0
  219. data/spec/application_spec.rb +7 -0
  220. data/spec/client_manager_spec.rb +171 -0
  221. data/spec/commands/chat_commands_spec.rb +38 -0
  222. data/spec/commands/datastore_commands_spec.rb +91 -0
  223. data/spec/commands/grid_commands_spec.rb +37 -0
  224. data/spec/commands/navigation_commands_spec.rb +51 -0
  225. data/spec/commands/player_commands_spec.rb +48 -0
  226. data/spec/commands_spec.rb +38 -0
  227. data/spec/data_stores/mapdb_spec.rb +46 -0
  228. data/spec/data_stores/redis_spec.rb +44 -0
  229. data/spec/game_systems/agents/controller_spec.rb +84 -0
  230. data/spec/game_systems/agents/test_agent.rb +10 -0
  231. data/spec/game_systems/agents/test_agent_config.rb +29 -0
  232. data/spec/game_systems/chat_manager_spec.rb +66 -0
  233. data/spec/game_systems/chat_spec.rb +187 -0
  234. data/spec/game_systems/entity_tracking_spec.rb +64 -0
  235. data/spec/game_systems/region_manager_spec.rb +138 -0
  236. data/spec/grid_spec.rb +37 -0
  237. data/spec/handlers/authentication_spec.rb +36 -0
  238. data/spec/handlers/game_spec.rb +49 -0
  239. data/spec/handlers/request_spec.rb +65 -0
  240. data/spec/hashring_spec.rb +59 -0
  241. data/spec/integration_helper.rb +120 -0
  242. data/spec/java_grid_spec.rb +89 -0
  243. data/spec/message_buffer_spec.rb +67 -0
  244. data/spec/message_expectations.rb +47 -0
  245. data/spec/message_queue_spec.rb +23 -0
  246. data/spec/misc_spec.rb +71 -0
  247. data/spec/model_spec.rb +103 -0
  248. data/spec/mono_spec.rb +36 -0
  249. data/spec/mono_test.rb +18 -0
  250. data/spec/navigation/detour_navmesh_spec.rb +34 -0
  251. data/spec/navigation/detour_path_spec.rb +25 -0
  252. data/spec/spec_helper.rb +40 -0
  253. data/spec/udp_server_spec.rb +10 -0
  254. data/spec/write_behind_cache_spec.rb +109 -0
  255. data/web/app.rb +131 -0
  256. data/web/config/trinidad.yml +4 -0
  257. data/web/controllers/auth_controller.rb +19 -0
  258. data/web/controllers/base_controller.rb +16 -0
  259. data/web/controllers/index_controller.rb +7 -0
  260. data/web/controllers/log_controller.rb +47 -0
  261. data/web/controllers/messages_controller.rb +59 -0
  262. data/web/controllers/player_register_controller.rb +15 -0
  263. data/web/log/development.log +1339 -0
  264. data/web/tmp/restart.txt +0 -0
  265. data/web/views/game_messages.haml +45 -0
  266. data/web/views/index.haml +6 -0
  267. data/web/views/layout.haml +41 -0
  268. data/web/views/logs.haml +32 -0
  269. data/web/views/player_register.haml +22 -0
  270. data/web/views/player_registered.haml +2 -0
  271. data/web/views/register_layout.haml +22 -0
  272. data/web/views/restart.haml +35 -0
  273. metadata +576 -0
@@ -0,0 +1,10 @@
1
+ class TestAgent < GameMachine::Actor::Base
2
+
3
+ def post_init(*args)
4
+ end
5
+
6
+ def on_receive(message)
7
+
8
+ end
9
+ end
10
+
@@ -0,0 +1,29 @@
1
+ class TestAgentConfig
2
+
3
+ def reload?
4
+ true
5
+ end
6
+
7
+ def agent_names
8
+ data.keys
9
+ end
10
+
11
+ def klass_for_name(name)
12
+ data.fetch(name,nil)
13
+ end
14
+
15
+ def load!
16
+ end
17
+
18
+ def data
19
+ {
20
+ :agent1 => 'TestAgent',
21
+ :agent2 => 'TestAgent',
22
+ :agent3 => 'TestAgent',
23
+ :agent4 => 'TestAgent',
24
+ :agent5 => 'TestAgent'
25
+ }
26
+ end
27
+
28
+
29
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module GameSystems
5
+
6
+ describe ChatManager do
7
+
8
+ let(:player_id) {'player1'}
9
+ let(:topic) {'test_topic'}
10
+ let(:chat_text) {'test text'}
11
+ let(:client_id) {'player1_id'}
12
+ let(:gateway) {'blah'}
13
+
14
+ let(:game_message) do
15
+ Helpers::GameMessage.new(player_id)
16
+ end
17
+
18
+ let(:join_request) do
19
+ game_message.join_chat(topic)
20
+ game_message.to_entity
21
+ end
22
+
23
+ let(:chat_message) do
24
+ game_message.chat_message('group',chat_text,topic)
25
+ game_message.to_entity
26
+ end
27
+
28
+ let(:actor_builder) {mock('Actor::Builder', :with_parent => actor_builder, :start => true)}
29
+
30
+ let(:chat_invite) do
31
+ chat = Commands::ChatCommands.new
32
+ chat.invite_message('inviter','invitee','test')
33
+ end
34
+
35
+ subject do
36
+ ref = Actor::Builder.new(GameSystems::ChatManager).with_name('chat_manager').test_ref
37
+ ref.underlying_actor
38
+ end
39
+
40
+ describe "chat invites" do
41
+ it "chat manager calls send_invite when it receives a chat invite" do
42
+ expect(subject).to receive(:send_invite).with(chat_invite.chat_invite)
43
+ subject.on_receive(chat_invite)
44
+ end
45
+
46
+ end
47
+
48
+ describe "multiple players" do
49
+
50
+ end
51
+
52
+ describe "managing chat messages" do
53
+
54
+ it "creates chat actor for player if it does not exist" do
55
+ expect(subject).to receive(:forward_chat_request)
56
+ subject.on_receive(chat_message)
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end
65
+
66
+
@@ -0,0 +1,187 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module GameSystems
5
+ describe Chat do
6
+
7
+ let(:player_id) {'player1'}
8
+ let(:topic) {'test_topic'}
9
+ let(:chat_text) {'test text'}
10
+ let(:client_id) {'player1_id'}
11
+ let(:gateway) {'blah'}
12
+
13
+ let(:commands) do
14
+ Commands::Base.new
15
+ end
16
+
17
+ let(:game_message) do
18
+ Helpers::GameMessage.new(player_id)
19
+ end
20
+
21
+ let(:leave_request) do
22
+ game_message.leave_chat(topic)
23
+ game_message.to_entity
24
+ end
25
+
26
+ let(:join_request_with_flags) do
27
+ flags = 'subscribers|blah'
28
+ game_message.join_chat(topic,flags)
29
+ game_message.to_entity
30
+ end
31
+
32
+ let(:join_request) do
33
+ game_message.join_chat(topic)
34
+ game_message.to_entity
35
+ end
36
+
37
+ let(:public_chat_request) do
38
+ game_message.chat_message('group',chat_text,topic)
39
+ game_message.to_entity
40
+ end
41
+
42
+ let(:private_chat_request) do
43
+ game_message.chat_message('private',chat_text,topic)
44
+ game_message.to_entity
45
+ end
46
+
47
+ let(:all_requests) do
48
+ game_message.join_chat(topic)
49
+ game_message.chat_message('group',chat_text,topic)
50
+ game_message.leave_chat(topic)
51
+ game_message.to_entity
52
+ end
53
+
54
+ let(:actor_ref) {double('Actor::Ref', :tell => true)}
55
+
56
+ subject do
57
+ ref = Actor::Builder.new(GameSystems::Chat,player_id).with_name('chat_test').test_ref
58
+ actor = ref.underlying_actor
59
+ actor
60
+ end
61
+
62
+ before(:each) do
63
+ Chat.any_instance.stub(:load_state)
64
+ Actor::Builder.new(GameSystems::Chat,player_id).start
65
+ MessageQueue.stub(:find).and_return(actor_ref)
66
+ commands.datastore.delete("chat_topic_#{topic}")
67
+ end
68
+
69
+ describe "private channels" do
70
+
71
+ it "joining private channel without invite should fail" do
72
+ channel_name = "priv/otherplayer/test"
73
+ join_message = commands.chat.join_message(channel_name,player_id)
74
+ expect(subject).to_not receive(:join_channel)
75
+ subject.on_receive(join_message)
76
+ end
77
+
78
+ it "joining my own channel should work" do
79
+ channel_name = "priv/#{player_id}/test"
80
+ join_message = commands.chat.join_message(channel_name,player_id)
81
+ expect(subject).to receive(:join_channel)
82
+ subject.on_receive(join_message)
83
+ end
84
+
85
+ it "joining private channel with invite should work" do
86
+ channel_name = "priv/otherplayer/test"
87
+ join_message = commands.chat.join_message(channel_name,player_id,'myinvite')
88
+ expect(subject).to receive(:join_channel)
89
+ expect(subject).to receive(:invite_exists?).with(channel_name,'myinvite').and_return(true)
90
+ subject.on_receive(join_message)
91
+
92
+ end
93
+ end
94
+
95
+ describe "#subscribers_for_topic" do
96
+ it "subscriber id count is zero when no subscribers" do
97
+ subscribers = Chat.subscribers_for_topic(topic)
98
+ expect(subscribers.get_subscriber_id_count).to eql(0)
99
+ end
100
+ end
101
+
102
+ describe "subscribers list updates" do
103
+ it "joining a channel adds player to subscriber list" do
104
+ subject.on_receive(join_request)
105
+ subscribers = Chat.subscribers_for_topic(topic)
106
+ expect(subscribers.get_subscriber_id_count).to eql(1)
107
+ expect(subscribers.get_subscriber_id_list.first).to eql(player_id)
108
+ subject.on_receive(leave_request)
109
+ end
110
+
111
+ it "leaving a channel removes player as subscriber" do
112
+ subject.on_receive(join_request)
113
+ subject.on_receive(leave_request)
114
+ subscribers = Chat.subscribers_for_topic(topic)
115
+ expect(subscribers.get_subscriber_id_count).to eql(0)
116
+ end
117
+ end
118
+
119
+ describe "channel flags" do
120
+ it "joining a channel with flags should persist the flag" do
121
+ subject.on_receive(join_request_with_flags)
122
+ topic_flags = subject.get_flags.fetch(topic,[])
123
+ topic_flags.include?('subscribers').should be_true
124
+ end
125
+
126
+ it "chat status should add subscribers to channel if flag is set" do
127
+ subject.on_receive(join_request_with_flags)
128
+ expect_any_instance_of(MessageLib::ChatChannel).to receive(:set_subscribers)
129
+ entity = MessageLib::Entity.new.set_chat_status(MessageLib::ChatStatus.new)
130
+ subject.on_receive(entity)
131
+ end
132
+ end
133
+
134
+ describe "subscriptions" do
135
+ it "joining a channel should persist subscriptions" do
136
+ subject.on_receive(join_request_with_flags)
137
+ subscriptions = subject.get_subscriptions
138
+ subscriptions.include?(topic).should be_true
139
+ end
140
+ end
141
+
142
+ describe "joining and leaving channels" do
143
+ it "processes the entity as a leave channel request" do
144
+ subject.should_receive(:leave_channels)
145
+ subject.on_receive(leave_request)
146
+ end
147
+
148
+ it "sends an unsubscribe message to message queue" do
149
+ subject.on_receive(join_request)
150
+ actor_ref.should_receive(:tell).with(kind_of(MessageLib::Unsubscribe),anything())
151
+ subject.on_receive(leave_request)
152
+ end
153
+
154
+ it "processes the entity as a join channel request" do
155
+ subject.should_receive(:join_channels)
156
+ subject.on_receive(join_request)
157
+ end
158
+
159
+ it "sends a subscribe message to message queue" do
160
+ actor_ref.should_receive(:tell).exactly(1).times
161
+ subject.on_receive(join_request)
162
+ end
163
+
164
+ it "processes multiple requests in a single message" do
165
+ subject.should_receive(:join_channels).once
166
+ subject.should_receive(:leave_channels).once
167
+ subject.should_receive(:send_message).once
168
+ subject.on_receive(all_requests)
169
+ end
170
+
171
+ it "send a private chat message" do
172
+ subject.should_receive(:send_private_message).once
173
+ subject.on_receive(private_chat_request)
174
+ end
175
+
176
+ it "send a group chat message" do
177
+ subject.should_receive(:send_group_message).once
178
+ subject.on_receive(public_chat_request)
179
+ end
180
+
181
+ end
182
+
183
+ end
184
+
185
+ end
186
+ end
187
+
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module GameSystems
5
+ describe EntityTracking do
6
+
7
+
8
+ subject do
9
+ ref = Actor::Builder.new(EntityTracking).with_name('entity_tracking_test').test_ref
10
+ ref.underlying_actor.post_init
11
+ ref.underlying_actor
12
+ end
13
+
14
+ let(:track_entity) do
15
+ MessageLib::TrackEntity.new.set_value(true)
16
+ end
17
+
18
+ let(:vector3) do
19
+ MessageLib::Vector3.new.set_x(0).set_y(0).set_z(0)
20
+ end
21
+
22
+ let(:get_neighbors) do
23
+ MessageLib::GetNeighbors.new.set_neighbor_type('player').set_vector3(vector3)
24
+ end
25
+
26
+ let(:player) do
27
+ MessageLib::Player.new.set_id('1')
28
+ end
29
+
30
+ let(:entity) do
31
+ MessageLib::Entity.new.set_id('0').
32
+ set_player(player).
33
+ set_track_entity(track_entity).
34
+ set_entity_type('player').
35
+ set_vector3(vector3)
36
+ end
37
+
38
+ let(:get_neighbors_entity) do
39
+ MessageLib::Entity.new.set_id('0').set_get_neighbors(get_neighbors)
40
+ end
41
+
42
+ let(:actor_ref) {double('Actor::Ref', :tell => true)}
43
+
44
+ describe 'tracking location' do
45
+
46
+ it "should call grid.set with player" do
47
+ expect(subject.grid).to receive(:set).with('0',0.0,0.0,0.0,'player')
48
+ subject.on_receive(entity)
49
+ end
50
+
51
+ end
52
+
53
+ describe 'get neighbors' do
54
+ it "sends neighbors to player" do
55
+ expect(subject).to receive(:send_neighbors_to_player)
56
+ get_neighbors_entity.set_player(player)
57
+ subject.on_receive(entity)
58
+ subject.on_receive(get_neighbors_entity)
59
+ end
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module GameSystems
5
+
6
+ class Zone2Manager < Actor::Base
7
+ def on_receive(message);end
8
+ end
9
+ class Zone1Manager < Actor::Base
10
+ def on_receive(message);end
11
+ end
12
+
13
+ describe RegionManager do
14
+
15
+ let(:zone1_manager) {'GameMachine::GameSystems::Zone1Manager'}
16
+ let(:zone2_manager) {'GameMachine::GameSystems::Zone2Manager'}
17
+
18
+ let(:region1) {double('region1', :name => 'zone1', :server => nil,
19
+ :manager => zone1_manager, :save => true)}
20
+ let(:region2) {double('region2', :name => 'zone2', :server => nil,
21
+ :manager => zone2_manager, :save => true)}
22
+
23
+ let(:regions) {{'zone1' => region1, 'zone2' => region2}}
24
+
25
+ let(:cluster_member) {double('cluster_member')}
26
+
27
+ let(:server1_address) {'akka.tcp://cluster@localhost:2551'}
28
+ let(:server2_address) {'akka.tcp://cluster@localhost:2552'}
29
+
30
+ let(:cluster_members) do
31
+ {server1_address => cluster_member, server2_address => cluster_member}
32
+ end
33
+
34
+ let(:cluster_with_down_members) do
35
+ {server1_address => cluster_member}
36
+ end
37
+
38
+ let(:actor_ref) {double('Actor::Ref', :tell => true)}
39
+
40
+ subject do
41
+ ref = Actor::Builder.new(RegionManager).with_name('region_manager_test').test_ref
42
+ ref.underlying_actor
43
+ end
44
+
45
+ describe "#assign_servers" do
46
+ it "should assign servers to regions that have none" do
47
+ subject.stub(:regions).and_return(regions)
48
+ ClusterMonitor.stub(:cluster_members).and_return(cluster_members)
49
+ expect(region1).to receive(:server=)
50
+ expect(region2).to receive(:server=)
51
+ expect(region1).to receive(:save)
52
+ expect(region2).to receive(:save)
53
+ subject.assign_servers
54
+ expect(subject.servers[server1_address]).to eq region1.name
55
+ expect(subject.servers[server2_address]).to eq region2.name
56
+ end
57
+
58
+ end
59
+
60
+ describe "#notify_managers" do
61
+ it "should send message to manager of each region" do
62
+ subject.stub(:regions).and_return(regions)
63
+ region1.stub(:server).and_return(server1_address)
64
+ region2.stub(:server).and_return(server2_address)
65
+ expect(GameSystems::Zone1Manager).to receive(:find_by_address).
66
+ with(server1_address). and_return(actor_ref)
67
+ expect(GameSystems::Zone2Manager).to receive(:find_by_address).
68
+ with(server2_address). and_return(actor_ref)
69
+ subject.notify_managers
70
+ end
71
+ end
72
+
73
+ describe "#load_from_config" do
74
+
75
+ it "should create new regions that do not exist" do
76
+ expect(Models::Region).to receive(:find).
77
+ with('zone1',5000).and_return(nil)
78
+ expect(Models::Region).to receive(:find).
79
+ with('zone2',5000).and_return(nil)
80
+
81
+ expect(Models::Region).to receive(:new).
82
+ with(:id => 'zone1', :name => 'zone1', :manager => zone1_manager).and_return(region1)
83
+ expect(Models::Region).to receive(:new).
84
+ with(:id => 'zone2', :name => 'zone2', :manager => zone2_manager).and_return(region2)
85
+
86
+ expect(region1).to receive(:save)
87
+ expect(region2).to receive(:save)
88
+ expect(subject.regions['zone1']).to eq region1
89
+ expect(subject.regions['zone2']).to eq region2
90
+ end
91
+
92
+ it "should load regions that exist" do
93
+ expect(Models::Region).to receive(:find).with('zone1',5000).and_return(region1)
94
+ expect(Models::Region).to receive(:find).with('zone2',5000).and_return(region2)
95
+ expect(subject.regions['zone1']).to eq region1
96
+ expect(subject.regions['zone2']).to eq region2
97
+ end
98
+ end
99
+
100
+ describe "#unassign_down_servers" do
101
+
102
+ context "nodes have not changed" do
103
+ it "should not unassign servers from regions" do
104
+ ClusterMonitor.stub(:cluster_members).and_return(cluster_members)
105
+ subject.unassign_down_servers
106
+ expect(region1).to_not receive(:save)
107
+ expect(region2).to_not receive(:save)
108
+ end
109
+ end
110
+
111
+ context "node has been downed" do
112
+
113
+ before(:each) do
114
+ subject.regions['zone1'].server = server2_address
115
+ subject.servers[server2_address] = 'zone1'
116
+ ClusterMonitor.stub(:cluster_members).and_return(cluster_with_down_members)
117
+ end
118
+
119
+ it "should set region server to nil" do
120
+ subject.unassign_down_servers
121
+ expect(subject.regions['zone1'].server).to be_nil
122
+ end
123
+
124
+ it "should remove servers entry" do
125
+ subject.unassign_down_servers
126
+ expect(subject.servers.has_key?(server2_address)).to be_false
127
+ end
128
+
129
+ it "should save region" do
130
+ expect(subject.regions['zone1']).to receive(:save)
131
+ subject.unassign_down_servers
132
+ end
133
+ end
134
+ end
135
+
136
+ end
137
+ end
138
+ end