game_machine 0.0.11 → 1.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.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -1
  3. data/Gemfile.lock +32 -47
  4. data/Rakefile +0 -27
  5. data/bin/bundle_run.sh +1 -0
  6. data/bin/game_machine +29 -27
  7. data/config/cluster.conf +6 -5
  8. data/config/default.conf +164 -0
  9. data/config/game_machine.sql +33 -0
  10. data/config/game_messages.proto +87 -25
  11. data/config/gamecloud.conf +140 -0
  12. data/config/messages.proto +46 -53
  13. data/config/test.conf +149 -0
  14. data/game_machine.gemspec +10 -5
  15. data/games/boot.rb +3 -0
  16. data/games/example/data/game_data.yml +4 -4
  17. data/games/example/lib/aggressive_npc.rb +1 -1
  18. data/games/example/lib/game.rb +1 -2
  19. data/games/example/lib/player_register.rb +1 -1
  20. data/games/routes.rb +9 -0
  21. data/games/tutorial/boot.rb +12 -0
  22. data/games/tutorial/item_manager.rb +256 -0
  23. data/games/tutorial/object_store.rb +55 -0
  24. data/games/tutorial/seed.rb +52 -0
  25. data/games/tutorial/sql_store.rb +30 -0
  26. data/java/project/build.gradle +134 -0
  27. data/java/project/component.erb +719 -0
  28. data/java/{gradle.properties → project/gradle.properties} +1 -1
  29. data/java/project/gradle/wrapper/gradle-wrapper.jar +0 -0
  30. data/java/{gradle → project/gradle}/wrapper/gradle-wrapper.properties +2 -2
  31. data/java/{gradlew → project/gradlew} +0 -0
  32. data/java/{gradlew.bat → project/gradlew.bat} +0 -0
  33. data/java/project/local_lib/AdminUi.jar +0 -0
  34. data/java/{local_lib/protostuff-compiler-1.0.7-jarjar.jar → project/local_lib/protostuff-compiler-1.0.8-jarjar.jar} +0 -0
  35. data/java/project/local_lib/sigar/libsigar-amd64-freebsd-6.so +0 -0
  36. data/java/project/local_lib/sigar/libsigar-amd64-linux.so +0 -0
  37. data/java/project/local_lib/sigar/libsigar-amd64-solaris.so +0 -0
  38. data/java/project/local_lib/sigar/libsigar-ia64-hpux-11.sl +0 -0
  39. data/java/project/local_lib/sigar/libsigar-ia64-linux.so +0 -0
  40. data/java/project/local_lib/sigar/libsigar-pa-hpux-11.sl +0 -0
  41. data/java/project/local_lib/sigar/libsigar-ppc-aix-5.so +0 -0
  42. data/java/project/local_lib/sigar/libsigar-ppc-linux.so +0 -0
  43. data/java/project/local_lib/sigar/libsigar-ppc64-aix-5.so +0 -0
  44. data/java/project/local_lib/sigar/libsigar-ppc64-linux.so +0 -0
  45. data/java/project/local_lib/sigar/libsigar-s390x-linux.so +0 -0
  46. data/java/project/local_lib/sigar/libsigar-sparc-solaris.so +0 -0
  47. data/java/project/local_lib/sigar/libsigar-sparc64-solaris.so +0 -0
  48. data/java/project/local_lib/sigar/libsigar-universal-macosx.dylib +0 -0
  49. data/java/project/local_lib/sigar/libsigar-universal64-macosx.dylib +0 -0
  50. data/java/project/local_lib/sigar/libsigar-x86-freebsd-5.so +0 -0
  51. data/java/project/local_lib/sigar/libsigar-x86-freebsd-6.so +0 -0
  52. data/java/project/local_lib/sigar/libsigar-x86-linux.so +0 -0
  53. data/java/project/local_lib/sigar/libsigar-x86-solaris.so +0 -0
  54. data/java/project/local_lib/sigar/sigar-amd64-winnt.dll +0 -0
  55. data/java/project/local_lib/sigar/sigar-x86-winnt.dll +0 -0
  56. data/java/project/local_lib/sigar/sigar-x86-winnt.lib +0 -0
  57. data/java/project/model.erb +99 -0
  58. data/java/{settings.gradle → project/settings.gradle} +0 -0
  59. data/java/project/src/main/java/com/game_machine/authentication/DefaultAuthenticator.java +28 -0
  60. data/java/project/src/main/java/com/game_machine/authentication/PlayerAuthenticator.java +6 -0
  61. data/java/project/src/main/java/com/game_machine/authentication/PublicAuthenticator.java +20 -0
  62. data/java/{src → project/src}/main/java/com/game_machine/core/ActorFactory.java +0 -0
  63. data/java/{src → project/src}/main/java/com/game_machine/core/ActorUtil.java +13 -0
  64. data/java/project/src/main/java/com/game_machine/core/AuthorizedPlayers.java +23 -0
  65. data/java/project/src/main/java/com/game_machine/core/ClientMessageDecoder.java +36 -0
  66. data/java/project/src/main/java/com/game_machine/core/ClientMessageEncoder.java +19 -0
  67. data/java/project/src/main/java/com/game_machine/core/CloudClient.java +298 -0
  68. data/java/{src → project/src}/main/java/com/game_machine/core/CommandProxy.java +0 -0
  69. data/java/project/src/main/java/com/game_machine/core/Commands.java +20 -0
  70. data/java/project/src/main/java/com/game_machine/core/DatastoreCommands.java +43 -0
  71. data/java/project/src/main/java/com/game_machine/core/DbConnectionPool.java +72 -0
  72. data/java/project/src/main/java/com/game_machine/core/DefaultMovementVerifier.java +56 -0
  73. data/java/{src → project/src}/main/java/com/game_machine/core/EntitySerializer.java +0 -0
  74. data/java/project/src/main/java/com/game_machine/core/EntityTracking.java +119 -0
  75. data/java/{src → project/src}/main/java/com/game_machine/core/EventStreamHandler.java +1 -1
  76. data/java/project/src/main/java/com/game_machine/core/GameActor.java +73 -0
  77. data/java/project/src/main/java/com/game_machine/core/GameMachineLoader.java +43 -0
  78. data/java/project/src/main/java/com/game_machine/core/GameMessageActor.java +44 -0
  79. data/java/project/src/main/java/com/game_machine/core/Grid.java +255 -0
  80. data/java/{src → project/src}/main/java/com/game_machine/core/GridValue.java +0 -0
  81. data/java/project/src/main/java/com/game_machine/core/Hashring.java +66 -0
  82. data/java/{src → project/src}/main/java/com/game_machine/core/IActorFactory.java +0 -0
  83. data/java/project/src/main/java/com/game_machine/core/LocalLinkedBuffer.java +20 -0
  84. data/java/project/src/main/java/com/game_machine/core/MessageGateway.java +120 -0
  85. data/java/project/src/main/java/com/game_machine/core/MessagePersister.java +26 -0
  86. data/java/project/src/main/java/com/game_machine/core/MonoProxy.java +39 -0
  87. data/java/project/src/main/java/com/game_machine/core/MovementVerifier.java +7 -0
  88. data/java/{src → project/src}/main/java/com/game_machine/core/NetMessage.java +10 -6
  89. data/java/project/src/main/java/com/game_machine/core/PersistentMessage.java +9 -0
  90. data/java/project/src/main/java/com/game_machine/core/PlayerCommands.java +31 -0
  91. data/java/project/src/main/java/com/game_machine/core/TcpServer.java +100 -0
  92. data/java/project/src/main/java/com/game_machine/core/TcpServerHandler.java +54 -0
  93. data/java/project/src/main/java/com/game_machine/core/TcpServerInitializer.java +32 -0
  94. data/java/project/src/main/java/com/game_machine/core/UdpClient.java +86 -0
  95. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServer.java +18 -27
  96. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServerHandler.java +23 -26
  97. data/java/project/src/main/java/com/game_machine/core/Vector3.java +159 -0
  98. data/java/project/src/main/java/com/game_machine/orm/models/PlayerItem.java +118 -0
  99. data/java/project/src/main/java/com/game_machine/orm/models/TestObject.java +110 -0
  100. data/java/project/src/main/java/com/game_machine/tutorial/LootGenerator.java +26 -0
  101. data/java/{src → project/src}/main/resources/game_machine.java.stg +3 -1
  102. data/java/project/src/main/resources/logback.properties +13 -0
  103. data/java/project/src/main/resources/logback.xml +76 -0
  104. data/java/{src → project/src}/main/resources/protostuff.properties +0 -0
  105. data/java/src/main/java/game/MyGameActor.java +26 -0
  106. data/lib/game_machine.rb +17 -16
  107. data/lib/game_machine/actor.rb +1 -1
  108. data/lib/game_machine/actor/base.rb +8 -31
  109. data/lib/game_machine/actor/builder.rb +5 -6
  110. data/lib/game_machine/actor/game_actor.rb +55 -0
  111. data/lib/game_machine/actor/reloadable.rb +6 -1
  112. data/lib/game_machine/akka.rb +26 -32
  113. data/lib/game_machine/app_config.rb +39 -26
  114. data/lib/game_machine/application.rb +56 -62
  115. data/lib/game_machine/client_manager.rb +14 -8
  116. data/lib/game_machine/cloud_updater.rb +51 -0
  117. data/lib/game_machine/cluster_monitor.rb +3 -3
  118. data/lib/game_machine/commands.rb +1 -1
  119. data/lib/game_machine/commands/misc_commands.rb +4 -8
  120. data/lib/game_machine/commands/player_commands.rb +8 -0
  121. data/lib/game_machine/console.rb +1 -0
  122. data/lib/game_machine/console/build.rb +57 -24
  123. data/lib/game_machine/console/bundle.rb +95 -0
  124. data/lib/game_machine/console/deploy.rb +30 -0
  125. data/lib/game_machine/console/install.rb +70 -36
  126. data/lib/game_machine/console/server.rb +2 -69
  127. data/lib/game_machine/data_store.rb +111 -15
  128. data/lib/game_machine/data_stores/couchbase.rb +8 -3
  129. data/lib/game_machine/data_stores/gamecloud.rb +93 -0
  130. data/lib/game_machine/data_stores/jdbc.rb +98 -0
  131. data/lib/game_machine/default_handlers.rb +2 -0
  132. data/lib/game_machine/default_handlers/team_handler.rb +51 -0
  133. data/lib/game_machine/default_handlers/zone_manager.rb +30 -0
  134. data/lib/game_machine/endpoints.rb +0 -4
  135. data/lib/game_machine/endpoints/udp_incoming.rb +13 -5
  136. data/lib/game_machine/endpoints/udp_outgoing.rb +15 -9
  137. data/lib/game_machine/game_systems.rb +0 -2
  138. data/lib/game_machine/game_systems/agents/controller.rb +2 -2
  139. data/lib/game_machine/game_systems/entity_tracking.rb +0 -3
  140. data/lib/game_machine/game_systems/region_manager.rb +3 -2
  141. data/lib/game_machine/game_systems/region_service.rb +2 -2
  142. data/lib/game_machine/game_systems/remote_echo.rb +10 -0
  143. data/lib/game_machine/game_systems/team_manager.rb +2 -11
  144. data/lib/game_machine/grid.rb +5 -18
  145. data/lib/game_machine/handlers/authentication.rb +1 -9
  146. data/lib/game_machine/handlers/game.rb +27 -2
  147. data/lib/game_machine/handlers/player_authentication.rb +87 -0
  148. data/lib/game_machine/handlers/request.rb +9 -11
  149. data/lib/game_machine/hocon_config.rb +81 -0
  150. data/lib/game_machine/java_lib.rb +14 -1
  151. data/lib/game_machine/logger.rb +10 -23
  152. data/lib/game_machine/models.rb +1 -0
  153. data/lib/game_machine/mono_server.rb +6 -1
  154. data/lib/game_machine/object_db.rb +12 -6
  155. data/lib/game_machine/protobuf.rb +1 -1
  156. data/lib/game_machine/protobuf/game_messages.rb +13 -3
  157. data/lib/game_machine/protobuf/generate.rb +107 -5
  158. data/lib/game_machine/restart_watcher.rb +1 -1
  159. data/lib/game_machine/routes.rb +23 -0
  160. data/lib/game_machine/scheduler.rb +1 -1
  161. data/lib/game_machine/securerandom.rb +2 -0
  162. data/lib/game_machine/system_stats.rb +28 -7
  163. data/lib/game_machine/version.rb +1 -1
  164. data/lib/game_machine/wavefront_ext.rb +47 -0
  165. data/lib/game_machine/write_behind_cache.rb +24 -9
  166. data/mono/server/Makefile +1 -1
  167. data/mono/server/Newtonsoft.Json.dll +0 -0
  168. data/mono/server/build.bat +1 -1
  169. data/mono/server/callable.cs +9 -0
  170. data/mono/server/echo.cs +17 -0
  171. data/mono/server/message_router.cs +16 -23
  172. data/mono/server/messages.cs +1792 -417
  173. data/mono/server/protobuf-net.dll +0 -0
  174. data/mono/server/server.cs +120 -0
  175. data/mono/server/server.exe +0 -0
  176. data/pathfinding/astar.cpp +149 -0
  177. data/pathfinding/build.sh +6 -0
  178. data/pathfinding/build.txt +16 -0
  179. data/pathfinding/crowd.cpp +194 -0
  180. data/pathfinding/include/astar.h +49 -0
  181. data/pathfinding/include/common.h +5 -0
  182. data/pathfinding/include/crowd.h +43 -0
  183. data/pathfinding/include/micropather.h +511 -0
  184. data/pathfinding/include/navmesh.h +114 -0
  185. data/pathfinding/include/pathfinder.h +24 -0
  186. data/pathfinding/main.cpp +108 -17
  187. data/pathfinding/micropather.cpp +1062 -0
  188. data/pathfinding/navmesh.cpp +408 -0
  189. data/pathfinding/overrides/DetourCrowd.cpp +1446 -0
  190. data/pathfinding/overrides/DetourNavMeshQuery.cpp +3551 -0
  191. data/pathfinding/overrides/DetourNavMeshQuery.h +538 -0
  192. data/pathfinding/pathfinder.cpp +117 -0
  193. data/pathfinding/{bin → premake}/premake4 +0 -0
  194. data/pathfinding/premake/premake4.exe +0 -0
  195. data/pathfinding/premake4.lua +12 -3
  196. data/spec/actor/actor_spec.rb +0 -7
  197. data/spec/client_manager_spec.rb +1 -1
  198. data/spec/couchproxy_spec.rb +38 -0
  199. data/spec/entity_persistence_spec.rb +129 -0
  200. data/spec/game_systems/team_manager_spec.rb +2 -2
  201. data/spec/hashring_spec.rb +17 -39
  202. data/spec/java_grid_spec.rb +0 -2
  203. data/spec/misc_spec.rb +111 -0
  204. data/spec/mono_spec.rb +50 -3
  205. data/spec/reliable_message_spec.rb +38 -0
  206. data/spec/spec_helper.rb +4 -4
  207. data/spec/spec_helper_minimal.rb +10 -0
  208. data/web/app.rb +108 -86
  209. data/web/config/trinidad.yml +1 -0
  210. data/web/views/add_player.erb +25 -0
  211. data/web/views/index.erb +0 -0
  212. data/web/views/layout.erb +48 -0
  213. data/web/views/login.erb +25 -0
  214. data/web/views/players.erb +24 -0
  215. metadata +209 -94
  216. data/config/config.example.yml +0 -100
  217. data/config/regions.example.yml +0 -9
  218. data/games/example/lib/authentication_handler.rb +0 -69
  219. data/games/models.rb +0 -3
  220. data/games/models/clan_member.rb +0 -8
  221. data/games/models/clan_profile.rb +0 -9
  222. data/games/models/player.rb +0 -7
  223. data/games/plugins.rb +0 -1
  224. data/games/plugins/team_handler.rb +0 -49
  225. data/games/preload.rb +0 -13
  226. data/java/.gitignore +0 -1
  227. data/java/build.gradle +0 -95
  228. data/java/component.erb +0 -396
  229. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  230. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +0 -25
  231. data/java/src/main/java/com/game_machine/core/Grid.java +0 -195
  232. data/java/src/main/resources/logback.xml +0 -14
  233. data/java/src/main/resources/logging.properties +0 -3
  234. data/lib/game_machine/actor/mono_actor.rb +0 -89
  235. data/lib/game_machine/auth_handlers/base.rb +0 -21
  236. data/lib/game_machine/auth_handlers/public.rb +0 -34
  237. data/lib/game_machine/endpoints/mono_gateway.rb +0 -87
  238. data/lib/game_machine/endpoints/tcp.rb +0 -51
  239. data/lib/game_machine/endpoints/tcp_handler.rb +0 -75
  240. data/lib/game_machine/endpoints/udp.rb +0 -88
  241. data/lib/game_machine/game_loader.rb +0 -46
  242. data/lib/game_machine/game_systems/region_settings.rb +0 -13
  243. data/lib/game_machine/hashring.rb +0 -48
  244. data/lib/game_machine/settings.rb +0 -11
  245. data/mono/server/actor.cs +0 -37
  246. data/mono/server/iactor.cs +0 -11
  247. data/mono/server/message_util.cs +0 -29
  248. data/mono/server/proxy_client.cs +0 -73
  249. data/mono/server/proxy_server.cs +0 -30
  250. data/mono/server/test_actor.cs +0 -33
  251. data/pathfinding/include/pathfind.h +0 -167
  252. data/pathfinding/pathfind.cpp +0 -174
  253. data/pathfinding/pathfinder.cs +0 -66
  254. data/script/server.sh +0 -109
  255. data/script/watch.sh +0 -11
  256. data/spec/commands/navigation_commands_spec.rb +0 -51
  257. data/spec/game_systems/entity_tracking_spec.rb +0 -64
  258. data/spec/navigation/detour_navmesh_spec.rb +0 -34
  259. data/spec/navigation/detour_path_spec.rb +0 -25
  260. data/spec/udp_server_spec.rb +0 -10
  261. data/web/controllers/auth_controller.rb +0 -19
  262. data/web/controllers/base_controller.rb +0 -16
  263. data/web/controllers/index_controller.rb +0 -7
  264. data/web/controllers/log_controller.rb +0 -47
  265. data/web/controllers/messages_controller.rb +0 -59
  266. data/web/controllers/player_register_controller.rb +0 -15
  267. data/web/views/game_messages.haml +0 -45
  268. data/web/views/index.haml +0 -6
  269. data/web/views/layout.haml +0 -41
  270. data/web/views/logs.haml +0 -32
  271. data/web/views/player_register.haml +0 -22
  272. data/web/views/player_registered.haml +0 -2
  273. data/web/views/register_layout.haml +0 -22
  274. data/web/views/restart.haml +0 -35
@@ -26,7 +26,6 @@ module GameMachine
26
26
  grid_value = subject.get('blah')
27
27
 
28
28
  expect(grid_value.id).to eq('blah')
29
- expect(grid_value.cell).to eq(0)
30
29
  expect(grid_value.x).to eq(0)
31
30
  expect(grid_value.y).to eq(0)
32
31
  expect(grid_value.z).to eq(3)
@@ -65,7 +64,6 @@ module GameMachine
65
64
  subject.set('blah',0,0,0,'player')
66
65
  points = subject.neighbors(0,0,25,'player')
67
66
  expect(points.first.cell).to eq(0)
68
-
69
67
  end
70
68
 
71
69
  it "does not return cells out of range" do
@@ -1,4 +1,7 @@
1
1
  require 'spec_helper'
2
+ require 'benchmark'
3
+ require "net/http"
4
+ require "uri"
2
5
  require 'jruby/core_ext'
3
6
  module GameMachine
4
7
 
@@ -13,6 +16,114 @@ module GameMachine
13
16
  entity
14
17
  end
15
18
 
19
+ it "ebean test" do
20
+ config = AppConfig.instance.config
21
+ pool = GameMachine::JavaLib::DbConnectionPool.getInstance
22
+ pool.connect(
23
+ 'test',
24
+ config.jdbc.hostname,
25
+ config.jdbc.port,
26
+ config.jdbc.database,
27
+ config.jdbc.ds,
28
+ config.jdbc.username,
29
+ config.jdbc.password || ''
30
+ )
31
+ BeanLib::TestModel.set_ds
32
+ BeanLib::TestModel.test
33
+ end
34
+
35
+ xit "authorizes with cloudclient" do
36
+ url = "http://localhost:9000/client/login/test"
37
+ uri = URI.parse(url)
38
+
39
+ response = Net::HTTP.post_form(uri, {'username' => 'chris', 'password' => 'pass'})
40
+ puts response.inspect
41
+ puts response.body
42
+
43
+ end
44
+
45
+ xit "serialized to json" do
46
+ entity = MessageLib::Entity.new.set_id('player')
47
+ puts entity.to_json
48
+ end
49
+
50
+ xit "couch http client" do
51
+ entity = MessageLib::Entity.new.set_id('3')
52
+ client = JavaLib::Couchclient.get_instance
53
+ 10.times do |i|
54
+ id = "TESTING#{i}"
55
+ response = client.put(id,entity.to_byte_array)
56
+ puts response.status
57
+ #puts response.body
58
+
59
+ response = client.get(id)
60
+ puts response.status
61
+ if response.status == 200
62
+ puts MessageLib::Entity.parse_from(response.body)
63
+ end
64
+
65
+
66
+ response = client.delete(id)
67
+ puts response.status
68
+ #puts response.body
69
+ end
70
+ end
71
+
72
+ xit "msyql ogbject store stress" do
73
+ GameMachine::Application.orm_connect
74
+ ds = Commands::DatastoreCommands.new
75
+ count = 0
76
+ puts Benchmark.realtime {
77
+ 10000.times do
78
+ entity.id = count.to_s
79
+ entity.db_put
80
+ count += 1
81
+ sleep 0.002
82
+ end
83
+ }
84
+ end
85
+
86
+ xit "finds model" do
87
+ GameMachine::Application.orm_connect
88
+ MessageLib::TestObject.delete_async('player1')
89
+ if message = MessageLib::TestObject.find_by_player_id("player1")
90
+ message.set_fvalue(1.9)
91
+ message.save_async('player1')
92
+ else
93
+ message = MessageLib::TestObject.new
94
+ message.set_required_string('testing')
95
+ message.set_fvalue(1.9)
96
+ message.set_bvalue(true)
97
+ message.set_dvalue(3.4)
98
+ message.set_numbers64(555)
99
+ message.save_async('player1')
100
+ end
101
+
102
+ sleep 2
103
+ end
104
+
105
+ xit "trackdata test" do
106
+ neighbors = MessageLib::Neighbors.new
107
+ trackdata = MessageLib::TrackData.new
108
+ trackdata.x = 100.0
109
+ trackdata.y = 100.0
110
+ trackdata.z = 100.0
111
+ 200.times do
112
+ neighbors.add_track_data(trackdata)
113
+ end
114
+
115
+ tracktest = MessageLib::TrackTest.new
116
+ 200.times do
117
+ tracktest.add_x(100.0)
118
+ tracktest.add_y(100.0)
119
+ tracktest.add_z(100.0)
120
+ end
121
+ 100000000.times do
122
+ tracktest.to_byte_array
123
+ #neighbors.to_byte_array
124
+ end
125
+ end
126
+
16
127
  xit "singleton manager" do
17
128
  ref = Akka.instance.actor_system.actor_selection('/user/region_manager_proxy')
18
129
  ref.tell('HELLO',nil)
@@ -4,6 +4,8 @@ require "base64"
4
4
  require 'socket'
5
5
  require "uri"
6
6
  require 'net/http'
7
+ require 'benchmark'
8
+ require 'descriptive_statistics'
7
9
  java_import 'java.util.concurrent.ThreadPoolExecutor'
8
10
  java_import 'java.util.concurrent.TimeUnit'
9
11
  java_import 'java.util.concurrent.LinkedBlockingQueue'
@@ -11,20 +13,65 @@ java_import 'java.util.concurrent.FutureTask'
11
13
  java_import 'java.util.concurrent.Callable'
12
14
 
13
15
  CHARS = [*('a'..'z'),*('0'..'9')].flatten
14
- STR = Array.new(100) {|i| CHARS.sample}.join
16
+ STR = Array.new(200) {|i| CHARS.sample}.join
15
17
  STR2 = Array.new(1000) {|i| CHARS.sample}.join
16
18
 
17
19
 
18
20
  module GameMachine
19
21
  describe 'mono' do
20
22
 
21
- it "mono gateway" do
23
+ xit "udp gateway" do
24
+ host = '127.0.0.1'
25
+ port = 4000
26
+ message = MessageLib::Entity.new.set_id(STR)
27
+
28
+ threads = []
29
+ proxy = JavaLib::MonoProxy.getInstance
30
+ 1.times do
31
+ threads << Thread.new do
32
+ results = []
33
+ errors = 0
34
+ 10000.times do
35
+ results << Benchmark.realtime {
36
+ response = proxy.call('MyGame.Echo',message)
37
+ if response.nil?
38
+ puts 'error'
39
+ errors += 1
40
+ end
41
+ }
42
+ end
43
+ puts "Number = #{results.number} Errors = #{errors} Average #{results.mean * 1000000} Standard deviation #{results.standard_deviation * 1000000}"
44
+ end
45
+ end
46
+ threads.map(&:join)
47
+ end
48
+
49
+ xit "calls mono method" do
50
+
51
+ Mono::Vm.instance.load
52
+
53
+ threads = []
54
+ 4.times do
55
+ threads << Thread.new do
56
+ str = Array.new(400) {|i| CHARS.sample}.join
57
+ message = MessageLib::Entity.new.set_id(str)
58
+ puts Benchmark.realtime {
59
+ 1000000.times do
60
+ Mono::Vm.instance.call_mono('GameMachine','TestActor',message)
61
+ end
62
+ }
63
+ end
64
+ end
65
+ threads.map(&:join)
66
+ end
67
+
68
+ xit "mono gateway" do
22
69
  Actor::Builder.new(Endpoints::MonoGateway).start
23
70
  sleep 1
24
71
  str = Array.new(1000) {|i| CHARS.sample}.join
25
72
  message = MessageLib::Entity.new.set_id(STR)
26
73
  message.set_destination('GameMachine.TestActor')
27
- puts timed = Benchmark.realtime {
74
+ puts Benchmark.realtime {
28
75
  10.times do
29
76
  Endpoints::MonoGateway.find.tell(message)
30
77
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ module GameMachine
3
+
4
+ describe "Reliable Messages" do
5
+ let(:id) {'1'}
6
+ let(:game_message) do
7
+ MessageLib::GameMessage.new.set_message_id(id)
8
+ end
9
+
10
+ subject do
11
+ ref = Actor::Builder.new(GameSystems::Devnull).with_name('devnull').test_ref
12
+ ref.underlying_actor
13
+ end
14
+
15
+ before(:each) do
16
+ JavaLib::GameActor.remove_reliable_message(id)
17
+ subject.set_player_id('player')
18
+ end
19
+
20
+ describe "#exactly_once" do
21
+ it "should return true exactly once" do
22
+ expect(subject.exactly_once(game_message)).to be_truthy
23
+ expect(subject.exactly_once(game_message)).to be_falsy
24
+ end
25
+ end
26
+
27
+ describe "#set_reply" do
28
+ it "should return false if message not yet delivered" do
29
+ expect(subject.set_reply(game_message)).to be_falsy
30
+ end
31
+
32
+ it "should return true if message delivered" do
33
+ subject.exactly_once(game_message)
34
+ expect(subject.set_reply(game_message)).to be_truthy
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,6 +1,6 @@
1
1
 
2
2
  ENV['APP_ROOT'] ||= File.expand_path(Dir.pwd)
3
- ENV['JAVA_ROOT'] = File.join(ENV['APP_ROOT'],'java')
3
+ ENV['JAVA_ROOT'] = File.join(ENV['APP_ROOT'],'java','project')
4
4
  ENV['GAME_ENV'] = 'test'
5
5
  require 'rubygems'
6
6
 
@@ -12,17 +12,17 @@ end
12
12
 
13
13
  RSpec.configure do |config|
14
14
  config.before(:suite) do
15
- GameMachine::Application.initialize!('default',true)
15
+ GameMachine::Application.initialize!
16
16
  end
17
17
 
18
18
  config.before(:each) do
19
- GameMachine::AuthHandlers::Base.instance
19
+ GameMachine::AppConfig.instance.load_config
20
20
  GameMachine::Application.create_grids
21
21
  GameMachine::Application.start_actor_system
22
22
  GameMachine::Application.start_core_systems
23
23
  GameMachine::Application.start_handlers
24
24
  #GameMachine::Application.start_game_systems
25
- GameMachine::GameLoader.new.load_all
25
+
26
26
  end
27
27
 
28
28
  config.after(:each) do
@@ -0,0 +1,10 @@
1
+ ENV['APP_ROOT'] ||= File.expand_path(Dir.pwd)
2
+ ENV['JAVA_ROOT'] = File.join(ENV['APP_ROOT'],'java','project')
3
+ ENV['GAME_ENV'] = 'test'
4
+ require 'rubygems'
5
+
6
+ begin
7
+ require 'game_machine'
8
+ rescue LoadError
9
+ require_relative '../lib/game_machine'
10
+ end
data/web/app.rb CHANGED
@@ -1,131 +1,153 @@
1
1
  require 'json'
2
2
  require 'sinatra/base'
3
- require 'sinatra/multi_route'
4
-
5
- require_relative 'controllers/base_controller'
6
- require_relative 'controllers/index_controller'
7
- require_relative 'controllers/messages_controller'
8
- require_relative 'controllers/auth_controller'
9
- require_relative 'controllers/log_controller'
10
- require_relative 'controllers/player_register_controller'
3
+ require 'rack-flash'
11
4
 
12
5
 
13
6
  class WebApp < Sinatra::Base
14
- CONTROLLERS = {}
15
- set :bind, GameMachine::Application.config.http_host
16
- set :port, GameMachine::Application.config.http_port
7
+ set :bind, GameMachine::Application.config.http.host
8
+ set :port, GameMachine::Application.config.http.port
17
9
  set :root, File.expand_path(File.dirname(__FILE__))
18
10
  set :environment, :development
19
11
  mime_type :proto, 'application/octet-stream'
12
+ set :server, :puma
20
13
 
21
- register Sinatra::MultiRoute
14
+ enable :sessions
15
+ set :session_secret, 'dsf5785sadf86876asdf6'
16
+ use Rack::Flash
22
17
 
23
- def base_uri
24
- host = GameMachine::Application.config.http_host
25
- port = GameMachine::Application.config.http_port
26
- "http://#{host}:#{port}"
27
- end
18
+ helpers do
28
19
 
29
- def controller(name)
30
- case name
31
- when :index
32
- CONTROLLERS[name] ||= Web::Controllers::IndexController.new
33
- when :auth
34
- CONTROLLERS[name] ||= Web::Controllers::AuthController.new
35
- when :messages
36
- CONTROLLERS[name] ||= Web::Controllers::MessagesController.new
37
- when :log
38
- CONTROLLERS[name] ||= Web::Controllers::LogController.new
39
- when :player_register
40
- CONTROLLERS[name] ||= Web::Controllers::PlayerRegisterController.new
20
+ def config
21
+ GameMachine::Application.config
41
22
  end
42
- end
43
23
 
24
+ def logged_in?
25
+ session['user']
26
+ end
44
27
 
45
- get '/player_register' do
46
- @content = {}
47
- haml :player_register, :layout => :register_layout
48
- end
28
+ def admin_user
29
+ config.admin.user
30
+ end
49
31
 
50
- post '/player_register.html' do
51
- @content = controller(:player_register).set_request(request,params).create
52
- if @content['error']
53
- haml :player_register, :layout => :register_layout
54
- else
55
- haml :player_registered, :layout => :register_layout
32
+ def admin_pass
33
+ config.admin.pass
56
34
  end
35
+
36
+ def auth_response(token)
37
+ response = {
38
+ :authtoken => token,
39
+ :protocol => config.client.protocol
40
+ }
41
+
42
+ if config.client.protocol == 'TCP'
43
+ response['tcp_host'] = config.tcp.host
44
+ response['tcp_port'] = config.tcp.port
45
+ elsif config.client.protocol == 'UDP'
46
+ response['udp_host'] = config.udp.host
47
+ response['udp_port'] = config.udp.port
48
+ end
49
+ response
50
+ end
51
+
57
52
  end
58
53
 
59
- post '/player_register.json' do
60
- content = controller(:player_register).set_request(request,params).create
61
- JSON.generate(content)
54
+ before do
55
+ allow = false
56
+ public = ['/client','/login','/clusterinfo']
57
+ public.each do |path|
58
+ if request.path_info.match(path)
59
+ allow = true
60
+ end
61
+ end
62
+
63
+ if !allow && !logged_in?
64
+ redirect to('/login')
65
+ end
62
66
  end
63
67
 
64
68
  get '/' do
65
- if request.params['restarted']
66
- @restarted = true
69
+ erb :index
70
+ end
71
+
72
+ get '/login' do
73
+ erb :login
74
+ end
75
+
76
+ post '/login' do
77
+ if params['username'] == admin_user && params['password'] == admin_pass
78
+ flash[:notice] = "Logged in"
79
+ session['user'] = true
80
+ redirect to('/')
81
+ else
82
+ flash[:error] = "Invalid username or password"
83
+ redirect to("/login")
67
84
  end
68
- haml :index
69
85
  end
70
86
 
71
- get '/alive' do
72
- JSON.generate({})
87
+ get '/players/:id/delete' do
88
+ GameMachine::MessageLib::Player.store_delete('players',params['id'])
89
+ redirect to('/players')
73
90
  end
74
91
 
75
- get '/restart' do
76
- haml :restart
92
+ post '/players' do
93
+ scope,query_string = params['query_string'].split('##')
94
+ if query_string.nil?
95
+ query_string = ''
96
+ end
97
+ @players = GameMachine::DataStore.instance.query(scope,query_string,200,'Player')
98
+ @form_query = scope + '##' + query_string
99
+ erb :players
77
100
  end
78
101
 
79
- get '/logs' do
80
- @logtypes = {
81
- :app => 'Application',
82
- :stdout => 'Standard out',
83
- :stderr => 'Standard error'
84
- }
85
- @logtype = (params['logtype'] || 'app').to_sym
86
- @content = controller(:log).set_request(request,params).logs(@logtype)
87
- haml :logs
102
+ get '/players' do
103
+ @players = GameMachine::DataStore.instance.query("players",'',200,'Player')
104
+ erb :players
88
105
  end
89
106
 
90
- get '/messages/game' do
91
- @content = controller(:messages).set_request(request,params).game
92
- @messages = :game
93
- haml :game_messages
107
+ get '/add_player' do
108
+ erb :add_player
94
109
  end
95
110
 
96
- post '/messages/game' do
97
- @content = controller(:messages).set_request(request,params).update
98
- if @content == 'restart'
99
- haml :restart
111
+ post '/add_player' do
112
+ if player = GameMachine::MessageLib::Player.store_get('players',params['username'],500)
113
+ flash[:error] = "Error creating player (already exists?)"
100
114
  else
101
- @messages = :game
102
- haml :game_messages
115
+ player = GameMachine::MessageLib::Player.new.set_id(params['username'])
116
+ authenticator = GameMachine::JavaLib::DefaultAuthenticator.new(player)
117
+ authenticator.set_password(params['password'])
118
+ flash[:notice] = "Player created"
103
119
  end
120
+ redirect to('/')
104
121
  end
105
122
 
106
- get '/messages/all' do
107
- @content = controller(:messages).set_request(request,params).all
108
- @messages = :all
109
- @format = params['format']
110
- if @format == 'proto'
111
- content_type :proto
112
- attachment 'messages.proto'
113
- @content
114
- else
115
- haml :game_messages
123
+ get '/clusterinfo' do
124
+ info = {}
125
+ info[:members] = {}
126
+ GameMachine::ClusterMonitor.cluster_members.keys.each do |key|
127
+ member = GameMachine::ClusterMonitor.cluster_members[key]
128
+ info[:members][key] = {:address => member.address, :status => member.status}
116
129
  end
130
+ info[:self_address] = GameMachine::Akka.instance.address
131
+
132
+ JSON.generate(info)
117
133
  end
118
134
 
119
- route :get, :post, '/auth' do
120
- res = controller(:auth).set_request(request,params).get
121
- if res == 'error'
122
- status 403
123
- body res
135
+ post '/api/client/login/:game_id' do
136
+ if authtoken = GameMachine::Handlers::PlayerAuthentication.instance.authorize(params['username'],params['password'])
137
+ content_type 'text/plain'
138
+ JSON.generate(auth_response(authtoken))
124
139
  else
125
- res
140
+ status 403
141
+ 'error'
126
142
  end
127
143
  end
144
+
145
+ get '/stats' do
146
+ @stats = {}
147
+ @stats[:local_player_count] = GameMachine::ClientManager.local_players.size
148
+ @stats[:local_players] = GameMachine::ClientManager.local_players
149
+ end
150
+
128
151
  end
129
152
 
130
153
  WebApp.run!
131
-