Skip to content

Commit ddf2148

Browse files
🎉 Ensure gym.make work for all common HCraft envs (#32)
2 parents c845de6 + da95b04 commit ddf2148

14 files changed

Lines changed: 90 additions & 47 deletions

File tree

src/hcraft/examples/__init__.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import hcraft.examples.recursive as recursive
2121
import hcraft.examples.tower as tower
2222

23-
from hcraft.examples.minecraft.env import MineHcraftEnv
23+
from hcraft.examples.minecraft import MineHcraftEnv, MINEHCRAFT_GYM_ENVS
2424
from hcraft.examples.random_simple import RandomHcraftEnv
2525
from hcraft.examples.recursive import LightRecursiveHcraftEnv, RecursiveHcraftEnv
2626
from hcraft.examples.tower import TowerHcraftEnv
27-
from hcraft.examples.minicraft import MINICRAFT_ENVS
27+
from hcraft.examples.minicraft import MINICRAFT_ENVS, MINICRAFT_GYM_ENVS
2828

2929
EXAMPLE_ENVS = [
3030
MineHcraftEnv,
@@ -35,6 +35,15 @@
3535
# RandomHcraftEnv,
3636
]
3737

38+
HCRAFT_GYM_ENVS = [
39+
*MINEHCRAFT_GYM_ENVS,
40+
*MINICRAFT_GYM_ENVS,
41+
"TowerHcraft-v1",
42+
"RecursiveHcraft-v1",
43+
"LightRecursiveHcraft-v1",
44+
]
45+
46+
3847
__all__ = [
3948
"minecraft",
4049
"minicraft",

src/hcraft/examples/minecraft/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from hcraft.purpose import Purpose, RewardShaping, platinium_purpose
1313
from hcraft.task import GetItemTask
1414

15+
MINEHCRAFT_GYM_ENVS = []
16+
1517
# gym is an optional dependency
1618
try:
1719
import gym
@@ -24,13 +26,15 @@
2426
entry_point=ENV_PATH,
2527
kwargs={"purpose": None},
2628
)
29+
MINEHCRAFT_GYM_ENVS.append("MineHcraft-NoReward-v1")
2730

2831
# Get all items, place all zones_items and go everywhere
2932
gym.register(
3033
id="MineHcraft-v1",
3134
entry_point=ENV_PATH,
3235
kwargs={"purpose": platinium_purpose(MineHcraftEnv().world)},
3336
)
37+
MINEHCRAFT_GYM_ENVS.append("MineHcraft-v1")
3438

3539
def _to_camel_case(name: str):
3640
return "".join([subname.capitalize() for subname in name.split("_")])
@@ -50,13 +54,15 @@ def _register_minehcraft_single_item(
5054
)
5155
if name is None:
5256
name = _to_camel_case(item.name)
57+
gym_name = f"MineHcraft-{name}-v{version}"
5358
gym.register(
54-
id=f"MineHcraft-{name}-v{version}",
59+
id=gym_name,
5560
entry_point=ENV_PATH,
5661
kwargs={"purpose": purpose},
5762
)
63+
MINEHCRAFT_GYM_ENVS.append(gym_name)
5864

59-
_register_minehcraft_single_item(items.DIRT)
65+
_register_minehcraft_single_item(items.WOOD)
6066
_register_minehcraft_single_item(items.COBBLESTONE, name="Stone")
6167
_register_minehcraft_single_item(items.IRON_INGOT, name="Iron")
6268
_register_minehcraft_single_item(items.DIAMOND)
Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,56 @@
1-
from hcraft.examples.minicraft.empty import MiniCraftEmpty
2-
from hcraft.examples.minicraft.fourrooms import MiniCraftFourRooms
3-
from hcraft.examples.minicraft.multiroom import MiniCraftMultiRoom
4-
from hcraft.examples.minicraft.crossing import MiniCraftCrossing
5-
from hcraft.examples.minicraft.doorkey import MiniCraftDoorKey
6-
from hcraft.examples.minicraft.unlock import MiniCraftUnlock
7-
from hcraft.examples.minicraft.unlockpickup import MiniCraftUnlockPickup
8-
from hcraft.examples.minicraft.unlockpickupblocked import MiniCraftBlockedUnlockPickup
9-
from hcraft.examples.minicraft.keycorridor import MiniCraftKeyCorridor
1+
import inspect
2+
from pathlib import Path
3+
4+
from hcraft.examples.minicraft.empty import MiniHCraftEmpty
5+
from hcraft.examples.minicraft.fourrooms import MiniHCraftFourRooms
6+
from hcraft.examples.minicraft.multiroom import MiniHCraftMultiRoom
7+
from hcraft.examples.minicraft.crossing import MiniHCraftCrossing
8+
from hcraft.examples.minicraft.doorkey import MiniHCraftDoorKey
9+
from hcraft.examples.minicraft.unlock import MiniHCraftUnlock
10+
from hcraft.examples.minicraft.unlockpickup import MiniHCraftUnlockPickup
11+
from hcraft.examples.minicraft.unlockpickupblocked import MiniHCraftBlockedUnlockPickup
12+
from hcraft.examples.minicraft.keycorridor import MiniHCraftKeyCorridor
1013

1114

1215
MINICRAFT_ENVS = [
13-
MiniCraftEmpty,
14-
MiniCraftFourRooms,
15-
MiniCraftMultiRoom,
16-
MiniCraftCrossing,
17-
MiniCraftDoorKey,
18-
MiniCraftUnlock,
19-
MiniCraftUnlockPickup,
20-
MiniCraftBlockedUnlockPickup,
21-
MiniCraftKeyCorridor,
16+
MiniHCraftEmpty,
17+
MiniHCraftFourRooms,
18+
MiniHCraftMultiRoom,
19+
MiniHCraftCrossing,
20+
MiniHCraftDoorKey,
21+
MiniHCraftUnlock,
22+
MiniHCraftUnlockPickup,
23+
MiniHCraftBlockedUnlockPickup,
24+
MiniHCraftKeyCorridor,
2225
]
2326

2427
__all__ = [
25-
"MiniCraftEmpty",
26-
"MiniCraftFourRooms",
27-
"MiniCraftMultiRoom",
28-
"MiniCraftCrossing",
29-
"MiniCraftDoorKey",
30-
"MiniCraftUnlock",
31-
"MiniCraftUnlockPickup",
32-
"MiniCraftBlockedUnlockPickup",
33-
"MiniCraftKeyCorridor",
28+
"MiniHCraftEmpty",
29+
"MiniHCraftFourRooms",
30+
"MiniHCraftMultiRoom",
31+
"MiniHCraftCrossing",
32+
"MiniHCraftDoorKey",
33+
"MiniHCraftUnlock",
34+
"MiniHCraftUnlockPickup",
35+
"MiniHCraftBlockedUnlockPickup",
36+
"MiniHCraftKeyCorridor",
3437
]
38+
39+
MINICRAFT_GYM_ENVS = []
40+
41+
try:
42+
import gym
43+
44+
ENV_PATH = "hcraft.examples.minicraft"
45+
46+
for env_class in MINICRAFT_ENVS:
47+
env_name = env_class().name
48+
submodule = Path(inspect.getfile(env_class)).name.split(".")[0]
49+
env_path = f"{ENV_PATH}.{submodule}:{env_class.__name__}"
50+
gym_name = f"{env_name}-v1"
51+
gym.register(id=gym_name, entry_point=env_path)
52+
MINICRAFT_GYM_ENVS.append(gym_name)
53+
54+
55+
except ImportError:
56+
pass

src/hcraft/examples/minicraft/crossing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1010

1111

12-
class MiniCraftCrossing(MiniCraftEnv):
12+
class MiniHCraftCrossing(MiniCraftEnv):
1313
MINICRAFT_NAME = "Crossing"
1414
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1515

src/hcraft/examples/minicraft/doorkey.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1010

1111

12-
class MiniCraftDoorKey(MiniCraftEnv):
12+
class MiniHCraftDoorKey(MiniCraftEnv):
1313
MINICRAFT_NAME = "DoorKey"
1414
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1515

src/hcraft/examples/minicraft/empty.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1010

1111

12-
class MiniCraftEmpty(MiniCraftEnv):
12+
class MiniHCraftEmpty(MiniCraftEnv):
1313
MINICRAFT_NAME = "Empty"
1414
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1515

src/hcraft/examples/minicraft/fourrooms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1111

1212

13-
class MiniCraftFourRooms(MiniCraftEnv):
13+
class MiniHCraftFourRooms(MiniCraftEnv):
1414
MINICRAFT_NAME = "FourRooms"
1515
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1616

src/hcraft/examples/minicraft/keycorridor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1010

1111

12-
class MiniCraftKeyCorridor(MiniCraftEnv):
12+
class MiniHCraftKeyCorridor(MiniCraftEnv):
1313
MINICRAFT_NAME = "KeyCorridor"
1414
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1515

src/hcraft/examples/minicraft/minicraft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(
4040
start_zones_items=start_zones_items,
4141
)
4242
world.resources_path = os.path.join(os.path.dirname(__file__), "resources")
43-
super().__init__(world, name=f"MiniCraft{self.minicraft_name}", **kwargs)
43+
super().__init__(world, name=f"MiniHCraft{self.minicraft_name}", **kwargs)
4444

4545
@abstractmethod
4646
def build_transformations(self) -> List[Transformation]:

src/hcraft/examples/minicraft/multiroom.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from hcraft.examples.minicraft.minicraft import MiniCraftEnv
1010

1111

12-
class MiniCraftMultiRoom(MiniCraftEnv):
12+
class MiniHCraftMultiRoom(MiniCraftEnv):
1313
MINICRAFT_NAME = "MultiRoom"
1414
__doc__ = MiniCraftEnv.description(MINICRAFT_NAME)
1515

0 commit comments

Comments
 (0)