miniworld-maze 1.1.0__tar.gz → 1.3.0__tar.gz

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 miniworld-maze might be problematic. Click here for more details.

Files changed (288) hide show
  1. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/PKG-INFO +25 -14
  2. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/README.md +23 -9
  3. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/basic_usage.py +4 -3
  4. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/benchmark_rendering.py +8 -2
  5. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/generate_observations.py +10 -3
  6. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/live_control_opencv.py +118 -141
  7. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/observation_level_demo.py +7 -4
  8. miniworld_maze-1.3.0/examples/save_topdown_views.py +215 -0
  9. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/pyproject.toml +2 -31
  10. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/__init__.py +17 -5
  11. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/constants.py +55 -14
  12. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/__init__.py +1 -1
  13. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/base_env.py +3 -0
  14. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/unified_env.py +23 -19
  15. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/__init__.py +0 -2
  16. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/base_grid_rooms.py +90 -15
  17. miniworld_maze-1.3.0/src/miniworld_maze/environments/factory.py +42 -0
  18. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/nine_rooms.py +5 -23
  19. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/spiral_nine_rooms.py +5 -23
  20. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/twenty_five_rooms.py +5 -38
  21. miniworld_maze-1.3.0/src/miniworld_maze/tools/__init__.py +3 -0
  22. miniworld_maze-1.3.0/src/miniworld_maze/utils.py +286 -0
  23. miniworld_maze-1.1.0/src/miniworld_maze/environments/factory.py +0 -105
  24. miniworld_maze-1.1.0/src/miniworld_maze/tools/__init__.py +0 -5
  25. miniworld_maze-1.1.0/src/miniworld_maze/tools/generate_observations.py +0 -199
  26. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/LICENSE +0 -0
  27. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/README.md +0 -0
  28. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/__init__.py +0 -0
  29. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/README.md +0 -0
  30. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/__init__.py +0 -0
  31. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/agent.py +0 -0
  32. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/base_entity.py +0 -0
  33. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/objects.py +0 -0
  34. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entity_manager.py +0 -0
  35. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/envs/__init__.py +0 -0
  36. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/math.py +0 -0
  37. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/objmesh.py +0 -0
  38. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/occlusion_queries.py +0 -0
  39. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/opengl.py +0 -0
  40. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/params.py +0 -0
  41. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/random.py +0 -0
  42. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/__init__.py +0 -0
  43. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/drawing.py +0 -0
  44. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/framebuffer.py +0 -0
  45. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/texture.py +0 -0
  46. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering_engine.py +0 -0
  47. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/room.py +0 -0
  48. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/texture_utils.py +0 -0
  49. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/airduct_grate_1.png +0 -0
  50. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/asphalt_1.png +0 -0
  51. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/beanpaste_1.png +0 -0
  52. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/beige_1.png +0 -0
  53. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/black_1.png +0 -0
  54. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/blueberry_1.png +0 -0
  55. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/brick_wall_1.png +0 -0
  56. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_1.png +0 -0
  57. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_2.png +0 -0
  58. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_3.png +0 -0
  59. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_4.png +0 -0
  60. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tile_noborder_1.png +0 -0
  61. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tiles_1.png +0 -0
  62. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cinder_blocks_1.png +0 -0
  63. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cobaltgreen_1.png +0 -0
  64. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_1.png +0 -0
  65. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_2.png +0 -0
  66. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_3.png +0 -0
  67. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_4.png +0 -0
  68. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_tiles_1.png +0 -0
  69. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/copperred_1.png +0 -0
  70. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/crimson_1.png +0 -0
  71. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_doom_1.png +0 -0
  72. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_doom_2.png +0 -0
  73. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_garage_red.png +0 -0
  74. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_garage_white.png +0 -0
  75. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_brown.png +0 -0
  76. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_grey.png +0 -0
  77. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_red.png +0 -0
  78. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/drywall_1.png +0 -0
  79. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_bw_1.png +0 -0
  80. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_white.png +0 -0
  81. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/grass_1.png +0 -0
  82. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/grass_2.png +0 -0
  83. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lava_1.png +0 -0
  84. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lava_2.png +0 -0
  85. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lemongrass_1.png +0 -0
  86. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightbeige_1.png +0 -0
  87. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightcobaltgreen_1.png +0 -0
  88. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightgray_1.png +0 -0
  89. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightnavyblue_1.png +0 -0
  90. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightskyblue_1.png +0 -0
  91. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lime_1.png +0 -0
  92. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/logo_mila_1.png +0 -0
  93. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/magenta_1.png +0 -0
  94. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/marble_1.png +0 -0
  95. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/marble_2.png +0 -0
  96. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_1.png +0 -0
  97. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_2.png +0 -0
  98. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/morningglory_1.png +0 -0
  99. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/navyblue_1.png +0 -0
  100. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/oakbrown_1.png +0 -0
  101. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/orange_1.png +0 -0
  102. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/orchid_1.png +0 -0
  103. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/picket_fence_1.png +0 -0
  104. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.license +0 -0
  105. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.png +0 -0
  106. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.license +0 -0
  107. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.png +0 -0
  108. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.license +0 -0
  109. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.png +0 -0
  110. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.license +0 -0
  111. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.png +0 -0
  112. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.license +0 -0
  113. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.png +0 -0
  114. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.license +0 -0
  115. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.png +0 -0
  116. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.license +0 -0
  117. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.png +0 -0
  118. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.license +0 -0
  119. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.png +0 -0
  120. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.license +0 -0
  121. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.png +0 -0
  122. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.license +0 -0
  123. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.png +0 -0
  124. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.license +0 -0
  125. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.png +0 -0
  126. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.license +0 -0
  127. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.png +0 -0
  128. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.license +0 -0
  129. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.png +0 -0
  130. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.license +0 -0
  131. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.png +0 -0
  132. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.license +0 -0
  133. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.png +0 -0
  134. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.license +0 -0
  135. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.png +0 -0
  136. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.license +0 -0
  137. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.png +0 -0
  138. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.license +0 -0
  139. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.png +0 -0
  140. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.license +0 -0
  141. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.png +0 -0
  142. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.license +0 -0
  143. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.png +0 -0
  144. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.license +0 -0
  145. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.png +0 -0
  146. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.license +0 -0
  147. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.png +0 -0
  148. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.license +0 -0
  149. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.png +0 -0
  150. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.license +0 -0
  151. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.png +0 -0
  152. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.license +0 -0
  153. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.png +0 -0
  154. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.license +0 -0
  155. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.png +0 -0
  156. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.license +0 -0
  157. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.png +0 -0
  158. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.license +0 -0
  159. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.png +0 -0
  160. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.license +0 -0
  161. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.png +0 -0
  162. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.license +0 -0
  163. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.png +0 -0
  164. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.license +0 -0
  165. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.png +0 -0
  166. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.license +0 -0
  167. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.png +0 -0
  168. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.license +0 -0
  169. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.png +0 -0
  170. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.license +0 -0
  171. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.png +0 -0
  172. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.license +0 -0
  173. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.png +0 -0
  174. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.license +0 -0
  175. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.png +0 -0
  176. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.license +0 -0
  177. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.png +0 -0
  178. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.license +0 -0
  179. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.png +0 -0
  180. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.license +0 -0
  181. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.png +0 -0
  182. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.license +0 -0
  183. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.png +0 -0
  184. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.license +0 -0
  185. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.png +0 -0
  186. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.license +0 -0
  187. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.png +0 -0
  188. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.license +0 -0
  189. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.png +0 -0
  190. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.license +0 -0
  191. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.png +0 -0
  192. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.license +0 -0
  193. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.png +0 -0
  194. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.license +0 -0
  195. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.png +0 -0
  196. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.license +0 -0
  197. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.png +0 -0
  198. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.license +0 -0
  199. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.png +0 -0
  200. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.license +0 -0
  201. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.png +0 -0
  202. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.license +0 -0
  203. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.png +0 -0
  204. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.license +0 -0
  205. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.png +0 -0
  206. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.license +0 -0
  207. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.png +0 -0
  208. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.license +0 -0
  209. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.png +0 -0
  210. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.license +0 -0
  211. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.png +0 -0
  212. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.license +0 -0
  213. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.png +0 -0
  214. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.license +0 -0
  215. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.png +0 -0
  216. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.license +0 -0
  217. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.png +0 -0
  218. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.license +0 -0
  219. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.png +0 -0
  220. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.license +0 -0
  221. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.png +0 -0
  222. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.license +0 -0
  223. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.png +0 -0
  224. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.license +0 -0
  225. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.png +0 -0
  226. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.license +0 -0
  227. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.png +0 -0
  228. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.license +0 -0
  229. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.png +0 -0
  230. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.license +0 -0
  231. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.png +0 -0
  232. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.license +0 -0
  233. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.png +0 -0
  234. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.license +0 -0
  235. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.png +0 -0
  236. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.license +0 -0
  237. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.png +0 -0
  238. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.license +0 -0
  239. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.png +0 -0
  240. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.license +0 -0
  241. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.png +0 -0
  242. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.license +0 -0
  243. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.png +0 -0
  244. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.license +0 -0
  245. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.png +0 -0
  246. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.license +0 -0
  247. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.png +0 -0
  248. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.license +0 -0
  249. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.png +0 -0
  250. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.license +0 -0
  251. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.png +0 -0
  252. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.license +0 -0
  253. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.png +0 -0
  254. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.license +0 -0
  255. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.png +0 -0
  256. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.license +0 -0
  257. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.png +0 -0
  258. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.license +0 -0
  259. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.png +0 -0
  260. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.license +0 -0
  261. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.png +0 -0
  262. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.license +0 -0
  263. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.png +0 -0
  264. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.license +0 -0
  265. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.png +0 -0
  266. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.license +0 -0
  267. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.png +0 -0
  268. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/realblueberry_1.png +0 -0
  269. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/redbean_1.png +0 -0
  270. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/rock_1.png +0 -0
  271. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/seablue_1.png +0 -0
  272. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/silver_1.png +0 -0
  273. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/skyblue_1.png +0 -0
  274. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/slime_1.png +0 -0
  275. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/stucco_1.png +0 -0
  276. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/sunnyyellow_1.png +0 -0
  277. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/turquoise_1.png +0 -0
  278. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/violet_1.png +0 -0
  279. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_1.png +0 -0
  280. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_2.png +0 -0
  281. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_3.png +0 -0
  282. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/white_1.png +0 -0
  283. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_1.png +0 -0
  284. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_2.png +0 -0
  285. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_planks_1.png +0 -0
  286. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/utils.py +0 -0
  287. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/wrappers.py +0 -0
  288. {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/observation_types.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: miniworld-maze
3
- Version: 1.1.0
4
- Summary: Multi-room maze environments from the DrStrategy paper for reinforcement learning research
3
+ Version: 1.3.0
4
+ Summary: Multi-room maze environments from the DrStrategy paper. Provides NineRooms-v0, SpiralNineRooms-v0, and TwentyFiveRooms-v0 gymnasium environments.
5
5
  Keywords: reinforcement-learning,environment,gymnasium,multi-room-maze,drstrategy,maze-navigation,partial-observability,3d-environments
6
6
  Author: Tim Joseph
7
7
  Author-email: Tim Joseph <tim@mctigger.com>
@@ -46,9 +46,6 @@ Requires-Dist: opencv-python>=4.5.0,<5.0.0
46
46
  Requires-Dist: pillow>=8.0.0,<11.0.0
47
47
  Requires-Dist: pyopengl>=3.1.0,<4.0.0
48
48
  Requires-Dist: pyglet>=1.5.0,<2.0.0
49
- Requires-Dist: black>=22.0,<25.0 ; extra == 'dev'
50
- Requires-Dist: isort>=5.10,<6.0 ; extra == 'dev'
51
- Requires-Dist: flake8>=4.0,<7.0 ; extra == 'dev'
52
49
  Requires-Dist: ruff>=0.1.0,<1.0.0 ; extra == 'dev'
53
50
  Requires-Dist: build>=0.8.0,<2.0.0 ; extra == 'dev'
54
51
  Requires-Dist: twine>=4.0.0,<6.0.0 ; extra == 'dev'
@@ -83,6 +80,18 @@ pip install miniworld-maze
83
80
 
84
81
  ## Usage
85
82
 
83
+ ### Registered Environments
84
+
85
+ This package registers the following gymnasium environments:
86
+
87
+ | Environment ID | Description | Rooms | Max Steps |
88
+ |---|---|---|---|
89
+ | `NineRooms-v0` | Standard 3×3 grid with adjacent room connections | 9 | 1000 |
90
+ | `SpiralNineRooms-v0` | 3×3 grid with spiral connection pattern | 9 | 1000 |
91
+ | `TwentyFiveRooms-v0` | Large 5×5 grid with complex navigation | 25 | 1000 |
92
+
93
+ All environments use `TOP_DOWN_PARTIAL` observation level and factory default room/door sizes by default.
94
+
86
95
  ### Basic Usage
87
96
 
88
97
  See `examples/basic_usage.py` for a complete working example:
@@ -95,12 +104,13 @@ Basic usage example for miniworld-maze environments.
95
104
  This is a minimal example showing how to create and interact with the environment.
96
105
  """
97
106
 
98
- from miniworld_maze import NineRoomsEnvironmentWrapper
107
+ import gymnasium as gym
108
+ import miniworld_maze # noqa: F401
99
109
 
100
110
 
101
111
  def main():
102
- # Create environment
103
- env = NineRoomsEnvironmentWrapper(variant="NineRooms", size=64)
112
+ # Create environment using gymnasium registry
113
+ env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
104
114
  obs, info = env.reset()
105
115
 
106
116
  # obs is a dictionary containing:
@@ -212,14 +222,15 @@ Each environment supports three different observation modes:
212
222
  All environments can be customized with the following parameters:
213
223
 
214
224
  ```python
215
- from miniworld_maze import NineRoomsEnvironmentWrapper
216
- from miniworld_maze.core import ObservationLevel
225
+ import gymnasium as gym
226
+ from miniworld_maze import ObservationLevel
227
+ import miniworld_maze # noqa: F401
217
228
 
218
- env = NineRoomsEnvironmentWrapper(
219
- variant="NineRooms", # "NineRooms", "SpiralNineRooms", "TwentyFiveRooms"
229
+ env = gym.make(
230
+ "NineRooms-v0", # Environment variant
220
231
  obs_level=ObservationLevel.TOP_DOWN_PARTIAL, # Observation type
221
- continuous=False, # Use continuous actions
222
- size=64, # Observation image size (64x64)
232
+ obs_width=64, # Observation image width
233
+ obs_height=64, # Observation image height
223
234
  room_size=5, # Size of each room in environment units
224
235
  door_size=2, # Size of doors between rooms
225
236
  agent_mode="empty", # Agent rendering: "empty", "circle", "triangle"
@@ -19,6 +19,18 @@ pip install miniworld-maze
19
19
 
20
20
  ## Usage
21
21
 
22
+ ### Registered Environments
23
+
24
+ This package registers the following gymnasium environments:
25
+
26
+ | Environment ID | Description | Rooms | Max Steps |
27
+ |---|---|---|---|
28
+ | `NineRooms-v0` | Standard 3×3 grid with adjacent room connections | 9 | 1000 |
29
+ | `SpiralNineRooms-v0` | 3×3 grid with spiral connection pattern | 9 | 1000 |
30
+ | `TwentyFiveRooms-v0` | Large 5×5 grid with complex navigation | 25 | 1000 |
31
+
32
+ All environments use `TOP_DOWN_PARTIAL` observation level and factory default room/door sizes by default.
33
+
22
34
  ### Basic Usage
23
35
 
24
36
  See `examples/basic_usage.py` for a complete working example:
@@ -31,12 +43,13 @@ Basic usage example for miniworld-maze environments.
31
43
  This is a minimal example showing how to create and interact with the environment.
32
44
  """
33
45
 
34
- from miniworld_maze import NineRoomsEnvironmentWrapper
46
+ import gymnasium as gym
47
+ import miniworld_maze # noqa: F401
35
48
 
36
49
 
37
50
  def main():
38
- # Create environment
39
- env = NineRoomsEnvironmentWrapper(variant="NineRooms", size=64)
51
+ # Create environment using gymnasium registry
52
+ env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
40
53
  obs, info = env.reset()
41
54
 
42
55
  # obs is a dictionary containing:
@@ -148,14 +161,15 @@ Each environment supports three different observation modes:
148
161
  All environments can be customized with the following parameters:
149
162
 
150
163
  ```python
151
- from miniworld_maze import NineRoomsEnvironmentWrapper
152
- from miniworld_maze.core import ObservationLevel
164
+ import gymnasium as gym
165
+ from miniworld_maze import ObservationLevel
166
+ import miniworld_maze # noqa: F401
153
167
 
154
- env = NineRoomsEnvironmentWrapper(
155
- variant="NineRooms", # "NineRooms", "SpiralNineRooms", "TwentyFiveRooms"
168
+ env = gym.make(
169
+ "NineRooms-v0", # Environment variant
156
170
  obs_level=ObservationLevel.TOP_DOWN_PARTIAL, # Observation type
157
- continuous=False, # Use continuous actions
158
- size=64, # Observation image size (64x64)
171
+ obs_width=64, # Observation image width
172
+ obs_height=64, # Observation image height
159
173
  room_size=5, # Size of each room in environment units
160
174
  door_size=2, # Size of doors between rooms
161
175
  agent_mode="empty", # Agent rendering: "empty", "circle", "triangle"
@@ -5,12 +5,13 @@ Basic usage example for miniworld-maze environments.
5
5
  This is a minimal example showing how to create and interact with the environment.
6
6
  """
7
7
 
8
- from miniworld_maze import NineRoomsEnvironmentWrapper
8
+ import gymnasium as gym
9
+ import miniworld_maze # noqa: F401
9
10
 
10
11
 
11
12
  def main():
12
- # Create environment
13
- env = NineRoomsEnvironmentWrapper(variant="NineRooms", size=64)
13
+ # Create environment using gymnasium registry
14
+ env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
14
15
  obs, info = env.reset()
15
16
 
16
17
  # obs is a dictionary containing:
@@ -23,7 +23,8 @@ from miniworld_maze.core.constants import (
23
23
  MB_TO_BYTES,
24
24
  RGB_CHANNELS,
25
25
  )
26
- from miniworld_maze.environments.factory import NineRoomsEnvironmentWrapper
26
+ import gymnasium as gym
27
+ import miniworld_maze # noqa: F401
27
28
 
28
29
 
29
30
  def benchmark_rendering_performance(
@@ -58,7 +59,12 @@ def benchmark_rendering_performance(
58
59
  print(f"\n🔍 Testing {size}x{size} observations...")
59
60
 
60
61
  # Create environment with specific observation size
61
- env = NineRoomsEnvironmentWrapper(variant, size=size)
62
+ variant_mapping = {
63
+ "NineRooms": "NineRooms-v0",
64
+ "SpiralNineRooms": "SpiralNineRooms-v0",
65
+ "TwentyFiveRooms": "TwentyFiveRooms-v0"
66
+ }
67
+ env = gym.make(variant_mapping[variant], obs_width=size, obs_height=size)
62
68
 
63
69
  # Warmup phase
64
70
  print(f" 🔥 Warming up ({num_warmup} steps)...")
@@ -10,10 +10,12 @@ import os
10
10
  import numpy as np
11
11
  from PIL import Image
12
12
 
13
+ import gymnasium as gym
14
+
13
15
  from miniworld_maze.core.miniworld_gymnasium.rendering.framebuffer import (
14
16
  FrameBuffer,
15
17
  )
16
- from miniworld_maze.environments.factory import NineRoomsEnvironmentWrapper
18
+ import miniworld_maze # noqa: F401
17
19
 
18
20
 
19
21
  def generate_observations(variant, output_dir=None, high_res_full_views=False):
@@ -24,7 +26,12 @@ def generate_observations(variant, output_dir=None, high_res_full_views=False):
24
26
  os.makedirs(output_dir, exist_ok=True)
25
27
 
26
28
  # Create environment
27
- env = NineRoomsEnvironmentWrapper(variant=variant, size=64)
29
+ variant_mapping = {
30
+ "NineRooms": "NineRooms-v0",
31
+ "SpiralNineRooms": "SpiralNineRooms-v0",
32
+ "TwentyFiveRooms": "TwentyFiveRooms-v0"
33
+ }
34
+ env = gym.make(variant_mapping[variant], obs_width=64, obs_height=64)
28
35
 
29
36
  # Get base environment for direct render access
30
37
  base_env = env.env if hasattr(env, "env") else env
@@ -157,7 +164,7 @@ def generate_observations(variant, output_dir=None, high_res_full_views=False):
157
164
 
158
165
  for i, (pos, pos_name) in enumerate(test_positions):
159
166
  # First-person view from agent's perspective
160
- render_obs = env.render_on_pos(pos)
167
+ render_obs = base_env.render_on_pos(pos)
161
168
 
162
169
  # Convert CHW to HWC for PIL
163
170
  if len(render_obs.shape) == 3 and render_obs.shape[0] == 3:
@@ -28,7 +28,15 @@ from typing import Optional
28
28
  import cv2
29
29
  import numpy as np
30
30
 
31
- from miniworld_maze import NineRoomsEnvironmentWrapper, ObservationLevel
31
+ import gymnasium as gym
32
+
33
+ from miniworld_maze import ObservationLevel
34
+ import miniworld_maze # noqa: F401
35
+ from miniworld_maze.utils import (
36
+ clamp_pixel_coords,
37
+ environment_to_pixel_coords,
38
+ get_environment_bounds,
39
+ )
32
40
 
33
41
  OPENCV_AVAILABLE = True
34
42
 
@@ -110,18 +118,25 @@ class OpenCVLiveController:
110
118
  print(f"🔄 Creating {variant} environments...")
111
119
 
112
120
  # Create main environment (ego view)
113
- self.env = NineRoomsEnvironmentWrapper(
114
- variant=variant,
115
- size=self.size,
121
+ variant_mapping = {
122
+ "NineRooms": "NineRooms-v0",
123
+ "SpiralNineRooms": "SpiralNineRooms-v0",
124
+ "TwentyFiveRooms": "TwentyFiveRooms-v0"
125
+ }
126
+ self.env = gym.make(
127
+ variant_mapping[variant],
128
+ obs_width=self.size,
129
+ obs_height=self.size,
116
130
  obs_level=self.obs_level,
117
131
  agent_mode="triangle", # Make agent visible for better demo
118
132
  info_obs=[ObservationLevel.FIRST_PERSON],
119
133
  )
120
134
 
121
135
  # Create separate environment for top-down map
122
- self.map_env = NineRoomsEnvironmentWrapper(
123
- variant=variant,
124
- size=self.size,
136
+ self.map_env = gym.make(
137
+ variant_mapping[variant],
138
+ obs_width=self.size,
139
+ obs_height=self.size,
125
140
  obs_level=ObservationLevel.TOP_DOWN_FULL,
126
141
  # Always use full top-down for map
127
142
  agent_mode="triangle", # Make agent visible in map view
@@ -130,7 +145,7 @@ class OpenCVLiveController:
130
145
 
131
146
  # Synchronize both environments to same initial state
132
147
  obs, info = self.env.reset(seed=42)
133
- map_obs, map_info = self.map_env.reset(seed=42)
148
+ map_obs, _ = self.map_env.reset(seed=42)
134
149
 
135
150
  # Store info for accessing additional observations
136
151
  self.current_info = info
@@ -216,138 +231,100 @@ class OpenCVLiveController:
216
231
 
217
232
  def get_map_view_display(self) -> Optional[np.ndarray]:
218
233
  """
219
- Get current map observation with agent rendered by the engine.
234
+ Get current map observation with agent and goal markers.
220
235
 
221
236
  Returns:
222
237
  BGR image array for OpenCV or None if failed
223
238
  """
224
- if self.map_env is not None:
225
- # Get base environment to access the new get_observation method
226
- base_env = self.map_env
227
- while hasattr(base_env, "env") or hasattr(base_env, "_env"):
228
- if hasattr(base_env, "env"):
229
- base_env = base_env.env
230
- elif hasattr(base_env, "_env"):
231
- base_env = base_env._env
232
- else:
233
- break
234
-
235
- # Use the new get_observation method with agent rendering enabled
236
- if hasattr(base_env, "get_observation"):
237
- map_obs_with_agent = base_env.get_observation(render_agent=True)
238
-
239
- if map_obs_with_agent is not None:
240
- # get_observation returns HWC format, so use directly
241
- obs_hwc = map_obs_with_agent
242
-
243
- # Convert RGB to BGR for OpenCV
244
- obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
245
-
246
- # Resize for display
247
- obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
248
-
249
- return obs_resized
250
- else:
251
- return self._create_placeholder("No Map View")
252
- else:
253
- # Fallback to current observation with manual overlay (HWC format)
254
- if self.current_map_obs is not None:
255
- obs_hwc = self.current_map_obs # Already in HWC format
256
- obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
257
- obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
258
- return self._add_agent_marker(obs_resized)
259
- else:
260
- return self._create_placeholder("No Map View")
261
- else:
262
- return self._create_placeholder("No Map View")
239
+ # Use current map observation with manual overlay
240
+ obs_hwc = self.current_map_obs # Already in HWC format
241
+ obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
242
+ obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
243
+ return self._add_agent_marker(obs_resized)
263
244
 
264
245
  def _add_agent_marker(self, map_image: np.ndarray) -> np.ndarray:
265
246
  """
266
- Add agent position and orientation marker to the map view.
247
+ Add agent and goal position markers to the map view.
267
248
 
268
249
  Args:
269
250
  map_image: The top-down map image
270
251
 
271
252
  Returns:
272
- Map image with agent marker
253
+ Map image with agent and goal markers
273
254
  """
274
- # Get access to the base environment to read agent position
275
- base_env = self.map_env
276
- while hasattr(base_env, "env") or hasattr(base_env, "_env"):
277
- if hasattr(base_env, "env"):
278
- base_env = base_env.env
279
- elif hasattr(base_env, "_env"):
280
- base_env = base_env._env
281
- else:
282
- break
283
-
284
- # Get agent position and orientation
285
- if hasattr(base_env, "agent") and base_env.agent is not None:
286
- agent_pos = base_env.agent.pos
287
- agent_dir = base_env.agent.dir
288
-
289
- # Convert world coordinates to pixel coordinates
290
- # Environment bounds
291
- env_min_x = base_env.min_x
292
- env_max_x = base_env.max_x
293
- env_min_z = base_env.min_z
294
- env_max_z = base_env.max_z
295
-
296
- # Convert agent position to pixel coordinates
297
- pixel_x = int(
298
- (agent_pos[0] - env_min_x) / (env_max_x - env_min_x) * self.view_size
299
- )
300
- pixel_z = int(
301
- (agent_pos[2] - env_min_z) / (env_max_z - env_min_z) * self.view_size
302
- )
255
+ # Get positions from info dictionary - these are guaranteed to be available
256
+ agent_pos_2d = self.current_info["agent_position"] # [x, z] coordinates as ndarray
257
+ goal_pos_2d = self.current_info["goal_position"] # [x, z] coordinates as ndarray
303
258
 
304
- # Clamp to image bounds
305
- pixel_x = max(0, min(self.view_size - 1, pixel_x))
306
- pixel_z = max(0, min(self.view_size - 1, pixel_z))
307
-
308
- # Create a copy to avoid modifying the original
309
- marked_image = map_image.copy()
310
-
311
- # Draw agent position as a circle
312
- agent_radius = max(5, self.view_size // 80) # Scale with image size
313
- cv2.circle(
314
- marked_image, (pixel_x, pixel_z), agent_radius, (0, 255, 255), -1
315
- ) # Yellow filled circle
316
- cv2.circle(
317
- marked_image, (pixel_x, pixel_z), agent_radius + 2, (0, 0, 0), 2
318
- ) # Black outline
319
-
320
- # Draw direction indicator (small arrow/line)
321
- if agent_dir is not None:
322
- # Calculate direction vector
323
- dir_length = agent_radius + 8
324
- end_x = int(pixel_x + dir_length * math.cos(agent_dir))
325
- end_z = int(pixel_z + dir_length * math.sin(agent_dir))
326
-
327
- # Draw direction line
328
- cv2.line(
329
- marked_image, (pixel_x, pixel_z), (end_x, end_z), (0, 255, 0), 3
330
- ) # Green direction line
331
-
332
- # Draw small arrowhead
333
- arrow_size = 5
334
- arrow_angle = 0.5 # radians
335
-
336
- # Calculate arrowhead points
337
- left_x = int(end_x - arrow_size * math.cos(agent_dir - arrow_angle))
338
- left_z = int(end_z - arrow_size * math.sin(agent_dir - arrow_angle))
339
- right_x = int(end_x - arrow_size * math.cos(agent_dir + arrow_angle))
340
- right_z = int(end_z - arrow_size * math.sin(agent_dir + arrow_angle))
341
-
342
- # Draw arrowhead
343
- cv2.line(marked_image, (end_x, end_z), (left_x, left_z), (0, 255, 0), 2)
344
- cv2.line(
345
- marked_image, (end_x, end_z), (right_x, right_z), (0, 255, 0), 2
346
- )
259
+ # Get environment bounds using utility function
260
+ env_min_bounds, env_max_bounds = get_environment_bounds(self.map_env)
261
+ env_min_bounds = np.array(env_min_bounds)
262
+ env_max_bounds = np.array(env_max_bounds)
347
263
 
348
- return marked_image
349
- else:
350
- return map_image
264
+ # Create a copy to avoid modifying the original
265
+ marked_image = map_image.copy()
266
+
267
+ # Convert goal position to pixel coordinates and clamp
268
+ goal_pixel_x, goal_pixel_z = environment_to_pixel_coords(
269
+ goal_pos_2d, env_min_bounds, env_max_bounds, self.view_size
270
+ )
271
+ goal_pixel_x, goal_pixel_z = clamp_pixel_coords(
272
+ goal_pixel_x, goal_pixel_z, self.view_size
273
+ )
274
+
275
+ # Draw goal as a red circle
276
+ goal_radius = max(7, self.view_size // 70)
277
+ cv2.circle(
278
+ marked_image, (goal_pixel_x, goal_pixel_z), goal_radius, (0, 0, 255), -1
279
+ ) # Red filled circle
280
+ cv2.circle(
281
+ marked_image,
282
+ (goal_pixel_x, goal_pixel_z),
283
+ goal_radius + 2,
284
+ (255, 255, 255),
285
+ 2,
286
+ ) # White outline
287
+
288
+ # Convert agent position to pixel coordinates and clamp
289
+ pixel_x, pixel_z = environment_to_pixel_coords(
290
+ agent_pos_2d, env_min_bounds, env_max_bounds, self.view_size
291
+ )
292
+ pixel_x, pixel_z = clamp_pixel_coords(pixel_x, pixel_z, self.view_size)
293
+
294
+ # Draw agent position as a circle
295
+ agent_radius = max(5, self.view_size // 80)
296
+ cv2.circle(
297
+ marked_image, (pixel_x, pixel_z), agent_radius, (0, 255, 255), -1
298
+ ) # Yellow filled circle
299
+ cv2.circle(
300
+ marked_image, (pixel_x, pixel_z), agent_radius + 2, (0, 0, 0), 2
301
+ ) # Black outline
302
+
303
+ # Draw direction indicator
304
+ # Get base environment for agent direction
305
+ base_env = self.map_env.unwrapped
306
+ agent_dir = base_env.agent.dir
307
+ dir_length = agent_radius + 8
308
+ end_x = int(pixel_x + dir_length * math.cos(agent_dir))
309
+ end_z = int(pixel_z + dir_length * math.sin(agent_dir))
310
+
311
+ # Draw direction line
312
+ cv2.line(
313
+ marked_image, (pixel_x, pixel_z), (end_x, end_z), (0, 255, 0), 3
314
+ ) # Green direction line
315
+
316
+ # Draw arrowhead
317
+ arrow_size = 5
318
+ arrow_angle = 0.5 # radians
319
+ left_x = int(end_x - arrow_size * math.cos(agent_dir - arrow_angle))
320
+ left_z = int(end_z - arrow_size * math.sin(agent_dir - arrow_angle))
321
+ right_x = int(end_x - arrow_size * math.cos(agent_dir + arrow_angle))
322
+ right_z = int(end_z - arrow_size * math.sin(agent_dir + arrow_angle))
323
+
324
+ cv2.line(marked_image, (end_x, end_z), (left_x, left_z), (0, 255, 0), 2)
325
+ cv2.line(marked_image, (end_x, end_z), (right_x, right_z), (0, 255, 0), 2)
326
+
327
+ return marked_image
351
328
 
352
329
  def _create_placeholder(self, text: str) -> np.ndarray:
353
330
  """Create a placeholder image with text."""
@@ -484,16 +461,18 @@ class OpenCVLiveController:
484
461
  legend_y = goal_y + 20
485
462
  legend_font_scale = 0.4
486
463
 
487
- # Legend text - agent is now rendered by the engine
488
- cv2.putText(
489
- combined_img,
490
- "Agent Rendered by Engine",
491
- (legend_x, legend_y),
492
- font,
493
- legend_font_scale,
494
- (200, 200, 200),
495
- 1,
496
- )
464
+ # Legend text - positions from info dict
465
+ legend_lines = ["Yellow: Agent (from info)", "Red: Goal (from info)"]
466
+ for i, line in enumerate(legend_lines):
467
+ cv2.putText(
468
+ combined_img,
469
+ line,
470
+ (legend_x, legend_y + i * 15),
471
+ font,
472
+ legend_font_scale,
473
+ (200, 200, 200),
474
+ 1,
475
+ )
497
476
 
498
477
  # Create info panel at bottom
499
478
  info_y = self.view_size + 70
@@ -560,7 +539,7 @@ class OpenCVLiveController:
560
539
  # Use same seed to keep environments synchronized
561
540
  seed = np.random.randint(0, 1000000)
562
541
  obs, info = self.env.reset(seed=seed)
563
- map_obs, map_info = self.map_env.reset(seed=seed)
542
+ map_obs, _ = self.map_env.reset(seed=seed)
564
543
 
565
544
  # Store info for accessing additional observations
566
545
  self.current_info = info
@@ -588,9 +567,7 @@ class OpenCVLiveController:
588
567
  action = self.action_map[key]
589
568
  # Step both environments with the same action
590
569
  obs, reward, terminated, truncated, info = self.env.step(action)
591
- map_obs, map_reward, map_terminated, map_truncated, map_info = (
592
- self.map_env.step(action)
593
- )
570
+ map_obs, _, _, _, _ = self.map_env.step(action)
594
571
 
595
572
  # Store info for accessing additional observations
596
573
  self.current_info = info
@@ -622,7 +599,7 @@ class OpenCVLiveController:
622
599
  # Reset both environments with same seed
623
600
  seed = np.random.randint(0, 1000000)
624
601
  obs, info = self.env.reset(seed=seed)
625
- map_obs, map_info = self.map_env.reset(seed=seed)
602
+ map_obs, _ = self.map_env.reset(seed=seed)
626
603
  # Store info for accessing additional observations
627
604
  self.current_info = info
628
605
  # Extract observation array from dict
@@ -740,7 +717,7 @@ def main():
740
717
 
741
718
  # Convert string to enum
742
719
  obs_level_map = {
743
- "FIRST_PERSON": ObservationLevel.TOP_DOWN_PARTIAL,
720
+ "FIRST_PERSON": ObservationLevel.FIRST_PERSON,
744
721
  "TOP_DOWN_PARTIAL": ObservationLevel.TOP_DOWN_PARTIAL,
745
722
  "TOP_DOWN_FULL": ObservationLevel.TOP_DOWN_FULL,
746
723
  }
@@ -6,8 +6,10 @@ This example shows how to use the descriptive enum values instead of magic numbe
6
6
  """
7
7
 
8
8
  from PIL import Image
9
+ import gymnasium as gym
9
10
 
10
- from miniworld_maze import NineRoomsEnvironmentWrapper, ObservationLevel
11
+ from miniworld_maze import ObservationLevel
12
+ import miniworld_maze # noqa: F401
11
13
 
12
14
 
13
15
  def main():
@@ -27,10 +29,11 @@ def main():
27
29
  print(f"\n🔍 Testing {obs_level.name}...")
28
30
 
29
31
  # Create environment with specific observation level
30
- env = NineRoomsEnvironmentWrapper(
31
- variant="NineRooms",
32
+ env = gym.make(
33
+ "NineRooms-v0",
32
34
  obs_level=obs_level, # Using descriptive enum!
33
- size=64,
35
+ obs_width=64,
36
+ obs_height=64,
34
37
  )
35
38
 
36
39
  # Reset and get observation