kaggle-environments 0.2.1__py3-none-any.whl → 1.20.0__py3-none-any.whl

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.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

Files changed (215) hide show
  1. kaggle_environments/__init__.py +49 -13
  2. kaggle_environments/agent.py +177 -124
  3. kaggle_environments/api.py +31 -0
  4. kaggle_environments/core.py +295 -170
  5. kaggle_environments/envs/cabt/cabt.js +164 -0
  6. kaggle_environments/envs/cabt/cabt.json +28 -0
  7. kaggle_environments/envs/cabt/cabt.py +186 -0
  8. kaggle_environments/envs/cabt/cg/__init__.py +0 -0
  9. kaggle_environments/envs/cabt/cg/cg.dll +0 -0
  10. kaggle_environments/envs/cabt/cg/game.py +75 -0
  11. kaggle_environments/envs/cabt/cg/libcg.so +0 -0
  12. kaggle_environments/envs/cabt/cg/sim.py +48 -0
  13. kaggle_environments/envs/cabt/test_cabt.py +120 -0
  14. kaggle_environments/envs/chess/chess.js +4289 -0
  15. kaggle_environments/envs/chess/chess.json +60 -0
  16. kaggle_environments/envs/chess/chess.py +4241 -0
  17. kaggle_environments/envs/chess/test_chess.py +60 -0
  18. kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
  19. kaggle_environments/envs/connectx/connectx.js +1 -1
  20. kaggle_environments/envs/connectx/connectx.json +15 -1
  21. kaggle_environments/envs/connectx/connectx.py +6 -23
  22. kaggle_environments/envs/connectx/test_connectx.py +70 -24
  23. kaggle_environments/envs/football/football.ipynb +75 -0
  24. kaggle_environments/envs/football/football.json +91 -0
  25. kaggle_environments/envs/football/football.py +277 -0
  26. kaggle_environments/envs/football/helpers.py +95 -0
  27. kaggle_environments/envs/football/test_football.py +360 -0
  28. kaggle_environments/envs/halite/__init__.py +0 -0
  29. kaggle_environments/envs/halite/halite.ipynb +44741 -0
  30. kaggle_environments/envs/halite/halite.js +199 -83
  31. kaggle_environments/envs/halite/halite.json +31 -18
  32. kaggle_environments/envs/halite/halite.py +164 -303
  33. kaggle_environments/envs/halite/helpers.py +720 -0
  34. kaggle_environments/envs/halite/test_halite.py +190 -0
  35. kaggle_environments/envs/hungry_geese/__init__.py +0 -0
  36. kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
  37. kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
  38. kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
  39. kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
  40. kaggle_environments/envs/identity/identity.json +6 -5
  41. kaggle_environments/envs/identity/identity.py +15 -2
  42. kaggle_environments/envs/kore_fleets/__init__.py +0 -0
  43. kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
  44. kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
  45. kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
  46. kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
  47. kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
  48. kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
  49. kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
  50. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
  51. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
  52. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
  53. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
  54. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
  55. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
  56. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
  57. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
  58. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
  59. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
  60. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
  61. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
  62. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
  63. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
  64. kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
  65. kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
  66. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
  67. kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
  68. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
  69. kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
  70. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
  71. kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
  72. kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
  73. kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
  74. kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
  75. kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
  76. kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
  77. kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
  78. kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
  79. kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
  80. kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
  81. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
  82. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
  83. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
  84. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
  85. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
  86. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
  87. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
  88. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
  89. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
  90. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
  91. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
  92. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
  93. kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
  94. kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
  95. kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
  96. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
  97. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
  98. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
  99. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
  100. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
  101. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
  102. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
  103. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
  104. kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
  105. kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
  106. kaggle_environments/envs/lux_ai_2021/README.md +3 -0
  107. kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
  108. kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
  109. kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
  110. kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
  111. kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
  112. kaggle_environments/envs/lux_ai_2021/index.html +43 -0
  113. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
  114. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
  115. kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
  116. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
  117. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
  118. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
  119. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
  120. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
  121. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
  122. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
  123. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
  124. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
  125. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
  126. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
  127. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
  128. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
  129. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
  130. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
  131. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
  132. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
  133. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
  134. kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
  135. kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
  136. kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
  137. kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
  138. kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
  139. kaggle_environments/envs/lux_ai_s3/README.md +21 -0
  140. kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
  141. kaggle_environments/envs/lux_ai_s3/index.html +42 -0
  142. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
  143. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
  144. kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
  145. kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
  146. kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
  147. kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
  148. kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
  149. kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
  150. kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
  151. kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
  152. kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
  153. kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
  154. kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
  155. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
  156. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
  157. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
  158. kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
  159. kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
  160. kaggle_environments/envs/mab/__init__.py +0 -0
  161. kaggle_environments/envs/mab/agents.py +12 -0
  162. kaggle_environments/envs/mab/mab.js +100 -0
  163. kaggle_environments/envs/mab/mab.json +74 -0
  164. kaggle_environments/envs/mab/mab.py +146 -0
  165. kaggle_environments/envs/open_spiel/__init__.py +0 -0
  166. kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
  167. kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
  168. kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
  169. kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
  170. kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
  171. kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
  172. kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
  173. kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
  174. kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
  175. kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
  176. kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
  177. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
  178. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
  179. kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
  180. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
  181. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
  182. kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
  183. kaggle_environments/envs/open_spiel/observation.py +128 -0
  184. kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
  185. kaggle_environments/envs/open_spiel/proxy.py +138 -0
  186. kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
  187. kaggle_environments/envs/rps/__init__.py +0 -0
  188. kaggle_environments/envs/rps/agents.py +84 -0
  189. kaggle_environments/envs/rps/helpers.py +25 -0
  190. kaggle_environments/envs/rps/rps.js +117 -0
  191. kaggle_environments/envs/rps/rps.json +63 -0
  192. kaggle_environments/envs/rps/rps.py +90 -0
  193. kaggle_environments/envs/rps/test_rps.py +110 -0
  194. kaggle_environments/envs/rps/utils.py +7 -0
  195. kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
  196. kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
  197. kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
  198. kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
  199. kaggle_environments/errors.py +2 -4
  200. kaggle_environments/helpers.py +377 -0
  201. kaggle_environments/main.py +340 -0
  202. kaggle_environments/schemas.json +23 -18
  203. kaggle_environments/static/player.html +206 -74
  204. kaggle_environments/utils.py +46 -73
  205. kaggle_environments-1.20.0.dist-info/METADATA +25 -0
  206. kaggle_environments-1.20.0.dist-info/RECORD +211 -0
  207. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
  208. kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
  209. kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
  210. kaggle_environments/temp.py +0 -14
  211. kaggle_environments-0.2.1.dist-info/METADATA +0 -393
  212. kaggle_environments-0.2.1.dist-info/RECORD +0 -32
  213. kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
  214. kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
  215. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,10 +1,31 @@
1
+ // Copyright 2020 Kaggle Inc
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
1
15
  async function renderer({
2
16
  parent,
17
+ // The gamestep we're rendering, starting at 0 and going by default up to 399.
3
18
  step,
19
+ // We render several frames within a step for animation, and use float values in [0, 1] range.
20
+ // Rendering while the game is paused gives frame == 1.0.
4
21
  frame,
22
+ // Optional list of agents which will render a legend with player names.
23
+ agents,
24
+ // update fn which lets us pass rendering info for `agents` for the legend.
25
+ update,
5
26
  environment,
6
- width = 400,
7
- height = 400,
27
+ width = 800,
28
+ height = 600,
8
29
  }) {
9
30
  // Configuration.
10
31
  const { size } = environment.configuration;
@@ -15,7 +36,7 @@ async function renderer({
15
36
  const colors = {
16
37
  bg: "#000B49",
17
38
  bgGradient: "#000B2A",
18
- players: ["#E2CD13", "#F24E4E", "#9BE38E", "#20BDFF"],
39
+ players: ["#E2CD13", "#F24E4E", "#34BB1C", "#7B33E2"],
19
40
  ships: [
20
41
  [
21
42
  "#F1E61D",
@@ -36,27 +57,30 @@ async function renderer({
36
57
  "#161616",
37
58
  ],
38
59
  [
39
- "#51E32A",
40
- "#36C61C",
41
- "#2EA818",
42
- "#299515",
43
- "#1B630E",
44
- "#17540C",
60
+ "#4BCF27",
61
+ "#34BB1C",
62
+ "#299516",
63
+ "#268814",
64
+ "#17560C",
65
+ "#14470A",
45
66
  "#161616",
46
67
  ],
47
68
  [
48
- "#2FDEFF",
49
- "#20BDFF",
50
- "#1AA1D9",
51
- "#168EBE",
52
- "#105F80",
53
- "#0F516D",
69
+ "#BA4DF2",
70
+ "#7B33E2",
71
+ "#692BC0",
72
+ "#5C26AB",
73
+ "#3D1971",
74
+ "#341561",
54
75
  "#161616",
55
76
  ],
56
77
  ],
57
78
  };
58
79
 
59
- // Rectangle coordinates on a 20x20 grid.
80
+ // Rectangle coordinates on a 20x20 grid, with ';' as separator.
81
+ // Each entry is either a color or a list of [x, y, w, h, special, minFrame, maxFrame]
82
+ // with default values of [0, 0, 1, 1, 0, 0, 1] if missing. "special" is a bitmask
83
+ // which indicates to swap across axes to help with mirroring common subimages.
60
84
  const rects = {
61
85
  ship: [
62
86
  "9.5,0;9,1;8,3,1,2;7,5,1,2;6,7,1,2;7,10,2;9,9",
@@ -78,10 +102,10 @@ async function renderer({
78
102
  "#FFFFFF66;9,9,2,2,0,0.4;6,6,1,1,14,0.6;5,5,1,1,14,0.7;4,4,1,1,14,0.8;3,3,1,1,14,0.9;2,2,1,1,14,1",
79
103
  ],
80
104
  explosion: [
81
- "#C84302;7,7,1,1,14;6,9,1,2,4;5,5,1,1,14,0.25;9,5,2,10,0,0.25;6,9,8,2,0,0.25;3,3,1,1,14,0.5;7,6,1,1,15,0.5;5,4,1,1,14,0.75;4,5,1,1,14,0.75;8,5,1,1,14,0.75;9,4,2,1,2,0.75;4,8,1,1,14,0.75;7,2,1,1,14,0.75;",
82
- "#FF972E;9,6,2,1,2;8,9,4,2;4,9,1,2,4,0.25,0.74;9,6,2,8,0,0.25;7,7,6,2,2,0.25;2,9,1,2,4,0.5;6,7,8,2,2,0.75;9,5,2,10,0,0.75;8,6,4,8,0,0.5;6,6,1,1,14,0.75;5,5,1,1,14,0.75;5,7,1,1,14,0.75;7,4,1,1,14,0.75;",
83
- "#FEF545;9,8,2,4;9,7,2,6,0,0.25;8,8,4,4,0,0.25;8,7,1,1,14,0.5;8,7,4,6,1,0.75;9,6,2,1,2,0.75;",
84
- "#FFF5FF;9,9,2,2;8,9,4,2,1,0.25;7,9,6,2,0,0.5;9,7,2,6,0,0.75",
105
+ "#C84302BB;7,7,1,1,14;6,9,1,2,4;5,5,1,1,14,0.25;9,5,2,10,0,0.25;6,9,8,2,0,0.25;3,3,1,1,14,0.5;7,6,1,1,15,0.5;5,4,1,1,14,0.75;4,5,1,1,14,0.75;8,5,1,1,14,0.75;9,4,2,1,2,0.75;4,8,1,1,14,0.75;7,2,1,1,14,0.75;",
106
+ "#FF972EBB;9,6,2,1,2;8,9,4,2;4,9,1,2,4,0.25,0.74;9,6,2,8,0,0.25;7,7,6,2,2,0.25;2,9,1,2,4,0.5;6,7,8,2,2,0.75;9,5,2,10,0,0.75;8,6,4,8,0,0.5;6,6,1,1,14,0.75;5,5,1,1,14,0.75;5,7,1,1,14,0.75;7,4,1,1,14,0.75;",
107
+ "#FEF545BB;9,8,2,4;9,7,2,6,0,0.25;8,8,4,4,0,0.25;8,7,1,1,14,0.5;8,7,4,6,1,0.75;9,6,2,1,2,0.75;",
108
+ "#FFF5FFBB;9,9,2,2;8,9,4,2,1,0.25;7,9,6,2,0,0.5;9,7,2,6,0,0.75",
85
109
  ],
86
110
  largeHalite: [
87
111
  "#008DFF;17,6;2,13;9,1,2,18,1;5,7,10,6,1",
@@ -246,11 +270,11 @@ async function renderer({
246
270
 
247
271
  const getShipDir = (playerIndex, uid) => {
248
272
  for (let s = step; s >= 0; s--) {
249
- const action = environment.steps[s][playerIndex].action;
273
+ const action = environment.steps[s][playerIndex].action || {};
250
274
  if (uid in action) return Math.max(directions.indexOf(action[uid]), 0);
251
275
  }
252
276
  for (let s = step + 1; s < environment.steps.length; s++) {
253
- const action = environment.steps[s][playerIndex].action;
277
+ const action = environment.steps[s][playerIndex].action || {};
254
278
  if (uid in action) return Math.max(directions.indexOf(action[uid]), 0);
255
279
  }
256
280
  return 0;
@@ -317,6 +341,12 @@ async function renderer({
317
341
  });
318
342
  }
319
343
  });
344
+ // Shipyards.
345
+ colors.players.forEach((color, n) => {
346
+ move(ctx, { x: 500 + 100 * n, y: 400 }, () => {
347
+ rects.shipyard.forEach(v => drawRects(ctx, v, color, 5));
348
+ });
349
+ })
320
350
  }
321
351
 
322
352
  // Restore Canvases.
@@ -345,7 +375,46 @@ async function renderer({
345
375
  yOffset,
346
376
  } = data(bufferCanvas, "storage");
347
377
 
378
+ const topLeftCell = getCoords(0);
379
+ const botRightCell = getCoords(size * size - 1);
380
+
381
+ const renderHalite = (ctx, pos, halite, maxHalite, scaleFactor, rotate) => {
382
+ if (halite <= 0) return;
383
+
384
+ let { dx, dy, ds, ss } = getCoords(pos);
385
+ let sx = 0;
386
+ let sy = 0;
387
+
388
+ const pct = Math.min(1, halite / maxHalite);
389
+ let scale = 1;
390
+
391
+ // Scale by the halite size.
392
+ if (pct > 0.7) {
393
+ scale = pct;
394
+ } else if (pct > 0.3) {
395
+ sy = 100;
396
+ scale = pct + 0.3;
397
+ } else {
398
+ sy = 200;
399
+ scale = pct * 3;
400
+ }
401
+
402
+ // Apply the scale.
403
+ scale = Math.max(0.3, scaleFactor * scale);
404
+ dx += (ds - ds * scale) / 2;
405
+ dy += (ds - ds * scale) / 2;
406
+ ds *= scale;
407
+
408
+ // Rotate the halite to get a bit of randomness, if desired.
409
+ move(
410
+ ctx,
411
+ { x: dx, y: dy, width: ds, height: ds, angle: rotate ? haliteRotations[pos] : 0 },
412
+ () => ctx.drawImage(bufferCanvas, sx, sy, ss, ss, 0, 0, ds, ds)
413
+ );
414
+ }
415
+
348
416
  // Render Background once per step (Gradient + Halite)
417
+ const boxPadding = height * 0.007;
349
418
  if (data(bgCanvas, "step") !== step) {
350
419
  data(bgCanvas, "step", step);
351
420
  bgCtx.fillStyle = colors.bg;
@@ -358,56 +427,42 @@ async function renderer({
358
427
  bgCtx.fillStyle = bgStyle;
359
428
  bgCtx.fillRect(0, 0, bgCanvas.width, bgCanvas.height);
360
429
 
361
- // Render the halite.
362
- halite.forEach((cellHalite, pos) => {
363
- if (!cellHalite) return;
364
-
365
- let { dx, dy, ds, ss } = getCoords(pos);
366
- let sx = 0;
367
- let sy = 0;
368
-
369
- const pct = Math.min(cellHalite, maxCellHalite) / maxCellHalite;
370
- let scale = 1;
371
-
372
- // Scale by the halite size.
373
- if (pct > 0.7) {
374
- scale = pct;
375
- } else if (pct < 0.3) {
376
- scale = pct / 0.3;
377
- sy = 200;
378
- } else {
379
- sy = 100;
380
- scale = pct + 0.3;
381
- }
430
+ // Render bounding box.
431
+ bgCtx.strokeStyle = "white";
432
+ bgCtx.lineWidth = 0.5;
433
+ bgCtx.strokeRect(
434
+ topLeftCell.dx - boxPadding,
435
+ topLeftCell.dy - boxPadding,
436
+ botRightCell.dx + botRightCell.ds - topLeftCell.dx + 2 * boxPadding,
437
+ botRightCell.dy + botRightCell.ds - topLeftCell.dy + 2 * boxPadding);
382
438
 
383
- // Apply the scale.
384
- scale = Math.max(0.3, scale);
385
- dx += (ds - ds * scale) / 2;
386
- dy += (ds - ds * scale) / 2;
387
- ds *= scale;
388
-
389
- // Rotate the halite to get a bit of randomness.
390
- move(
391
- bgCtx,
392
- { x: dx, y: dy, width: ds, height: ds, angle: haliteRotations[pos] },
393
- () => {
394
- bgCtx.drawImage(bufferCanvas, sx, sy, ss, ss, 0, 0, ds, ds);
395
- }
396
- );
397
- });
439
+ // Render the halite.
440
+ halite.forEach((cellHalite, pos) => renderHalite(bgCtx, pos, cellHalite, 500, 1, true));
398
441
  }
399
442
 
400
443
  // Render Foreground (every frame).
401
444
 
402
445
  // Draw Shipyards.
403
- players.forEach((player, player_index) => {
446
+ players.forEach((player, playerIndex) => {
404
447
  Object.values(player[1]).forEach(pos => {
405
- const { scale, dx, dy } = getCoords(pos);
406
- move(fgCtx, { x: dx, y: dy, scale }, () => {
407
- rects.shipyard.forEach((v, i) =>
408
- drawRects(fgCtx, v, colors.players[player_index], 5)
409
- );
410
- });
448
+ const shipx = 500 + 100 * playerIndex;
449
+ const ss = fixedCellSize;
450
+ const { dx, dy, ds } = getCoords(pos);
451
+ fgCtx.drawImage(bufferCanvas, shipx, 400, ss, ss, dx, dy, ds, ds);
452
+ });
453
+ });
454
+
455
+ // Draw Ships and a smaller Halite icon according to their current cargo.
456
+ players.forEach((player, playerIndex) => {
457
+ Object.entries(player[2]).forEach(([uid, [pos, cargo]]) => {
458
+ const shipx = 500 + 100 * playerIndex;
459
+ const flamex = 200 + 100 * Math.min(2, Math.floor(3 * frame));
460
+ const { dx, dy, ds } = getCoords(pos);
461
+ const sy = getShipDir(playerIndex, uid) * 100;
462
+ const ss = fixedCellSize;
463
+ fgCtx.drawImage(bufferCanvas, shipx, sy, ss, ss, dx, dy, ds, ds);
464
+ fgCtx.drawImage(bufferCanvas, flamex, sy, ss, ss, dx, dy, ds, ds);
465
+ renderHalite(fgCtx, pos, cargo, 1500, 0.6, false);
411
466
  });
412
467
  });
413
468
 
@@ -416,19 +471,18 @@ async function renderer({
416
471
  const board = Array(size * size)
417
472
  .fill(0)
418
473
  .map(() => ({ shipyard: -1, ship: null, collision: false }));
419
- players.forEach((player, player_index) => {
474
+ players.forEach((player, playerIndex) => {
420
475
  const [, shipyards, ships] = player;
421
476
  Object.values(shipyards).forEach(
422
- pos => (board[pos].shipyard = player_index)
477
+ pos => (board[pos].shipyard = playerIndex)
423
478
  );
424
479
  Object.entries(ships).forEach(([uid, [pos]]) => (board[pos].ship = uid));
425
480
  });
426
481
  environment.steps[step - 1][0].observation.players.forEach(
427
- (player, player_index) => {
428
- const status = state[player_index].status;
429
- if (status != "ACTIVE" && status != "DONE") return;
482
+ (player, playerIndex) => {
483
+ const status = state[playerIndex].status;
430
484
  const [, shipyards, ships] = player;
431
- const action = environment.steps[step][player_index].action;
485
+ const action = environment.steps[step][playerIndex].action || {};
432
486
  // Stationary ships collecting Halite.
433
487
  Object.entries(ships).forEach(([uid, [pos]]) => {
434
488
  if (uid in action) return;
@@ -455,21 +509,83 @@ async function renderer({
455
509
  if (!collision) return;
456
510
  const { dx, dy, ds, ss } = getCoords(pos);
457
511
  const sx = 100;
458
- const sy = 100 * Math.round(4 - frame * 4);
512
+ const sy = 100 * Math.round(4 * (1 - frame));
459
513
  fgCtx.drawImage(bufferCanvas, sx, sy, ss, ss, dx, dy, ds, ds);
460
514
  });
461
515
  }
462
516
 
463
- // Draw Ships.
464
- players.forEach((player, player_index) => {
465
- Object.entries(player[2]).forEach(([uid, [pos]]) => {
466
- const shipx = 500 + 100 * player_index;
467
- const flamex = 200 + (frame <= 0.33 ? 0 : frame >= 0.66 ? 200 : 100);
468
- const { dx, dy, ds } = getCoords(pos);
469
- const sy = getShipDir(player_index, uid) * 100;
470
- const ss = fixedCellSize;
471
- fgCtx.drawImage(bufferCanvas, shipx, sy, ss, ss, dx, dy, ds, ds);
472
- fgCtx.drawImage(bufferCanvas, flamex, sy, ss, ss, dx, dy, ds, ds);
517
+ const scoreboardFontSizePx = Math.round(height / 36);
518
+ const scoreboardPaddingPx = Math.max(1, scoreboardFontSizePx / 4);
519
+ const scoreboardLineYDiffPx = scoreboardFontSizePx + scoreboardPaddingPx;
520
+
521
+ const getHalite = player => player[0];
522
+ const getCargo = player => Object.entries(player[2]).map(([, v]) => v[1]).reduce((a, b) => a + b, 0);
523
+ const getNumShips = player => Object.entries(player[2]).length;
524
+ const getNumShipyards = player => Object.entries(player[1]).length;
525
+
526
+ // Writes two lines, "Halite" and "Cargo", and returns y value for what would be the third line.
527
+ const writeScoreboardText = (ctx, player, x, y) => {
528
+ ctx.fillText(`Halite: ${getHalite(player)}`, x, y);
529
+ ctx.fillText(`Cargo: ${getCargo(player)}`, x, y + scoreboardLineYDiffPx);
530
+ return y + 2 * scoreboardLineYDiffPx;
531
+ }
532
+
533
+ const scoreboardShipSizePx = scoreboardFontSizePx * 1.7;
534
+ const drawShip = (ctx, playerIndex, x, y, iconSize = scoreboardShipSizePx) => ctx.drawImage(
535
+ bufferCanvas, 500 + 100 * playerIndex, 0, fixedCellSize, fixedCellSize,
536
+ x, y, iconSize, iconSize);
537
+ const drawShipYard = (ctx, playerIndex, x, y, iconSize = scoreboardShipSizePx) => ctx.drawImage(
538
+ bufferCanvas, 500 + 100 * playerIndex, 400, fixedCellSize, fixedCellSize,
539
+ x, y, iconSize, iconSize);
540
+
541
+ const scoreboardShipXPaddingPx = scoreboardShipSizePx + scoreboardPaddingPx;
542
+ const drawShipAndYardCounts = (ctx, player, playerIndex, x, y, iconSize = scoreboardShipSizePx) => {
543
+ drawShip(ctx, playerIndex, x, y);
544
+ ctx.fillText(`x ${getNumShips(player)}`, x + scoreboardShipXPaddingPx, y + 0.28 * iconSize);
545
+ drawShipYard(ctx, playerIndex, x, y + iconSize);
546
+ ctx.fillText(`x ${getNumShipyards(player)}`, x + scoreboardShipXPaddingPx, y + 1.38 * iconSize);
547
+ }
548
+
549
+ // Render Scoreboard for each player, if we have enough room on the sides of the window.
550
+ if (width / height >= 1.3) {
551
+ fgCtx.fillStyle = "#FFFFFF";
552
+ fgCtx.font = `normal ${scoreboardFontSizePx}px sans-serif`;
553
+ fgCtx.textBaseline = "top";
554
+ fgCtx.textAlign = "left";
555
+ const topStartY = topLeftCell.dy;
556
+ const bottomStartY = botRightCell.dy + botRightCell.ds - 2 * scoreboardShipSizePx - 2 * scoreboardLineYDiffPx;
557
+ players.forEach((player, playerIndex) => {
558
+ const x = playerIndex % 2 === 1
559
+ ? Math.max(
560
+ // Make sure we don't start within the game area on the right side.
561
+ botRightCell.dx + botRightCell.ds + 2 * boxPadding,
562
+ width - topLeftCell.dy - 5.5 * scoreboardFontSizePx)
563
+ : topLeftCell.dy;
564
+ const startY = playerIndex < 2 ? topStartY : bottomStartY;
565
+ const nextY = writeScoreboardText(fgCtx, player, x, startY);
566
+ drawShipAndYardCounts(fgCtx, player, playerIndex, x, nextY);
473
567
  });
474
- });
568
+ }
569
+
570
+ // Populate the legend which renders agent icons and names (see player.html).
571
+ if (agents && agents.length && (!agents[0].color || !agents[0].image)) {
572
+ const getPieceImage = playerIndex => {
573
+ const pieceCanvas = document.createElement("canvas");
574
+ parent.appendChild(pieceCanvas);
575
+ pieceCanvas.style.marginLeft = "10000px";
576
+ pieceCanvas.width = 100;
577
+ pieceCanvas.height = 100;
578
+ ctx = pieceCanvas.getContext("2d");
579
+ drawShip(ctx, playerIndex, 0, 0, 100);
580
+ const dataUrl = pieceCanvas.toDataURL();
581
+ parent.removeChild(pieceCanvas);
582
+ return dataUrl;
583
+ };
584
+
585
+ agents.forEach(agent => {
586
+ agent.color = "#FFFFFF";
587
+ agent.image = getPieceImage(agent.index);
588
+ });
589
+ update({ agents });
590
+ }
475
591
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "halite",
3
- "title": "Halite 3.1",
3
+ "title": "Halite 4",
4
4
  "description": "The game of space salt.",
5
- "version": "1.0.0",
5
+ "version": "1.2.1",
6
6
  "agents": [1, 2, 4],
7
7
  "configuration": {
8
8
  "episodeSteps": 400,
9
- "halite": {
9
+ "startingHalite": {
10
10
  "description": "The starting amount of halite available on the board.",
11
11
  "type": "integer",
12
12
  "default": 24000
@@ -14,7 +14,7 @@
14
14
  "size": {
15
15
  "description": "The number of cells vertically and horizontally on the board.",
16
16
  "type": "integer",
17
- "default": 15,
17
+ "default": 21,
18
18
  "minimum": 2
19
19
  },
20
20
  "spawnCost": {
@@ -26,13 +26,13 @@
26
26
  "convertCost": {
27
27
  "description": "The amount of halite to convert a ship into a shipyard.",
28
28
  "type": "integer",
29
- "default": 2000,
29
+ "default": 500,
30
30
  "minimum": 0
31
31
  },
32
32
  "moveCost": {
33
33
  "description": "The percent deducted from ship's current halite per move.",
34
34
  "type": "number",
35
- "default": 0.1,
35
+ "default": 0,
36
36
  "minimum": 0
37
37
  },
38
38
  "collectRate": {
@@ -46,17 +46,35 @@
46
46
  "type": "number",
47
47
  "default": 0.02,
48
48
  "minimum": 0
49
- }
49
+ },
50
+ "maxCellHalite": {
51
+ "description": "The maximum halite that can be in any cell.",
52
+ "type": "integer",
53
+ "default": 500,
54
+ "minimum": 0
55
+ },
56
+ "randomSeed": {
57
+ "description": "The seed used to initialize the random number generator.",
58
+ "type": "integer",
59
+ "default": null
60
+ },
61
+ "agentTimeout": {
62
+ "description": "Obsolete field kept for backwards compatibility, please use observation.remainingOverageTime.",
63
+ "type": "number",
64
+ "minimum": 0,
65
+ "default": 60
66
+ },
67
+ "actTimeout": 3,
68
+ "runTimeout": 9600
50
69
  },
51
70
  "reward": {
52
- "description": "The amount of player owned halite (equal to players[index][0]).",
71
+ "description": "The amount of player owned halite (equal to players[index][0]) if the player has not been eliminated, else step_eliminated - episode_steps - 1.",
53
72
  "type": "integer",
54
- "default": 5000,
55
- "minimum": 0
73
+ "default": 5000
56
74
  },
57
75
  "observation": {
58
76
  "halite": {
59
- "description": "Halite: Serialized list of available halite per cell on the board.",
77
+ "description": "Serialized list of available halite per cell on the board.",
60
78
  "type": "array",
61
79
  "shared": true,
62
80
  "items": {
@@ -110,16 +128,11 @@
110
128
  }
111
129
  },
112
130
  "player": {
113
- "description": "The agents player index.",
131
+ "description": "The current agent's player index.",
114
132
  "type": "integer",
115
133
  "defaults": [0, 1, 2, 3]
116
134
  },
117
- "step": {
118
- "description": "The current step index within the episode.",
119
- "type": "integer",
120
- "shared": true,
121
- "minimum": 0
122
- }
135
+ "remainingOverageTime": 60
123
136
  },
124
137
  "action": {
125
138
  "description": "Actions taken per asset (ship or shipyard).",