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
data/script/watch.sh ADDED
@@ -0,0 +1,11 @@
1
+ #!/bin/bash
2
+ while true
3
+ do
4
+ ATIME=`stat -c %Z /tmp/restart.txt`
5
+ if [[ "$ATIME" != "$LTIME" ]]
6
+ then
7
+ script/server.sh restart
8
+ LTIME=$ATIME
9
+ fi
10
+ sleep 1
11
+ done
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module Actor
5
+
6
+ describe Base do
7
+
8
+ let(:aspect) {['one','two']}
9
+
10
+ subject do
11
+ ref = Actor::Builder.new(Actor::Base).test_ref
12
+ ref.underlying_actor
13
+ end
14
+
15
+ describe "#onReceive" do
16
+ it "forwards the message to on_receive" do
17
+ expect(subject).to receive(:on_receive).with('test')
18
+ subject.onReceive('test')
19
+ end
20
+ end
21
+
22
+ describe "#aspect" do
23
+ it "adds the aspects" do
24
+ Actor::Base.aspect(aspect)
25
+ expect(Actor::Base.aspects.first).to eq(aspect)
26
+ end
27
+
28
+ it "registeres the class in the system manager" do
29
+ Actor::Base.aspect(aspect)
30
+ expect(Application.registered.include?(Actor::Base)).to be_true
31
+ end
32
+ end
33
+
34
+ describe "#sender" do
35
+ it "returns an actor ref" do
36
+ subject.sender.should be_kind_of(Actor::Ref)
37
+ end
38
+ end
39
+
40
+ describe "#find_distributed" do
41
+ it "should return ref with correctly formatted path" do
42
+ Actor::Builder.new(GameSystems::LocalEcho).distributed(1).with_name('echotest').start
43
+ actor_ref = GameSystems::LocalEcho.find_distributed('testid','echotest')
44
+ puts actor_ref.path
45
+ #actor_ref.path.match(/akka.tcp:\/\/cluster@localhost:2551\/user\/echotest[\d]{1,2}/).should be_true
46
+ end
47
+ end
48
+
49
+ describe "#find_remote" do
50
+ it "should return ref with correctly formatted path" do
51
+ actor_ref = GameSystems::LocalEcho.find_remote('default','test')
52
+ actor_ref.path.match(/akka.tcp:\/\/cluster@localhost:2551\/user\/test/).should be_true
53
+ end
54
+ end
55
+
56
+ describe "#find" do
57
+ it "should return ref with correctly formatted path" do
58
+ actor_ref = GameSystems::LocalEcho.find('test')
59
+ actor_ref.path.match(/\/user\/test/).should be_true
60
+ end
61
+ end
62
+
63
+ describe "#add_hashring" do
64
+ it "adds the hashring and returns it" do
65
+ expect(Actor::Base.add_hashring('test','ring')).to eq(Actor::Base.hashring('test'))
66
+ Actor::Base.hashring('test').should == 'ring'
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+ end
73
+
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ describe Actor::Builder do
5
+
6
+ let(:actor_class) {GameSystems::LocalEcho}
7
+
8
+ let(:router) {double('Router')}
9
+
10
+ subject do
11
+ Actor::Builder.new(actor_class)
12
+ end
13
+
14
+ describe "#with_name" do
15
+ it "should set name and return self" do
16
+ expect(subject.with_name('blah')).to eq(subject)
17
+ expect(subject.name).to eq('blah')
18
+ end
19
+ end
20
+
21
+ describe "#with_parent" do
22
+ it "returns self" do
23
+ expect(subject.with_parent('blah')).to eq(subject)
24
+ end
25
+ end
26
+
27
+ describe "#with_router" do
28
+ it "calls new on router with num_routers and return self" do
29
+ expect(router).to receive(:new).with(10)
30
+ expect(subject.with_router(router,10)).to eq(subject)
31
+ end
32
+ end
33
+
34
+ describe "#distributed" do
35
+ it "returns self" do
36
+ expect(subject.distributed(1)).to eq(subject)
37
+ end
38
+ end
39
+
40
+ describe "#start" do
41
+ it "creates the actor and returns the actor ref" do
42
+ expect(subject.with_name('blah').start).to be_kind_of((JavaLib::ActorRef))
43
+ end
44
+
45
+ it "adds a hashring if distributed" do
46
+ expect(GameSystems::LocalEcho).to receive(:add_hashring).with(
47
+ GameSystems::LocalEcho.name,kind_of(Hashring)
48
+ )
49
+ subject.distributed(1).start
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ describe Actor::Ref do
5
+
6
+ let(:local_echo) do
7
+ ref = Actor::Builder.new(GameSystems::LocalEcho).with_name('localecho1').test_ref
8
+ ref.underlying_actor
9
+ end
10
+
11
+ subject do
12
+ Actor::Ref.new('test')
13
+ end
14
+
15
+ describe "#initialize" do
16
+ it "sets the path" do
17
+ Actor::Ref.new('test').path.should == 'test'
18
+ end
19
+ end
20
+
21
+ describe "#ask" do
22
+ it "should accept an actor ref" do
23
+ ref = Actor::Ref.new(local_echo.get_self)
24
+ ref.ask('test',1000).should == 'test'
25
+ end
26
+
27
+ it "should accept a path" do
28
+ Actor::Builder.new(GameSystems::LocalEcho).with_name('echotest3').start
29
+ ref = GameSystems::LocalEcho.find('echotest3')
30
+ ref.ask('test',1000).should == 'test'
31
+ end
32
+ end
33
+
34
+ describe "#tell" do
35
+ it 'sender argument is optional' do
36
+ subject.tell('test').should be_true
37
+ end
38
+
39
+ it "should accept a path" do
40
+ Actor::Builder.new(GameSystems::LocalEcho).with_name('echotest4').start
41
+ GameSystems::LocalEcho.should_receive_message('test','echotest4') do
42
+ ref = GameSystems::LocalEcho.find('echotest4')
43
+ ref.tell('test',nil)
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ describe "#send_message" do
50
+
51
+ it "default should call tell with message and nil sender" do
52
+ subject.should_receive(:tell).with('test',nil)
53
+ subject.send_message('test')
54
+ end
55
+
56
+ it "blocking=true should call ask with message and default timeout" do
57
+ subject.should_receive(:ask).with('test',100)
58
+ subject.send_message('test', :blocking => true)
59
+ end
60
+
61
+ it "sender option should be passed to tell" do
62
+ subject.should_receive(:tell).with('test','sender')
63
+ subject.send_message('test',:sender => 'sender')
64
+ end
65
+
66
+ it "timeout option should be passed to ask" do
67
+ subject.should_receive(:ask).with('test',2)
68
+ subject.send_message('test', :timeout => 2, :blocking => true)
69
+ end
70
+
71
+ it "should get returned message" do
72
+ Actor::Builder.new(GameSystems::LocalEcho).with_name('echotest2').start
73
+ ref = GameSystems::LocalEcho.find('echotest2')
74
+ ref.send_message('hi', :blocking => true, :timeout => 1000).should == 'hi'
75
+ end
76
+
77
+ it "should return false on timeout" do
78
+ ref = GameSystems::LocalEcho.find('blah')
79
+ ref.send_message('hi', :blocking => true, :timeout => 1).should be_false
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'spec_helper'
2
+
3
+ module GameMachine
4
+ describe Application do
5
+
6
+ end
7
+ end
@@ -0,0 +1,171 @@
1
+
2
+ require 'spec_helper'
3
+ module GameMachine
4
+ describe ClientManager do
5
+
6
+ let(:player_id) {'player_test'}
7
+ let(:actor_name) {'testactor'}
8
+ let(:client_name) {'testclient'}
9
+ let(:actor_ref) {double('Actor::Ref')}
10
+ let(:player) {MessageLib::Player.new.set_id(player_id)}
11
+
12
+ let("actor_register") do
13
+ MessageLib::Entity.new.set_id(client_name).set_client_manager_register(
14
+ MessageLib::ClientManagerRegister.new.set_register_type('actor').
15
+ set_name(actor_name)
16
+ )
17
+ end
18
+
19
+ let("actor_unregister") do
20
+ MessageLib::Entity.new.set_id(client_name).set_client_manager_unregister(
21
+ MessageLib::ClientManagerUnregister.new.set_register_type('actor').
22
+ set_name(actor_name)
23
+ )
24
+ end
25
+
26
+ let("client_register") do
27
+ MessageLib::Entity.new.set_id(client_name).set_client_manager_register(
28
+ MessageLib::ClientManagerRegister.new.set_register_type('client').
29
+ set_name(client_name)
30
+ ).set_player(player).set_client_connection(client_connection)
31
+ end
32
+
33
+ let("client_unregister") do
34
+ MessageLib::Entity.new.set_id(client_name).set_client_manager_unregister(
35
+ MessageLib::ClientManagerUnregister.new.set_register_type('client').
36
+ set_name(client_name)
37
+ ).set_player(player).set_client_connection(client_connection)
38
+ end
39
+
40
+ let('client_disconnected_event') do
41
+ MessageLib::Entity.new.set_id(client_name).set_client_event(
42
+ MessageLib::ClientEvent.new.set_event('disconnected').set_client_id(client_name).
43
+ set_sender_id(sender_id).set_player_id(player_id)
44
+ )
45
+ end
46
+
47
+ let(:sender_id) {['server2',ClientManager.name].join('|')}
48
+
49
+ let('client_connected_event') do
50
+ MessageLib::Entity.new.set_id(client_name).set_client_event(
51
+ MessageLib::ClientEvent.new.set_event('connected').set_client_id(client_name).
52
+ set_sender_id(sender_id).set_player_id(player_id)
53
+ )
54
+ end
55
+
56
+ let(:client_connection) do
57
+ MessageLib::ClientConnection.new.set_id(client_name).set_gateway('udp').
58
+ set_server('server')
59
+ end
60
+
61
+ let('local_player_message') do
62
+ MessageLib::Entity.new.set_id(client_name).set_player(player).
63
+ set_send_to_player(true)
64
+ end
65
+
66
+ let('remote_player_message') do
67
+ MessageLib::Entity.new.set_id(client_name).set_player(player).
68
+ set_send_to_player(true)
69
+ end
70
+
71
+ subject do
72
+ ref = Actor::Builder.new(ClientManager).with_name('client_manager_test').test_ref
73
+ ref.underlying_actor
74
+ end
75
+
76
+ before(:each) do
77
+ subject.class.local_players.delete(player_id)
78
+ end
79
+
80
+ describe "#on_receive" do
81
+
82
+ it "should not process client even if message is from self" do
83
+ client_connected_event.client_event.set_sender_id("default|me")
84
+ expect(subject).to_not receive(:process_client_event)
85
+ subject.on_receive(client_connected_event)
86
+ end
87
+ end
88
+
89
+ describe "#send_to_player" do
90
+ it "should send message directly to player if player is local" do
91
+ subject.local_clients[client_name] = client_connection
92
+ subject.players[player_id] = client_name
93
+ subject.class.local_players[player_id] = true
94
+ actor_ref.stub(:tell)
95
+ expect(Actor::Base).to receive(:find).with(player_id).and_return(actor_ref)
96
+ ClientManager.send_to_player(local_player_message)
97
+ end
98
+
99
+ it "should send message to remote manager if player is remote" do
100
+ subject.remote_clients[client_name] = actor_ref
101
+ subject.players[player_id] = client_name
102
+ ClientManager.stub(:find).and_return(actor_ref)
103
+ expect(actor_ref).to receive(:tell).with(remote_player_message)
104
+ ClientManager.send_to_player(remote_player_message)
105
+ end
106
+ end
107
+
108
+ describe "#process_client_event" do
109
+ it "on connect should set players entry" do
110
+ subject.on_receive(client_connected_event)
111
+ expect(subject.players.has_key?(player_id)).to be_true
112
+ end
113
+
114
+ it "on connect should set remote_clients entry" do
115
+ subject.on_receive(client_connected_event)
116
+ expect(subject.remote_clients.has_key?(client_name)).to be_true
117
+ end
118
+
119
+ it "on disconnect event should remove remote client reference" do
120
+ subject.remote_clients[client_name] = true
121
+ subject.on_receive(client_disconnected_event)
122
+ expect(subject.remote_clients.has_key?(client_name)).to be_false
123
+ end
124
+ end
125
+
126
+ describe "#register_sender" do
127
+ it "should add local client entry if client" do
128
+ subject.on_receive(client_register)
129
+ expect(subject.local_clients.has_key?(client_name)).to be_true
130
+ end
131
+
132
+ it "should add local actor entry if actor" do
133
+ subject.on_receive(actor_register)
134
+ expect(subject.local_actors.has_key?(actor_name)).to be_true
135
+ end
136
+
137
+ it "client register should call send_client_event" do
138
+ expect(subject).to receive(:send_client_event).with(client_name,player_id,'connected')
139
+ subject.on_receive(client_register)
140
+ end
141
+
142
+ it "should not send client event for local connenction" do
143
+ client_register.client_connection.set_type('local')
144
+ expect(subject).to_not receive(:send_client_event)
145
+ subject.on_receive(client_register)
146
+ end
147
+ end
148
+
149
+ describe "#unregister_sender" do
150
+ it "sends disconnected message to message queue" do
151
+ expect(subject).to receive(:send_client_event).with(client_name,player_id,'disconnected')
152
+ subject.on_receive(client_unregister)
153
+ end
154
+
155
+ it "removes local client reference" do
156
+ subject.local_clients[client_name] = true
157
+ subject.on_receive(client_unregister)
158
+ expect(subject.local_clients.has_key?(client_name)).to be_false
159
+ end
160
+
161
+ it "should not send client event for local connenction" do
162
+ client_unregister.client_connection.set_type('local')
163
+ expect(subject).to_not receive(:send_client_event)
164
+ subject.on_receive(client_unregister)
165
+ end
166
+ end
167
+
168
+
169
+ end
170
+
171
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module Commands
5
+ describe ChatCommands do
6
+
7
+ let(:actor_ref) {double('Actor::Ref', :tell => true)}
8
+
9
+ subject{ChatCommands.new}
10
+
11
+ before(:each) do
12
+ GameSystems::ChatManager.stub(:find).and_return(actor_ref)
13
+ end
14
+
15
+ describe "#send_private_message" do
16
+ it "sends a private message request to the chat actor" do
17
+ expect(actor_ref).to receive(:tell)
18
+ subject.send_private_message('1','blah')
19
+ end
20
+ end
21
+
22
+ describe "#join" do
23
+ it "joins a chat group" do
24
+ expect(actor_ref).to receive(:tell)
25
+ subject.join('blah','player1')
26
+ end
27
+ end
28
+
29
+ describe "#leave" do
30
+ it "leaves a chat group" do
31
+ expect(actor_ref).to receive(:tell)
32
+ subject.leave('blah','player1')
33
+ end
34
+ end
35
+
36
+ end
37
+ end
38
+ end