kaggle-environments 0.2.0__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.
- kaggle_environments/__init__.py +49 -13
- kaggle_environments/agent.py +177 -124
- kaggle_environments/api.py +31 -0
- kaggle_environments/core.py +298 -173
- kaggle_environments/envs/cabt/cabt.js +164 -0
- kaggle_environments/envs/cabt/cabt.json +28 -0
- kaggle_environments/envs/cabt/cabt.py +186 -0
- kaggle_environments/envs/cabt/cg/__init__.py +0 -0
- kaggle_environments/envs/cabt/cg/cg.dll +0 -0
- kaggle_environments/envs/cabt/cg/game.py +75 -0
- kaggle_environments/envs/cabt/cg/libcg.so +0 -0
- kaggle_environments/envs/cabt/cg/sim.py +48 -0
- kaggle_environments/envs/cabt/test_cabt.py +120 -0
- kaggle_environments/envs/chess/chess.js +4289 -0
- kaggle_environments/envs/chess/chess.json +60 -0
- kaggle_environments/envs/chess/chess.py +4241 -0
- kaggle_environments/envs/chess/test_chess.py +60 -0
- kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
- kaggle_environments/envs/connectx/connectx.js +1 -1
- kaggle_environments/envs/connectx/connectx.json +15 -1
- kaggle_environments/envs/connectx/connectx.py +6 -23
- kaggle_environments/envs/connectx/test_connectx.py +70 -24
- kaggle_environments/envs/football/football.ipynb +75 -0
- kaggle_environments/envs/football/football.json +91 -0
- kaggle_environments/envs/football/football.py +277 -0
- kaggle_environments/envs/football/helpers.py +95 -0
- kaggle_environments/envs/football/test_football.py +360 -0
- kaggle_environments/envs/halite/__init__.py +0 -0
- kaggle_environments/envs/halite/halite.ipynb +44741 -0
- kaggle_environments/envs/halite/halite.js +199 -83
- kaggle_environments/envs/halite/halite.json +31 -18
- kaggle_environments/envs/halite/halite.py +164 -303
- kaggle_environments/envs/halite/helpers.py +720 -0
- kaggle_environments/envs/halite/test_halite.py +190 -0
- kaggle_environments/envs/hungry_geese/__init__.py +0 -0
- kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
- kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +22 -15
- kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
- kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
- kaggle_environments/envs/identity/identity.json +6 -5
- kaggle_environments/envs/identity/identity.py +15 -2
- kaggle_environments/envs/kore_fleets/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
- kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
- kaggle_environments/envs/lux_ai_2021/README.md +3 -0
- kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
- kaggle_environments/envs/lux_ai_2021/index.html +43 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
- kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
- kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
- kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
- kaggle_environments/envs/lux_ai_s3/README.md +21 -0
- kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
- kaggle_environments/envs/lux_ai_s3/index.html +42 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
- kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
- kaggle_environments/envs/mab/__init__.py +0 -0
- kaggle_environments/envs/mab/agents.py +12 -0
- kaggle_environments/envs/mab/mab.js +100 -0
- kaggle_environments/envs/mab/mab.json +74 -0
- kaggle_environments/envs/mab/mab.py +146 -0
- kaggle_environments/envs/open_spiel/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
- kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
- kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
- kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
- kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
- kaggle_environments/envs/open_spiel/observation.py +128 -0
- kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
- kaggle_environments/envs/open_spiel/proxy.py +138 -0
- kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
- kaggle_environments/envs/rps/__init__.py +0 -0
- kaggle_environments/envs/rps/agents.py +84 -0
- kaggle_environments/envs/rps/helpers.py +25 -0
- kaggle_environments/envs/rps/rps.js +117 -0
- kaggle_environments/envs/rps/rps.json +63 -0
- kaggle_environments/envs/rps/rps.py +90 -0
- kaggle_environments/envs/rps/test_rps.py +110 -0
- kaggle_environments/envs/rps/utils.py +7 -0
- kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
- kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
- kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
- kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
- kaggle_environments/errors.py +2 -4
- kaggle_environments/helpers.py +377 -0
- kaggle_environments/main.py +214 -50
- kaggle_environments/schemas.json +23 -18
- kaggle_environments/static/player.html +206 -74
- kaggle_environments/utils.py +46 -73
- kaggle_environments-1.20.0.dist-info/METADATA +25 -0
- kaggle_environments-1.20.0.dist-info/RECORD +211 -0
- {kaggle_environments-0.2.0.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
- kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
- kaggle_environments/envs/battlegeese/battlegeese.py +0 -219
- kaggle_environments/temp.py +0 -14
- kaggle_environments-0.2.0.dist-info/METADATA +0 -393
- kaggle_environments-0.2.0.dist-info/RECORD +0 -33
- kaggle_environments-0.2.0.dist-info/entry_points.txt +0 -3
- kaggle_environments-0.2.0.dist-info/top_level.txt +0 -1
- {kaggle_environments-0.2.0.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 =
|
|
7
|
-
height =
|
|
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", "#
|
|
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
|
-
"#
|
|
40
|
-
"#
|
|
41
|
-
"#
|
|
42
|
-
"#
|
|
43
|
-
"#
|
|
44
|
-
"#
|
|
60
|
+
"#4BCF27",
|
|
61
|
+
"#34BB1C",
|
|
62
|
+
"#299516",
|
|
63
|
+
"#268814",
|
|
64
|
+
"#17560C",
|
|
65
|
+
"#14470A",
|
|
45
66
|
"#161616",
|
|
46
67
|
],
|
|
47
68
|
[
|
|
48
|
-
"#
|
|
49
|
-
"#
|
|
50
|
-
"#
|
|
51
|
-
"#
|
|
52
|
-
"#
|
|
53
|
-
"#
|
|
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
|
-
"#
|
|
82
|
-
"#
|
|
83
|
-
"#
|
|
84
|
-
"#
|
|
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
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
384
|
-
|
|
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,
|
|
446
|
+
players.forEach((player, playerIndex) => {
|
|
404
447
|
Object.values(player[1]).forEach(pos => {
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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,
|
|
474
|
+
players.forEach((player, playerIndex) => {
|
|
420
475
|
const [, shipyards, ships] = player;
|
|
421
476
|
Object.values(shipyards).forEach(
|
|
422
|
-
pos => (board[pos].shipyard =
|
|
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,
|
|
428
|
-
const status = state[
|
|
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][
|
|
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
|
|
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
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
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
|
+
"title": "Halite 4",
|
|
4
4
|
"description": "The game of space salt.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.2.1",
|
|
6
6
|
"agents": [1, 2, 4],
|
|
7
7
|
"configuration": {
|
|
8
8
|
"episodeSteps": 400,
|
|
9
|
-
"
|
|
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":
|
|
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":
|
|
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
|
|
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": "
|
|
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
|
|
131
|
+
"description": "The current agent's player index.",
|
|
114
132
|
"type": "integer",
|
|
115
133
|
"defaults": [0, 1, 2, 3]
|
|
116
134
|
},
|
|
117
|
-
"
|
|
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).",
|