Repository: Kinds-of-Intelligence-CFI/animal-ai (language: python)

Issue:
Moveable Object Images Are Incorrect In Docs
The images in the documentation are incorrect for the moveable objects. Need to change.


Discussion / hints:

Fix patch:
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 16c02b4f2..e0e5f8d02 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,17 +1,32 @@
-### Summary
-_Overview_
+### Proposed change(s)
 
-### Details
-_Details_
+_i.e. what this PR does, and why it should be merged._
+
+### Useful links (Github issues, ML-Agents forum threads etc.)
+
+
+
+### Types of change(s)
+
+- [ ] Bug fix
+- [ ] New feature
+- [ ] Code refactor
+- [ ] Breaking change
+- [ ] Documentation update
+- [ ] Other (please describe)
 
 ### Checklist
-- [ ] Tested AAI overall and confirmed nothing has been broken (relative to what's been changed)
-- [ ] Tested and confirmed bug x is fixed
-- [ ] ...
-- [ ] ...
 
-### Final Notes (if any)
-_Notes_
+- [ ] Added tests that prove my fix is effective or that my feature works
+- [ ] Updated the changelog (if applicable)
+- [ ] Updated the documentation (if applicable)
+- [ ] Updated the migration guide (if applicable)
+
+### Other comments
+
+
 
 ### Screenshots (if any)
-```
+
+
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 59a575254..808e45e8b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,15 +2,28 @@
 
 Welcome! We are glad that you want to contribute to Animal-AI! This document will help you get started.
 
-As you get started, you are in the best position to give us feedback on areas of
-our project that we need help with including:
+#### Table of Contents
+
+* [Introduction](#introduction)
+* [Ways to Contribute](#ways-to-contribute)
+* [1. Fork the repository](#1-fork-the-repository)
+* [2. Set up your development environment](#2-set-up-your-development-environment)
+* [3. Contribution Workflow](#3-contribution-workflow)
+  + [Creating an Issue/Feature Request](#creating-an-issuefeature-request)
+  + [Pre-Pull Request](#pre-pull-request)
+  + [Creating a Pull Request](#creating-a-pull-request)
+  + [Review and Merging a Pull Request](#review-and-merging-a-pull-request)
+  + [Post-Merge](#post-merge)
+
+## Introduction
+
+As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:
 
 * Problems found during setting up a new developer environment
-* Gaps in our Quickstart Guide or documentation
+* Gaps in our Getting Started Guide or documentation
 * Bugs in our automation scripts
 
-If anything doesn't make sense, or doesn't work when you run it, please open a
-bug report and let us know!
+If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!
 
 ## Ways to Contribute
 
@@ -23,37 +36,52 @@ We welcome many different types of contributions including:
 * Issue Triage
 
 ## 1. Fork the repository
-Fork the respective Animal-AI 'sister' repositories (Unity/C# and/or Ml-agents/Python) by clicking on the "Fork" button in the top right corner of the repositories, located here: [Unity](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-unity-project), and [Python](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-package).
+
+Fork the respective Animal-AI 'sister' repositories (Unity/C# and/or Ml-agents/Python) by clicking on the "Fork" button in the top right corner of the repositories, located here: [Unity](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-unity-project) and [Python](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-package).
 
 ## 2. Set up your development environment
+
 Clone the forked repository to your local machine using Git. Install the necessary dependencies (pip install animalai) and follow the instructions provided in the documentation to set up your development environment properly. Create a new branch for your changes and start working on your contribution.
 
-## 3. Choose an issue or feature
-Browse the project's issue tracker or discussions to find an open issue or feature that you would like to contribute to. Please note that Animal-AI has a de-centralized project structure currently, and all issues/bugs/technical developments are to be submitted to their respective repositories. If you can't find an issue or feature that interests you, create a new one and discuss it with the project maintainers. Note that any new feature is to be submitted to the main repository [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai).
+So you decided on which codebases you want to contribute to...so...what do you do now? 
+
+The next step would be to look at the issues tab of the repository you want to contribute to. The issues tab contains a list of issues that need to be addressed, and is a good place to start if you are new to the project. You can also create your own issues if you have a feature request or a bug report. If you are new to the project, you can start by looking at the issues tagged with the `good first issue` label. These issues are relatively easy to fix, usually with minimal to little testing required. If you are looking for a more challenging issue, you can look at the issues tagged with the `help wanted` label. These issues are more challenging, and may require more effort and time, as well as testing and debugging.
+
+## 3. Contribution Workflow
+
+### Creating an Issue/Feature Request
+
+If you have a feature request or a bug report, you can create your own issue in the respective codebase repository. If you are unsure where to submit your issue or request, then choose the codebase repository where the programming language you are using is located. If using both, then choose the codebase repository where the issue is most relevant and make a note of it in the issue description.
+
+Please make sure to follow the issue template, and provide as much information as possible. If you are creating a bug report, please provide the steps to reproduce the bug, as well as the expected and actual behavior. If you are creating a feature request, please provide a detailed description of the feature, as well as the motivation behind the feature. 
+
+_Note well that the feature request may not be accepted, and may be closed if it is not in line with the project goals. Therefore, checking out the Project Roadmap [here](/project/AAI-RoadMap.md) will keep you aligned and oriented._ 
+
+### Pre-Pull Request
+
+Before you create a pull request, there are a few tasks that you should complete. First, you should make sure that your code is well documented, and that you have written unit tests for your code. You should also make sure that your code is well formatted, and that it follows the project style guide. 
+
+We provided a set of sanity check configurations which **must be passed** before creating a pull request. These configurations can be found in the `sanity-checks` folder in the respective codebase repository. You should run these configurations before creating a pull request, and make sure that they pass. If they do not pass, then you should fix the issues before creating a pull request. Additional testing/checks may be beneficial and are welcome. Finally, please state which sanity checks you have run in the pull request description and provide the output of the sanity checks.
+
+### Creating a Pull Request
 
-## 4. Make your changes
-Create a new branch for your changes based on the main branch of the respective Animal-AI repository, either Unity or Python. Implement your code changes or add new features as necessary. Ensure that your code follows the project's coding style and conventions.
+Once you have fixed an issue or implemented a feature, you can create a pull request to submit your changes. The pull request should be created where the issue or feature request is located and should be linked to the issue or feature request. Please make sure to follow the pull request template, and provide as much information as possible. If you are fixing an issue, please provide the issue number in the pull request description. Please note that a sufficient amount of documentation is required for the pull request to be accepted.
 
-* Example: Let's say you want to add support for a new type of reward in the Animal-AI environment. You should make your changes on the Unity codebase (and Python codebase if your modifications affect how the Python API behaves). You can create a new branch named feature/reward-function to implement this feature and make your changes.
+Once you have created the pull request, it will be reviewed by the project maintainers and may request changes. If changes are requested, you should make the requested changes and update the pull request. **Please update any documentation that may be affected by your changes.**
 
-## 5. Test your changes
-Run the appropriate tests to ensure your changes work as intended. If necessary, add new tests to cover your code and verify that it doesn't introduce regressions. We have Csharp and Python specific tests for Animal-AI. You should run the tests for the programming language you are using appropriately.
+_We kindly ask you to be patient, as it may take some time for your pull request to be reviewed._
 
-* Example: For the reward function feature, you would write tests to check different scenarios and expected outcomes of the new reward function. Animal-AI is a complex multi-disciplinary project, with a strong emphasis on game development, which requires more extensive testing on average.
+### Review and Merging a Pull Request
 
-## 6. Submit a pull request
-Push your branch to your forked repository and submit a pull request (PR) to the respective Animal-AI repository. Provide a clear and concise description of your changes, explaining the problem you solved or the feature you added. Include any relevant links or references that would help the project maintainers review your changes.
+Once a pull request has been created, it will be reviewed by the _Lead Software Developer_ (alhasacademy@gmail.com). For any questions, feel free to contact him at any time in any stage you are in. 
 
-## 7. Respond to feedback
-Be responsive to any feedback or comments provided by the project maintainers. Address the feedback by making necessary revisions to your code and continue the discussion if required.
+### Post-Merge
 
-## 8. Code review
-The Animal-AI project requires code reviewers to review your code before merging to main. Address any issues flagged by the reviewer and actively participate in the code review process by addressing comments from reviewers.
+Once your pull request has been merged, you will be added to the list of contributors in the project.
 
-## 9. Merge your changes
-Once your pull request has been approved and meets all the project's requirements, one of the maintainers will merge your changes into the main repository and provide feedback to you. 
+---
 
-We are grateful for your contribution to the Animal-AI project.
+Congratulations and thank you so much for contributing to our project and vision. We are very grateful for your contribution and we hope you will continue to contribute to the project in the future.
 
 **Remember to always adhere to the project's code of conduct, be respectful, and follow any specific contribution guidelines provided by the Animal-AI project.**
 
diff --git a/README.md b/README.md
index 57422a2a0..c03f5f3d0 100644
--- a/README.md
+++ b/README.md
@@ -1,162 +1,113 @@
-# AnimalAI 3
-
 ![steampunkFOURcrop](https://github.com/Kinds-of-Intelligence-CFI/animal-ai/assets/65875290/df798f4a-cb2c-416f-a150-093b9382a621)
 
-![PyPI Downloads](https://img.shields.io/pypi/dm/animalai) ![PyPI Downloads](https://img.shields.io/pypi/dw/animalai) ![PyPI Downloads](https://img.shields.io/pypi/dd/animalai)
+# Animal-AI
 
 Animal-Artificial Intelligence (Animal-AI) supports interdisciplinary research to help better understand human, animal, and artificial cognition. It aims to support AI research towards unlocking cognitive capabilities and better understanding the space of possible minds. It is designed to facilitate testing across animals, humans, and AI. Animal-AI is an active, open-source software engineering and research project.
 
-| ![](docs/figs/animal-cyl-fail.gif) | ![](docs/figs/agent-cyl-fail.gif) |
+| ![agent-cyl-fail](project/figs/agent-cyl-fail.gif) | ![agent-cyl-pass](project/figs/agent-cyl-pass.gif) |
 |---|---|
-| ![](docs/figs/animal-cyl-pass.gif) | ![](docs/figs/agent-cyl-pass.gif) |
+| ![animal-cyl-fail](project/figs/animal-cyl-fail.gif) | ![animal-cyl-pass](project/figs/animal-cyl-pass.gif) |
+
+
+#### Table of Contents
+
+- [Overview](#overview)
+- [Features](#features)
+- [Installation](#installation)
+- [Getting Started](#getting-started)
+- [Citation](#citation)
+- [Unity ML-Agents](#unity-ml-agents)
+- [The Animal-AI Community](#the-animal-ai-community)
+
+
+## Overview
+
+- **Website:** [here](https://animalai.org/)
+- **Unity/C# Source Code:** [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-unity-project)
+- **Python Source Code:** [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-package/tree/main/animalai)
+
+This repository serves as the primary hub for essential information and activities related to the Animal-AI environment. It contains a collection of in-depth guides to the environment, as well as an extensive library of 900 tasks featured in the inaugural Animal-AI Olympics competition.
+
+_If you wish to contribute to the project, please familiarize yourself with the [Contributing Guide](CONTRIBUTING.md) and the [Code of Conduct](CODE_OF_CONDUCT.md) first._ A comprehensive documentation of how Animal-AI works is also available [here](docs/Technical-Overview.md.md), where you can understand the inner workings of how the environment is built and how it functions (_csharp_ and _Python_ codebases).
 
-## This Repo
+The Animal-AI environment and packages are currently tested on **Windows 11**, **Linux**, and **MacOS**, with **Python 3.9.x** support, but **Python 3.6.x+** has been reported to be working also. **Linux distros** are also working and stable. 
 
-This repo contains the AnimalAI environment, some introductory python scripts for interacting with it, as well as the [900 tasks](configs/competition) which were used in the original Animal-AI Olympics competition (and some others for demonstration purposes). Details of the tasks can be found on the [AAI website](http://animalai.org) where they can also be played and competition entries watched.
 
-The environment is built using [Unity ml-agents](https://github.com/Unity-Technologies/ml-agents/tree/master/docs) **Release 20-stable (Python version 0.30.0)**. **Unity** (game engine) is the engine used to develop the platform.
+## Features
 
-The AnimalAI environment and packages are currently tested on **Windows 11**, **Linux**, and **Mac**, with minimum **Python 3.8.x**, but Python 3.6+ has reported to be working also. **Linux distros** are also working and stable.
+**Interdisciplinary Research Platform:**
+- Facilitates research in human, animal, and artificial cognition.
+- Supports cross-disciplinary studies.
+- Enables comparative assessments among humans, animals, and artificial intelligences.
 
-**The Unity Project** for the environment is available [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-unity-project).
+**Comprehensive AI Environment:**
+- Includes a versatile environment for AI experiments, from basic to advanced configurations.
+- Wrap Unity learning environments as a gym(nasium) environment
+- Wrap Unity learning environments as a PettingZoo environment
 
+**Extensive Task Library:**
+- Multiple example tasks.
+- 900 tasks from the Animal-AI Olympics.
+- Procedural Generation functionality
 
-## Quick Install (please see Release for latest version of AAI-3)
+**Unity Game Engine:**
+- Utilizes Unity ml-agents.
+- Leverages Unity game engine for advanced simulation capabilities.
+- Fast and robust wrapper.
 
-*see [here](docs/installationGuide.md) for a more detailed installation guide, including information on Python/pip/conda and using the command line during installation*
+**Cross-Platform Compatibility:**
+- Compatible with Windows 11, Linux, and MacOS.
+- Supports Python 3.6.x and above.
 
-To get started you will need to:
-1. Clone this repo.
-2. **Install the animalai python package** and requirements by running `pip install animalai` from the root folder.
-3. **Download the latest release of the environment** for your system [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai/releases):
+**Control Modes:**
+- Player mode for interactive environment control, for human testing.
+- Training mode for Reinforcement Learning, with support for tensorflow analysis.
+- Supports AI model training across different systems.
 
-(Old releases can be found [here](docs/oldVersions.md))
+**Interactive and Dynamic Environment:**
+- Offers interactive elements for complex AI training.
+- Supports dynamic environment generation (dynamic)
 
-Unzip the **entire content** of the archive to the (initially empty) `env` folder. On linux you may have to make the file executable by running `chmod +x env/AnimalAI.x86_64`. Note that the env folder should contain the AnimalAI.exe/.x86_84/.app depending on your system and *any other folders* in the same directory in the zip file.
 
-## Tutorials and Examples
+## Installation
 
-Some example scripts to get started can be found in the `examples` folder. The following docs provide information for some common uses of the environment.
+*See [here](/docs/gettingStarted/Installation-Guide.md) for a detailed installation guide.*
 
-- [Getting started with the environment](docs/quickStart.md)
-- [Using the ML-Agents Low-Level API: A hand-coded Braitenberg Vehicle baseline](docs/lowLevelAPI.md)
-- [Designing Experiments](docs/configFile.md)
-- [Training examples](docs/training.md)
+([latest release](https://github.com/Kinds-of-Intelligence-CFI/animal-ai/releases/tag/v3.1.4)) / ([all releases]))
 
-## Manual Control
+For legacy builds of Animal-AI, please see ([legacy releases](/project/AAI-Versions-Archive.md))
 
-If you launch the environment directly from the executable or through the `play.py` script it will launch in player mode. Here you can control the agent with the following:
 
-| Keyboard Key  | Action    |
-| --- | --- |
-| W   | move agent forwards |
-| S   | move agent backwards|
-| A   | turn agent left     |
-| D   | turn agent right    |
-| C   | switch camera       |
-| R   | reset environment   |
+## Getting Started
 
-## Citing
-If you use the Animal-AI environment in your work you can cite the environment paper:
+We've prepared a comprehensive set of tutorials to help you get started with the Animal-AI environment. Your first stop should be the [Getting Started Guide](/docs/gettingStarted/Getting-Started.md), which will guide you on where to start and where to go next depending on your interests and experience.
 
- Crosby, M., Beyret, B., Shanahan, M., Hernández-Orallo, J., Cheke, L. & Halina, M.. (2020). The Animal-AI Testbed and Competition. Proceedings of the NeurIPS 2019 Competition and Demonstration Track, in Proceedings of Machine Learning Research 123:164-176 Available [here](http://proceedings.mlr.press/v123/crosby20a.html).
+
+## Citation
+
+We published our Version 3 paper on Animal-AI, which you can find [here](https://arxiv.org/abs/2312.11414). If you use Animal-AI in your research, please cite our paper:
+
+ _Voudouris, K., Alhas, I., Schellaert, W., Crosby, M., Holmes, J., Burden, J., Chaubey, N., Donnelly, N., Patel, M., Halina, M,. Hernández-Orallo, J. & Cheke, L. G. (2023). Animal-AI 3: What's New & Why You Should Care. arXiv preprint arXiv:2312.11414._
 ```
- @InProceedings{pmlr-v123-crosby20a, 
-    title = {The Animal-AI Testbed and Competition}, 
-    author = {Crosby, Matthew and Beyret, Benjamin and Shanahan, Murray and Hern\'{a}ndez-Orallo, Jos\'{e} and Cheke, Lucy and Halina, Marta}, 
-    booktitle = {Proceedings of the NeurIPS 2019 Competition and Demonstration Track}, 
-    pages = {164--176}, 
-    year = {2020}, 
-    editor = {Hugo Jair Escalante and Raia Hadsell}, 
-    volume = {123}, 
-    series = {Proceedings of Machine Learning Research}, 
-    month = {08--14 Dec}, 
-    publisher = {PMLR}, 
-} 
+@article{voudouris2023animal,
+  title={Animal-AI 3: What's New \& Why You Should Care},
+  author={Voudouris, Konstantinos and Alhas, Ibrahim and Schellaert, Wout and Crosby, Matthew and Holmes, Joel and Burden, John and Chaubey, Niharika and Donnelly, Niall and Patel, Matishalin and Halina, Marta and Hernández-Orallo, José and Cheke, Lucy G.},
+  journal={arXiv preprint arXiv:2312.11414},
+  year={2023}
+}
 ```
+For further publications related to Animal-AI, see our website [here](https://sites.google.com/csah.cam.ac.uk/animalai/resources).
+
 
 ## Unity ML-Agents
 
-The Animal-AI Olympics was built using [Unity's ML-Agents Toolkit.](https://github.com/Unity-Technologies/ml-agents)
-
-Juliani, A., Berges, V., Vckay, E., Gao, Y., Henry, H., Mattar, M., Lange, D. (2018). [Unity: A General Platform for 
-Intelligent Agents.](https://arxiv.org/abs/1809.02627) *arXiv preprint arXiv:1809.02627*
-
-Further the documentation for [mlagents](https://github.com/Unity-Technologies/ml-agents) should be consulted if you want to make any changes.
-
-## Version History
-- v3.1.3
-  - Resolved Spawner Tree Clock and Multiple Arenas cycling issues
-  - Enhanced multiple arenas randomization via the randomizeArenas parameter in YAML
-    - Adjusted code to handle arenas with negative IDs by converting them to positive
-    - Added more robust error-checking for arena ID's and arena cycling
-  - Addressed Unity native warning in Training Arena script
-  - Rectified the invisibility issue of the Sign Poster game object
-  - Conducted unit tests on TrainingArena.cs and ArenaParameters.cs
-  - Shortened end-of-episode notification to 2.5 seconds; also added visual elements of paired reinforcing cues such as colours and short GIFs for better visual understanding for the 'user'
-  - Undertook minor Unity script optimizations
-- v3.1.2
-  - Implemented hot fix for an undiscovered and new bug that affected the Spawner Tree
-- v3.1.1
-  - Introduced a new feature: "End of Episode Notification." When activated, the episode concludes with a notification for the user/player if their cumulative reward meets or exceeds the threshold set in the config file.
-  - Fixed bug that affected the Spawner Tree
-- v3.1.0
-  - Introduced the "Interactive Button" feature, allowing the player/agent to engage with a button that, through a probabilistic algorithm, may generate a reward.
-  - Fixed various bugs.
-  - "Headless" mode is tested and supported unofficially - can be used for training agents (works with Raycasting).
-  - Further performance improvements to overall project.
-- v3.0.2
-  - Upgraded Mlagents to 2.3.0-exp3 (mlagents python version 0.30.0)
-- v3.0.1
-  - Added Agent Freezing Parameter, enabling you to freeze the agent for no reward decrement at the start of an episode, while other objects continue to move around.
-- v3.0 **Note that due to the changes to controls and graphics agents trained on previous versions might not preform the same**
-  - Updated agent handling. The agent now comes to a stop more quickly when not moving forwards or backwards and accelerates slightly faster.
-  - Added new objects, spawners, signs, goal types (see [doc](docs/definitionsOfObjects.md)).
-  - Added 3 animal skins to the player character.
-  - Updated graphics for many objects. Default shading on many previously plain objects make it easier to determine location(s)/velocity.
-  - Made the Unity Environment available (see link on main page).
-  - Many improvements to documentation and examples.
-  - Upgraded to Mlagents 2.1.0-exp.1 (ml-agents python version 0.27.0).
-  - Fixed various bugs.
-- v2.2.3
-  - Now you can specify multiple different arenas in a single yml config file ant the environment will cycle through them each time it resets.
-- v2.2.2 
-  - Low quality version with improved fps. (will work on further improvments to graphics & fps later).
-- v2.2.1
-  - Improve UI scaling wrt. screen size.
-  - Fixed an issue with cardbox objects spawning at the wrong sizes.
-  - Fixed an issue where the environment would time out after the time period even when health > 0 (no longer intended behaviour).
-  - Improved Death Zone shader for weird Zone sizes.
-- v2.2.0 Health and Basic Scripts.
-  - Switched to health-based system (rewards remain the same).
-  - Updated overlay in play mode.
-  - Allow 3D hot zones and death zones and make them 3D by default in old configs.
-  - Added rewards that grow/decay (currently not configurable but will be added in next update).
-  - Added basic Gym Wrapper.
-  - Added basic heuristic agent for benchmarking and testing.
-  - Improved all other python scripts.
-  - Fixed a reset environment bug when resetting during training.
-  - Added the ability to set the DecisionPeriod (frameskip) when instantiating and environment.
-- v2.1.1 bugfix
-  - Fixed raycast length being less then diagonal length of standard arena.
-- v2.1 beta release
-  - Upgraded to ML-Agents release 2 (0.26.0).
-  - New features:
-    - Added raycast observations
-    - Added agent global position to observations
-
-### Notice
-
-   Copyright 2023 Kinds of Intelligence, Centre for the Future of Intelligence, University of Cambridge
-   
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
+Juliani, A., Berges, V., Vckay, E., Gao, Y., Henry, H., Mattar, M., Lange, D. (2018). [Unity: A General Platform for Intelligent Agents.](https://arxiv.org/abs/1809.02627) *arXiv preprint arXiv:1809.02627*
+
+Documentation for [ML-Agents](https://github.com/Unity-Technologies/ml-agents) should be consulted if you want additional resources.
+
+
+## The Animal-AI Community 
+
+Animal-AI has been an open-source research project from the beginning, and will continue to be so in the future. We welcome contributions from the community from all backgrounds and experiences, and we are always looking for new ways to collaborate. Do check out our [Contributing Guide](contributing.md) if you are interested in contributing to the project. 
+
+---
diff --git a/agents/PPOAgent.py b/agents/PPOAgent.py
deleted file mode 100644
index 12058d6a0..000000000
--- a/agents/PPOAgent.py
+++ /dev/null
@@ -1,114 +0,0 @@
-from stable_baselines3 import PPO
-from stable_baselines3 import DQN
-import torch as th
-from wandb.integration.sb3 import WandbCallback
-import sys
-import random
-import os
-# from stable_baselines3.common.vec_env.dummy_vec_env import DummyVecEnv
-from gym_unity.envs import UnityToGymWrapper
-from animalai.envs.environment import AnimalAIEnvironment
-
-import wandb
-#wandb.init(project='AnimalAI Agent', sync_tensorboard=True)
-#
-
-### Basic PPO agent + load config and watch.
-
-training = False
-
-if training:
-    wandb.init(project="AnimalAI Agents", entity="kindsofintelligence", sync_tensorboard=True) 
-    ## This will write to the KoI Wandb page. You must be logged in to a KoI team account on wandb for this to work. 
-
-def train_agent_single_config(configuration_file):
-
-    aai_env = AnimalAIEnvironment(
-        seed = 123,
-        file_name="../env/AnimalAI",
-        arenas_configurations=configuration_file,
-        play=False,
-        base_port=5000,
-        inference=False,
-        useCamera=True,
-        resolution=72,
-        useRayCasts=False,
-        # raysPerSide=1,
-        # rayMaxDegrees = 30,
-    )
-
-    # env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=False)
-    # def make_env():
-    #     def _thunk():
-    #         env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-    #         return env
-    #     return _thunk
-    # env = DummyVecEnv([make_env()])
-    env = UnityToGymWrapper(aai_env, uint8_visual=True, allow_multiple_obs=False, flatten_branched=True)
-    runname = "72Px"
-
-    policy_kwargs = dict(activation_fn=th.nn.ReLU)
-    model = PPO("CnnPolicy", env, policy_kwargs=policy_kwargs, verbose=1, tensorboard_log=("./ppo_tensorboard/" + runname))
-
-    no_saves = 100
-    no_steps = 1000000
-    reset_num_timesteps = True
-    for i in range(no_saves):
-        model.learn(no_steps, reset_num_timesteps=reset_num_timesteps, callback=WandbCallback())
-        model.save("results/" + runname + "/model_" + str( (i+1)*no_steps ))
-        reset_num_timesteps = False
-    env.close()
-
-
-def watchModel(configuration_file):
-    aai_env = AnimalAIEnvironment(
-        seed = 123,
-        file_name="../env/AnimalAI",
-        arenas_configurations=configuration_file,
-        play=False,
-        base_port=5000,
-        inference=True,
-        useCamera=True,
-        resolution=72,
-        useRayCasts=False,
-        # raysPerSide=1,
-        # rayMaxDegrees = 30,
-    )
-
-    # env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=False)
-    # def make_env():
-    #     def _thunk():
-    #         env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-    #         return env
-    #     return _thunk
-    # env = DummyVecEnv([make_env()])
-    env = UnityToGymWrapper(aai_env, uint8_visual=True, allow_multiple_obs=False, flatten_branched=True)
-    runname = "Runs"
-
-    policy_kwargs = dict(activation_fn=th.nn.ReLU)
-    model =  PPO.load("results/72Px/model_6000000")
-    for run in range(0, 100):
-        obs = env.reset()
-        done=False
-        while not done:
-            action, _states = model.predict(obs)
-            obs, rewards, done, info = env.step(action)
-            env.render()
-
-    
-# Loads a random competition configuration unless a link to a config is given as an argument.
-if __name__ == "__main__":
-    if len(sys.argv) > 1:
-        configuration_file = sys.argv[1]
-    else:   
-        competition_folder = "../configs/basic/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = (
-            competition_folder + "1g.yml"#configuration_files[configuration_random]
-        )
-    if training:
-        train_agent_single_config(configuration_file=configuration_file)
-    else:
-        watchModel(configuration_file=configuration_file)
-    wandb.finish()
diff --git a/agents/basicBraitenberg.py b/agents/basicBraitenberg.py
deleted file mode 100644
index 16ac06dd1..000000000
--- a/agents/basicBraitenberg.py
+++ /dev/null
@@ -1,250 +0,0 @@
-import argparse
-import os
-import random
-import numpy as np
-
-from animalai.envs.actions import AAIActions, AAIAction
-from animalai.envs.environment import AnimalAIEnvironment
-from animalai.envs.raycastparser import RayCastParser
-from animalai.envs.raycastparser import RayCastObjects
-
-class Braitenberg():
-    """Implements a simple heuristic agent (Braitenberg Vehicle)
-    It heads towards good goals and away from bad goals.
-    It navigates around immoveable objects directly ahead 
-    If it is stationary it turns around
-    """
-    def __init__(self, no_rays, max_degrees, verbose=False):
-        self.verbose = verbose # do you want to see the observations and actions?
-        self.no_rays = no_rays # how many rays should the agent have?
-        assert(self.no_rays % 2 == 1), "Number of rays must be an odd number." 
-        self.max_degrees = max_degrees # how many degrees do you want the rays spread over?
-        """
-        We specify six types of objects here. This set can be expanded to include more objects if you wish to design further rules.
-        """
-        self.listOfObjects = [RayCastObjects.ARENA, 
-                              RayCastObjects.IMMOVABLE, 
-                              RayCastObjects.MOVABLE, 
-                              RayCastObjects.GOODGOAL, 
-                              RayCastObjects.GOODGOALMULTI, 
-                              RayCastObjects.BADGOAL]
-        
-        self.raycast_parser = RayCastParser(self.listOfObjects, self.no_rays) #initialize a class to parse raycasts for these objects
-        self.actions = AAIActions() # initalise the action set
-        self.prev_action = self.actions.NOOP # initialise the first action, chosen to be forwards 
-
-    def prettyPrint(self, obs) -> str:
-        """Prints the parsed observation"""
-        return self.raycast_parser.prettyPrint(obs) #prettyprints the observation in a nice format
-    
-    def checkStationarity(self, raycast): #checks whether the agent is stationary by examining its velocities. If they are below 1 in all directions, it turns.
-        vel_observations = raycast['velocity']
-        if self.verbose:
-            print("Velocity observations")
-            print(vel_observations)
-        bool_array = (vel_observations <= np.array([1,1,1]))
-        if sum(bool_array) == 3:
-            return True
-        else:
-            return False
-    
-    def get_action(self, observations) -> AAIAction: #select an action based on observations
-        """Returns the action to take given the current parsed raycast observation and other observations"""
-        obs = self.raycast_parser.parse(observations)
-        if self.verbose:
-            print("Raw Raycast Observations:")
-            print(obs)
-            print("Pretty Raycast Observations:")
-            self.raycast_parser.prettyPrint(observations)
-
-        newAction = self.actions.FORWARDS.action_tuple #initialise the new action to be no action
-
-        """
-        If the agent is stationary, and it hasn't previously gone forwardsleft or forwardsright, it must be the first step. So choose one of those actions at random (p(0.5))
-        """
-        if self.checkStationarity(observations) and self.prev_action != self.actions.FORWARDSLEFT and self.prev_action != self.actions.FORWARDSRIGHT:
-            select_LR = random.randint(0,1)
-            if select_LR == 0:
-                newAction = self.actions.FORWARDSLEFT
-            else:
-                newAction = self.actions.FORWARDSRIGHT
-        elif self.checkStationarity(observations) and self.prev_action == self.actions.FORWARDSLEFT: # otherwise if stationary, continue in the same direction (it must be stuck by an obstacle)
-            newAction = self.actions.FORWARDSLEFT
-        elif self.checkStationarity(observations) and self.prev_action == self.actions.FORWARDSRIGHT:
-            newAction = self.actions.FORWARDSRIGHT
-        elif self.ahead(obs, RayCastObjects.GOODGOALMULTI) and not self.checkStationarity(observations): #if it's not stationary and it sees a good goal ahead, go forwards
-            newAction = self.actions.FORWARDS
-        elif self.left(obs, RayCastObjects.GOODGOALMULTI) and not self.checkStationarity(observations): # if it's to the left, rotate left
-            newAction = self.actions.LEFT
-        elif self.right(obs, RayCastObjects.GOODGOALMULTI) and not self.checkStationarity(observations): # if it's to the right, rotate right
-            newAction = self.actions.RIGHT
-        elif self.ahead(obs, RayCastObjects.GOODGOAL) and not self.checkStationarity(observations): #as above for good goals
-            newAction = self.actions.FORWARDS
-        elif self.left(obs, RayCastObjects.GOODGOAL) and not self.checkStationarity(observations):
-            newAction = self.actions.LEFT
-        elif self.right(obs, RayCastObjects.GOODGOAL) and not self.checkStationarity(observations):
-            newAction = self.actions.RIGHT
-        elif self.ahead(obs, RayCastObjects.BADGOAL) and not self.checkStationarity(observations): #the opposite for bad goals
-            newAction = self.actions.BACKWARDS
-        elif self.left(obs, RayCastObjects.BADGOAL) and not self.checkStationarity(observations):
-            newAction = self.actions.RIGHT
-        elif self.right(obs, RayCastObjects.BADGOAL) and not self.checkStationarity(observations):
-            newAction = self.actions.LEFT
-        elif self.ahead(obs, RayCastObjects.IMMOVABLE) and not self.checkStationarity(observations): # if there is an obstacle ahead move forwardsleft or forwardsright randomly to start navigating around it
-            select_LR = random.randint(0,1)
-            if select_LR == 0:
-                newAction = self.actions.FORWARDSLEFT
-            else:
-                newAction = self.actions.FORWARDSRIGHT
-        # Otherwise, if there is an obstacle ahead and the previous action was forwardsleft OR if there is an obstacle to the left and nothing ahead and the agent is not stationary, continue forwardsleft to continue navigating around
-        elif ((self.ahead(obs, RayCastObjects.IMMOVABLE) and self.prev_action == self.actions.FORWARDSLEFT) or (self.left(obs, RayCastObjects.IMMOVABLE) and not self.ahead(obs, RayCastObjects.IMMOVABLE))) and not self.checkStationarity(observations):
-            newAction = self.actions.FORWARDSLEFT
-        # vice versa for if the right side. This way the agent can navigate around obstacles
-        elif ((self.ahead(obs, RayCastObjects.IMMOVABLE) and self.prev_action == self.actions.FORWARDSRIGHT) or (self.right(obs, RayCastObjects.IMMOVABLE) and not self.ahead(obs, RayCastObjects.IMMOVABLE))) and not self.checkStationarity(observations):
-            newAction = self.actions.FORWARDSRIGHT
-        else: #otherwise, continue the same action as before
-            newAction = self.prev_action        
-        self.prev_action = newAction
-        
-        if self.verbose:
-            print("Action selected:")
-            print(newAction.name)
-        newActionTuple = newAction.action_tuple
-        
-        return newActionTuple
-    
-    def ahead(self, obs, object): #returns a true if the object is detected in the middle ray.
-        """Returns true if the input object is ahead of the agent"""
-        if(obs[self.listOfObjects.index(object)][int((self.no_rays-1)/2)] > 0):
-            if self.verbose:
-                print("found " + str(object) + " ahead")
-            return True
-        return False
-
-    def left(self, obs, object): #returns a true if the object is in one of the left rays
-        """Returns true if the input object is left of the agent"""
-        for i in range(int((self.no_rays-1)/2)):
-            if(obs[self.listOfObjects.index(object)][i] > 0):
-                if self.verbose:
-                    print("found " + str(object) + " left")
-                return True
-        return False
-
-    def right(self, obs, object): #returns a true if the object is in one of the right rays
-        """Returns true if the input object is right of the agent"""
-        for i in range(int((self.no_rays-1)/2)):
-            if(obs[self.listOfObjects.index(object)][i+int((self.no_rays-1)/2) + 1] > 0):
-                if self.verbose:
-                    print("found " + str(object) + " right")
-                return True
-        return False
-
-"""
-A helper function to watch the agent on a single config.
-You must run this config from the agents directory.
-"""
-
-def watch_braitenberg_agent_single_config(configuration_file: str, agent: Braitenberg):
-    
-    try:
-        port = 4000 + random.randint(
-            0, 1000
-            )  # use a random port to avoid problems if a previous version exits slowly
-        
-        aai_env = AnimalAIEnvironment( 
-        inference=True, #Set true when watching the agent
-        seed = 123,
-        worker_id=random.randint(0, 65500),
-        file_name="../env/AnimalAI",
-        arenas_configurations=configuration_file,
-        base_port=port,
-        useCamera=False,
-        useRayCasts=True,
-        raysPerSide = int((agent.no_rays)/2),
-        rayMaxDegrees = agent.max_degrees
-        )
-
-        behavior = list(aai_env.behavior_specs.keys())[0] # by default should be AnimalAI?team=0
-
-        done = False
-        episodeReward = 0
-
-        aai_env.step() # take first step to get an observation
-
-        dec, term = aai_env.get_steps(behavior)
-    
-        while not done:
-
-            observations = aai_env.get_obs_dict(dec.obs)
-
-            action = agent.get_action(observations)
-
-            aai_env.set_actions(behavior, action)
-
-            aai_env.step()
-
-            dec, term = aai_env.get_steps(behavior)
-            
-            if len(dec.reward) > 0 and len(term) <= 0:
-                episodeReward += dec.reward
-
-            elif len(term) > 0: #Episode is over
-                episodeReward += term.reward
-                print(f"Episode Reward: {episodeReward}")
-                done = True
-            
-            else:
-                pass
-
-        aai_env.close()
-    except:
-        print("Try again. Looks like that port was busy. Sometimes it takes a while for the environment to close properly.")
-
-        
-    
-        
-
-
-
-
-if __name__ == "__main__":
-
-    parser = argparse.ArgumentParser()
-
-    parser.add_argument("--config_file", 
-                        type=str, 
-                        help="What config file should be run? Defaults to a random file from the competition folder.")
-    
-    parser.add_argument("--no_rays", 
-                        type=int, 
-                        help="How many rays should the raycaster produce? Must be an odd number. Defaults to 11.",
-                        default = 11)
-    parser.add_argument("--max_degrees", 
-                        type=int, 
-                        help = "Over how many degrees ought the raycasts be distributed? Defaults to 60.",
-                        default = 60)
-    parser.add_argument("--verbose", 
-                        type=bool, 
-                        help = "Do you want to print out observations and actions? Defaults to False.",
-                        default = False)
-    
-    args = parser.parse_args()
-
-    no_rays = args.no_rays 
-    max_degrees = args.max_degrees
-    verbose = args.verbose
-
-    if args.config_file is not None:
-        configuration_file = args.config_file
-    else:
-        config_folder = "../configs/competition/"
-        configuration_files = os.listdir(config_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = config_folder + configuration_files[configuration_random]
-        print(f"Using configuration file {configuration_file}")
-
-    singleEpisodeVanillaBraitenberg = Braitenberg(no_rays=no_rays,
-                                             max_degrees=max_degrees,
-                                             verbose = verbose)
-    
-    watch_braitenberg_agent_single_config(configuration_file=configuration_file, agent = singleEpisodeVanillaBraitenberg)
\ No newline at end of file
diff --git a/agents/randomActionAgents.py b/agents/randomActionAgents.py
deleted file mode 100644
index fbe6d9799..000000000
--- a/agents/randomActionAgents.py
+++ /dev/null
@@ -1,303 +0,0 @@
-"""
-Copyright © 2023 Konstantinos Voudouris (@kozzy97)
-
-Author: Konstantinos Voudouris
-Date: June 2023
-Python Version: 3.10.4
-Animal-AI Version: 3.1.1
-
-"""
-
-
-import argparse
-import numpy as np
-import os
-import random
-import sys
-import warnings
-
-from animalai.envs.environment import AnimalAIEnvironment
-from collections import deque
-from mlagents_envs.envs.unity_gym_env import UnityToGymWrapper
-from scipy.special import softmax
-
-### Random Action Agent + load config and watch.
-
-"""
-Random action class for the animal-ai environment
-"""
-
-class RandomActionAgent:
-    """Implements a random walker with many changeable parameters"""
-
-    def __init__(self, max_step_length = 10, step_length_distribution = 'fixed', norm_mu = 5, norm_sig = 1, beta_alpha = 2, beta_beta = 2, cauchy_mode = 5, gamma_kappa = 9, gamma_theta = 0.5, weibull_alpha = 2, poisson_lambda = 5, action_biases = [1,1,1,1,1,1,1,1,1], prev_step_bias = 0, remove_prev_step = False):
-        self.max_step_length = max_step_length 
-        self.step_length_distribution = step_length_distribution
-        self.norm_mu = norm_mu
-        self.norm_sig = norm_sig
-        self.beta_alpha = beta_alpha
-        self.beta_beta = beta_beta
-        self.cauchy_mode = cauchy_mode
-        self.gamma_kappa = gamma_kappa
-        self.gamma_theta = gamma_theta
-        self.weibull_alpha = weibull_alpha
-        self.poisson_lambda = poisson_lambda
-        self.action_biases = action_biases
-        self.prev_step_bias = prev_step_bias
-        self.remove_prev_step = remove_prev_step
-
-    def get_num_steps(self, prev_step: int):
-        
-        if self.step_length_distribution == 'fixed':
-            num_steps = self.max_step_length
-        
-        elif self.step_length_distribution == 'uniform': 
-            num_steps = random.randint(0, self.max_step_length)
-
-        elif self.step_length_distribution == 'normal':
-            num_steps = -1
-            while num_steps <= 0: # to make sure that num_steps is always a natural number
-                num_steps = int(np.random.normal(self.norm_mu, self.norm_sig))
-
-        elif self.step_length_distribution == 'beta':
-            num_steps = int(np.random.beta(self.beta_alpha, self.beta_beta) * self.max_step_length) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-
-        elif self.step_length_distribution == 'cauchy':
-            num_steps = -1
-            while num_steps < 0:
-                num_steps = int(np.random.standard_cauchy() + self.cauchy_mode)
-        
-        elif self.step_length_distribution == 'gamma':
-            num_steps = -1
-            while num_steps < 0:
-                num_steps = int(np.random.gamma(self.gamma_kappa, self.gamma_theta))
-        
-        elif self.step_length_distribution == 'weibull':
-            num_steps = int(np.random.weibull(self.weibull_alpha) * self.max_step_length) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-        
-        elif self.step_length_distribution == 'poisson':
-            num_steps = int(np.random.poisson(self.poisson_lambda))
-        
-        else:
-            raise ValueError("Distribution not recognised.")
-
-        if num_steps > 100:
-            warning_string = 'The number of steps chosen is: ' + str(num_steps) + '. Try toggling distribution parameters as your agent might get stuck.'
-            warnings.warn(warning_string)
-
-        
-        step_list = deque([prev_step]*num_steps)
-        return step_list
-
-    def get_new_action(self, prev_step: int):
-
-        """
-        Provide a vector of 9 real values, one for each action, which is then softmaxed to provide the probability of selecting that action. Relative differences between the values is what is important. 
-
-        Provide an initial probability of selecting the previous step again. If that action is not selected, then the next step is picked according to the softmaxed action biases. The previous action can be removed
-        from the softmaxed biases (by continually sampling until an action is picked that is not the previous action), by changing `remove_prev_step` to `True`.
-        """
-
-        assert(len(self.action_biases) == 9), "You must provide biases for all nine (9) actions. A uniform distribution is [1,1,1,1,1,1,1,1,1]"
-
-        assert(self.prev_step_bias >= 0 and self.prev_step_bias <= 1), "The bias towards the previous action must be a scalar value between 0 and 1."
-
-        
-        action_is_prev_step = np.random.choice(a = [False,True], size = 1, p = [(1-self.prev_step_bias), self.prev_step_bias]) # should the action be the previous step?
-
-        if action_is_prev_step:
-            action = prev_step
-        else:
-            if self.remove_prev_step:
-                action_biases_softmax = softmax(self.action_biases)
-                action = prev_step
-                while action == prev_step:
-                    action = np.random.choice(a = [0,1,2,3,4,5,6,7,8], size = 1, p = action_biases_softmax)
-            else:
-                action_biases_softmax = softmax(self.action_biases)
-                action = np.random.choice(a = [0,1,2,3,4,5,6,7,8], size = 1, p = action_biases_softmax)
-        
-        action = int(action)
-
-        return action
-    
-def watch_random_action_agent_single_config(configuration_file: str, agent: RandomActionAgent):
-    
-    port = 4000 + random.randint(
-    0, 1000
-    )  # use a random port to avoid problems if a previous version exits slowly
-    
-    aai_env = AnimalAIEnvironment( 
-    inference=True, #Set true when watching the agent
-    seed = 123,
-    worker_id=random.randint(0, 65500),
-    file_name="../env/AnimalAI",
-    arenas_configurations=configuration_file,
-    base_port=port,
-    useCamera=False,
-    resolution=36,
-    useRayCasts=True,
-    )
-
-    env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-
-    obs = env.reset()
-     
-    done = False
-    episodeReward = 0
-    initialActionAgent = agent
-    initialActionAgent.prev_step_bias = 0 #select a random action according to the biases. There is no previous step bias as there is no previous step at the start of an episode!
-
-    previous_action = initialActionAgent.get_new_action(prev_step=0) 
-
-    while not done:
-
-        step_list = agent.get_num_steps(prev_step = previous_action)
-        
-        for action in step_list:
-            
-            obs, reward, done, info = env.step(int(action))
-            episodeReward += reward
-            env.render()
-
-            previous_action = action
-
-            if done:
-                print(F"Episode Reward: {episodeReward}")
-                obs=env.reset()
-                env.close()
-                break
-                
-        if not done:
-            ## get new action for one step before repeating while loop.
-
-            action = agent.get_new_action(prev_step = previous_action)
-            
-            obs, reward, done, info = env.step(int(action))
-            
-            episodeReward += reward
-            env.render()
-
-            previous_action = action
-
-            if done:
-                print(F"Episode Reward: {episodeReward}")
-                obs=env.reset()
-                env.close()
-                break #to be sure.
-
-        
-    
-        
-
-
-
-
-if __name__ == "__main__":
-
-    parser = argparse.ArgumentParser()
-
-    parser.add_argument("--config_file", 
-                        type=str, 
-                        help="What config file should be run? Defaults to a random file from the competition folder.")
-    
-    parser.add_argument("--max_step_length", 
-                        type=int, 
-                        help="What is the maximum step length you want. This applies to fixed-step walkers (where the walker takes `max_step_length` steps before making another choice), and walkers that sample step length from uniform, beta, and weibull distributions. It provides the upper bound for these distributions, with 0 as the lower bound. Defaults to 10.",
-                        default = 10)
-    parser.add_argument("--step_length_distribution", 
-                        type=str, 
-                        help = "What is the distribution you want to sample step length from? The options are 'fixed', 'uniform', 'normal', 'cauchy', 'gamma', 'weibull', and 'poisson'. Defaults to 'fixed'.",
-                        default = 'fixed')
-    parser.add_argument("--norm_mu", 
-                        type=float, 
-                        help = "What is the mean of the normal distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'normal'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--norm_sig", 
-                        type=float, 
-                        help = "What is the standard deviation of the normal distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'normal'. Defaults to 1.",
-                        default = 1)
-    parser.add_argument("--beta_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the beta distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--beta_beta", 
-                        type=float, 
-                        help = "What is the beta parameter of the beta distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--cauchy_mode", 
-                        type=float, 
-                        help = "What is the mode of the standard cauchy distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'cauchy'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--gamma_kappa", 
-                        type=float, 
-                        help = "What is the kappa parameter of the gamma distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'gamma'. Defaults to 9.",
-                        default = 9)
-    parser.add_argument("--gamma_theta", 
-                        type=float, 
-                        help = "What is the theta parameter of the gamma distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'gamma'. Defaults to 0.5.",
-                        default = 0.5)
-    parser.add_argument("--weibull_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the weibull distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'weibull'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--poisson_lambda", 
-                        type=float, 
-                        help = "What is the lambda parameter of the poisson distribution for step length sampling. This is ignored if `step_length_distribution` is anything other than 'poisson'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--action_biases", 
-                    nargs='+',
-                    type=float,
-                    help="Provide a series of 9 real values, one for each action, which is then softmaxed to provide the probability of selecting that action. Relative differences between the values is what is important. 0=stationary-action, 1=right-turn, 2=left-turn, 3=forwards, 4=forwards-right, 5=forwards-left, 6=backwards, 7=backwards-left, 8=backwards-right. Defaults to a value of 1 for all actions.",
-                    default=[1, 1, 1, 1, 1, 1, 1, 1, 1])
-    parser.add_argument("--prev_step_bias",
-                      type=float,
-                      help="Provide the initial probability that the previous action will be selected again at a choice point. Defaults to 0.",
-                      default=0)
-    parser.add_argument("--remove_prev_step",
-                       type=bool,
-                       help="Should the previous action be removed when selecting the next action. If True and `prev_step_bias` is 0, then a new action is selected that is not the old action. If True and there is some bias, then the bias is applied first, and if the previous step is not reselected, then the next action is guaranteed to not include the previous action. Defaults to False",
-                       default=False)
-    
-    args = parser.parse_args()
-
-    max_step_length = args.max_step_length 
-    step_length_distribution = args.step_length_distribution
-    norm_mu = args.norm_mu
-    norm_sig = args.norm_sig
-    beta_alpha = args.beta_alpha
-    beta_beta = args.beta_beta
-    cauchy_mode = args.cauchy_mode
-    gamma_kappa = args.gamma_kappa
-    gamma_theta = args.gamma_theta
-    weibull_alpha = args.weibull_alpha
-    poisson_lambda = args.poisson_lambda
-    action_biases = np.array(args.action_biases)
-    prev_step_bias = args.prev_step_bias
-    remove_prev_step = args.remove_prev_step
-
-    if args.config_file is not None:
-        configuration_file = args.config_file
-    else:
-        competition_folder = "../configs/competition/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = competition_folder + configuration_files[configuration_random]
-        print(F"Using configuration file {configuration_file}")
-
-    singleEpisodeRandomaActionAgent = RandomActionAgent(max_step_length=max_step_length,
-                                             step_length_distribution=step_length_distribution,
-                                             norm_mu=norm_mu,
-                                             norm_sig=norm_sig,
-                                             beta_alpha=beta_alpha,
-                                             beta_beta=beta_beta,
-                                             cauchy_mode=cauchy_mode,
-                                             gamma_kappa=gamma_kappa,
-                                             gamma_theta=gamma_theta,
-                                             weibull_alpha = weibull_alpha,
-                                             poisson_lambda=poisson_lambda,
-                                             action_biases=action_biases,
-                                             prev_step_bias=prev_step_bias,
-                                             remove_prev_step=remove_prev_step)
-    
-    watch_random_action_agent_single_config(configuration_file=configuration_file, agent = singleEpisodeRandomaActionAgent)
\ No newline at end of file
diff --git a/agents/randomWalkers.py b/agents/randomWalkers.py
deleted file mode 100644
index a9afbf5d8..000000000
--- a/agents/randomWalkers.py
+++ /dev/null
@@ -1,509 +0,0 @@
-"""
-Copyright © 2023 Konstantinos Voudouris (@kozzy97)
-
-Author: Konstantinos Voudouris
-Date: June 2023
-Python Version: 3.10.4
-Animal-AI Version: 3.0.2
-
-"""
-
-
-import argparse
-import numpy as np
-import os
-import random
-import warnings
-
-from animalai.envs.environment import AnimalAIEnvironment
-from collections import deque
-from mlagents_envs.envs.unity_gym_env import UnityToGymWrapper
-
-### Random Walker Agent + load config and watch.
-
-"""
-Random walker class for the animal-ai environment
-"""
-
-class RandomWalker:
-    """Implements a random walker with many changeable parameters.
-    The key idea is that a certain number of steps is selected (saccade length), the agent goes forwards for that many steps if positive and backwards if negative, and then
-    picks a number of steps (angle) to turn for. 
-    If the number of steps is negative, they turn left, if positive, they turn right.
-    """
-
-    def __init__(self, 
-                 max_saccade_length = 10, 
-                 max_angle_steps = 5,
-                 saccade_distribution = 'fixed', 
-                 angle_distribution = 'fixed',
-                 saccade_norm_mu = 5, 
-                 saccade_norm_sig = 1, 
-                 saccade_beta_alpha = 2, 
-                 saccade_beta_beta = 2, 
-                 saccade_cauchy_mode = 5, 
-                 saccade_gamma_kappa = 9, 
-                 saccade_gamma_theta = 0.5, 
-                 saccade_weibull_alpha = 2, 
-                 saccade_poisson_lambda = 5, 
-                 angle_fixed_randomise_turn = True,
-                 angle_norm_mu = 5,
-                 angle_norm_sig = 1,
-                 angle_beta_alpha = 2,
-                 angle_beta_beta = 2, 
-                 angle_cauchy_mode = 5,
-                 angle_gamma_kappa = 9,
-                 angle_gamma_theta = 0.5,
-                 angle_weibull_alpha = 2,
-                 angle_poisson_lambda = 5,
-                 angle_correlation = 0,
-                 backwards_action = False
-                 ):
-        self.max_saccade_length = max_saccade_length 
-        self.max_angle_steps = max_angle_steps
-        self.saccade_distribution = saccade_distribution
-        self.angle_distribution = angle_distribution
-        self.saccade_norm_mu = saccade_norm_mu
-        self.saccade_norm_sig = saccade_norm_sig
-        self.saccade_beta_alpha = saccade_beta_alpha
-        self.saccade_beta_beta = saccade_beta_beta
-        self.saccade_cauchy_mode = saccade_cauchy_mode
-        self.saccade_gamma_kappa = saccade_gamma_kappa
-        self.saccade_gamma_theta = saccade_gamma_theta
-        self.saccade_weibull_alpha = saccade_weibull_alpha
-        self.saccade_poisson_lambda = saccade_poisson_lambda
-        self.angle_fixed_randomise_turn  = angle_fixed_randomise_turn
-        self.angle_norm_mu = angle_norm_mu
-        self.angle_norm_sig = angle_norm_sig
-        self.angle_beta_alpha = angle_beta_alpha
-        self.angle_beta_beta = angle_beta_beta 
-        self.angle_cauchy_mode = angle_cauchy_mode
-        self.angle_gamma_kappa = angle_gamma_kappa
-        self.angle_gamma_theta = angle_gamma_theta
-        self.angle_weibull_alpha = angle_weibull_alpha
-        self.angle_poisson_lambda = angle_poisson_lambda
-        self.angle_correlation = angle_correlation
-        self.backwards_action = backwards_action
-
-    def get_num_steps_saccade(self):
-        
-        if self.saccade_distribution == 'fixed':
-            num_steps = int(self.max_saccade_length)
-
-        # The while statements remove the possibility of a 0, so that choices between negative and positive are not biased.
-           
-        elif self.saccade_distribution == 'uniform': 
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = random.randint(0, self.max_saccade_length)
-
-        elif self.saccade_distribution == 'normal':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.normal(self.saccade_norm_mu, self.saccade_norm_sig))
-
-        elif self.saccade_distribution == 'beta':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.beta(self.saccade_beta_alpha, self.saccade_beta_beta) * self.max_saccade_length) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-
-        elif self.saccade_distribution == 'cauchy':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.standard_cauchy() + self.saccade_cauchy_mode)
-        
-        elif self.saccade_distribution == 'gamma':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.gamma(self.saccade_gamma_kappa, self.saccade_gamma_theta))
-        
-        elif self.saccade_distribution == 'weibull':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.weibull(self.saccade_weibull_alpha) * self.max_saccade_length) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-        
-        elif self.saccade_distribution == 'poisson':
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.poisson(self.saccade_poisson_lambda))
-        
-        else:
-            raise ValueError("Distribution not recognised.")
-
-        if num_steps > 100:
-            warning_string = 'The number of steps chosen is: ' + str(num_steps) + '. Try toggling distribution parameters as your agent might get stuck.'
-            warnings.warn(warning_string)
-
-        if self.backwards_action:
-            num_steps = abs(num_steps) #make num_steps a positive number so it only goes forwards.
-
-        if num_steps > 0: #Move forwards
-            step_list = deque([3]*abs(num_steps)) 
-            step_list.append(0) # add in a stationary movement to reduce effect of momentum on next step.
-            step_list.append(0) # add in a stationary movement to reduce effect of momentum on next step.
-        
-        elif num_steps < 0: #Move backwards
-            step_list = deque([6]*abs(num_steps))
-            step_list.append(0) # add in a stationary movement to reduce effect of momentum on next step.
-            step_list.append(0) # add in a stationary movement to reduce effect of momentum on next step.
-
-        else:
-            raise ValueError("Saccade length is 0. Try increasing max_saccade_length.")
-        
-        return step_list
-    
-    def get_num_steps_turn(self, prev_angle_central_moment):
-        
-        if self.angle_distribution == 'fixed':
-            if self.angle_fixed_randomise_turn:
-                right = bool(random.getrandbits(1))
-                if right:
-                    num_steps = int(self.max_angle_steps)
-                else:
-                    num_steps = int(self.max_angle_steps * -1)
-            else:
-                num_steps = self.max_angle_steps
-        
-        elif self.angle_distribution == 'uniform': 
-            num_steps = 0
-
-            while num_steps == 0:
-                if self.angle_fixed_randomise_turn:
-                    right = bool(random.getrandbits(1))
-                    if right:
-                        num_steps = random.randint(0, self.max_angle_steps)
-                    else:
-                        num_steps = random.randint(0, (self.max_angle_steps)) * -1
-
-        elif self.angle_distribution == 'normal':
-            central_moment_difference = prev_angle_central_moment - self.angle_norm_mu 
-            central_moment_shift = central_moment_difference * self.angle_correlation
-
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.normal(central_moment_shift, self.angle_norm_sig))
-
-        elif self.angle_distribution == 'beta':
-            num_steps = 0
-
-            while num_steps == 0:
-                if self.angle_fixed_randomise_turn:
-                    right = bool(random.getrandbits(1))
-                    if right:
-                        num_steps = int(np.random.beta(self.angle_beta_alpha, self.angle_beta_beta) * self.max_angle_steps) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-                    else:
-                        num_steps = (int(np.random.beta(self.angle_beta_alpha, self.angle_beta_beta) * self.max_angle_steps) * -1) #rescale it to be bounded by 0 and max_step_length rather than by 0 and 1
-                
-
-        elif self.angle_distribution == 'cauchy':
-            central_moment_difference = prev_angle_central_moment - self.angle_cauchy_mode 
-            central_moment_shift = central_moment_difference * self.angle_correlation
-
-            num_steps = 0
-
-            while num_steps == 0:
-                num_steps = int(np.random.standard_cauchy() + central_moment_shift) #affine transform of distribution
-        
-        elif self.angle_distribution == 'gamma':
-            num_steps = 0
-
-            while num_steps == 0:
-                if self.angle_fixed_randomise_turn:
-                    right = bool(random.getrandbits(1))
-                    if right:
-                        num_steps = int(np.random.gamma(self.angle_gamma_kappa, self.angle_gamma_theta)) 
-                    else:
-                        num_steps = (int(np.random.gamma(self.angle_gamma_kappa, self.angle_gamma_theta)) * -1) 
-        
-        elif self.angle_distribution == 'weibull':
-            num_steps = 0
-
-            while num_steps == 0:
-                if self.angle_fixed_randomise_turn:
-                    right = bool(random.getrandbits(1))
-                    if right:
-                        num_steps = int(np.random.weibull(self.angle_weibull_alpha)) 
-                    else:
-                        num_steps = (int(np.random.weibull(self.angle_weibull_alpha)) * -1) 
-        
-        elif self.angle_distribution == 'poisson':
-            num_steps = 0
-            
-            while num_steps == 0:
-                if self.angle_fixed_randomise_turn:
-                    right = bool(random.getrandbits(1))
-                    if right:
-                        num_steps = int(np.random.poisson(self.angle_poisson_lambda)) #
-                    else:
-                        num_steps = (int(np.random.poisson(self.angle_poisson_lambda)) * -1) 
-
-            while num_steps == 0:
-                num_steps = int(np.random.poisson(self.angle_poisson_lambda))
-        
-        else:
-            raise ValueError("Distribution not recognised.")
-
-        if num_steps > 0: #Turn right
-            step_list = deque([1]*abs(num_steps))
-        
-        elif num_steps < 0: #Turn left
-            step_list = deque([2]*abs(num_steps))
-
-        else:
-            raise ValueError("Angle turn steps is 0. Try increasing max_angle_steps.")
-        
-        return step_list, num_steps
-    
-def watch_random_walker_single_config(configuration_file: str, agent: RandomWalker):
-    
-    port = 4000 + random.randint(
-    0, 1000
-    )  # use a random port to avoid problems if a previous version exits slowly
-    
-    aai_env = AnimalAIEnvironment( 
-    inference=True, #Set true when watching the agent
-    seed = 123,
-    worker_id=random.randint(0, 65500),
-    file_name="../env/AnimalAI",
-    arenas_configurations=configuration_file,
-    base_port=port,
-    useCamera=False,
-    resolution=36,
-    useRayCasts=False,
-    )
-
-    env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-
-    obs = env.reset()
-     
-    done = False
-    episodeReward = 0
-    
-    while not done:
-
-        saccade_list = agent.get_num_steps_saccade()
-        
-        for action in saccade_list:
-            
-            obs, reward, done, info = env.step(int(action))
-            episodeReward += reward
-            env.render()
-            
-            if done:
-                print(F"Episode Reward: {episodeReward}")
-                obs=env.reset()
-                env.close()
-                break
-        
-        if not done:
-            if 'num_angle_steps' not in locals() and agent.angle_distribution == 'normal': #if no turns have been done yet and using normal distribution, then set the central moment to be the prespecified normal_mu
-                prev_angle_central_moment = agent.angle_norm_mu
-            elif 'num_angle_steps' not in locals() and agent.angle_distribution == 'cauchy': #as above
-                prev_angle_central_moment = agent.angle_cauchy_mode
-            elif 'num_angle_steps' in locals():
-                prev_angle_central_moment = num_angle_steps #if turns have been done, then the central moment is whatever number of steps was provided before.
-            else:
-                prev_angle_central_moment = 0
-
-            angle_list, num_angle_steps = agent.get_num_steps_turn(prev_angle_central_moment)
-        
-            for action in angle_list:
-            
-                obs, reward, done, info = env.step(int(action))
-
-                episodeReward += reward
-
-                env.render()
-            
-                if done:
-                    print(F"Episode Reward: {episodeReward}")
-                    env.close()
-                    break
-        
-    
-        
-
-
-
-
-if __name__ == "__main__":
-
-    parser = argparse.ArgumentParser()
-
-    parser.add_argument("--config_file", 
-                        type=str, 
-                        help="What config file should be run? Defaults to a random file from the competition folder.")   
-    parser.add_argument("--max_saccade_length", 
-                        type=int, 
-                        help="What is the maximum saccade length you want. This applies to fixed-step walkers (where the walker takes `max_saccade_length` steps before making turning), and walkers that sample saccade length from uniform, beta, and weibull distributions. It provides the upper bound for these distributions, with 0 as the lower bound. Defaults to 10. You can use negative numbers if you want the walker to go backwards rather than forwards.",
-                        default = 10)
-    parser.add_argument("--max_angle_steps", 
-                        type=int, 
-                        help="What is the maximum number of steps that the walker will turn for? This applies to fixed-step walkers (where the walker turns for `max_saccade_length` steps before moving forwards/backwards), and walkers that sample angle steps from uniform, beta, and weibull distributions. It provides the upper bound for these distributions, with 0 as the lower bound. Defaults to 5. You can use negative numbers if you want the walker to go backwards rather than forwards.",
-                        default = 5)
-    parser.add_argument("--saccade_distribution", 
-                        type=str, 
-                        help = "What is the distribution you want to sample saccade length from? The options are 'fixed', 'uniform', 'normal', 'cauchy', 'gamma', 'weibull', and 'poisson'. Defaults to 'fixed'.",
-                        default = 'fixed')
-    parser.add_argument("--angle_distribution", 
-                        type=str, 
-                        help = "What is the distribution you want to sample number of steps to turn from? The options are 'fixed', 'uniform', 'normal', 'cauchy', 'gamma', 'weibull', and 'poisson'. Defaults to 'fixed'.",
-                        default = 'fixed')
-    parser.add_argument("--angle_fixed_randomise_turn",
-                        type=bool,
-                        help = "Should a random walker that turns for a fixed number of steps pick at random between left and right? If True, then there is a 0.5 probability of picking left and a 0.5 probability of picking right. This is ignored if `angle_distribution` is anything other than 'fixed'. Defaults to true.",
-                        default = True)
-    parser.add_argument("--saccade_norm_mu", 
-                        type=float, 
-                        help = "What is the mean of the normal distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'normal'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--saccade_norm_sig", 
-                        type=float, 
-                        help = "What is the standard deviation of the normal distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'normal'. Defaults to 1.",
-                        default = 1)
-    parser.add_argument("--angle_norm_mu", 
-                        type=float, 
-                        help = "What is the mean of the normal distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'normal'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--angle_norm_sig", 
-                        type=float, 
-                        help = "What is the standard deviation of the normal distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'normal'. Defaults to 1.",
-                        default = 1)
-    parser.add_argument("--saccade_beta_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the beta distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--saccade_beta_beta", 
-                        type=float, 
-                        help = "What is the beta parameter of the beta distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--angle_beta_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the beta distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--angle_beta_beta", 
-                        type=float, 
-                        help = "What is the beta parameter of the beta distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'beta'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--saccade_cauchy_mode", 
-                        type=float, 
-                        help = "What is the mode of the standard cauchy distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'cauchy'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--angle_cauchy_mode", 
-                        type=float, 
-                        help = "What is the mode of the standard cauchy distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'cauchy'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--saccade_gamma_kappa", 
-                        type=float, 
-                        help = "What is the kappa parameter of the gamma distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'gamma'. Defaults to 9.",
-                        default = 9)
-    parser.add_argument("--saccade_gamma_theta", 
-                        type=float, 
-                        help = "What is the theta parameter of the gamma distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'gamma'. Defaults to 0.5.",
-                        default = 0.5)
-    parser.add_argument("--angle_gamma_kappa", 
-                        type=float, 
-                        help = "What is the kappa parameter of the gamma distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'gamma'. Defaults to 9.",
-                        default = 9)
-    parser.add_argument("--angle_gamma_theta", 
-                        type=float, 
-                        help = "What is the theta parameter of the gamma distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'gamma'. Defaults to 0.5.",
-                        default = 0.5)
-    parser.add_argument("--saccade_weibull_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the weibull distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'weibull'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--angle_weibull_alpha", 
-                        type=float, 
-                        help = "What is the alpha parameter of the weibull distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'weibull'. Defaults to 2.",
-                        default = 2)
-    parser.add_argument("--saccade_poisson_lambda", 
-                        type=float, 
-                        help = "What is the lambda parameter of the poisson distribution for saccade length sampling. This is ignored if `saccade_distribution` is anything other than 'poisson'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--angle_poisson_lambda", 
-                        type=float, 
-                        help = "What is the lambda parameter of the poisson distribution for angle step sampling. This is ignored if `angle_distribution` is anything other than 'poisson'. Defaults to 5.",
-                        default = 5)
-    parser.add_argument("--angle_correlation",
-                        type=float,
-                        help = "What correlation is there with selecting the turn angle on the current step with the previous turn angle? This only applies at the moment to normal and cauchy distributed angles. Add a value from 0 to 1 and this will push the mass of the distributions towards the value previously chosen. Defaults to 0.",
-                        default = 0)
-    parser.add_argument("--backwards_action",
-                        type=bool,
-                        help = "Can the agent go backwards? If `True`, the agent will go symmetrically forwards and backwards. If `False`, the agent will only go forwards. Defaults to `False`.",
-                        default = False)
-    
-    args = parser.parse_args()
-
-    max_saccade_length = args.max_saccade_length
-    max_angle_steps = args.max_angle_steps
-    saccade_distribution = args.saccade_distribution
-    angle_distribution = args.angle_distribution
-    saccade_norm_mu = args.saccade_norm_mu 
-    saccade_norm_sig = args.saccade_norm_sig 
-    saccade_beta_alpha = args.saccade_beta_alpha 
-    saccade_beta_beta = args.saccade_beta_beta 
-    saccade_cauchy_mode = args.saccade_cauchy_mode 
-    saccade_gamma_kappa = args.saccade_gamma_kappa
-    saccade_gamma_theta = args.saccade_gamma_theta 
-    saccade_weibull_alpha = args.saccade_weibull_alpha
-    saccade_poisson_lambda = args.saccade_poisson_lambda 
-    angle_fixed_randomise_turn = args.angle_fixed_randomise_turn
-    angle_norm_mu = args.angle_norm_mu
-    angle_norm_sig = args.angle_norm_sig
-    angle_beta_alpha = args.angle_beta_alpha
-    angle_beta_beta = args.angle_beta_beta
-    angle_cauchy_mode = args.angle_cauchy_mode
-    angle_gamma_kappa = args.angle_gamma_kappa
-    angle_gamma_theta = args.angle_gamma_theta
-    angle_weibull_alpha = args.angle_weibull_alpha
-    angle_poisson_lambda = args.angle_poisson_lambda
-    angle_correlation = args.angle_correlation
-    backwards_action = args.backwards_action
-
-
-    if args.config_file is not None:
-        configuration_file = args.config_file
-    else:
-        competition_folder = "../configs/competition/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = competition_folder + configuration_files[configuration_random]
-        print(F"Using configuration file {configuration_file}")
-
-    singleEpisodeRandomWalker = RandomWalker(max_saccade_length = max_saccade_length, 
-                 max_angle_steps = max_angle_steps,
-                 saccade_distribution = saccade_distribution, 
-                 angle_distribution = angle_distribution,
-                 saccade_norm_mu = saccade_norm_mu, 
-                 saccade_norm_sig = saccade_norm_sig, 
-                 saccade_beta_alpha = saccade_beta_alpha, 
-                 saccade_beta_beta = saccade_beta_beta, 
-                 saccade_cauchy_mode = saccade_cauchy_mode, 
-                 saccade_gamma_kappa = saccade_gamma_kappa, 
-                 saccade_gamma_theta = saccade_gamma_theta, 
-                 saccade_weibull_alpha = saccade_weibull_alpha, 
-                 saccade_poisson_lambda = saccade_poisson_lambda, 
-                 angle_fixed_randomise_turn = angle_fixed_randomise_turn,
-                 angle_norm_mu = angle_norm_mu,
-                 angle_norm_sig = angle_norm_sig,
-                 angle_beta_alpha = angle_beta_alpha,
-                 angle_beta_beta = angle_beta_beta, 
-                 angle_cauchy_mode = angle_cauchy_mode,
-                 angle_gamma_kappa = angle_gamma_kappa,
-                 angle_gamma_theta = angle_gamma_theta,
-                 angle_weibull_alpha = angle_weibull_alpha,
-                 angle_poisson_lambda = angle_poisson_lambda,
-                 angle_correlation = angle_correlation,
-                 backwards_action = backwards_action)
-    
-    watch_random_walker_single_config(configuration_file=configuration_file, agent = singleEpisodeRandomWalker)
\ No newline at end of file
diff --git a/agents/readme.md b/agents/readme.md
deleted file mode 100644
index d888abbe8..000000000
--- a/agents/readme.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Agents In Animal-AI
-
-This directory provides some starting points for building a range of agents for interaction with the animal-ai environment. Note that some of the  scripts require additional packages to be installed to use - this should be obvious from the scripts. See the docs directory and the forthcoming Animal-AI Version 3 Paper for more description/explanation.
-
-- `randomWalkers.py` provides an implementation for random walkers using the low-level API.
-- `goToGoodBraitenberg.py` shows off the ml-agents low level python api for interacting with the environment and demonstrates inference with a hand-coded *Braitenberg* agent that navigates towards good goals and away from bad goals.
-- `PPOAgent.py` shows how to wrap animalai as a gym environment and train and test a PPO agent on a config.
diff --git a/animalai/.gitignore b/animalai/.gitignore
deleted file mode 100644
index 4fc8a6e08..000000000
--- a/animalai/.gitignore
+++ /dev/null
@@ -1,1 +0,0 @@
-animalai.egg-info/
\ No newline at end of file
diff --git a/animalai/animalai/__init__.py b/animalai/animalai/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/animalai/animalai/envs/__init__.py b/animalai/animalai/envs/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/animalai/animalai/envs/actions.py b/animalai/animalai/envs/actions.py
deleted file mode 100644
index 8da035d59..000000000
--- a/animalai/animalai/envs/actions.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import numpy as np
-from mlagents_envs.base_env import ActionTuple
-
-##A class to help access the discrete action space of AAI environment.
-class AAIActions():
-    def __init__(self, no_agents=1):
-        self.NOOP = AAIAction("noop", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[0,0]], dtype=np.int32)))
-        self.LEFT = AAIAction("left", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[0,2]], dtype=np.int32)))
-        self.RIGHT = AAIAction("right", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[0,1]], dtype=np.int32)))
-        self.FORWARDS = AAIAction("forwards", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[1,0]], dtype=np.int32)))
-        self.FORWARDSLEFT = AAIAction("forwards&left", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[1,2]], dtype=np.int32)))
-        self.FORWARDSRIGHT = AAIAction("forwards&right", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[1,1]], dtype=np.int32)))
-        self.BACKWARDS = AAIAction("backwards", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[2,0]], dtype=np.int32)))
-        self.BACKWARDSLEFT = AAIAction("backwards&left", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[2,2]], dtype=np.int32)))
-        self.BACKWARDSRIGHT = AAIAction("backwards&right", ActionTuple(continuous=np.zeros((no_agents,0)), discrete=np.array([[2,1]], dtype=np.int32)))
-        self.allActions = [self.NOOP, self.LEFT, self.RIGHT, self.FORWARDS, self.FORWARDSLEFT, self.FORWARDSRIGHT, self.BACKWARDS, self.BACKWARDSLEFT, self.BACKWARDSRIGHT]
-
-    def random(self):
-        return np.random.choice(self.allActions)
-
-class AAIAction():
-    """Actions have a name and an associated ActionTuple"""
-    def __init__(self, name, action_tuple):
-        self.name = name
-        self.action_tuple = action_tuple
-    
-    def __str__(self):
-        return self.name
-
-    def __repr__(self):
-        return self.name
\ No newline at end of file
diff --git a/animalai/animalai/envs/braitenberg.py b/animalai/animalai/envs/braitenberg.py
deleted file mode 100644
index 9845654f6..000000000
--- a/animalai/animalai/envs/braitenberg.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from animalai.envs.actions import AAIActions, AAIAction
-from animalai.envs.raycastparser import RayCastParser
-from animalai.envs.raycastparser import RayCastObjects
-
-class Braitenberg():
-    """Implements a simple Braitenberg vehicle agent that heads towards food
-    Can change the number of rays but only responds to GOODGOALs, GOODGOALMULTI and BADGOAL"""
-    def __init__(self, no_rays):
-        self.no_rays = no_rays
-        assert(self.no_rays % 2 == 1), "Only supports odd number of rays (but environment should only allow odd number"
-        self.listOfObjects = [RayCastObjects.GOODGOAL, RayCastObjects.GOODGOALMULTI, RayCastObjects.BADGOAL, RayCastObjects.IMMOVABLE, RayCastObjects.MOVABLE]
-        self.raycast_parser = RayCastParser(self.listOfObjects, self.no_rays)
-        self.actions = AAIActions()
-        self.prev_action = self.actions.NOOP
-
-    def prettyPrint(self, obs) -> str:
-        """Prints the parsed observation"""
-        return self.raycast_parser.prettyPrint(obs)
-    
-    def get_action(self, obs) -> AAIAction:
-        """Returns the action to take given the current parsed raycast observation"""
-        obs = self.raycast_parser.parse(obs)
-        newAction = self.actions.NOOP
-        if self.ahead(obs, RayCastObjects.GOODGOALMULTI):
-            newAction = self.actions.FORWARDS
-        elif self.left(obs, RayCastObjects.GOODGOALMULTI):
-            newAction = self.actions.FORWARDSLEFT
-        elif self.right(obs, RayCastObjects.GOODGOALMULTI):
-            newAction = self.actions.FORWARDSRIGHT
-        elif self.ahead(obs, RayCastObjects.GOODGOAL):
-            newAction = self.actions.FORWARDS
-        elif self.left(obs, RayCastObjects.GOODGOAL):
-            newAction = self.actions.FORWARDSLEFT
-        elif self.right(obs, RayCastObjects.GOODGOAL):
-            newAction = self.actions.FORWARDSRIGHT
-        elif self.ahead(obs, RayCastObjects.BADGOAL):
-            newAction = self.actions.BACKWARDS
-        elif self.left(obs, RayCastObjects.BADGOAL):
-            newAction = self.actions.BACKWARDSLEFT
-        elif self.right(obs, RayCastObjects.BADGOAL):
-            newAction = self.actions.BACKWARDSRIGHT
-        else:
-            if self.prev_action == self.actions.NOOP or self.prev_action == self.actions.BACKWARDS:
-                newAction = self.actions.LEFT
-            else:
-                newAction = self.prev_action    
-        self.prev_action = newAction
-        return newAction
-
-    def ahead(self, obs, object):
-        """Returns true if the input object is ahead of the agent"""
-        if(obs[self.listOfObjects.index(object)][int((self.no_rays-1)/2)] > 0):
-            # print("found " + str(object) + " ahead")
-            return True
-        return False
-
-    def left(self, obs, object):
-        """Returns true if the input object is left of the agent"""
-        for i in range(int((self.no_rays-1)/2)):
-            if(obs[self.listOfObjects.index(object)][i] > 0):
-                # print("found " + str(object) + " left")
-                return True
-        return False
-
-    def right(self, obs, object):
-        """Returns true if the input object is right of the agent"""
-        for i in range(int((self.no_rays-1)/2)):
-            if(obs[self.listOfObjects.index(object)][i+int((self.no_rays-1)/2) + 1] > 0):
-                # print("found " + str(object) + " right")
-                return True
-        return False
\ No newline at end of file
diff --git a/animalai/animalai/envs/environment.py b/animalai/animalai/envs/environment.py
deleted file mode 100644
index 0c474cdc7..000000000
--- a/animalai/animalai/envs/environment.py
+++ /dev/null
@@ -1,264 +0,0 @@
-import uuid
-from typing import NamedTuple, Dict, Optional, List
-from mlagents_envs.environment import UnityEnvironment
-from mlagents_envs.rpc_communicator import UnityTimeOutException
-from mlagents_envs.side_channel.raw_bytes_channel import RawBytesChannel
-from mlagents_envs.side_channel.side_channel import SideChannel
-from mlagents_envs.side_channel.engine_configuration_channel import (
-    EngineConfig,
-    EngineConfigurationChannel,
-)
-
-class PlayTrain(NamedTuple):
-    play: int
-    train: int
-
-class AnimalAIEnvironment(UnityEnvironment):
-    """Extends UnityEnvironment with options specific for AnimalAI
-    see https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Python-API.md for documentation
-    and the animalai observations doc for explanation of the AnimalAI-specific parameters."""
-
-    # Default values for configuration parameters of the environment, can be changed if needed.
-    WINDOW_WIDTH = PlayTrain(play=1200, train=32)
-    WINDOW_HEIGHT = PlayTrain(play=800, train=32)
-    QUALITY_LEVEL = PlayTrain(play=1, train=1)
-    ARENA_CONFIG_SC_UUID = "9c36c837-cad5-498a-b675-bc19c9370072"
-    YAML_SC_UUID = "20b62eb2-cde3-4f5f-a8e5-af8d9677971d"
-
-    def __init__(
-        self,
-        additional_args: List[str] = None,
-        log_folder: str = "",
-        file_name: Optional[str] = None,
-        worker_id: int = 0,
-        base_port: int = 5005,
-        seed: int = 0,
-        play: bool = False,
-        arenas_configurations: str = "",
-        inference: bool = False,
-        useCamera: bool = True,
-        resolution: int = None,
-        grayscale: bool = False,
-        useRayCasts: bool = False,
-        raysPerSide: int = 2,
-        rayMaxDegrees: int = 60,       
-        decisionPeriod: int = 3, 
-        side_channels: Optional[List[SideChannel]] = None,
-        no_graphics: bool = False,
-        use_YAML: bool = True,
-        timescale: int = 1,
-        targetFrameRate: int = 60,
-        captureFrameRate: int = 0,
-        ):
-        """
-        Parameters
-        ----------
-        additional_args : List[str]
-            Currently not supported anymore. TODO.
-        log_folder : str
-            Optional folder to write the Unity Player log file into. Requires absolute path.
-        file_name : Optional[str]
-            Path to the Unity environment binary.
-        worker_id : int
-            Offset from base_port. Used for training multiple environments simultaneously.
-        base_port : int
-            Base port to connect to Unity environment over. worker_id increments over this.
-            If no environment is specified (i.e. file_name is None), the DEFAULT_EDITOR_PORT will be used.
-        seed : int
-            Random seed used for the environment.
-        play : bool
-            Whether to run the Unity simulator in play mode.
-        arenas_configurations : str
-            Path to the YAML file containing the arena configurations.
-        inference : bool
-            Sets the window size to the same as play mode to allow observing the agent.
-        useCamera : bool
-            Whether to use the camera observations.
-        resolution : int
-            Resolution of the camera observations.
-        grayscale : bool
-            Whether to use grayscale camera observations.
-        useRayCasts : bool
-            Whether to use the raycast observations.
-        raysPerSide : int
-            Number of rays per side.
-        rayMaxDegrees : int
-            Maximum degrees of the raycast observations.
-        decisionPeriod : int
-            [DEPRECATED] Number of steps to take before the agent gets a decision. TODO.
-        side_channels : Optional[List[SideChannel]]
-            Additional side channel for no-rl communication with Unity.
-        no_graphics : bool
-            Whether to run the Unity simulator in no-graphics mode. 
-            Not compatible with useCamera, as all observations will empty.
-        use_YAML :
-            [DEPRECATED]. TODO.
-        timescale : int
-            Defines the multiplier for the deltatime in the simulation. Default is 1.
-            If set to a higher value, time will pass faster in the simulation
-            and might speed of training but the physics might break.
-            A value of 1 is real time, 2 is double speed, 0.5 is half speed.
-            WARNING: Make sure that the observations your agent can receive 
-            per second is adequate for the set timescale.
-            For example, with an average observations per second 60, a timescale
-            of 60 will cause your agent to only observe 1 frame per in-simulation second.
-            Especially important with time-sensitive environments, 
-            e.g. decaying or growing goals, falling or rolling objects...
-        targetFrameRate : int
-            Instructs simulation to try to render at a specified frame rate. 
-            A value of -1 will attempt to render as fast as possible, recommended
-            when timescale is set to a value higher than 1.
-        captureFrameRate : int
-            Instructs the simulation to consider time between updates to always be constant, regardless of the actual frame rate.
-        """
-
-        self.obsdict = {
-            "camera": [],
-            "rays": [],
-            "health": [],
-            "velocity": [],
-            "position": [],
-        }
-        self.useCamera = useCamera
-        self.useRayCasts = useRayCasts
-        args = self.executable_args( 
-            play,
-            useCamera, 
-            resolution, 
-            grayscale, 
-            useRayCasts, 
-            raysPerSide, 
-            rayMaxDegrees, 
-            decisionPeriod)
-        self.play = play
-        self.inference = inference
-        self.timeout = 10 if play else 60
-        self.side_channels = side_channels if side_channels else []
-        self.arenas_parameters_side_channel = None
-        self.use_YAML = use_YAML
-        self.timescale = timescale
-        self.captureFrameRate = captureFrameRate
-        self.targetFrameRate = targetFrameRate
-
-        self.configure_side_channels(self.side_channels)
-
-        super().__init__(
-            file_name=file_name,
-            worker_id=worker_id,
-            base_port=base_port,
-            seed=seed,
-            no_graphics=no_graphics,
-            timeout_wait=self.timeout,
-            additional_args=args,
-            side_channels=self.side_channels,
-            log_folder=log_folder,
-        )
-        self.reset(arenas_configurations)
-
-    def configure_side_channels(self, side_channels: List[SideChannel]) -> None:
-
-        contains_engine_config_sc = any(
-            [isinstance(sc, EngineConfigurationChannel) for sc in side_channels]
-        )
-        if not contains_engine_config_sc:
-            self.side_channels.append(self.create_engine_config_side_channel())
-        contains_arena_config_sc = any(
-            [sc.channel_id == self.ARENA_CONFIG_SC_UUID for sc in side_channels]
-        )
-        if not contains_arena_config_sc:
-            self.arenas_parameters_side_channel = RawBytesChannel(
-                channel_id=uuid.UUID(self.ARENA_CONFIG_SC_UUID)
-            )
-            self.side_channels.append(self.arenas_parameters_side_channel)
-
-    def create_engine_config_side_channel(self) -> EngineConfigurationChannel:
-        if self.play or self.inference:
-            width, height, quality_level = (
-                self.WINDOW_WIDTH.play,
-                self.WINDOW_HEIGHT.play,
-                self.QUALITY_LEVEL.play,
-            )
-        else:
-            width, height, quality_level = (
-                self.WINDOW_WIDTH.train,
-                self.WINDOW_HEIGHT.train,
-                self.QUALITY_LEVEL.train,
-            )
-        engine_configuration = EngineConfig(
-            width=width,
-            height=height,
-            quality_level=quality_level,
-            time_scale = self.timescale,
-            target_frame_rate = self.targetFrameRate,
-            capture_frame_rate = self.captureFrameRate
-        )
-        engine_configuration_channel = EngineConfigurationChannel()
-        engine_configuration_channel.set_configuration(engine_configuration)
-        return engine_configuration_channel
-
-    def get_obs_dict(self, obs) -> Dict:
-        """Parse the observation:
-        input: the observation directly from AAI
-        output: a dictionary with keys: ["camera", "rays", "health", "velocity", "position"] """
-        intrinsicobs = 0
-        if(self.useCamera):
-            intrinsicobs = intrinsicobs+1
-            self.obsdict["camera"] = obs[0][0]
-            if(self.useRayCasts):
-                intrinsicobs = intrinsicobs+1
-                self.obsdict["rays"] = obs[1][0]
-        elif(self.useRayCasts):
-            intrinsicobs = intrinsicobs+1
-            self.obsdict["rays"] = obs[0][0]
-        
-        self.obsdict["health"] = obs[intrinsicobs][0][0]
-        self.obsdict["velocity"] = obs[intrinsicobs][0][1:4]
-        self.obsdict["position"] = obs[intrinsicobs][0][4:7]
-        return self.obsdict
-
-    def reset(self, arenas_configurations="") -> None:
-        if arenas_configurations != "":
-            f = open(arenas_configurations, "r")
-            d = f.read()
-            f.close()
-            self.arenas_parameters_side_channel.send_raw_data(bytearray(d, encoding="utf-8"))
-        try:
-            super().reset()
-        except UnityTimeOutException as timeoutException:
-            if self.play:
-                pass
-            else:
-                raise timeoutException
-
-    @staticmethod
-    def executable_args(
-        play: bool = False,
-        useCamera: bool = True,
-        resolution: int = 150,
-        grayscale: bool = False,
-        useRayCasts: bool = True,
-        raysPerSide: int = 2,
-        rayMaxDegrees: int = 60,
-        decisionPeriod: int = 3,
-    ) -> List[str]:
-        args = ["--playerMode"]
-        if play:
-            args.append("1")
-        else:
-            args.append("0")
-        if useCamera:
-            args.append("--useCamera")
-        if resolution:
-            args.append("--resolution")
-            args.append(str(resolution))
-        if grayscale:
-            args.append("--grayscale")
-        if useRayCasts:
-            args.append("--useRayCasts")
-        args.append("--raysPerSide")
-        args.append(str(raysPerSide))
-        args.append("--rayMaxDegrees")
-        args.append(str(rayMaxDegrees))
-        args.append("--decisionPeriod")
-        args.append(str(decisionPeriod))
-        return args
\ No newline at end of file
diff --git a/animalai/animalai/envs/gym/__init__.py b/animalai/animalai/envs/gym/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/animalai/animalai/envs/gym/environment.py b/animalai/animalai/envs/gym/environment.py
deleted file mode 100644
index fe9848167..000000000
--- a/animalai/animalai/envs/gym/environment.py
+++ /dev/null
@@ -1,177 +0,0 @@
-import numpy as np
-from gym import spaces
-from typing import Union, List
-
-from gym_unity.envs import (
-    UnityToGymWrapper,
-    UnityGymException,
-    GymStepResult,
-    ActionFlattener,
-    logger,
-)
-
-from animalai.envs.environment import AnimalAIEnvironment
-from animalai.envs.arena_config import ArenaConfig
-
-
-class AnimalAIGym(UnityToGymWrapper):
-    def __init__(
-        self,
-        environment_filename: str,
-        worker_id: int = 0,
-        uint8_visual: bool = False,
-        flatten_branched: bool = False,
-        n_arenas: int = 1,
-        seed: int = 0,
-        inference: bool = False,
-        grayscale: bool = False,
-        arenas_configurations: ArenaConfig = None,
-    ):
-        """
-        Environment initialization
-        :param environment_filename: The UnityEnvironment path or file to be wrapped in the gym.
-        :param worker_id: Worker number for environment.
-        :param use_visual: Whether to use visual observation or vector observation.
-        :param uint8_visual: Return visual observations as uint8 (0-255) matrices instead of float (0.0-1.0).
-        :param multiagent: Whether to run in multi-agent mode (lists of obs, reward, done).
-        :param flatten_branched: If True, turn branched discrete action spaces into a Discrete space rather than
-            MultiDiscrete.
-        :param no_graphics: Whether to run the Unity simulator in no-graphics mode
-        :param allow_multiple_visual_obs: If True, return a list of visual observations instead of only one.
-        """
-        base_port = 5005
-        if environment_filename is None:
-            base_port = AnimalAIEnvironment.DEFAULT_EDITOR_PORT
-
-        self._env = AnimalAIEnvironment(
-            file_name=environment_filename,
-            worker_id=worker_id,
-            base_port=base_port,
-            seed=seed,
-            n_arenas=n_arenas,
-            inference=inference,
-            arenas_configurations=arenas_configurations,
-            grayscale=grayscale,
-        )
-
-        # Take a single step so that the brain information will be sent over
-        if not self._env.get_behavior_names():
-            self._env.step()
-
-        self.visual_obs = None
-        self._n_agents = -1
-
-        # self.agent_mapper = AgentIdIndexMapper()
-
-        # Save the step result from the last time all Agents requested decisions.
-        # self._previous_step_result: BatchedStepResult = None
-        self._multiagent = n_arenas > 1
-        self._flattener = None
-        # Hidden flag used by Atari environments to determine if the game is over
-        self.game_over = False
-        self._allow_multiple_visual_obs = n_arenas > 1
-
-        # Check brain configuration
-        if len(self._env.get_behavior_names()) != 1:
-            raise UnityGymException(
-                "There can only be one brain in a UnityEnvironment "
-                "if it is wrapped in a gym."
-            )
-
-        self.brain_name = self._env.get_behavior_names()[0]
-        self.name = self.brain_name
-        self.group_spec = self._env.get_behavior_spec(self.brain_name)
-
-        if self._get_n_vis_obs() == 0:
-            raise UnityGymException(
-                "`use_visual` was set to True, however there are no"
-                " visual observations as part of this environment."
-            )
-        self.use_visual = self._get_n_vis_obs() >= 1
-        self.uint8_visual = uint8_visual
-
-        # Check for number of agents in scene.
-        self._env.reset()
-        step_result = self._env.get_steps(self.brain_name)
-        # self._check_agents(step_result[0].agent)
-        # self._previous_step_result = step_result
-        # self.agent_mapper.set_initial_agents(list(self._previous_step_result.agent_id))
-
-        # Set observation and action spaces
-        if self.group_spec.is_action_discrete():
-            branches = self.group_spec.discrete_action_branches
-            if self.group_spec.action_shape == 1:
-                self._action_space = spaces.Discrete(branches[0])
-            else:
-                if flatten_branched:
-                    self._flattener = ActionFlattener(branches)
-                    self._action_space = self._flattener.action_space
-                else:
-                    self._action_space = spaces.MultiDiscrete(branches)
-
-        else:
-            if flatten_branched:
-                logger.warning(
-                    "The environment has a non-discrete action space. It will "
-                    "not be flattened."
-                )
-            high = np.array([1] * self.group_spec.action_shape)
-            self._action_space = spaces.Box(-high, high, dtype=np.float32)
-        high = np.array([np.inf] * self._get_vec_obs_size())
-        if self.use_visual:
-            shape = self._get_vis_obs_shape()
-            if uint8_visual:
-                self._observation_space = spaces.Box(
-                    0, 255, dtype=np.uint8, shape=shape
-                )
-            else:
-                self._observation_space = spaces.Box(
-                    0, 1, dtype=np.float32, shape=shape
-                )
-
-        else:
-            self._observation_space = spaces.Box(-high, high, dtype=np.float32)
-
-    def reset(
-        self, arenas_configurations: ArenaConfig = None
-    ) -> Union[List[np.ndarray], np.ndarray]:
-        """Resets the state of the environment and returns an initial observation.
-        In the case of multi-agent environments, this is a list.
-        Returns: observation (object/list): the initial observation of the
-        space.
-        """
-        step_result = self._step(True, arenas_configurations=arenas_configurations)
-        n_agents = step_result.n_agents()
-        self._check_agents(n_agents)
-        self.game_over = False
-
-        if not self._multiagent:
-            res: GymStepResult = self._single_step(step_result)
-        else:
-            res = self._multi_step(step_result)
-        return res[0]
-
-    def _step(
-        self, needs_reset: bool = False, arenas_configurations: ArenaConfig = None
-    ):
-        if needs_reset:
-            self._env.reset(arenas_configurations=arenas_configurations)
-        else:
-            self._env.step()
-        info = self._env.get_step_result(self.brain_name)
-        # Two possible cases here:
-        # 1) all agents requested decisions (some of which might be done)
-        # 2) some Agents were marked Done in between steps.
-        # In case 2,  we re-request decisions until all agents request a real decision.
-        while info.n_agents() - sum(info.done) < self._n_agents:
-            if not info.done.all():
-                raise UnityGymException(
-                    "The environment does not have the expected amount of agents. "
-                    + "Some agents did not request decisions at the same time."
-                )
-            for agent_id, reward in zip(info.agent_id, info.reward):
-                self.agent_mapper.mark_agent_done(agent_id, reward)
-
-            self._env.step()
-            info = self._env.get_step_result(self.brain_name)
-        return self._sanitize_info(info)
diff --git a/animalai/animalai/envs/raycastparser.py b/animalai/animalai/envs/raycastparser.py
deleted file mode 100644
index d8c3ea6d2..000000000
--- a/animalai/animalai/envs/raycastparser.py
+++ /dev/null
@@ -1,178 +0,0 @@
-import enum
-import numpy as np
-
-"""
-The script is designed to parse raycast observations from the AnimalAI environment. 
-It includes a class to interpret these observations and output a simplified version 
-of the data that only contains relevant objects. 
-"""
-
-
-class RayCastObjects(enum.Enum):
-    """
-    Enumeration of possible objects detected by the raycast. 
-    The values should correspond with how they are defined in the AnimalAI Unity environment.
-    """
-    ARENA = 0
-    IMMOVABLE = 1
-    MOVABLE = 2
-    GOODGOAL = 3
-    GOODGOALMULTI = 4
-    BADGOAL = 5
-    GOALSPAWNER = 6
-    DEATHZONE = 7
-    HOTZONE = 8
-    RAMP = 9
-    PILLARBUTTON = 10
-    SIGNPOSTER = 11
-
-
-class RayCastParser():
-    """
-    The RayCastParser class is responsible for parsing raycast observations 
-    from the AnimalAI environment and returning a simplified version that only 
-    contains relevant objects.
-    """
-
-    def __init__(self, listOfObjects, numberOfRays):
-        """
-        Initialize the RayCastParser.
-
-        Parameters:
-        - listOfObjects: List of objects (from RayCastObjects enum) that the parser should look for.
-        - numberOfRays: The number of rays in the raycast from AnimalAI environment.
-        """
-        self.numberOfRays = numberOfRays
-        self.listOfObjects = listOfObjects
-        self.listofObjectVals = [x.value for x in listOfObjects]
-        self.numberOfObjects = len(listOfObjects)
-
-    def parse(self, raycast) -> np.ndarray:
-        """
-        Parse the raw raycast data and return a simplified array.
-
-        Parameters:
-        - raycast: The raw raycast array from the AnimalAI environment.
-
-        Returns:
-        - np.ndarray: The parsed raycast, simplified to only include objects in listOfObjects.
-        """
-        if isinstance(raycast, dict):
-            raycast = raycast['rays']
-
-        self.numberDetectableObjects = int(
-            len(raycast) / self.numberOfRays) - 2
-        parsedRaycast = np.zeros((len(self.listOfObjects), self.numberOfRays))
-        for i in range(self.numberOfRays):
-            for j in range(self.numberDetectableObjects):
-                idx = i * (self.numberDetectableObjects + 2) + j
-                distance_idx = i * \
-                    (self.numberDetectableObjects + 2) + \
-                    self.numberDetectableObjects + 1
-                if idx < len(raycast) and j in self.listofObjectVals:
-                    if raycast[idx] == 1 and distance_idx < len(raycast):
-                        parsedRaycast[self.listofObjectVals.index(
-                            j)][i] = raycast[distance_idx]
-
-        parsedRaycast = np.reshape(
-            parsedRaycast, (len(self.listOfObjects), self.numberOfRays))
-        reordered = np.zeros_like(parsedRaycast)
-        for i in range(parsedRaycast.shape[0]):
-            reordered[i] = self.reorderRow(parsedRaycast[i])
-        return reordered
-
-    def reorderRow(self, row):
-        """
-        Reorder the elements in a row so that they read from left to right, 
-        as opposed to from the middle outwards.
-
-        Parameters:
-        - row: A 1D numpy array representing a single row of parsed raycast data.
-
-        Returns:
-        - np.ndarray: The reordered row.
-        """
-        newRow = np.zeros_like(row)
-        midIndex = int((self.numberOfRays-1)/2)
-        newRow[midIndex] = row[0]
-        for i in range(midIndex):
-            newRow[i+1+midIndex] = row[self.numberOfRays-2*(i+1)]
-            newRow[i] = row[2*(i+1)]
-        return newRow
-
-    def prettyPrint(self, raycast) -> str:
-        """
-        Pretty-prints the parsed raycast data, making it easier to read and understand.
-
-        Parameters:
-        - raycast: The raw raycast array from the AnimalAI environment.
-
-        Prints the parsed and simplified raycast in a human-readable format.
-        """
-        if isinstance(raycast, dict):
-            raycast = raycast['rays']
-
-        parsedRaycast = self.parse(raycast)
-        for i in range(parsedRaycast.shape[0]):
-            print(self.listOfObjects[i].name, ":", parsedRaycast[i])
-
-
-if __name__ == "__main__":
-    # Test 1: Simple test to check if GOODGOAL and IMMOVABLE objects are correctly parsed
-    # Description: This test checks if the parser correctly identifies GOODGOAL and IMMOVABLE objects
-    # and places them correctly in the parsed raycast array.
-    rayParser = RayCastParser(
-        [RayCastObjects.GOODGOAL, RayCastObjects.IMMOVABLE], 5)
-    test_raycast = [1, 1, 1, 1, 1, 1, 0, 0.1,
-                    1, 1, 1, 1, 1, 1, 0, 0.2,
-                    1, 1, 1, 1, 1, 1, 1, 0.3,
-                    1, 1, 1, 1, 1, 1, 1, 0.4,
-                    1, 1, 1, 1, 1, 1, 1, 0.5]
-    parsedRaycast = rayParser.parse(test_raycast)
-    print("Parsed Raycast for Test 1:")
-    print(parsedRaycast)
-    rayParser.prettyPrint(test_raycast)
-
-    # Test 2: Checking for no objects detected
-    # Description: This test checks if the parser correctly identifies when no objects are detected.
-    rayParser = RayCastParser(
-        [RayCastObjects.GOODGOAL, RayCastObjects.BADGOAL], 3)
-    test_raycast = [0, 0, 0, 0, 0, 0, 0, 0.1,
-                    0, 0, 0, 0, 0, 0, 0, 0.2,
-                    0, 0, 0, 0, 0, 0, 0, 0.3]
-    parsedRaycast = rayParser.parse(test_raycast)
-    print("Parsed Raycast for Test 2:")
-    print(parsedRaycast)
-    rayParser.prettyPrint(test_raycast)
-
-    # Test 3: Mix of objects detected and not detected
-    # Description: This test checks if the parser correctly identifies some objects while ignoring others.
-    rayParser = RayCastParser(
-        [RayCastObjects.ARENA, RayCastObjects.MOVABLE, RayCastObjects.GOODGOALMULTI], 7)
-    test_raycast = [1, 0, 0, 0, 0, 0, 0, 0.1,
-                    0, 1, 0, 0, 0, 0, 0, 0.2,
-                    0, 0, 1, 0, 0, 0, 1, 0.3,
-                    0, 0, 0, 1, 0, 0, 1, 0.4,
-                    0, 0, 0, 0, 1, 0, 1, 0.5,
-                    0, 0, 0, 0, 0, 1, 1, 0.6,
-                    0, 0, 0, 0, 0, 0, 0, 0]
-    parsedRaycast = rayParser.parse(test_raycast)
-    print("Parsed Raycast for Test 3:")
-    print(parsedRaycast)
-    rayParser.prettyPrint(test_raycast)
-
-    # Test 4: Mix of objects detected and not detected, including PILLARBUTTON
-    # Description: This test checks if the parser correctly identifies some objects including PILLARBUTTON while ignoring others.
-    rayParser = RayCastParser(
-        [RayCastObjects.ARENA, RayCastObjects.PILLARBUTTON, RayCastObjects.MOVABLE], 7)
-    test_raycast = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.1,
-                    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.2,
-                    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.3,
-                    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0.4,
-                    0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0.5,
-                    0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.6,
-                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
-    parsedRaycast = rayParser.parse(test_raycast)
-    print("Parsed Raycast for Test 4:")
-    print(parsedRaycast)
-    rayParser.prettyPrint(test_raycast)
diff --git a/animalai/animalai/envs/settings.py b/animalai/animalai/envs/settings.py
deleted file mode 100644
index b11f3662d..000000000
--- a/animalai/animalai/envs/settings.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import attr
-import cattr
-
-from typing import Optional, List, Dict, Any
-from mlagents_envs.side_channel.side_channel import SideChannel
-from mlagents.trainers.cli_utils import load_config
-from mlagents.trainers.exception import TrainerConfigError
-
-@attr.s(auto_attribs=True)
-class AAIOptions():
-    """The options used by the animalai environment"""
-    arenaConfig: str = attr.ib() #The path of a valid arena config yaml file
-    useCamera: bool = attr.ib() #If true, then camera observations are returned
-    resolution: int = attr.ib() #The (square) resolution of camera observations (if useCamera is true)
-    grayscale: bool = attr.ib() #If the camera observations are grayscale or RGB
-    useRayCasts: bool = attr.ib() #If true, then raycast observations are returned
-    raysPerSide: int = attr.ib() #The number of rays on each side of the central ray (see observations doc)
-    rayMaxDegrees: int = attr.ib() #The number of degrees between the central ray and furthest ray in each direction.
-
-    @staticmethod
-    def load_config(config_path) -> "AAIOptions":
-        # Load YAML
-        configured_dict: Dict[str, Any] = {
-            "arenaConfig": {},
-            "useCamera": {},
-            "resolution": {},
-            "grayscale": {},
-            "useRayCasts": {},
-            "raysPerSide": {},
-            "rayMaxDegrees": {},
-        }
-        configured_dict.update(load_config(config_path))
-
-        for key in configured_dict.keys():
-            # Detect bad config options
-            if key not in attr.fields_dict(AAIOptions):
-                raise TrainerConfigError(
-                    "The option {} was specified in your YAML file, but is invalid.".format(
-                        key
-                    )
-                )
-                
-        return cattr.structure(configured_dict, AAIOptions)
diff --git a/animalai/animalai/train/__init__.py b/animalai/animalai/train/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/animalai/animalai/train/train.py b/animalai/animalai/train/train.py
deleted file mode 100644
index 993526b26..000000000
--- a/animalai/animalai/train/train.py
+++ /dev/null
@@ -1,271 +0,0 @@
-## This is a slightly modified version of learn.py from the ML-Agents Toolkit
-## It is modified so that it can load the AnimalAI Environment and pass the
-## environment-specific parameters and custom SideChannel
-## for loading config yaml files. 
-
-# # Unity ML-Agents Toolkit
-from animalai.envs.settings import AAIOptions
-from animalai.envs.environment import AnimalAIEnvironment
-
-from mlagents import torch_utils
-import yaml
-
-import os
-import numpy as np
-import json
-
-from typing import Callable, Optional, List
-
-import mlagents.trainers
-import mlagents_envs
-from mlagents.trainers.trainer_controller import TrainerController
-from mlagents.trainers.environment_parameter_manager import EnvironmentParameterManager
-from mlagents.trainers.trainer import TrainerFactory
-from mlagents.trainers.directory_utils import validate_existing_directories
-from mlagents.trainers.stats import StatsReporter
-from mlagents.trainers.cli_utils import parser
-from mlagents_envs.environment import UnityEnvironment
-from mlagents.trainers.settings import RunOptions
-
-from mlagents.trainers.training_status import GlobalTrainingStatus
-from mlagents_envs.base_env import BaseEnv
-from mlagents.trainers.subprocess_env_manager import SubprocessEnvManager
-from mlagents_envs.side_channel.side_channel import SideChannel
-from mlagents_envs.timers import (
-    hierarchical_timer,
-    get_timer_tree,
-    add_metadata as add_timer_metadata,
-)
-from mlagents_envs import logging_util
-from mlagents.plugins.stats_writer import register_stats_writer_plugins
-
-logger = logging_util.get_logger(__name__)
-
-TRAINING_STATUS_FILE_NAME = "training_status.json"
-
-
-def get_version_string() -> str:
-    return f""" Version information:
-  ml-agents: {mlagents.trainers.__version__},
-  ml-agents-envs: {mlagents_envs.__version__},
-  Communicator API: {UnityEnvironment.API_VERSION},
-  PyTorch: {torch_utils.torch.__version__}"""
-
-
-def parse_command_line(argv: Optional[List[str]] = None) -> RunOptions:
-    args = parser.parse_args(argv)
-    return RunOptions.from_argparse(args)
-
-
-def run_training(run_seed: int, options: RunOptions, animalai_options: AAIOptions) -> None:
-    """
-    Launches training session.
-    :param options: parsed command line arguments
-    :param run_seed: Random seed used for training.
-    :param run_options: Command line arguments for training.
-    """
-    with hierarchical_timer("run_training.setup"):
-        torch_utils.set_torch_config(options.torch_settings)
-        checkpoint_settings = options.checkpoint_settings
-        env_settings = options.env_settings
-        engine_settings = options.engine_settings
-
-        run_logs_dir = checkpoint_settings.run_logs_dir
-        port: Optional[int] = env_settings.base_port
-        # Check if directory exists
-        validate_existing_directories(
-            checkpoint_settings.write_path,
-            checkpoint_settings.resume,
-            checkpoint_settings.force,
-            checkpoint_settings.maybe_init_path,
-        )
-        # Make run logs directory
-        os.makedirs(run_logs_dir, exist_ok=True)
-        # Load any needed states
-        if checkpoint_settings.resume:
-            GlobalTrainingStatus.load_state(
-                os.path.join(run_logs_dir, "training_status.json")
-            )
-
-        # Configure Tensorboard Writers and StatsReporter
-        stats_writers = register_stats_writer_plugins(options)
-        for sw in stats_writers:
-            StatsReporter.add_writer(sw)
-
-        if env_settings.env_path is None:
-            port = None
-        env_factory = create_environment_factory(
-            animalai_options,
-            env_settings.env_path,
-            engine_settings.no_graphics,
-            run_seed,
-            port,
-            env_settings.env_args,
-            os.path.abspath(run_logs_dir),  # Unity environment requires absolute path
-        )
-
-        env_manager = SubprocessEnvManager(env_factory, options, env_settings.num_envs)
-        env_parameter_manager = EnvironmentParameterManager(
-            options.environment_parameters, run_seed, restore=checkpoint_settings.resume
-        )
-
-        trainer_factory = TrainerFactory(
-            trainer_config=options.behaviors,
-            output_path=checkpoint_settings.write_path,
-            train_model=not checkpoint_settings.inference,
-            load_model=checkpoint_settings.resume,
-            seed=run_seed,
-            param_manager=env_parameter_manager,
-            init_path=checkpoint_settings.maybe_init_path,
-            multi_gpu=False,
-        )
-        # Create controller and begin training.
-        tc = TrainerController(
-            trainer_factory,
-            checkpoint_settings.write_path,
-            checkpoint_settings.run_id,
-            env_parameter_manager,
-            not checkpoint_settings.inference,
-            run_seed,
-        )
-
-    # Begin training
-    try:
-        tc.start_learning(env_manager)
-    finally:
-        env_manager.close()
-        write_run_options(checkpoint_settings.write_path, options)
-        write_timing_tree(run_logs_dir)
-        write_training_status(run_logs_dir)
-
-
-def write_run_options(output_dir: str, run_options: RunOptions) -> None:
-    run_options_path = os.path.join(output_dir, "configuration.yaml")
-    try:
-        with open(run_options_path, "w") as f:
-            try:
-                yaml.dump(run_options.as_dict(), f, sort_keys=False)
-            except TypeError:  # Older versions of pyyaml don't support sort_keys
-                yaml.dump(run_options.as_dict(), f)
-    except FileNotFoundError:
-        logger.warning(
-            f"Unable to save configuration to {run_options_path}. Make sure the directory exists"
-        )
-
-
-def write_training_status(output_dir: str) -> None:
-    GlobalTrainingStatus.save_state(os.path.join(output_dir, TRAINING_STATUS_FILE_NAME))
-
-
-def write_timing_tree(output_dir: str) -> None:
-    timing_path = os.path.join(output_dir, "timers.json")
-    try:
-        with open(timing_path, "w") as f:
-            json.dump(get_timer_tree(), f, indent=4)
-    except FileNotFoundError:
-        logger.warning(
-            f"Unable to save to {timing_path}. Make sure the directory exists"
-        )
-
-
-def create_environment_factory(
-    animalai_options: AAIOptions,
-    env_path: Optional[str],
-    no_graphics: bool,
-    seed: int,
-    start_port: Optional[int],
-    env_args: Optional[List[str]],
-    log_folder: str,
-) -> Callable[[int, List[SideChannel]], BaseEnv]:
-    def create_unity_environment(
-        worker_id: int, side_channels: List[SideChannel]
-    ) -> AnimalAIEnvironment:
-        # Make sure that each environment gets a different seed
-        env_seed = seed + worker_id
-        return AnimalAIEnvironment(
-            file_name=env_path,
-            worker_id=worker_id,
-            seed=env_seed,
-            no_graphics=no_graphics,
-            base_port=start_port,
-            additional_args=env_args,
-            side_channels=side_channels,
-            log_folder=log_folder,            
-    
-            play=False,
-            arenas_configurations=animalai_options.arenaConfig,
-            useCamera=animalai_options.useCamera,
-            resolution=animalai_options.resolution,
-            useRayCasts=animalai_options.useRayCasts,
-            raysPerSide=animalai_options.raysPerSide,
-            rayMaxDegrees=animalai_options.rayMaxDegrees,
-        )
-    return create_unity_environment
-
-
-def run_cli(options: RunOptions, animalai_options: AAIOptions) -> None:
-    try:
-        print(
-            """
-
-                        ▄▄▄▓▓▓▓
-                   ╓▓▓▓▓▓▓█▓▓▓▓▓
-              ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
-            ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
-          ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
-        ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
-        ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
-          ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
-            '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
-               ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
-                   `▀█▓▓▓▓▓▓▓▓▓▌
-                        ¬`▀▀▀█▓
-
-        """
-        )
-    except Exception:
-        print("\n\n\tUnity Technologies\n")
-    print(get_version_string())
-
-    if options.debug:
-        log_level = logging_util.DEBUG
-    else:
-        log_level = logging_util.INFO
-
-    logging_util.set_log_level(log_level)
-
-    logger.debug("Configuration for this run:")
-    logger.debug(json.dumps(options.as_dict(), indent=4))
-
-    # Options deprecation warnings
-    if options.checkpoint_settings.load_model:
-        logger.warning(
-            "The --load option has been deprecated. Please use the --resume option instead."
-        )
-    if options.checkpoint_settings.train_model:
-        logger.warning(
-            "The --train option has been deprecated. Train mode is now the default. Use "
-            "--inference to run in inference mode."
-        )
-
-    run_seed = options.env_settings.seed
-
-    # Add some timer metadata
-    add_timer_metadata("mlagents_version", mlagents.trainers.__version__)
-    add_timer_metadata("mlagents_envs_version", mlagents_envs.__version__)
-    add_timer_metadata("communication_protocol_version", UnityEnvironment.API_VERSION)
-    add_timer_metadata("pytorch_version", torch_utils.torch.__version__)
-    add_timer_metadata("numpy_version", np.__version__)
-
-    if options.env_settings.seed == -1:
-        run_seed = np.random.randint(0, 10000)
-        logger.debug(f"run_seed set to {run_seed}")
-    run_training(run_seed, options, animalai_options)
-
-
-def main(animalai_options: str):
-    run_cli(parse_command_line(), animalai_options)
-
-# # For python debugger to directly run this script
-# if __name__ == "__main__":
-#     main()
diff --git a/animalai/setup.py b/animalai/setup.py
deleted file mode 100644
index a2fac17d2..000000000
--- a/animalai/setup.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from setuptools import setup, find_packages
-
-setup(
-    name="animalai",
-    version="3.1.3",
-    description="Animal AI environment Python API",
-    url="https://github.com/Kinds-of-Intelligence-CFI/animal-ai",
-    author="Matt Crosby; Ibrahim Alhas; K. Voudouris; W. Schellaert",
-    author_email="ia424@cam.ac.uk",
-    classifiers=[
-        "Intended Audience :: Developers",
-        "Topic :: Scientific/Engineering :: Artificial Intelligence",
-        "License :: OSI Approved :: Apache Software License",
-        "Programming Language :: Python :: 3.6",
-        "Programming Language :: Python :: 3.7",
-        "Programming Language :: Python :: 3.8",
-        "Programming Language :: Python :: 3.9",
-    ],
-    packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
-    zip_safe=False,
-    install_requires=["mlagents==0.30.0",
-                      "numpy==1.21.2"],
-    python_requires=">=3.6",
-)
diff --git a/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreen.yml b/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreen.yml
deleted file mode 100644
index f7c253c7f..000000000
--- a/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreen.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
\ No newline at end of file
diff --git a/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreenCurriculum.yml b/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreenCurriculum.yml
deleted file mode 100644
index 7b8aceb26..000000000
--- a/configs/aai3-paper-experiments/buttonPressTask/buttonPressGreenCurriculum.yml
+++ /dev/null
@@ -1,236 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  1: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  2: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  3: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  4: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  5: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  6: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: -1}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  7: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: -1}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  8: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 25}
-  9: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 25}
-  10: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
-  11: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
-  12: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
-  13: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 2, y: 0, z: -1}
-      rotations: [90]
-    - !Item
-      name: Pillar-Button
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      moveDurations: [0.1]
-      resetDurations: [1.0]
-      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
-      rewardWeights: [1, 0, 0]
-      spawnProbability: 1.0
-      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
diff --git a/configs/aai3-paper-experiments/foragingTask/foragingTaskSpawnerTree.yml b/configs/aai3-paper-experiments/foragingTask/foragingTaskSpawnerTree.yml
deleted file mode 100644
index ff54ebba6..000000000
--- a/configs/aai3-paper-experiments/foragingTask/foragingTaskSpawnerTree.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-!ArenaConfig 
-arenas:
-  0: !Arena
-    pass_mark: 15
-    t: 500
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: -1, y: 0, z: 5}
-    - !Item
-      name: SpawnerTree
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      spawnCounts: [10]
-      finalValues: [2]
diff --git a/docs/Arena-Object-Definitions.md b/docs/Arena-Object-Definitions.md
new file mode 100644
index 000000000..5857608cf
--- /dev/null
+++ b/docs/Arena-Object-Definitions.md
@@ -0,0 +1,373 @@
+# Animal-AI Environment Objects
+
+#### Table of Contents
+
+1. [Introduction](#introduction)
+2. [Unity Objects - What are they?](#unity-objects---what-are-they)
+3. [The Arena](#the-arena)
+4. [The Agent](#the-agent)
+5. [Immovable Objects](#immovable-objects)
+6. [Movable Objects](#movable-objects)
+7. [Valenced Objects](#valenced-objects)
+8. [Dispensers](#dispensers)
+9. [Sign Boards](#sign-boards)
+
+## Introduction
+
+The Animal-AI environment comprises various objects categorized into _immovable_, _movable_, _rewards_, and _other/unique_ types. These objects can be configured in numerous ways to create diverse tasks. Each object's name, default characteristics, and configurable ranges are detailed below. All objects can rotate 360 degrees. Unity uses a left-handed coordinate system with `y` as the vertical axis, and `x` and `z` axes representing horizontal and depth dimensions, respectively.
+
+## Unity Objects - What are they?
+
+Briefly, Unity game objects, commonly referred to as *GameObjects*, are the fundamental components in the Unity Engine, serving as containers for all other components or functionalities within a Unity scene. These objects can represent characters, props, scenery, cameras, lights, and more. Each GameObject can be equipped with various components such as scripts, renderers, colliders, or custom components, defining their behavior and interaction within the game world. *Prefabs* in Unity are essentially templates created from GameObjects; they allow developers to create, configure, and store a GameObject complete with its components and properties. Once a Prefab is created, it can be reused multiple times across the scene or even across different projects, ensuring consistency and efficiency in game development by allowing changes to be made to multiple instances simultaneously.
+
+Most objects in AAI share a handful of fundamental parameters governing their size, position, and other properties. Values for these parameters can be defined in YAML ([see here](/docs/Background-YAML.md)). Common parameters are:
+* `name`: the name of the object you want to spawn.
+* `positions`: a list of `Vector3` positions within the arena where you want to spawn items, if the list is empty the position will be sampled randomly in the arena. Any position dimension set to -1 will spawn randomly.
+* `sizes`: a list of `Vector3` sizes, if the list is empty the size will be sampled randomly (within preset bounds for that particular object). You can set any size to -1 to spawn randomly along that dimension only.
+* `rotations`: a list of `float` in the range `[0,360]`, if the list is empty the rotation is sampled randomly.
+* `colors`: a list of `RGB` values (integers in the range `[0,255]`), if the list is empty the color is sampled randomly. Note that not all objects can have their colour changed and for those (e.g. transparent objects) this value will be ignored.
+
+Any of these fields can be omitted in the configuration files, in which case the omitted fields are automatically randomized. Any Vector3 that contains a -1 for any of its dimensions will spawn that dimension randomly. This can be used to spawn, for example, multiple walls of a set width and height but random lengths. 
+
+## The Arena
+
+<p align="center">
+  <img height="400" src="/docs/figs/prefabs/DefaultArena.png">
+</p>
+
+A single arena is as shown above, it comes with a single agent (spherical animal, [see below](#the-agent)), a floor and four walls. It is a square of size 40x40, the origin (the bottom-left corner) of the arena is `(0,0)` . You can provide coordinates for objects in the range `[0,40]x[0,40]` as floats.
+
+Note that in Unity the **y** axis is the vertical axis. In the above picture with the agent on the ground in the center of the environment its coordinates are `(20, 0, 20)` .
+
+For each arena you can provide the following parameters and a list of objects to spawn:
+* `t` an `int`, the length of an episode which can change from one episode to the other. A value of `0` means that the episode will not terminate until a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode). This value is converted into a decay rate for the health of the agent. A `t` of 100 means that the agent's health will decay to 0, and the episode will end, after 100 time steps.
+* `pass_mark` an `int`, the reward threshold that should constitute a ‘pass’ in the environment. Leaving this parameter undefined leads to the default value of 0, whereby any reward value obtained by the Agent results in a pass. This parameter also determines the notifications that players receive at the end of an episode. If used, this parameter should be defined with consideration to the reward size that can feasibly be obtained by the agent in each configuration file. 
+* `blackouts`
+
+### Blackouts
+
+Blackouts are parameters you can pass to each arena, which define between which frames of an episode the lights are 
+on or off. If omitted, this parameter automatically sets to have lights on for the entire episode. You can otherwise 
+pass two types of arguments for this parameter:
+
+* passing a list of frames `[5,10,15,20,25]` will start with the lights on, switch them off from frames 5 to 9 included, 
+then back on from 15 to 19 included etc...
+* passing a single negative argument `[-20]` will automatically switch lights on and off every 20 frames.
+
+**Note**: for infinite episodes (where `t=0` ), the first point above would leave the light off after frame `25` while the second point would keep switching the lights every `20` frames indefinitely.
+
+## The Agent
+
+The agent can be placed anywhere in the arena with any rotation. It has a fixed size and a fixed set of skins.
+
+* **Name**: `Agent`
+* **Size**: `(1,1,1)` (not changeable)
+* **Skins** (`skins`): `"hedgehog"`,  `"panda"`,  `"pig"`,  `"random"`
+
+Notes: The agent can be frozefor a specified number of frames at the start of an episode. There is no reward decrement during the frozen period. This can be set with an integer value passed to the `frozenAgentDelays` parameter (defaults to `0` ).
+
+<table>
+  <tr>
+
+    <td><img src="/docs/figs/prefabs/agent-skins/agent-hedgehog.png" width="500"/><p>The Agent as a hedgehog</p></td>
+    <td><img src="/docs/figs/prefabs/agent-skins/agent-panda.png" width="500"/><p>The Agent as a panda</p></td>
+    <td><img src="/docs/figs/prefabs/agent-skins/agent-pig.png" width="500"/><p>The Agent as a pig</p></td>
+
+  </tr>
+</table>
+
+## Immovable Objects
+
+_Immovable_ objects are fixed in place and cannot be moved. The outer walls of the arena are also immovable and are permanently fixed in place to prevent the player/agent from escaping the arena.
+
+### Wall
+
+<img align="right" height="100" src="/docs/figs/prefabs/Immovable/Wall.png" />
+
+* **Name**: `Wall`
+* **Size Range**: `(0.1,0.1,0.1)-(40,10,40)`
+* **Color**: RGB range `(0,0,0)-(255,255,255)`
+
+### Transparent Wall
+
+<img align="right" height="100" src="/docs/figs/prefabs/Immovable/WallTransparent.png" />
+
+* **Name**: `WallTransparent`
+* **Size Range**: `(0.1,0.1,0.1)-(40,10,40)`
+* **Color**: Not changeable
+
+### Ramp
+
+<img align="right" height="100" src="/docs/figs/prefabs/Immovable/Ramp.png" />
+
+* **Name**: `Ramp`
+* **Size Range**: `(0.5,0.1,0.5)-(40,10,40)`
+* **Color**: RGB range `(0,0,0)-(255,255,255)`
+
+### Tunnel
+
+<img align="right" height="100" src="/docs/figs/prefabs/Immovable/CylinderTunnel.png" />
+
+* **Name**: `CylinderTunnel`
+* **Size Range**: `(2.5,2.5,2.5)-(10,10,10)`
+* **Color**: RGB range `(0,0,0)-(255,255,255)`
+
+### Transparent Tunnel
+
+<img align="right" height="100" src="/docs/figs/prefabs/Immovable/CylinderTunnelTransparent.png" />
+
+* **Name**: `CylinderTunnelTransparent`
+* **Size Range**: `(2.5,2.5,2.5)-(10,10,10)`
+* **Color**: Not changeable
+
+## Movable Objects
+
+_Movable_ objects can be easily moved by the agent or other objects. These objects can be pushed by the player/agent as the physics engine is enabled for these objects directly. Note that these objects have aliases (alternative names) for backwards compatibility with previous versions of AAI.
+
+### Light Cardboard Block
+
+<img align="right" height="100" src="/docs/figs/prefabs/Movable/LightBlock.png" />
+
+* **Name**: `LightBlock`
+* **Size Range**: `(0.5,0.5,0.5)-(10,10,10)`
+* **Color**: Not changeable
+* **Alias**: `CardBox1`
+
+### Heavy Cardboard Block
+
+<img align="right" height="100" src="/docs/figs/prefabs/Movable/HeavyBlock.png" />
+
+* **Name**: `HeavyBlock`
+* **Size Range**: `(0.5,0.5,0.5)-(10,10,10)`
+* **Color**: Not changeable
+* **Alias**: `CardBox2`
+
+### U-shaped Block
+
+<img align="right" height="100" src="/docs/figs/prefabs/Movable/UBlock.png" />
+
+* **Name**: `UBlock`
+* **Size Range**: `(1,0.3,3)-(5,2,20)`
+* **Color**: Not changeable
+* **Alias**: `UObject`
+
+### L-shaped Block
+
+<img align="right" height="100" src="/docs/figs/prefabs/Movable/LBlock.png" />
+
+* **Name**: `LBlock`
+* **Size Range**: `(1,0.3,3)-(5,2,20)`
+* **Color**: Not changeable
+* **Alias**: `LObject`
+
+### J-shaped Block
+
+<img align="right" height="100" src="/docs/figs/prefabs/Movable/JBlock.png" />
+
+* **Name**: `JBlock`
+* **Size Range**: `(1,0.3,3)-(5,2,20)`
+* **Color**: Not changeable
+* **Alias**: `LObject2`
+
+## Valenced Objects
+
+Valenced objects increase or decrease the agent's reward when the agent touches them. Some are stationary and some have an initial velocity at the start of an episode. Note that some of these objects have aliases (alternative names) for backwards compatibility with previous versions of AAI.
+
+### Stationary Episode-Ending Positive Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoal.png" />
+
+* **Name**: `GoodGoal`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Positive, proportional to size
+
+### Moving Episode-Ending Positive Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoal.png" />
+
+* **Name**: `GoodGoalBounce`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Positive, proportional to size
+  
+Notes: The `rotations` parameter sets the direction of motion.
+
+### Stationary Episode-Ending Negative Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/BadGoal.png" />
+
+* **Name**: `BadGoal`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Negative, proportional to size
+
+### Moving Episode-Ending Negative Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/BadGoal.png" />
+
+* **Name**: `BadGoalBounce`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Negative, proportional to size
+
+Notes: The `rotations` parameter sets the direction of motion.
+
+### Stationary Non-Episode-Ending Positive Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoalMulti.png" />
+
+* **Name**: `GoodGoalMulti`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Positive, proportional to size
+
+### Moving Non-Episode-Ending Positive Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoalMulti.png" />
+
+* **Name**: `GoodGoalMultiBounce`
+* **Size Range**: `0.5-5`
+* **Color**: Not changeable
+* **Valence**: Positive, proportional to size
+
+Notes: The `rotations` parameter sets the direction of motion.
+
+### Non-Episode-Ending Ripen Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/RipenGoal.png" />
+
+* **Name**: `RipenGoal`
+* **Valence Range**: `0-5`
+* **Size**: automatically sets to final reward value
+* **Color**: Not changeable
+* **Ripen Onset Delay Range (frames)** (`delays`): `0-Inf` (default `150`)
+* **Ripen Rate (frames)** (`changeRates`): `0.001-Inf` (default `0.005`)
+* **Alias**: `AntiDecayGoal`
+
+Notes: Colour changes (from purple to grey) and a radial-timer fills over time during ripening process. Initial valence can be set with a float passed to the `initialValues` parameter, and valence can be set with a float passed to the `finalValues` parameter.
+
+### Non-Episode-Ending Decay Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/DecayGoal.png" />
+
+* **Name**: `DecayGoal`
+* **Valence Range**: `0-5`
+* **Size**: automatically sets to final reward value
+* **Color**: Not changeable
+* **Decay Onset Delay Range (frames)** (`delays`): `0-Inf` (default `150`)
+* **Decay Rate (frames)** (`changeRates`): `-0.001-Inf` (default `-0.005`, automatically converts to negative values if positive provided)
+
+Notes: Colour changes (from purple to grey) and a radial-timer depletes over time during decay process. Initial valence can be set with a float passed to the `initialValues` parameter, and valence can be set with a float passed to the `finalValues` parameter. 
+
+### Episode-Ending Grow Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoal.png" />
+
+* **Name**: `GrowGoal`
+* **Size Range**: `0-5`
+* **Valence Change Rate** (`changeRates`): `0.001-Inf` (default `0.005`)
+* **Valence**: Positive, proportional to size
+* **Color**: Not changeable
+* **Growth Onset Delay Range (frames)** (`delays`): `0-Inf` (default `0`)
+
+Notes: Growth halts if the the goal is trapped between/underneath other objects. Maximum size is `5` . Initial valence can be set with a float passed to the `initialValues` parameter, and valence can be set with a float passed to the `finalValues` parameter. 
+
+### Episode-Ending Shrink Goal
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/GoodGoal.png" />
+
+* **Name**: `ShrinkGoal`
+* **Size Range**: `0-5`
+* **Valence Change Rate** (`changeRates`): `0.001-Inf` (default `0.005`)
+* **Valence**: Positive, proportional to size
+* **Color**: Not changeable
+* **Growth Onset Delay Range (frames)** (`delays`): `0-Inf` (default `0`)
+
+Notes: Maximum size is `5` . Initial valence can be set with a float passed to the `initialValues` parameter, and valence can be set with a float passed to the `finalValues` parameter.
+
+### Episode-Ending DeathZone
+
+<img align="right" height="100" src="/docs/figs/prefabs/ValencedObjects/DeathZone.png" />
+
+* **Name**: `DeathZone`
+* **Size Range**: `(1,0.5,1)-(40,10,40)`
+* **Valence**: `-1`
+* **Color**: Not changeable
+
+### Non-Episode-Ending HotZone
+
+<img align="right" height="100" src="/docs/figs/prefabs/Rewards/HotZone.png" />
+
+* **Name**: `HotZone`
+* **Valence**: `min(-10/t, -0.00001)` for `t > 0`,  `-0.00001` otherwise, where `t` is the number of steps in the episode
+* **Color**: Not changeable
+
+Notes: When the agent enters the hot zone, reward decrement is accelerated by a factor of 10 compared to time alone. If a `DeathZone` and a `HotZone` overlap, `DeathZone` prevails.
+
+## Dispensers
+
+These objects dispense valenced objects. They are immovable.
+
+### SpawnerTree
+
+<img align="right" height="100" src="/docs/figs/prefabs/Dispensers/SpawnerTree.png" />
+
+* **Name**: `SpawnerTree`
+* **Size**: Fixed (`5.19 x 5.95 x 5.02`)
+* **Spawned Goal Size Range**: `0.2-3`
+* **Number of goals to spawn** (`spawnCounts`): `0-Inf` (leave blank or set to `-1` to spawn infinitely)
+* **Color**: Not changeable
+* **Growth Onset Delay Range (frames)** (`delays`): `0-Inf` (default `0`)
+
+Notes: The tree spawns `GoodGoalMulti` . They grow on the trees before dropping to the floor once they have reached their final size. The starting size of the goals can be set with the `initialValues` parameter (default: `0.2` ) and the final size with the `finalValues` parameter (default: `1.0` ). The valence of the goals is proportional to their size. The number of seconds it takes to 'grow' the goals on the tree (relative to the timescale of the environment) can be set with the `ripenTimes` parameter. The number of seconds between spawnings (relative to the timescale of the environment) can be set with the `timesBetweenSpawns` parameter (default: 4.0).
+
+### SpawnerDispenserTall
+
+<img align="right" height="100" src="/docs/figs/prefabs/Dispensers/SpawnerDispenserTall.png" />
+
+* **Name**: `SpawnerDispenserTall`
+* **Size**: Fixed (`1.67 x 4.46 x 1.67`)
+* **Spawned Goal Size Range**: `0.2-1`
+* **Number of goals to spawn** (`spawnCounts`): `0-Inf` (leave blank or set to `-1` to spawn infinitely)
+* **Color**: RGB range `(0,0,0)-(255,255,255)`
+* **Growth Onset Delay Range (frames)** (`delays`): `0-Inf` (default `0`)
+* **Alias**: `SpawnerDispenser`
+
+Notes: The dispenser spawns `GoodGoalMulti` . The valence of the goals is proportional to their size. The number of seconds between spawnings (relative to the timescale of the environment) can be set with the `timesBetweenSpawns` parameter (default: 1.5). The object has a door that can be animated to open and close.  The number of seconds before the door opens can be set with the `doorDelays` parameter (default: `10.0` ), and the number of seconds the door remains open for can be ste with the `timesBetweenDoorOpens` parameter (default: `-1` , if `< 0` then, once opened, the door stays open permanently).
+
+### SpawnerContainerShort
+
+<img align="right" height="100" src="/docs/figs/prefabs/Dispensers/SpawnerDispenserTall.png" />
+
+* **Name**: `SpawnerDispenserShort`
+* **Size**: Fixed (`1.67 x 1.67 x 1.67`)
+* **Spawned Goal Size Range**: `0.2-1`
+* **Number of goals to spawn** (`spawnCounts`): `0-Inf` (leave blank or set to `-1` to spawn infinitely)
+* **Color**: RGB range `(0,0,0)-(255,255,255)`
+* **Growth Onset Delay Range (frames)** (`delays`): `0-Inf` (default `0`)
+* **Alias**: `SpawnerDispenser`
+
+Notes: The dispenser spawns `GoodGoalMulti` . The valence of the goals is proportional to their size. The number of seconds between spawnings (relative to the timescale of the environment) can be set with the `timesBetweenSpawns` parameter (default: 1.5). The object has a door that can be animated to open and close.  The number of seconds before the door opens can be set with the `doorDelays` parameter (default: `10.0` ), and the number of seconds the door remains open for can be ste with the `timesBetweenDoorOpens` parameter (default: `-1` , if `< 0` then, once opened, the door stays open permanently).
+
+### SpawnerButton
+
+<img align="right" height="100" src="/docs/figs/prefabs/Dispensers/SpawnerButton.png" />
+
+* **Name**: `SpawnerButton`
+* **Size**: Fixed
+* **Spawned Goal Size**: `1`
+* **Color**: Not changeable
+* **Alias**: `Pillar-Button`
+
+Notes: Spawns a goal when the player/agent *interacts* with it by colliding with the physical object. The position of the spawned goal can be set with the a `!Vector3` passed to the `rewardSpawnPos` parameter. The probability that a goal will spawn upon a press can be set with a float between 0 and 1 passed to the `spawnProbability` parameter. Different valenced objects can be spawned on different presses. A list, such as `["GoodGoal", "BadGoal", "GoodGoalMulti"]` , can be passed to `rewardNames` to define the valenced objects (only these three are supported at the moment). A corresponding list of floats between 0 and 1 can be passed to the `rewardWeights` to determine the probability of spawning each of the types of valenced object. The probabilities are normalized to sum to one. The number of frames taken for the button to depress upon touching it can be defined with `moveDurations` , and the number of frames for the button to be reset before it can be pressed again can be set with `resetDurations` .
+
+## Sign Boards
+
+<p align="center">
+  <img height="250" src="/docs/figs/exampleGallery/SignPosterboard-preset-symbols.png">
+</p>
+
+<p align="center">
+  <img height="250" src="/docs/figs/exampleGallery/SignPosterboard-special-symbols-annotated.png">
+</p>
diff --git a/docs/Background-Cognitive-Science.md b/docs/Background-Cognitive-Science.md
new file mode 100644
index 000000000..db43d2b51
--- /dev/null
+++ b/docs/Background-Cognitive-Science.md
@@ -0,0 +1,79 @@
+# Background: Cognitive Science
+
+#### Table of Contents
+
+* [Introduction to Cognitive Science](#Introduction-to-Cognitive-Science)
+  + [What is Cognitive Science?](#What-is-Cognitive-Science?)
+  + [Key Areas in Cognitive Science](#Key-Areas-in-Cognitive-Science)
+    - [Perception and Sensation](#Perception-and-Sensation)
+    - [Memory and Learning](#Memory-and-Learning)
+    - [Language and Cognition](#Language-and-Cognition)
+    - [Decision Making and Problem Solving](#Decision-Making-and-Problem-Solving)
+    - [Computational Models](#Computational-Models)
+    - [Neuroscience](#Neuroscience)
+  + [Cognitive Science in Practice](#Cognitive-Science-in-Practice)
+  + [Conclusion](#Conclusion)
+
+  
+# Introduction to Cognitive Science
+
+Cognitive Science is an interdisciplinary field that explores the nature of cognition, encompassing a wide range of topics from the workings of the brain to the processes of thinking and learning. This document aims to provide a foundational overview of cognitive science and its various research areas.
+
+## What is Cognitive Science?
+
+Cognitive Science is the scientific study of the mind and its processes, including perception, thinking, memory, attention, language, problem-solving, and learning. It combines knowledge and methods from psychology, computer science, linguistics, philosophy, neuroscience, and anthropology.
+
+## Key Areas in Cognitive Science
+
+### Perception and Sensation
+
+Understanding how humans perceive the world around them is a fundamental aspect of cognitive science. This includes the study of sensory systems and perceptual processes.
+
+* **Resource**: [Sensation and Perception](https://en.wikipedia.org/wiki/Sensory_processing)
+
+### Memory and Learning
+
+Memory and learning are central to cognitive science, encompassing how we encode, store, and retrieve information, and how learning occurs.
+
+* **Resource**: [Memory](https://en.wikipedia.org/wiki/Memory), [Learning](https://en.wikipedia.org/wiki/Learning)
+
+### Language and Cognition
+
+The study of language in cognitive science involves understanding how language is processed and produced, and its role in cognition.
+
+* **Resource**: [Language Processing](https://en.wikipedia.org/wiki/Language_processing_in_the_brain)
+
+### Decision Making and Problem Solving
+
+This area focuses on how individuals make decisions, solve problems, and think critically.
+
+* **Resource**: [Decision Making](https://en.wikipedia.org/wiki/Decision-making)
+
+### Computational Models
+
+Cognitive science uses computational models to simulate and understand cognitive processes.
+
+* **Resource**: [Computational Cognition](https://en.wikipedia.org/wiki/Computational_cognition)
+
+### Neuroscience
+
+Neuroscience in cognitive science explores the neural basis of cognitive processes.
+
+* **Resource**: [Cognitive Neuroscience](https://en.wikipedia.org/wiki/Cognitive_neuroscience)
+
+## Cognitive Science in Practice
+
+Cognitive science has practical applications in areas such as artificial intelligence, human-computer interaction, education, and mental health.
+
+* **AI and Machine Learning**: Applying cognitive principles to develop intelligent systems.
+* **Human-Computer Interaction**: Designing user interfaces that align with human cognitive processes.
+* **Educational Technology**: Enhancing learning experiences based on cognitive research.
+* **Mental Health**: Understanding and treating cognitive disorders.
+
+## Conclusion
+
+Cognitive Science offers profound insights into the workings of the human mind and its processes. Its interdisciplinary nature allows for a comprehensive understanding of cognition, making it a pivotal field in both theoretical research and practical applications.
+
+---
+
+**N. B:** _This document provides a concise yet comprehensive overview of cognitive science, designed to introduce newcomers to the field and its diverse research areas. We hope it has provided you with a solid understanding of the fundamental concepts of cognitive science, as understanding the workings of the human mind is essential enhancing the capabilities of artificial intelligence, which is the primary goal of Animal-AI as a research platform._
diff --git a/docs/Background-Machine-Learning.md b/docs/Background-Machine-Learning.md
new file mode 100644
index 000000000..718e5379a
--- /dev/null
+++ b/docs/Background-Machine-Learning.md
@@ -0,0 +1,50 @@
+# Background: Machine Learning
+
+#### Table of Contents
+
+* [Introduction to Machine Learning Concepts](#Introduction-to-Machine-Learning-Concepts)
+  + [What is Machine Learning?](#What-is-Machine-Learning?)
+  + [Types of Machine Learning Algorithms](#Types-of-Machine-Learning-Algorithms)
+    - [Unsupervised Learning](#Unsupervised-Learning)
+    - [Supervised Learning](#Supervised-Learning)
+    - [Reinforcement Learning](#Reinforcement-Learning)
+  + [Deep Learning in Machine Learning](#Deep-Learning-in-Machine-Learning)
+  + [Training and Inference in ML](#Training-and-Inference-in-ML)
+  + [Conclusion](#Conclusion)
+
+  
+# Introduction to Machine Learning Concepts
+
+This document aims to provide an accessible overview of Machine Learning (ML) for those new to the field, particularly users of the ML-Agents Toolkit. While we won't cover machine learning exhaustively, we'll touch upon its key aspects, as numerous comprehensive resources are available online.
+
+## What is Machine Learning?
+
+Machine Learning, a subset of artificial intelligence, is about teaching computers to learn patterns from data. It encompasses three primary types of algorithms: unsupervised learning, supervised learning, and reinforcement learning, each learning from different data types.
+
+## Types of Machine Learning Algorithms
+
+### Unsupervised Learning
+
+[Unsupervised Learning](https://en.wikipedia.org/wiki/Unsupervised_learning) involves discovering patterns in data without predefined labels. For instance, in a gaming context, it could mean categorizing players based on engagement levels to tailor specific interactions, like beta testing invitations for highly engaged players or tutorial suggestions for less engaged ones. This method is particularly useful when labels are costly or difficult to obtain.
+
+### Supervised Learning
+
+[Supervised Learning](https://en.wikipedia.org/wiki/Supervised_learning) goes beyond grouping, aiming to learn a direct mapping from data to its corresponding category. For example, predicting player churn in games could involve analyzing historical data with known outcomes (churned or not) and using this to predict future player behavior. This approach requires a labeled dataset, where each data point is tagged with the correct outcome.
+
+### Reinforcement Learning
+
+[Reinforcement Learning](https://en.wikipedia.org/wiki/Reinforcement_learning) is about training agents to make a sequence of decisions. By continuously interacting with their environment, these agents learn to achieve a goal or maximize some notion of cumulative reward. This learning type is exemplified by scenarios like training a firefighting robot, where the robot must learn to extinguish fires effectively through trial and error, guided by rewards.
+
+## Deep Learning in Machine Learning
+
+[Deep Learning](https://en.wikipedia.org/wiki/Deep_learning) is a subset of machine learning algorithms known for learning complex functions from large datasets. It's particularly effective in reinforcement learning with extensive simulation data, like those generated in Unity environments. Deep learning algorithms form the backbone of many ML-Agents Toolkit algorithms, leveraging libraries like [PyTorch](Background-PyTorch.md).
+
+## Training and Inference in ML
+
+All ML branches involve a training phase, where the model is built using provided data, and an inference phase, where the model is applied to new data. Whether it's clustering players in unsupervised learning, predicting churn in supervised learning, or learning optimal policies in reinforcement learning, these phases are crucial.
+
+## Conclusion
+
+Machine Learning's diverse algorithms and applications make it a fascinating and impactful field. Understanding its core concepts is essential for anyone looking to explore AI or utilize tools like the ML-Agents Toolkit for game development and beyond.
+
+---
diff --git a/docs/Background-Unity.md b/docs/Background-Unity.md
new file mode 100644
index 000000000..2fcabcfeb
--- /dev/null
+++ b/docs/Background-Unity.md
@@ -0,0 +1,77 @@
+# Background: Unity
+
+#### Table of Contents
+
+* [Unity Engine: Fundamental Concepts](#Unity-Engine:-Fundamental-Concepts)
+  + [Unity Editor](#Unity-Editor)
+  + [Prefabs](#Prefabs)
+  + [Scripting](#Scripting)
+  + [Physics](#Physics)
+  + [Animation](#Animation)
+  + [Asset Management](#Asset-Management)
+  + [User Interface (UI)](#User-Interface-(UI))
+  + [Conclusion](#Conclusion)
+
+  
+# Unity Engine: Fundamental Concepts
+
+Unity is a powerful game development engine that offers a rich set of features for creating immersive 2D and 3D games. This document provides an overview of the fundamental concepts of the Unity Engine, complete with links to resources for deeper understanding. We try to provide a comprehensive overview of the Unity Engine, but we recommend that you refer to the [Unity Documentation](https://docs.unity3d.com/Manual/index.html) for more detailed information. 
+
+**Note** that in Unity the **y** axis is the vertical axis, while the **z** axis is the depth axis.
+
+<p align="center">
+  <img height="200" src="/docs/figs/prefabs/Referential.png">
+</p>
+
+## Unity Editor
+
+The Unity Editor is the core interface where game development takes place. It provides a user-friendly environment for building game scenes, adding assets, and scripting behavior.
+
+* **Overview**: [Unity Editor Overview](https://docs.unity3d.com/Manual/UsingTheEditor.html)
+* **Interface Guide**: [Unity Editor Interface](https://learn.unity.com/tutorial/unity-editor-interface-overview)
+
+## Prefabs
+
+Prefabs in Unity are pre-configured templates of game objects that can be reused across your projects. They are essential for efficient game development.
+
+* **Introduction to Prefabs**: [Working with Prefabs](https://docs.unity3d.com/Manual/Prefabs.html)
+* **Prefab Workflow**: [Prefab Workflow Guide](https://learn.unity.com/tutorial/introduction-to-prefabs)
+
+## Scripting
+
+Scripting in Unity is primarily done using C#. It allows you to define the behavior of your game objects, control game logic, and interact with user inputs.
+
+* **Scripting Overview**: [Unity Scripting API](https://docs.unity3d.com/ScriptReference/)
+* **C# Scripting Tutorial**: [C# Scripting in Unity](https://learn.unity.com/tutorial/introduction-to-scripting)
+
+## Physics
+
+Unity's physics engine allows for realistic simulation of physical interactions between objects in the game world.
+
+* **Physics System**: [Unity Physics System](https://docs.unity3d.com/Manual/PhysicsSection.html)
+* **Rigidbody and Colliders**: [Using Rigidbody and Colliders](https://learn.unity.com/tutorial/physics-rigidbodies-and-colliders)
+
+## Animation
+
+Unity provides a comprehensive system for animating characters and objects, offering tools for creating detailed animations and controlling them via scripts.
+
+* **Animation Overview**: [Unity Animation System](https://docs.unity3d.com/Manual/AnimationOverview.html)
+* **Animator Component**: [Using the Animator](https://learn.unity.com/tutorial/animator-component)
+
+## Asset Management
+
+Managing assets is a crucial part of game development in Unity. Unity supports a wide range of asset types including 3D models, textures, audio, and more.
+
+* **Asset Management**: [Unity Asset Workflow](https://docs.unity3d.com/Manual/AssetWorkflow.html)
+* **Asset Store**: [Unity Asset Store](https://assetstore.unity.com/)
+
+## User Interface (UI)
+
+Unity's UI system allows you to create interactive and intuitive user interfaces for your games.
+
+* **UI Overview**: [Unity UI System](https://docs.unity3d.com/Manual/UISystem.html)
+* **UI Toolkit**: [Using Unity's UI Toolkit](https://learn.unity.com/tutorial/introduction-to-the-new-ui-system)
+
+## Conclusion
+
+Unity's extensive range of features and tools makes it a versatile choice for game developers. Whether you're a beginner or an experienced developer, Unity offers the capabilities you need to bring your game ideas to life. We hope this document has provided you with a solid understanding of the fundamental concepts of the Unity Engine, as understanding the workings of Unity is essential for collaboration and contribution to Animal-AI. 
diff --git a/docs/Background-YAML.md b/docs/Background-YAML.md
new file mode 100644
index 000000000..593d093b5
--- /dev/null
+++ b/docs/Background-YAML.md
@@ -0,0 +1,95 @@
+# Background: YAML
+
+#### Table of Contents
+
+* [Background: YAML](#background-yaml)
+      - [Table of Contents](#table-of-contents)
+  + [YAML? What is it?](#yaml-what-is-it)
+  + [Configuration of Training Environments and Agents](#configuration-of-training-environments-and-agents)
+    - [Defining Agent Behaviors](#defining-agent-behaviors)
+    - [Setting Hyperparameters for Training](#setting-hyperparameters-for-training)
+  + [Example of a YAML Configuration in ML-Agents](#example-of-a-yaml-configuration-in-ml-agents)
+  + [Example of a YAML Configuration in Animal-AI](#example-of-a-yaml-configuration-in-animal-ai)
+  + [Advantages in Animal-AI Context](#advantages-in-animal-ai-context)
+    - [Easy to Read and Modify](#easy-to-read-and-modify)
+    - [Facilitating Complex Configurations](#facilitating-complex-configurations)
+
+## YAML? What is it?
+
+*YAML* (YAML Ain't Markup Language) is a data serialization format widely used in Unity and other setups (as well as in ML-Agents) for its readability and ease of use. It allows developers and researchers to define and adjust the behavior and training parameters of AI agents within Unity simulations. Due to it's human-readable format, YAML is also useful for researchers who have little experience with programming. 
+
+## Configuration of Training Environments and Agents
+
+YAML files are used to configure training environments and agents in Animal-AI. These files are used to define the parameters of the training process, such as the neural network architecture, the reward signals, and the hyperparameters. They are also used to define the parameters of the agents, such as the observation types, the action spaces, and the reward signals. 
+
+### Defining Agent Behaviors
+
+YAML files in ML-Agents are used to set up behavior parameters for agents, such as neural network models, observation types, actions, and reward signals. 
+
+### Setting Hyperparameters for Training
+
+These files are crucial for defining hyperparameters that guide the training process, like learning rate, batch size, and neural network configurations. 
+
+## Example of a YAML Configuration in ML-Agents
+
+```yaml
+behaviors:
+  SoccerPlayer:
+    trainer_type: ppo
+    hyperparameters:
+      batch_size: 64
+      buffer_size: 12000
+      learning_rate: 0.0003
+    network_settings:
+      normalize: false
+      hidden_units: 128
+    reward_signals:
+      extrinsic:
+        gamma: 0.99
+        strength: 1.0
+    max_steps: 5e5
+    time_horizon: 64
+    summary_freq: 10000
+```
+
+The above example shows a YAML configuration file for a soccer player agent in ML-Agents, for agent training. The agent's behavior is defined by the `SoccerPlayer` behavior name. The `trainer_type` parameter specifies the type of training algorithm used to train the agent. The `hyperparameters` section defines the hyperparameters for the training process. The `network_settings` section defines the neural network architecture for the agent. The `reward_signals` section defines the reward signals used to train the agent. The `max_steps` parameter defines the maximum number of steps the agent can take in the environment. The `time_horizon` parameter defines the number of steps the agent can take before the environment is reset. The `summary_freq` parameter defines the frequency at which the agent's training progress is logged. 
+
+## Example of a YAML Configuration in Animal-AI
+
+```yaml
+!ArenaConfig
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 500
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 2, y: 0, z: -1}
+      rotations: [90]
+    - !Item
+      name: SpawnerButton
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 20}
+      moveDurations: [0.1]
+      resetDurations: [1.0]
+      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
+      rewardWeights: [1, 0, 0]
+      spawnProbability: 1.0
+      rewardSpawnPos: !Vector3 {x: 20, y: 0, z: 35}
+```
+
+The above example shows a YAML configuration file for an arena in Animal-AI. The `!ArenaConfig` tag indicates that the file is a configuration file for an arena. The `arenas` section defines the arenas in the environment. The `0` tag indicates that the arena is the first arena in the environment. The `pass_mark` parameter defines the minimum score required to pass the arena. The `t` parameter defines the maximum number of steps the agent can take in the arena. The `items` section defines the objects in the arena. The `name` parameter defines the name of the object. The `positions` parameter defines the positions of the object. The `rotations` parameter defines the rotations of the object. The `moveDurations` parameter defines the durations of the object's movements. The `resetDurations` parameter defines the durations of the object's resets. The `rewardNames` parameter defines the names of the object's rewards. The `rewardWeights` parameter defines the weights of the object's rewards. The `spawnProbability` parameter defines the probability of the object spawning. The `rewardSpawnPos` parameter defines the position of the object's reward.
+
+## Advantages in Animal-AI Context
+
+### Easy to Read and Modify
+
+YAML's human-readable format makes it easier for developers and researchers to understand and modify the configurations of their Animal-AI environments. This is especially useful for researchers who have little experience with programming. 
+
+### Facilitating Complex Configurations
+
+The structure of YAML supports complex configurations with nested parameters, allowing for clear hierarchies and groupings of settings in Animal-AI. This makes it easier for developers to organize and modify their configurations. 
+
+---
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
new file mode 100644
index 000000000..6ea4f4525
--- /dev/null
+++ b/docs/CHANGELOG.md
@@ -0,0 +1,136 @@
+# Changelog
+
+All notable changes to the Animal-AI project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [3.3.0] - coming soon...
+
+### Added
+
+### Changed
+
+### Fixed
+
+--- 
+
+## [3.1.3] - 30.09.2023
+
+### Fixed
+* Resolved Spawner Tree Clock desync issue.
+* Resolved Multiple Arenas improper cycling issue.
+* Addressed Unity native warning in Training Arena script.
+* Rectified the invisibility issue of the SignBoard  prefab.
+
+### Added
+
+* Enhanced arenas randomization via the `randomizeArenas` parameter in YAML.
+* Added more robust error-checking for arena ID's and arena cycling.
+* Conducted unit tests on `TrainingArena.cs` and `ArenaParameters.cs`.
+* Added visual elements of paired reinforcing cues such as colours and short GIFs for better visual understanding for the user.
+
+### Changed
+
+* Shortened end-of-episode notification to *2.5 seconds*.
+* Undertook minor Unity script optimizations.
+* Updated the `README.md` file with more detailed instructions.
+
+## [3.1.2.exp1] - 11.09.2023
+
+### Fixed
+* Implemented hot fix for a newly discovered bug affecting the Spawner Tree.
+
+## [3.1.1] - 10.08.2023
+
+### Added
+* Introduced "End of Episode Notification" feature.
+* Supported "Headless" mode unofficially for training agents (works with Raycasting).
+
+### Fixed
+
+* Fixed bug affecting the Spawner Tree.
+* Fixed bug affecting the Interactive Button.
+
+## [3.1.0]
+
+### Added
+* Introduced "Interactive Button" feature.
+
+## [3.0.2]
+
+### Changed
+* Upgraded Mlagents to 2.3.0-exp3 (mlagents python version 0.30.0).
+
+## [3.0.1]
+
+### Added
+* Added Agent Freezing Parameter.
+
+## [3.0]
+
+### Changed
+* Updated agent handling for improved stop and acceleration.
+* Added new objects, spawners, signs, goal types.
+* Updated graphics for many objects.
+* Made the Unity Environment available.
+* Upgraded to Mlagents 2.1.0-exp.1 (ml-agents python version 0.27.0).
+
+### Fixed
+
+* Various bug fixes.
+
+### Note
+
+* Due to changes to controls and graphics, agents trained on previous versions might not perform the same.
+
+## [2.2.3]
+
+### Added
+* Ability to specify multiple different arenas in a single YAML config file.
+
+## [2.2.2]
+
+### Changed
+* Introduced a low-quality version with improved fps.
+
+## [2.2.1]
+
+### Fixed
+* Improved UI scaling with respect to screen size.
+* Fixed an issue with cardbox objects spawning at the wrong sizes.
+* Fixed an issue where the environment would time out incorrectly.
+
+### Changed
+
+* Improved Death Zone shader for unusual Zone sizes.
+
+## [2.2.0]
+
+### Added
+* Switched to health-based system.
+* Added basic Gym Wrapper.
+* Added basic heuristic agent for benchmarking and testing.
+
+### Fixed
+
+* Fixed a reset environment bug during training.
+* Added the ability to set the DecisionPeriod (frameskip) when instantiating an environment.
+
+## [2.1.1] - 01.07.2021
+
+### Added
+* RayCast Observations
+
+### Fixed
+
+* Fixed raycast length being less than diagonal length of standard arena.
+
+## [2.1] - Beta Release 2019
+
+### Added
+* Raycast observations.
+* Agent global position to observations.
+
+### Changed
+
+* Upgraded to ML-Agents release 2 (0.26.0).
diff --git a/docs/FAQ.md b/docs/FAQ.md
new file mode 100644
index 000000000..9eee9972f
--- /dev/null
+++ b/docs/FAQ.md
@@ -0,0 +1,119 @@
+# Frequently Asked Questions
+
+This document provides a comprehensive list of frequently asked questions and troubleshooting tips for the Animal-AI environment.
+
+#### Table of Contents
+
+  + [1. Troubleshooting Installation Issues](#1-troubleshooting-installation-issues)
+    - [1.1 Resolving Environment Permission Errors](#11-resolving-environment-permission-errors)
+      - [1.1.1 For macOS and Linux Users](#111-for-macos-and-linux-users)
+      - [1.1.2 For Windows Users](#112-for-windows-users)
+    - [1.2 Addressing Environment Connection Timeouts](#12-addressing-environment-connection-timeouts)
+    - [1.3 Communication Port Conflict](#13-communication-port-conflict)
+    - [1.4 Mean Reward Displaying NaN](#14-mean-reward-displaying-nan)
+  + [2. Python API / Package Dependency Issues](#2-python-api--package-dependency-issues)
+    - [2.1 No Module Named `animalai`](#21-no-module-named-animalai)
+    - [2.3 Incompatible Python Version](#23-incompatible-python-version)
+  + [3. File Not Found Error](#3-file-not-found-error)
+
+## 1. Troubleshooting Installation Issues
+
+Encountering issues while installing the Animal-AI environment? Here are some solutions to common problems:
+
+### 1.1 Resolving Environment Permission Errors
+
+#### 1.1.1 For macOS and Linux Users
+Permission errors after importing a Unity environment? Adjust file permissions with these commands:
+
+**macOS:**
+
+```sh
+chmod -R 755 *.app
+```
+
+**Linux:**
+
+```sh
+chmod -R 755 *.x86_64
+```
+
+#### 1.1.2 For Windows Users
+
+Windows users generally don't need additional permissions. If needed, refer to [Microsoft Documentation](https://docs.microsoft.com/).
+
+### 1.2 Addressing Environment Connection Timeouts
+
+Timeout errors when launching through `UnityEnvironment` ? Consider these fixes:
+
+* **No Agent in Scene:** Ensure an agent is in the scene.
+* **Firewall Issues on macOS:** Follow [Apple's instructions](https://support.apple.com/) to add exceptions.
+* **Errors in Unity Environment:** Refer to [Unity log files](https://docs.unity3d.com/Manual/LogFiles.html).
+* **Running in a Headless Environment:** Use `--no-graphics` or `no_graphics=True` if you intend on using this feature (not fully supported).
+
+### 1.3 Communication Port Conflict
+
+Encountering port conflicts? Try changing the worker number or port:
+
+```python
+UnityEnvironment(file_name=filename, worker_id=X)
+```
+
+Or find an available port:
+
+```python
+port = 5005 + random.randint(0, 1000)
+```
+
+### 1.4 Mean Reward Displaying NaN
+
+Seeing `Mean reward : nan` ? Set the `Max Steps` to a non-zero value or script custom termination conditions.
+
+## 2. Python API / Package Dependency Issues
+
+Encountering issues with the Python API or package dependencies? Here are some solutions to common problems:
+
+### 2.1 No Module Named `animalai`
+
+Seeing `ModuleNotFoundError: No module named 'animalai'` ? Ensure the `animalai` package is installed:
+
+```sh
+pip install animalai
+```
+
+or if you are using a virtual environment:
+
+```sh
+pip install animalai --user
+```
+
+or conda:
+```sh 
+conda install -c conda-forge animalai
+
+```
+Please do not forget to activate your environment before installing the package.
+
+You can verify the installation by running:
+```sh
+python -c "import animalai"
+```
+
+### 2.3 Incompatible Python Version
+
+Currently, the Animal-AI environment only supports **Python 3.6 to 3.9.** We have tested using 3.6, 3.7 and 3.8, but we cannot guarantee that it will work with these versions for everyone. If you are using a different version of Python, please install Python 3.9 for the optimal experience.
+
+Please verify that you are using the correct version of Python by running:
+
+```sh
+python --version
+```
+
+If you are using a different version of Python, please install Python 3.9 for the optimal experience.
+
+## 3. File Not Found Error
+
+Seeing `FileNotFoundError: [Errno 2] No such file or directory: 'AnimalAI/AnimalAI.app'` ? Ensure the `AnimalAI` folder is in the same directory as your Python script.
+
+If you are using macOS, you may get this error: `FileNotFoundError: [Errno 2] No such file or directory: 'env/AnimalAI'` . This error occurs when running the ` `python play.py`  ` command from the `  `animal-ai/examples` ` folder. 
+
+To fix this, simply rename the 'MACOS.app' folder you downloaded to AnimalAI. This will allow the ` `play.py` ` script to find the environment. Note that this error is likely to occur in older versions of Animal-AI.
diff --git a/docs/Glossary.md b/docs/Glossary.md
new file mode 100644
index 000000000..a624e9516
--- /dev/null
+++ b/docs/Glossary.md
@@ -0,0 +1,54 @@
+# Animal-AI Glossary
+
+#### Table of Contents
+
+  1. [Animal-AI Terms](#animal-ai-terms) 
+  2. [RL/ML-Agents Terms](#rlml-agents-terms)
+  3. [Unity Terms](#unity-terms)
+  4. [YAML Terms](#yaml-terms)
+
+## Animal-AI Terms
+
+* **Animal-AI**: The Animal-AI environment, encompassing the Unity environment, Python API, and associated documentation.
+* **Episode**: A single run of the environment, starting with a reset and ending with a failure or success.
+* **Arena**: The area in which the agent is placed at the start of an episode, which is synonymous with the environment/episode.
+
+## RL/ML-Agents Terms
+
+* **Academy**: A singleton object controlling the timing, reset, and training/inference settings of the environment.
+* **Action**: The execution of a decision by an agent within the environment.
+* **Agent**: A Unity Component that generates observations and takes actions in the environment, based on decisions from a Policy.
+* **Decision**: The output of a Policy, specifying an action in response to an observation.
+* **Editor**: The Unity Editor, encompassing various panes like Hierarchy, Scene, Inspector.
+* **Environment**: The Unity scene containing Agents.
+* **Experience**: A tuple [Agent observations, actions, rewards] representing a single Agent's data after a Step.
+* **FixedUpdate**: A Unity method called at each step of the game engine, where ML-Agents logic is typically executed.
+* **Frame**: An instance of rendering by the main camera, corresponding to each `Update` call in the game engine.
+* **Observation**: Information available to an agent about the environment's state (e.g., Vector, Visual).
+* **Policy**: The decision-making mechanism (often a neural network) that produces decisions from observations.
+* **Reward**: A signal indicating the desirability of an agent’s action within the current environment state.
+* **State**: The underlying properties of the environment and all agents within it at a given time.
+* **Step**: An atomic change in the engine occurring between Agent decisions.
+* **Trainer**: A Python class responsible for training a group of Agents.
+* **Update**: A Unity function called at each frame rendering. ML-Agents logic is typically not executed here.
+
+## Unity Terms
+
+* **Unity Objects**: Fundamental components in the Unity Engine, serving as containers for all other components or functionalities within a Unity scene.
+* **GameObjects**: Core elements in Unity, representing characters, props, scenery, cameras, lights, etc.
+* **Prefabs**: Templates created from GameObjects in Unity, allowing for reuse and consistency across scenes or projects.
+* **Immovable Objects**: Objects in the Animal-AI environment that are fixed in place and cannot be moved, like walls and ramps.
+* **Movable Objects**: Objects that can be easily moved by the agent or other objects in the environment.
+* **Rewards**: Objects providing positive or negative feedback to the agent, including stationary and moving goals.
+* **Reward Spawners**: Objects with the primary function of spawning rewards in the environment.
+* **Environment Permission Errors**: Issues related to file permissions when importing a Unity environment, particularly on macOS and Linux.
+* **Environment Connection Timeouts**: Problems encountered when launching the Animal-AI environment through `UnityEnvironment`.
+* **Communication Port Conflict**: Issues arising from port conflicts when initializing the Unity environment.
+* **Mean Reward Displaying NaN**: A scenario where the mean reward metric shows 'nan', indicating an issue with the environment setup or configuration.
+
+## YAML Terms
+
+* **YAML File**: A file containing data in YAML format.
+* **YAML Configuration File**: A YAML file containing configuration data for the Animal-AI environment.
+* **YAML Configuration Name**: The name of a YAML configuration file, which is used to identify the configuration. Your custom configurations are used to create a new environment.
+* **YAML Configuration Path**: The path to a YAML configuration file.
diff --git a/docs/InstallationGuide_screenshots/aai_installation_env_contents.PNG b/docs/InstallationGuide_screenshots/aai_installation_env_contents.PNG
deleted file mode 100644
index ae77c3d44..000000000
Binary files a/docs/InstallationGuide_screenshots/aai_installation_env_contents.PNG and /dev/null differ
diff --git a/docs/InstallationGuide_screenshots/python-installation-Add_to_PATH.PNG b/docs/InstallationGuide_screenshots/python-installation-Add_to_PATH.PNG
deleted file mode 100644
index 1950962b5..000000000
Binary files a/docs/InstallationGuide_screenshots/python-installation-Add_to_PATH.PNG and /dev/null differ
diff --git a/docs/PrefabsPictures/Arena.png b/docs/PrefabsPictures/Arena.png
deleted file mode 100644
index 0523197a7..000000000
Binary files a/docs/PrefabsPictures/Arena.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Immovable/MazeGenerator.png b/docs/PrefabsPictures/Immovable/MazeGenerator.png
deleted file mode 100644
index 6da8e2d37..000000000
Binary files a/docs/PrefabsPictures/Immovable/MazeGenerator.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/Cardbox1.png b/docs/PrefabsPictures/Movable/Cardbox1.png
deleted file mode 100644
index dcd66f105..000000000
Binary files a/docs/PrefabsPictures/Movable/Cardbox1.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/Cardbox2.png b/docs/PrefabsPictures/Movable/Cardbox2.png
deleted file mode 100644
index 65889e3bd..000000000
Binary files a/docs/PrefabsPictures/Movable/Cardbox2.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/LObject.png b/docs/PrefabsPictures/Movable/LObject.png
deleted file mode 100644
index 52bea5742..000000000
Binary files a/docs/PrefabsPictures/Movable/LObject.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/LObject2.png b/docs/PrefabsPictures/Movable/LObject2.png
deleted file mode 100644
index b80d1c552..000000000
Binary files a/docs/PrefabsPictures/Movable/LObject2.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/UObject.png b/docs/PrefabsPictures/Movable/UObject.png
deleted file mode 100644
index e58f966dc..000000000
Binary files a/docs/PrefabsPictures/Movable/UObject.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Movable/WoodLog.png b/docs/PrefabsPictures/Movable/WoodLog.png
deleted file mode 100644
index 7afafae6a..000000000
Binary files a/docs/PrefabsPictures/Movable/WoodLog.png and /dev/null differ
diff --git a/docs/PrefabsPictures/Other-Unique/SignPosterboard.PNG b/docs/PrefabsPictures/Other-Unique/SignPosterboard.PNG
deleted file mode 100644
index 4eb13d863..000000000
Binary files a/docs/PrefabsPictures/Other-Unique/SignPosterboard.PNG and /dev/null differ
diff --git a/docs/PrefabsPictures/Other-Unique/SpawnerContainer.PNG b/docs/PrefabsPictures/Other-Unique/SpawnerContainer.PNG
deleted file mode 100644
index 8ce8f5c11..000000000
Binary files a/docs/PrefabsPictures/Other-Unique/SpawnerContainer.PNG and /dev/null differ
diff --git a/docs/PrefabsPictures/Other-Unique/SpawnerDispenser.PNG b/docs/PrefabsPictures/Other-Unique/SpawnerDispenser.PNG
deleted file mode 100644
index 5b0f13f32..000000000
Binary files a/docs/PrefabsPictures/Other-Unique/SpawnerDispenser.PNG and /dev/null differ
diff --git a/docs/PrefabsPictures/Other-Unique/SpawnerTree.PNG b/docs/PrefabsPictures/Other-Unique/SpawnerTree.PNG
deleted file mode 100644
index c390d38ff..000000000
Binary files a/docs/PrefabsPictures/Other-Unique/SpawnerTree.PNG and /dev/null differ
diff --git a/docs/Technical-Overview.md b/docs/Technical-Overview.md
new file mode 100644
index 000000000..2029a7880
--- /dev/null
+++ b/docs/Technical-Overview.md
@@ -0,0 +1,72 @@
+# Animal-AI Technical Guide
+
+This guide will walk you through the engineering aspects of the Animal-AI Environment. It provides an overview of the environment and its components. If you are intending on contributing, then this guide will be a good place to start.
+
+If you have any questions or issues, please check the [FAQ](docs/FAQ.md) and documentation before posting an issue on GitHub.
+
+#### Table of Contents
+
+* [Running the Environment](#running-the-environment)
+  + [Play Mode](#play-mode)
+      - [Controls in Play Mode](#controls-in-play-mode)
+  + [Train Mode](#train-mode)
+* [Environment Overview](#environment-overview)
+   - [Observations](#observations)
+   - [Actions](#actions)
+   - [Rewards](#rewards)
+   - [Curriculum](#curriculum)
+   - [Configuration Files](#configuration-files)
+   - [Arena Files](#arena-files)
+   - [Unity Editor](#unity-editor)
+* [Training Agents](#training-agents)
+   - [Baselines](#baselines)
+   - [Training Scripts](#training-scripts)
+   - [Training Observations](#training-observations)
+   - [Training Rewards](#training-rewards)
+   - [Training Curriculum](#training-curriculum)
+   - [Training Arena Files](#training-arena-files)
+   - [Training Configuration Files](#training-configuration-files)
+* [Testing Agents](#testing-agents)
+* [Contributing](#contributing)
+* [Citation](#citation)
+* [License](#license)
+
+## Running the Environment
+
+The Animal-AI Environment can be run in one of two modes: `Play` and `Train` . In `Play` mode, the environment is run with a human player controlling the agent. In `Train` mode, the environment is run with an AI agent (see [Training Agents](#training-agents)). 
+
+### Play Mode
+
+To run the environment in `Play` mode, simply run the Animal-AI application for your OS, specifiying the configuration file location in full. This will launch the environment in play mode with the specified configuration file. The `play.py` command takes a single argument - the path to the configuration file to use. For example, to run the environment in `Play` mode using the `configs/curriculum/0.yaml` configuration file, use the following command:
+
+```bash
+animalai play configs/curriculum/0.yaml
+```
+
+#### Controls in Play Mode
+
+In play mode, you can switch the camera view and control the agent using the following keyboard commands: 
+
+| Keyboard Key  | Action               |
+| ------------- | -------------------- |
+| W             | Move agent forwards  |
+| S             | Move agent backwards |
+| A             | Turn agent left      |
+| D             | Turn agent right     |
+| C             | Switch camera view   |
+| R             | Reset environment    |
+| Q             | Quit application     |
+
+Toggle the camera between first-person, third-person, and bird's eye view using the `C` key. The agent can be controlled using `W` , `A` , `S` , `D` (or the arrow keys). Hitting `R` or collecting certain rewards (green or red) will reset the arena. Note that the camera and agent controls are not available in `Train` mode, with only third-person perspective implemented currently (we plan to add multiple camera observations during training at some point). Furthermore, you can toggle on/off the ability to restrict the player's camera angles via the `canChangePerspective` parameter in the configuration file. If this is set to false, then the player will not be able to change the camera angle. In addition, you can toggle on/off the ability to reset the arena via the `canResetArena` parameter in the configuration file. If this is set to false, then the player will not be able to reset the arena manually. A new feature added is that users can now toggle on/off Lastly, if you have multiple arenas specified in youur configuration file, you can randomize via the `randomizeArenas` parameter. This is false by default.
+
+### Train Mode
+
+To run the environment in `Train` mode, use the `animalai train` command. This will launch the environment with an AI agent controlling the agent. The `animalai train` command takes a single argument, the path to the configuration file to use. For example, to run the environment in `Train` mode using the `configs/curriculum/0.yaml` configuration file, use the following command:
+
+```bash
+animalai train configs/curriculum/0.yaml
+```
+
+## Environment Overview
+
+Regardless on what mode you are using, the arena you specify in the configuration file will be loaded. The agent will be placed in the arena and the environment will run until the agent reaches the goal or the episode time limit is reached. The environment will then reset and the process will repeat. The order of the arenas in the configuration file will be used to determine the order in which the arenas are loaded. Take a look at the [Configuration Files](#configuration-files) section for more details on how to create your own configuration files.
diff --git a/docs/Using-Jupyter-Notebooks.md b/docs/Using-Jupyter-Notebooks.md
new file mode 100644
index 000000000..74bbfd271
--- /dev/null
+++ b/docs/Using-Jupyter-Notebooks.md
@@ -0,0 +1,131 @@
+# Using Jupyter Notebooks for Animal-AI
+
+This guide combines instructions on creating a custom kernel for Jupyter Notebooks and specific steps for using Jupyter Notebooks with the Animal-AI environment. It is advised that you either create a python virtual environment or Anaconda for easier project management. See [Using-Virtual-Environments](/docs/Using-Virtual-Environment.md) for more information on creating and using a virtual environment. For more information on Jupyter Notebooks, refer to the [official documentation](https://jupyter-notebook.readthedocs.io/en/stable/)
+
+#### Table of Contents
+
+* [Creating a Kernel for Jupyter Notebooks](#creating-a-kernel-for-jupyter-notebooks)
+* [Using Jupyter Notebooks with Animal-AI](#using-jupyter-notebooks-with-animal-ai)
+* [Advantages of Using Jupyter Notebooks](#advantages-of-using-jupyter-notebooks)
+* [Tips for Effective Jupyter Notebook Use](#tips-for-effective-jupyter-notebook-use)
+
+## Creating a Kernel for Jupyter Notebooks
+
+### Step-by-Step Guide
+
+1. **Install the IPython Kernel**: 
+   
+
+```bash
+   pip install ipykernel
+   ```
+
+2. **Create a New Python Environment**:
+   - Using venv: 
+
+     
+
+```bash
+     python -m venv /path/to/new/virtual/environment
+     ```
+
+   - Using Conda:
+
+     
+
+```bash
+     conda create -n myenv python=3.x
+     ```
+
+3. **Activate the Environment**:
+   - Using venv:
+
+     
+
+```bash
+     source /path/to/new/virtual/environment/bin/activate
+     ```
+
+   - Using Conda:
+
+     
+
+```bash
+     conda activate myenv
+     ```
+
+4. **Install Necessary Packages**:
+   
+
+```bash
+   pip install numpy pandas matplotlib
+   ```
+
+5. **Add Your Kernel to Jupyter**:
+   
+
+```bash
+   ipython kernel install --name "myenv" --user
+   ```
+
+6. **Launch Jupyter Notebook**:
+   
+
+```bash
+   jupyter notebook
+   ```
+
+7. **Select Your Kernel**:
+   Choose "myenv" from the kernel list in Jupyter.
+
+### Notes
+
+* Replace placeholders with your desired directory and environment name.
+* Adjust Python version as needed.
+
+## Using Jupyter Notebooks with Animal-AI
+
+### Introduction
+
+_Jupyter Notebooks_ are interactive documents that combine live code, output, text, and visualizations.
+
+### Setup
+
+1. **Install Jupyter**:
+   
+
+```bash
+   pip install notebook
+   ```
+
+2. **Start Jupyter Notebook**:
+   - Use `jupyter notebook` or JupyterLab ( `jupyter lab` ).
+
+### Using with Animal-AI
+
+* **Create a New Notebook**: In your project directory.
+* **Import Animal-AI Package**:
+  
+
+```python
+  from animalai.envs.environment import AnimalAIEnvironment
+  # Other necessary imports for your script
+  ```
+
+### Writing Interactive Scripts
+
+* **Initialize Environment**: Set up the Animal-AI environment.
+* **Run Experiments**: Write code for experiments, training, or visualization.
+* **Visualize Outputs**: Display results using Jupyter's capabilities.
+
+## Advantages of Using Jupyter Notebooks
+
+* **Interactivity**: Test code in small, independent blocks.
+* **Documentation**: Combine code with rich text and visualizations.
+* **Experimentation**: Ideal for testing new ideas and visualizing data.
+
+## Tips for Effective Jupyter Notebook Use
+
+* **Manage Resources**: Be aware of resource usage, especially when running complex simulations.
+* **Kernel Management**: Restart the Jupyter kernel to clear memory and state if needed.
+* **Version Control**: Export code to Python scripts for version control in larger projects.
diff --git a/docs/Using-Virtual-Environment.md b/docs/Using-Virtual-Environment.md
new file mode 100644
index 000000000..c702af929
--- /dev/null
+++ b/docs/Using-Virtual-Environment.md
@@ -0,0 +1,109 @@
+# Using Virtual Environments for Animal-AI
+
+#### Table of Contents
+
+* [Introduction to Virtual Environments](#introduction-to-virtual-environments)
+* [Benefits of Using a Virtual Environment](#benefits-of-using-a-virtual-environment)
+* [Python Version Compatibility](#python-version-compatibility)
+* [Setting Up Virtual Environments](#setting-up-virtual-environments)
+  + [Common Steps](#common-steps)
+  + [Mac OS X](#mac-os-x)
+  + [Ubuntu](#ubuntu)
+  + [Windows](#windows)
+* [Introduction to Conda Environments](#introduction-to-conda-environments)
+* [Setting Up Conda Environments](#setting-up-conda-environments)
+  + [Installing Conda](#installing-conda)
+  + [Creating a Conda Environment](#creating-a-conda-environment)
+  + [Managing Packages](#managing-packages)
+  + [Deactivating an Environment](#deactivating-an-environment)
+* [Conclusion](#conclusion)
+
+## Introduction to Virtual Environments
+
+A _Virtual Environment_ in Python is a self-contained directory that includes a specific version of Python and various packages. This isolated environment helps in managing project dependencies effectively. For more details, visit the [Python venv documentation](https://docs.python.org/3/library/venv.html) and [Anaconda documentation](https://docs.anaconda.com/).
+
+## Benefits of Using a Virtual Environment
+
+Using a Virtual Environment offers several advantages:
+1. Simplifies dependency management for individual projects.
+2. Facilitates testing with different versions of libraries, ensuring code compatibility.
+3. Prevents conflicts between different versions of libraries.
+4. Allows for easy sharing of project requirements with collaborators.
+
+## Python Version Compatibility
+
+* This guide is compatible with Python version `3.9.9`.
+* Using newer Python versions might lead to compatibility issues with some libraries.
+
+## Setting Up Virtual Environments
+
+### Common Steps
+
+1. **Install Python 3.9.9**: Ensure this version is installed on your system. If not, download it from [Python's official website](https://www.python.org/downloads/).
+2. **Install Pip**:
+   - Download Pip: `curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py`
+
+   - Install Pip: `python3 get-pip.py`
+
+   - Verify installation: `pip3 -V`
+
+   - **Ubuntu Note**: If you encounter a `ModuleNotFoundError` , install `python3-distutils` using `sudo apt-get install python3-distutils` .
+
+### Mac OS X
+
+1. Create a directory for environments: `mkdir ~/python-envs`.
+2. Create a new environment: `python3 -m venv ~/python-envs/sample-env`.
+3. Activate the environment: `source ~/python-envs/sample-env/bin/activate`.
+4. Update Pip and setuptools:
+   - `pip3 install --upgrade pip`
+
+   - `pip3 install --upgrade setuptools` .
+5. Deactivate with `deactivate` (reactivate using the same command).
+
+### Ubuntu
+
+1. Install the `python3-venv` package: `sudo apt-get install python3-venv`.
+2. Follow the Mac OS X steps for environment creation and management.
+
+### Windows
+
+1. Create a directory for environments: `md python-envs` .
+2. Create a new environment: `python -m venv python-envs\sample-env` .
+3. Activate the environment: `python-envs\sample-env\Scriptsctivate` .
+4. Update Pip: `pip install --upgrade pip` .
+5. Deactivate with `deactivate` (reactivate using the same command).
+
+**Additional Notes for Windows Users**:
+* Confirm Python version: `python --version`.
+* Admin privileges may be required for Python installation.
+* This guide is specific to Windows 10 with a 64-bit architecture.
+
+## Introduction to Conda Environments
+
+_Anaconda_ (or simply Conda) is an open-source package management and environment management system that runs on Windows, macOS, and Linux. Conda environments are similar to Python virtual environments but they are managed with the Conda package manager.
+
+## Setting Up Conda Environments
+
+### Installing Conda
+
+1. Download and install Anaconda or Miniconda from [Conda's official website](https://www.anaconda.com/distribution/).
+2. Open a terminal (or Anaconda Prompt on Windows) and check the Conda version: `conda --version`.
+
+### Creating a Conda Environment
+
+1. Create a new environment: `conda create --name myenv` (replace `myenv` with your desired environment name).
+2. Activate the environment: `conda activate myenv`.
+
+### Managing Packages
+
+* Install a package: `conda install numpy` (replace `numpy` with your desired package).
+* Update a package: `conda update numpy`.
+* List installed packages: `conda list`.
+
+### Deactivating an Environment
+
+* Deactivate with `conda deactivate`.
+
+## Conclusion
+
+Virtual Environments offer a robust solution for managing complex dependencies and are particularly useful for projects requiring a combination of Python and non-Python packages. This guide should help you get started with Conda or Python's Virtual Environments for using with Animal-AI.
diff --git a/docs/configExamples.md b/docs/configExamples.md
deleted file mode 100644
index 08093373c..000000000
--- a/docs/configExamples.md
+++ /dev/null
@@ -1,219 +0,0 @@
-
-# Detailed examples
-
-Let's take a look at some examples:
-
-### EXAMPLE 1 - Standard Parameters & Randomisation
-```
-!ArenaConfig
-arenas:
-  0: !Arena
-    t: 0
-    items:
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 10}
-      - !Vector3 {x: -1, y: 0, z: 30}
-      colors:
-      - !RGB {r: 204, g: 0, b: 204 }
-      rotations: [45]
-      sizes:
-      - !Vector3 {x: -1, y: 5, z: -1}
-    - !Item
-      name: CylinderTunnel
-      colors:
-      - !RGB {r: 204, g: 0, b: 204 }
-      - !RGB {r: 204, g: 0, b: 204 }
-      - !RGB {r: 204, g: 0, b: 204 }
-    - !Item
-      name: GoodGoal
-```
-
-First of all, we can see that the number of parameters for `positions`, `rotations` and `sizes` do not need to match. The environment will spawn `max( len(positions), len(rotations), len(sizes) )` objects, where `len()` is the length of the list. Except in special-parameter cases, any missing parameter will be assigned a randomly generated value.
-
-In this case this will lead to (in order that they will spawn):
-- a pink `Cube` spawned at `[10,10]` on the ground with rotation `45` and a size randomized on both `x` and `z` and of `y=5`.
-- a `Cube` spawned on the ground, with a random `x` and `z=30`. Its rotation, size  and color will be random.
-- three pink `CylinderTunnel` objects, completely randomized.
-- a `GoodGoal` randomized.
-- the agent with position and rotation randomized.
-
-&nbsp;
-
-### EXAMPLE 2 - Decay Goals / Size-Changing Goals
-```
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-      skins:
-      - "hedgehog"
-    - !Item
-      name: ShrinkGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 11}
-      sizes:
-      - !Vector3 {x: 0.1, y: 0.1, z: 0.1}
-      symbolNames:
-      - "left-arrow"
-      initialValues: [2.5]
-      finalValues: [1.5]
-      delays: [400]
-      changeRates: [-0.2]
-    - !Item
-      name: DecayGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      initialValues: [4]
-      finalValues: [3]
-      delays: [250]
-      changeRates: [-0.003]
-    - !Item
-      name: AntiDecayGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      sizes:
-      - !Vector3 {x: 0.1, y: 0.1, z: 0.1}
-      initialValues: [1]
-      finalValues: [1.5]
-      delays: [300]
-      changeRates: [-0.007]
-    - !Item
-      name: GrowGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 29}
-      initialValues: [1]
-      finalValues: [3.5]
-      delays: [100]
-      changeRates: [0.01]
-```
-
-This example features goals that decay, grow, shrink and 'ripen' (anti-decay). Each `Item` also has some invalid *red-herring* parameters that are used incorrectly but will not affect the outcome, nor crash the AAI environment.
-
-The `ShrinkGoal` and `GrowGoal` does not actually use the `sizes` parameter that has been declared, but changes size according to the `initialValues` and `finalValues`.  Similarly, the size of the `DecayGoal` and `AntiDecayGoal` are given by `max(initialValue, finalValue)`, and the reward changes from `initial` to `final` over time. The `ShrinkGoal` even has an incorrectly-used `symbolNames` parameter, which are for `SignPosterboard` objects only - this is ignored.
-
-An *animal skin* has also been used - in this case, the Agent will always spawn as a hedgehog.
-
-<p align="center">
-  <img width="700" src="ExampleGallery/decay-sizechange-goal-test.PNG">
-</p>
-
-After a few seconds, the changed goals will look as follows:
-
-<p align="center">
-  <img width="700" src="ExampleGallery/decay-sizechange-goal-test-changes.PNG">
-</p>
-
-&nbsp;
-
-### EXAMPLE 3 - SignPosterboard (Preset Symbols)
-```
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 8}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      - !Vector3 {x: 20, y: 0, z: 20}
-      - !Vector3 {x: 20, y: 0, z: 26}
-      - !Vector3 {x: 20, y: 0, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "left-arrow"    
-      - "letter-a"    
-      - "circle"    
-      - "u-turn-arrow"    
-      - "tick"
-```
-
-This example demonstrates the use of preset symbols declared as the list `symbolNames`, a unique parameter for SignPosterboard objects. Each symbol has a default colour that can be overridden using the `colors` list (but in this example, default colours are used).
-
-<p align="center">
-  <img height="300" src="ExampleGallery/SignPosterboard-preset-symbols.PNG">
-</p>
-
-&nbsp;
-
-### EXAMPLE 4 - SignPosterboard (Special Symbols)
-```
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 8}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      - !Vector3 {x: 20, y: 0, z: 20}
-      - !Vector3 {x: 20, y: 0, z: 26}
-      - !Vector3 {x: 20, y: 0, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "01/10"    
-      - "111/110/001"    
-      - "001010/011000/100001/101010/111001"    
-      - "0101/**10/0010/0***"
-      - "13x11"
-```
-
-This example demonstrates the use of *special codes* to generate black-and-white pixel grids to use as symbols. `0` -> black, `1` -> white, and `*` is a 'joker' character that chooses to output black or white at random. The dimensions of the grid are given by the `/` character - each row between `/`s must be of the same size for the code to be valid.
-
-Fully-random grids can be generated using the code `"MxN"`, where `M` and `N` are the grid width and height dimensions respectively.
-
-<p align="center">
-  <img height="300" src="ExampleGallery/SignPosterboard-special-symbols-annotated.png">
-</p>
-
-&nbsp;
-
-### EXAMPLE GALLERY
-
-Below are some more creative examples of test environments created by config files.
-
-<p align="center">
-  <img width="750" src="ExampleGallery/TestCompetition02-28-02.PNG">
-</p>
-
-<p align="center">
-  <img width="750" src="ExampleGallery/TestCompetition10-13-01.PNG">
-</p>
-
-&nbsp;
diff --git a/docs/configFile.md b/docs/configFile.md
deleted file mode 100644
index bb870f452..000000000
--- a/docs/configFile.md
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-# Arena Configuration Files
-
-## TL;DR
-
-From the `examples` folder, run `python play.py ../configs/competition/10-26-01.yaml` to get an understanding of how the `YAML` files configure the 
-arenas for training. You will find a list of all objects you can add to an arena as well as the values for their parameters in [the definitions](definitionsOfObjects.md). You will find below all the technical details to create more complex training configurations.
-
-## Intro
-To configure training arenas you can use a simple **YAML file**. This makes training quite flexible and allows for the following:
-- load and save configurations for reusability
-- on the fly changes of configuration of one or more arenas between episodes, allowing for easy curriculum learning for example
-- share and update configurations easily
-
-We describe below the structure of the configuration files for an instance of the training environment, as well as all the parameters and the values they can take. 
-
-## The Arenas
-
-<p align="center">
-  <img height="400" src="PrefabsPictures/Arena.png">
-</p>
-
-A single arena is as shown above, it comes with a single agent (spherical animal - currently hedgehog, pig, or panda), a floor and 
-four walls. It is a square of size 40x40, the origin of the arena is `(0,0)`. You can provide coordinates for objects in the range `[0,40]x[0,40]` as floats.
-
-Note that in Unity the **y** axis is the vertical axis. In the above picture with the agent on the ground in the center of the environment its coordinates are (20, 0, 20).
-
-For each arena you can provide the following parameters and a list of objects to spawn:
-- `t` an `int`, the length of an episode which can change from one episode to the other. A value of `0` means that the episode will 
-not terminate until a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode). This value is converted into a decay rate for the health of the agent. A `t` of 100 means that the agent's health will decay to 0, and the episode will end, after 100 time steps.
-- `pass_mark` an `int`, the reward threshold that should constitute a ‘pass’ in the enviroment. Leaving this parameter undefined leads to the default value of 0, whereby any reward value obtained by the Agent results in a pass. This parameter also determines the notifications that players receive at the end of an episode. If used, this parameter should be defined with consideration to the reward size that can feasibly be obtained by the agent in each configuration file. 
-- `blackouts` [see below](#blackouts)
-
-## Objects
-
-All objects can be configured in the same manner, using a set of parameters for each item:
-
-- `name`: the name of the object you want to spawn.
-- `positions`: a list of `Vector3` positions within the arena where you want to spawn items, if the list is empty the position will be sampled randomly in the arena. Any position dimension set to -1 will spawn randomly.
-- `sizes`: a list of `Vector3` sizes, if the list is empty the size will be sampled randomly (within preset bounds for that particular object). You can set any size to -1 to spawn randomly along that dimension only.
-- `rotations`: a list of `float` in the range `[0,360]`, if the list is empty the rotation is sampled randomly.
-- `colors`: a list of `RGB` values (integers in the range `[0,255]`), if the list is empty the color is sampled randomly. Note that not all objects can have their colour changed and for those (e.g. transparent objects) this value will be ignored.
-
-Any of these fields can be omitted in the configuration files, in which case the omitted fields are automatically randomized. Any Vector3 that contains a -1 for any of its dimensions will spawn that dimension randomly. This can be used to spawn, for example, multiple walls of a set width and height but random lengths. 
-
-**All value ranges for the above fields can be found in [the definitions](definitionsOfObjects.md)**. If you go above or below the range for size it will automatically be set to the max or min respectively. If you try to spawn outside the arena (or overlapping with another object) then that object will not be spawned. Objects are placed in the order defined such that the second overlapping object is the one that does not spawn.
-
-## Unique/Special Object Parameters
-Some objects have unique/special parameters that only apply to them or a select few objects - they can be written in the configuration in exactly the same way as the 'standard' parameters, but will only be applied if assigned to a valid object:
-
-- `skins`:
-	- a list of animal names, denoting the 'skin' that is applied to the agent model.
-	- **applies to:** `Agent` only
-	- **defaults to:** `"random"` (is assigned any animal from the list)
-	- **preset list:** `"panda"`, `"pig"`, `"hedgehog"`, `"random"` (more animals TBC)
-- `delays`:
-	- a list of `float` fixed-frame time delays before each object's special behaviour is initiated.
-	- **applies to:** `DecayGoal`, `AntiDecayGoal`, `GrowGoal`, `ShrinkGoal`, `SpawnerTree`, `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** `0`
-- `initialValues`:
-	- a list of `float` reward/size values used as a starting point where the reward/size changes over time.
-	- **applies to:** `DecayGoal`, `AntiDecayGoal`, `GrowGoal`, `ShrinkGoal`, `SpawnerTree`
-	- **defaults to:** `2.5` if decaying/shrinking goal; `0.5` if ripening/growing goal; `0.2` for initial size of fruit from tree spawners
-- `finalValues`:
-	- a list of `float` reward/size values used as an ending point where the reward/size changes over time.
-	- **applies to:** `DecayGoal`, `AntiDecayGoal`, `GrowGoal`, `ShrinkGoal`, `SpawnerTree`
-	- **defaults to:** `0.5` if decaying/shrinking goal; `2.5` if ripening/growing goal; `1.0` for size of ripened fruit from tree spawners
-- `changeRates`:
-	- a list of `float` rates of change at which an object's reward/size change occurs.
-	- **applies to:** `DecayGoal`, `AntiDecayGoal`, `GrowGoal`, `ShrinkGoal`
-	- **defaults to:** `0.005` (automatically adjusted to `-0.005` if decaying/shrinking)
-- `spawnCounts`:
-	- a list of `int` numbers of goals that will be spawned by each spawner.
-	- **applies to:** `SpawnerTree`, `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** `-1` (infinite number of goals will be spawned continuously)
-- `spawnColors`:
-	- a list of `RGB` values denoting the colour of spawned objects from each spawner.
-	- **applies to:** `SpawnerTree`, `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** *(varies according to which spawner is used)*
-- `timesBetweenSpawns`:
-	- a list of `float` time intervals (seconds) between which spawn events occur in each spawner.
-	- **applies to:** `SpawnerTree`, `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** `4.0` if spawner is a tree; `1.5` otherwise
-- `ripenTimes`:
-	- a list of `float` time durations (seconds) spawned goals will take to 'ripen' (grow in size) in a tree before falling to the ground - *(set to `0` for instant spawning, and for ripening without size growth, set initial/finalValues to be equal)*.
-	- **applies to:** `SpawnerTree`
-	- **defaults to:** `6.0`
-- `doorDelays`:
-	- a list of `float` time durations (seconds) for a dispenser/container-spawner's door to open, making spawned goals accessible.
-	- **applies to:** `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** `10.0`
-- `timesBetweenDoorOpens`:
-	- a list of `float` time intervals (seconds) for which a dispenser/container-spawner's door will open before closing again *(door closing after opening is calculated automatically)*.
-	- **applies to:** `SpawnerDispenser`, `SpawnerContainer`
-	- **defaults to:** `-1` (if `< 0` then, once opened, door stays open permanently)
-- `symbolNames`:
-	- a list of symbol names to be drawn on SignPosterboard objects. Can choose from a preset list, or specify a custom 'QR code'-style symbol (see [examples](#detailed-examples))
-	- **applies to:** `SignPosterboard`
-	- **defaults to:** `"default"` (if no name or invalid name given)
-	- **preset list:** `"left-arrow"`, `"right-arrow"`, `"up-arrow"`, `"down-arrow"`, `"u-turn-arrow"`, `"letter-a"`, `"letter-b"`, `"letter-c"`, `"square"`, `"triangle"`, `"circle"`, `"star"`, `"tick"`, `"cross"`
-- `frozenAgentDelays`:
-	- a float that freezes the agent for the specified number of frames at the start of an episode. There is no reward decrement during the frozen period, and all other objects continue to move and interact.
-	- **applies to:** `Agent` only
-	- **defaults to:** `0`
-
-## Blackouts
-
-Blackouts are parameters you can pass to each arena, which define between which frames of an episode the lights are 
-on or off. If omitted, this parameter automatically sets to have lights on for the entire episode. You can otherwise 
-pass two types of arguments for this parameter:
-
-- passing a list of frames `[5,10,15,20,25]` will start with the lights on, switch them off from frames 5 to 9 included, 
-then back on from 15 to 19 included etc...
-- passing a single negative argument `[-20]` will automatically switch lights on and off every 20 frames.
-
-**Note**: for infinite episodes (where `t=0`), the first point above would leave the light off after frame `25` while the second point would keep switching the lights every `20` frames indefinitely.
-
-
-## Rules and Notes
-There are certain rules to follow when configuring an arena as well as some designs you should be aware of. If a 
-configuration file does not behave as you expect make sure you're not breaking one of the following:
-
-- Spawning objects:
-    - **Objects can only spawn if they do not overlap with each other**. Attempting to spawn an object where another object already is will discard the latter.
-    - The environment will attempt to spawn objects in the order they are provided in the file. In the case where any of the components is randomized we attempt to spawn the object **up to 20 times**. if no valid spawning spot is found the object is discarded.
-    - Due to the above point, the first objects in the list are more likely to spawn than the last ones.
-    - The `Agent` does not have to be provided in the configuration file, in which case it will spawn randomly.
-    - If an `Agent` position is provided, be aware that the **agent spawns last** therefore it might cause problems if other objects randomly spawn where the agent should be.
-    - In case an object is present where the `Agent` should spawn the arena resets and the process starts all over.
-    - You can **spawn some objects on top of each other**, however be aware there is a `0.1` buffer automatically added to any height you provide (to make sure things fall on each other nicely). 
-
-- Configuration file values:
-    - An objects' `name` must match one of the names provided in [the definitions](definitionsOfObjects.md), if the name provided is not found in this list, the object is ignored.
-    - Any component of `positions`, `sizes` and `rotations` can be randomized by providing a value of `-1`.
-    - Note that setting `positions.y = -1` will spawn the object at ground level.
-    - Goals (except for the red zone) can only be scaled equally on all axes, therefore they will always remain spheres. If a `Vector3` is provided for the scale of a sphere goal only the `x` component is used to scale all axes equally.
diff --git a/docs/configGuide/Example-YAML-File.yaml b/docs/configGuide/Example-YAML-File.yaml
new file mode 100644
index 000000000..7619596fa
--- /dev/null
+++ b/docs/configGuide/Example-YAML-File.yaml
@@ -0,0 +1,28 @@
+!ArenaConfig
+arenas:
+  0: !Arena # The number here is the arena ID. It must be unique.
+    t: 250 # The time limit for the arena in seconds.
+    items: # The items that will be spawned in the arena.
+    - !Item # The item type. This can be any item type defined in the items section of the config file.
+      name: Wall # The name of the item type. This must match the name of an item type defined in the items section of the config file.
+      positions:  # The positions of the items. The number of positions must match the number of rotations and sizes.
+      - !Vector3 {x: 21, y: 0, z: 10} # The position of the item. This is a Vector3 object with x, y, and z coordinates.
+      rotations: [0] # The rotations of the items. It can be in any angle but default is 0 degrees.
+      sizes: # The sizes of the items. You can scale the items by changing the sizes in each dimension.
+      - !Vector3 {x: 5, y: 3, z: 1} 
+      colors:  # The colors of the items. This is a RGB object with r, g, and b values.
+      - !RGB {r: 255, g: 0, b: 255} 
+    - !Item
+      name: GoodGoalBounce 
+      positions: 
+      - !Vector3 {x: 18, y: 0, z: 22} # Note that this item will be spawned multiple times at different positions.
+      - !Vector3 {x: 26, y: 0, z: 15} # ... by specifying multiple positions (-!Vector3 syntax).
+      rotations: [90, 60] # N.B: The rotations parameter is a list, taking in multiple rotations for each object defined. It is in order of the order of the positions. 
+      sizes: 
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 3, y: 3, z: 3}
+    - !Item
+      name: Agent # Note that the agent will always be spawned first regardless of its position in the configuration.
+      positions: 
+      - !Vector3 {x: 20, y: 0, z: 15}
+      rotations: [0]
diff --git a/docs/configGuide/YAML-Config-Syntax.md b/docs/configGuide/YAML-Config-Syntax.md
new file mode 100644
index 000000000..14449ccf8
--- /dev/null
+++ b/docs/configGuide/YAML-Config-Syntax.md
@@ -0,0 +1,526 @@
+# Detailed Arena Config Guide
+
+#### Table of Contents
+
+1. [Introduction](#introduction)
+2. [Understanding YAML Syntax](#understanding-yaml-syntax)
+   2.1 [YAML Hierarchical Syntax](#yaml-hierarchical-syntax)
+   2.2 [Syntax: Global Parameters](#yaml-hierarchical-syntax-global-parameters)
+   2.3 [Syntax: Local Parameters](#yaml-hierarchical-syntax-local-parameters)
+3. [EXAMPLES of YAML Configurations](#examples-of-yaml-configurations)
+   3.1 [Example 1 - Standard Parameters & Randomisation](#example-1---standard-parameters--randomisation)
+   3.2 [Example 2 - Decay Goals / Size-Changing Goals](#example-2---decay-goals--size-changing-goals)
+   3.3 [Example 3 - SignBoard (Preset Symbols)](#example-3---signboard-preset-symbols)
+   3.4 [Example 4 - SignBoard (Special Symbols)](#example-4---signboard-special-symbols)
+   3.5 [Example 5 - SpawnerButton (Interactive Objects)](#example-5---spawnerbutton-interactive-objects)
+   3.6 [Example 6 - Multiple Arenas (Randomisation)](#example-6---multiple-arenas-randomisation)
+   3.7 [Example 7 - Arena 'Blackouts'](#example-7---arena-blackouts)
+4. [Conclusion](#conclusion)
+5. [Further Reading and Documentation](#further-reading-and-documentation)
+
+
+### Introduction
+
+Let's take a look at some examples to understand how to use the YAML syntax in Animal-AI to create custom arenas. We will start with some simple examples and then move on to more complex examples.
+
+### Understanding YAML Syntax
+
+#### YAML Hierarchical Syntax
+
+```YAML
+# note that the arena has a fixed size of 40x40, meaning the size of the arena does not change. 
+# in later versions of Animal-AI, the arena size will be configurable. and be set dynamically.
+!ArenaConfig
+arenas:
+  0: !Arena 
+  Items: 
+    ... # rest of configuration file...
+```
+
+**Observations:** 
+
+We can observe the following structure: 
+
+* `!ArenaConfig` is the root tag. 
+* `arenas` is the tag for the arenas.
+* `0` is the tag for the first arena in the file.
+* `!Arena` is the tag for the arena itself.
+* `Items` is the tag for the objects to spawn in the arena.
+
+The `!ArenaConfig` tag is used to indicate that the following YAML file is an ArenaConfig file. The `arenas` tag is used to indicate that the following YAML file contains one or more arenas. The `0` tag indicates that the following arena is the first arena in the file, upto `n arenas` . The `!Arena` tag indicates that the following YAML file contains an arena. The `!` tag is used to indicate that the following YAML file is a custom class. In this case, the `!Arena` tag indicates that the following YAML file is an Arena file. The `!Arena` tag is followed by a list of parameters that are used to define the arena, with the objects to spawn for that particular arena only. Some arena parameters are applied locally, such as `t` (time limit) and `pass_mark` (more on this later), while others are applied globally (see below for an example). 
+
+#### YAML Hierarchical Syntax (Config/YAML Global Parameters)
+
+```YAML
+!ArenaConfig
+# Global Parameters that are optional to put here.
+canChangePerspective: false # can the agent change its perspective? (i.e. switch between first-person and third-person view)
+canResetEpisode: false # can the agent reset the episode? 
+showNotification: false # show the notification to the user upon completion of the episode? 
+randomizeArenas: false # randomize the arenas? This applies if there are > 1 arenas in the file. 
+arenas:
+  0: !Arena
+    ... # rest of configuration file...
+
+```
+
+**Observations:** 
+
+We can observe:
+
+* The default values for the global parameters are as follows: `canChangePerspective: true`,  `canResetEpisode: true`,  `showNotification: false`, and `randomizeArenas: false`.
+Bear in mind that the global parameters are optional to define. If we do not define them, the default values are used. 
+* If we do not provide global parameters, the default values are used. For example, if we do not provide a value for `canChangePerspective`, the default value of `true` is used.
+* If we provide a value for a global parameter, the value is applied to all arenas in the file. For example, if we set `canChangePerspective` to `false`, the agent will not be able to change its perspective in any of the arenas in the file. However, if we set `canChangePerspective` to `true`, the agent will be able to change its perspective in any of the arenas in the file.
+
+In the example above, the global parameters are defined before the arenas. These parameters are applied to all arenas in the file. Please note that these parameters are only applicable during `Play` mode, not agent `Training` mode.
+
+#### YAML Hierarchical Syntax (Arena/Item Local Parameters)
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    t: 250 # Time limit for the arena. This is a local parameter, and is only applicable to this arena.
+    pass_mark: 0 # Pass mark for the arena (i.e. the minimum reward required to pass the arena). This is a local parameter, and is only applicable to this arena.
+    items: # List of objects to spawn in the arena. This is a list which is converted to a GameObject array in Unity.
+    - !Item # An individual object to spawn in the arena. This object is then added to the list of objects to spawn in the arena.
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+      skins:
+      - "hedgehog"
+  1: !Arena # note that the arena number is 1, meaning this is the second arena in the file. Each arena must have a unique number and the first arena must be 0.
+    t: 250 # Time limit for the arena. This is a local parameter, and is only applicable to this arena.
+    pass_mark: 0 # Pass mark for the arena (i.e. the minimum reward required to pass the arena). This is a local parameter, and is only applicable to this arena.
+    items: # List of objects to spawn in the arena. This is a list which is converted to a GameObject array in Unity.
+    - !Item # An individual object to spawn in the arena. This object is then added to the list of objects to spawn in the arena.
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+      skins:
+      - "hedgehog"
+```
+
+**Observations:**
+
+Regarding Arena and Item local parameters, we can observe respectively that:
+
+* The _arena-specific_ parameters are only applicable to the arena in which they are defined. For example, if `t` is set to `250`, the time limit for the arena will be 250 seconds. However, if there are multiple arenas defined in the same YAML configuration file `t` is set to `500`, the time limit for the arena will be 500 seconds for that arena only. Please note that these parameters are applicable during `Play` and `Training` modes. Lastly, the properties of each "Item" is a local parameter specified for that particular object only. For example, if the `Agent` object is specified to have a `hedgehog` skin, only the `Agent` object will have a `hedgehog` skin for that particular arena.
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    t: 250 # Time limit for the arena. This is a local parameter, and is only applicable to this arena.
+    pass_mark: 0 # Pass mark for the arena (i.e. the minimum reward required to pass the arena). This is a local parameter, and is only applicable to this arena.
+    items: # List of objects to spawn in the arena. This is a list which is converted to a GameObject array in Unity.
+    - !Item # An individual object to spawn in the arena. This object is then added to the list of objects to spawn in the arena.
+      name: Agent
+      ... # rest of Agent parameters...
+    - !Item
+      name: Wall
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 10}
+      colors:
+      - !RGB {r: 204, g: 0, b: 204 }
+      rotations: [45]
+      sizes:
+      - !Vector3 {x: 5, y: 5, z: 5}
+    - !Item
+      name: Wall
+      positions:
+      - !Vector3 {x: 1000, y: 1000, z: 1000}
+      colors:
+      - !RGB {r: 204, g: 0, b: 204 }
+      rotations: [0]
+      sizes:
+      - !Vector3 {x: 1000, y: 1000, z: 1000}
+```
+
+* Moreover, we can observe that the `!Item` tag also contains local parameters of its own, which we define as _item-only_ local parameters. Such item-only local parameters are only applicable to the object in which they are defined. For example, if we define a `Wall` object twice in the same arena (as demonstrated in the above YAML snippet), the local parameters such as positions, sizes, colors, rotations etc. defined for the first  `Wall` object will not apply to the second `Wall` object in the same arena. 
+
+The syntax implemented allows for a high degree of flexibility in the creation of custom arenas where multiple objects of the same type can be defined with different properties for the same arena, without conflict.
+
+Let's now take a look at more complex examples to understand how to use the YAML syntax in Animal-AI to create custom arenas.
+
+### Examples of YAML Configurations
+
+Let's take a look at some examples to understand how to use the YAML syntax in Animal-AI to create custom arenas.
+
+#### EXAMPLE 1 - Standard Parameters & Randomisation
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    t: 0
+    items:
+    - !Item
+      name: Wall
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 10}
+      - !Vector3 {x: -1, y: 0, z: 30}
+      colors:
+      - !RGB {r: 204, g: 0, b: 204 }
+      rotations: [45, 45]
+      sizes:
+      - !Vector3 {x: -1, y: 5, z: -1}
+      # note that the second wall gameobject has no positions defined, meaning it will be randomly spawned in the arena. 
+    - !Item
+      name: CylinderTunnel
+      colors:
+      - !RGB {r: 204, g: 0, b: 204 }
+      - !RGB {r: 204, g: 0, b: 204 }
+      - !RGB {r: 204, g: 0, b: 204 }
+    - !Item
+      name: GoodGoal
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example1.png">
+</p>
+
+**Observations:** 
+* The number of parameters for `positions`,  `rotations`, and `sizes` do not need to match.
+* The environment will spawn `max(len(positions), len(rotations), len(sizes))` objects.
+* Missing parameters are assigned randomly. For example, if `positions` is specified, but `sizes` are not, the environment will randomly assign sizes values to the objects.
+
+In this scenario, the objects will spawn in the following order:
+
+* A pink Cube will appear at coordinates `[10, 10]` on the ground. It will have a rotation of `45` degrees and its size will be random along the `x` and `z` axes, with a fixed size of `y=5`.
+Another Cube will be placed on the ground at a random x coordinate and z=30. This cube's rotation, size, and color will all be randomly determined.
+* Three CylinderTunnel objects will spawn next, and each of these will be entirely random in terms of position, size, color, and rotation.
+* A GoodGoal object will then appear, with all its attributes randomized.
+* Finally, the agent will spawn in a random position and orientation if it is unspecified in the arena instance. This is an important point to note, as if the agent was specified, it would have priority over all other objects and would be spawned first, before any other object(s).
+
+&nbsp; 
+
+#### EXAMPLE 2 - Decay Goals / Size-Changing Goals
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+      skins:
+      - "hedgehog"
+    - !Item
+      name: ShrinkGoal
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 11}
+      sizes:
+      - !Vector3 {x: 0.1, y: 0.1, z: 0.1}
+      symbolNames:
+      - "left-arrow"
+      initialValues: [2.5]
+      finalValues: [1.5]
+      delays: [400]
+      changeRates: [-0.2]
+    - !Item
+      name: DecayGoal
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 17}
+      initialValues: [4]
+      finalValues: [3]
+      delays: [250]
+      changeRates: [-0.003]
+    - !Item
+      name: AntiDecayGoal
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 23}
+      sizes:
+      - !Vector3 {x: 0.1, y: 0.1, z: 0.1}
+      initialValues: [1]
+      finalValues: [1.5]
+      delays: [300]
+      changeRates: [-0.007]
+    - !Item
+      name: GrowGoal
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 29}
+      initialValues: [1]
+      finalValues: [3.5]
+      delays: [100]
+      changeRates: [0.01]
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example2.png">
+</p>
+
+**Observations:**
+
+This example showcases various goals that undergo changes such as `decay` , `growth` , `shrinkage` , and `ripening` (anti-decay). Each Item in this setup includes certain parameters that are either irrelevant or used incorrectly. These 'red herring' parameters, while not utilized properly, do not impact the overall outcome or cause issues with the AAI environment.
+
+In the above scenario:
+
+* The `ShrinkGoal` and `GrowGoal` ignore the declared `sizes` parameter. Instead, their sizes change based on the initialValues and finalValues.
+* For both `DecayGoal` and `AntiDecayGoal`, the size is determined by the larger of the `initialValue` or `finalValue`. 
+* Additionally, the reward for these goals transitions from the initial value to the final value over time.
+Interestingly, the ShrinkGoal includes a `symbolNames` parameter, which is typically reserved for `SignBoard` objects. This parameter is not applicable here and is therefore disregarded.
+* Furthermore, an 'animal skin' feature is utilized in this example. Specifically, the Agent is configured to always appear with a 'hedgehog' skin.
+
+&nbsp; 
+
+#### EXAMPLE 3 - SignBoard (Preset Symbols)
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+    - !Item
+      name: SignBoard
+      positions: # note that the positions, rotations, and sizes parameters must be of the same length 
+      # ...(i.e. if there are 5 positions, there must be 5 rotations and 5 sizes).
+      - !Vector3 {x: 20, y: 0, z: 8}
+      - !Vector3 {x: 20, y: 0, z: 14}
+      - !Vector3 {x: 20, y: 0, z: 20}
+      - !Vector3 {x: 20, y: 0, z: 26}
+      - !Vector3 {x: 20, y: 0, z: 32}
+      rotations: [0, 0, 0, 0, 0]
+      sizes:
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      symbolNames: # note also that the symbolNames parameter must be of the same length as the positions parameters 
+      # ...(i.e. if there are 5 positions, there must be 5 symbolNames). Each position is an instance of a SignBoard object, and each SignBoard object can only have one symbol.
+      - "left-arrow"    
+      - "letter-a"    
+      - "circle"    
+      - "u-turn-arrow"    
+      - "tick"
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example3.png">
+</p>
+
+**Observations:**
+
+This example illustrates how to employ predefined symbols using the `symbolNames` parameter, which is exclusive to `SignBoard` objects. Each symbol in this list comes with a default color. However, these colors do not affect the texture of the symbol. Instead, the color of the SignBoard gameobject is determined by the `colors` parameter and only that.
+
+&nbsp; 
+
+#### EXAMPLE 4 - SignBoard (Special Symbols)
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+    - !Item
+      name: SignBoard
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 8}
+      - !Vector3 {x: 20, y: 0, z: 14}
+      - !Vector3 {x: 20, y: 0, z: 20}
+      - !Vector3 {x: 20, y: 0, z: 26}
+      - !Vector3 {x: 20, y: 0, z: 32}
+      rotations: [0, 0, 0, 0, 0]
+      sizes:
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      - !Vector3 {x: 1, y: 1, z: 1}
+      symbolNames:
+      - "01/10"    
+      - "111/110/001"    
+      - "001010/011000/100001/101010/111001"    
+      - "0101/**10/0010/0***"
+      - "13x11"
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example4.png">
+</p>
+
+**Observations:**
+
+This example demonstrates the use of *special codes* to generate black-and-white pixel grids to use as symbols. `0` -> black, `1` -> white, and `*` is a 'joker' character that chooses to output black or white at random. The dimensions of the grid are given by the `/` character - each row between `/` s must be of the same size for the code to be valid. 
+
+Fully-random grids can be generated using the code `"MxN"` , where `M` and `N` are the grid width and height dimensions respectively. For example, `"5x3"` will generate a 5x3 grid.
+
+&nbsp; 
+
+#### EXAMPLE 5 - SpawnerButton (Interactive Objects)
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+    - !Item
+      name: SpawnerButton
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 10}
+      sizes:
+      - !Vector3 {x: 5, y: 5, z: 5}
+      rotations: [0]
+      # colors:
+      # - !RGB {r: 204, g: 0, b: 204 }
+      # note that the SpawnerButton is a modular object, but the colors are fixed for each module in order to remove the
+      # ...occurance of each module having the same color, which would be confusing for the player/agent on which module to interact with.
+      moveDurations: [0.1] 
+      resetDurations: [1.0] 
+      rewardNames: ["GoodGoal", "BadGoal", "GoodGoalMulti"]
+      rewardWeights: [100, 0, 0] 
+      spawnProbability: 1.0 
+      maxRewardCounts: [-1, -1, -1] 
+      rewardSpawnPos: !Vector3 {x: 25, y: 0, z: 23} # the position where the reward will be spawned. 
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example5.png">
+</p>
+
+**Observations:** 
+
+* The `SpawnerButton` object is an interactive object, meaning that it can be interacted with by the player/agent.
+* The `SpawnerButton` object is a modular object, meaning that it is made up of multiple modules. In this case, the `SpawnerButton` object is made up of 2 modules.
+
+In the above example, the `SpawnerButton` object is used to spawn rewards upon interaction with the button (by 'colliding' with the gameobject) by the player/agent. We can observe that the `SpawnerButton` object has a number of parameters that are used to define the object's behaviour. These parameters are as follows:
+
+* `moveDurations`: The duration of the movement of the button when it is pressed.
+* `resetDurations`: The duration of the movement of the button when it is reset.
+* `rewardNames`: The list of rewards that can be spawned.
+* `rewardWeights`: The weights of each reward in the rewards list. 
+As an added feature, the weights can be used to control the probability of spawning each reward. For example, if the weights are `[100, 0, 0]` , the probability of spawning the first reward is 100%, while the probability of spawning the second and third rewards are 0%. If the weights are `[50, 50, 0]` , the probability of spawning the first and second rewards are 50%, while the probability of spawning the third reward is 0%. If the weights are `[33, 33, 33]` , the probability of spawning each reward is 33%.
+* `spawnProbability`: The probability of spawning the reward upon interaction with the SpawnerButton. This parameter is used in conjunction with the `rewardWeights` parameter. Essentially, it controls the overall probability of spawning _a_ reward upon interaction with the SpawnerButton. For example, if you have the `rewardWeights` set to `[100, 100, 100]` but the `spawnProbability` set to `0.5`, the probability of spawning a reward is 50% at each interaction. Conversely, if you have the `rewardWeights` set to `[100, 100, 100]` but the `spawnProbability` set to `0.0`, the probability of spawning a reward is 0% at each interaction, meaning no reward will ever be spawned. 
+* `maxRewardCounts`: The maximum number of times each reward can be spawned. A value of -1 means no limit to the number of times the reward can be spawned per episode.
+* `rewardSpawnPos`: The position where the reward will be spawned. If left unspecified, the reward will be spawned randomly within the arena.
+
+&nbsp; 
+
+#### EXAMPLE 6 - Multiple Arenas (Randomisation)
+
+```YAML
+!ArenaConfig
+randomizeArenas: true # Here, we set randomizeArenas to true, which means that the arenas will be randomized upon play. Note that this is not applicable to training mode.
+arenas:
+  0: !Arena
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+    - !Item
+      name: SpawnerButton
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 8}
+  1: !Arena # Here, we define a second arena. However, for simplicitiy, the second arena has the same objects and parameters as the first arena.
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+    - !Item
+      name: SpawnerButton
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 8}
+    - !Item
+      name: SpawnerButton
+      - !Vector3 {x: 27.9799995, y: 0, z: 7.99999905}
+```
+
+<table>
+  <tr>
+
+    <td><img src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example5.png" width="500"/>
+    <p>Arena 0 </p></td>
+    <td><img src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example6.png" width="500"/><p>Arena 1</p></td>
+
+  </tr>
+</table>
+
+**Observations:** 
+
+We can observe that:
+
+* If we set `randomizeArenas` to `false`, the arenas will not be randomized upon play. Instead, the arenas will be played in the order in which they are defined in the file. For example, if we set `randomizeArenas` to `false`, the first arena will be played first, followed by the second arena.
+* If we set `randomizeArenas` to `true`, the arenas will be randomized upon play and played in a random order. Regardless of the order in which the arenas are defined in the file, the arenas will be recycled (start from the beginning again) when every arena has been cycled through once.
+
+In this example, we define two arenas. However, we set `randomizeArenas` to `true` , which means that the arenas will be randomized upon play. Note that this is not applicable to training mode. This means that the order in which the arenas are defined does not matter, as the arenas will be randomized upon play. Please note that the `randomizeArenas` parameter is only applicable to the arenas in the file, not the objects within the arenas. 
+
+&nbsp; 
+
+#### EXAMPLE 7 - Arena 'Blackouts'
+
+```YAML
+!ArenaConfig
+arenas:
+  0: !Arena
+    t: 250 
+    pass_mark: 50 
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 10, y: 0, z: 20}
+      rotations: [90]
+      skins:
+      - "pig"
+    blackouts: [10, 43, 50, 20] # here, we are defining the blackout times (in frames) for the arena at frames 10, 43, 50 and 20.
+```
+
+<p align="center">
+  <img height="250" src="../../docs/figs/exampleGallery/Yaml-Config-Sytax-Arenas/example7.png">
+</p>
+
+**Observations:** 
+
+We can observe that:
+
+* The `blackouts` parameter is used to define the blackout zones for the arena. The `blackouts` parameter is a list of frames at which the arena will be blacked out. For example, if we set `blackouts` to `[10, 43, 50, 20]`, the arena will be blacked out at frames 10, 43, 50 and 20. This means the player/agent will be virtually blind at these frames (no light will be emitted to the arena).
+* Additionally, if we set `blackouts` to `[-20]`, the arena will blackout every 20 frames (because we placed the '-' indicating repeat).
+* The blackout has no effect on any other aspect of the agent or the arena. For example, the agent will still be able to move around the arena, and the objects in the arena will still be visible to the agent. _RayCasting_ will still work. 
+
+### Conclusion
+
+We hope that this guide has helped you understand how to use the YAML syntax in Animal-AI to create custom arenas. 
+
+### Further Reading and Documentation
+
+For more information on how YAML works, please refer to the [YAML documentation](https://yaml.org/spec/1.2/spec.html). If you are still unsure about how to use the YAML syntax, please refer to the [Background-YAML](/docs/Background-YAML.md) guide for a closer look into how YAML is used.
+
+---
diff --git a/docs/definitionsOfObjects.md b/docs/definitionsOfObjects.md
deleted file mode 100644
index 5789e6bf9..000000000
--- a/docs/definitionsOfObjects.md
+++ /dev/null
@@ -1,280 +0,0 @@
-
-
-
-## The Objects
-
-There are 9 types of object split amongst four categories:
-* Immovable
-    * Walls
-    * Ramps
-    * Tunnels
-* Movable
-    * Cardboard Boxes
-    * Shapes
-* Rewards
-    * Food
-    * Zones
-* Other/Unique
-    * Spawners
-    * Signs
-    * Spawner Buttons
-
-For each object we describe the object name to be used in a configuration file or in Python directly, as well as their default characteristics and the range of values you can assign to them. **All objects can be rotated `360` degrees.**
-
-The axis below corresponds to that shown in the images for each individual object.
-
-<img height="200" src="PrefabsPictures/Referential.png">
-
-**Note:** the **Y axis** is the vertical axis and **Z** is the forward axis (following conventions used in Unity). 
-
-## Immovable
-
-These objects are fixed and cannot be moved:
-
-#### Wall
-<img align="right" height="100" src="PrefabsPictures/Immovable/Wall.png">
-
-* name: `Wall`
-* size range: `(0.1,0.1,0.1)-(40,10,40)`
-* can change color. 
-
-For simplicity, walls in most test problems will be grey and set to RGB (r: 153, g: 153, b: 153). If a wall is used as a platform it will be blue and set to RGB (r: 0, g: 0, b: 255).
-
-#### Transparent Wall
-<img align="right" height="100" src="PrefabsPictures/Immovable/WallTransparent.png">
-
-* name: `WallTransparent`
-* size range: `(0.1,0.1,0.1)-(40,10,40)`
-* cannot change color
-
-#### Ramp
-<img align="right" height="100" src="PrefabsPictures/Immovable/Ramp.png">
-
-* name: `Ramp`
-* size range: `(0.5,0.1,0.5)-(40,10,40)`
-* can change color. 
-
-For simplicity, ramps in most test problems will be pink and set to RGB (r: 255, g: 0, b: 255).
-
-#### Tunnel
-<img align="right" height="100" src="PrefabsPictures/Immovable/CylinderTunnel.png">
-
-* name: `CylinderTunnel`
-* size range: `(2.5,2.5,2.5)-(10,10,10)`
-* can change color
-
-For simplicity, tunnels in most test problems will be grey and set to RGB (r: 153, g: 153, b: 153).
-
-#### Transparent Tunnel
-<img align="right" height="100" src="PrefabsPictures/Immovable/CylinderTunnelTransparent.png">
-
-* name: `CylinderTunnelTransparent`
-* size range: `(2.5,2.5,2.5)-(10,10,10)`
-* cannot change color
-    
-## Movable
-
-These are objects that are light enough to be easily moved by the agent (or other objects). Note that different object types weigh different amounts. Also note that since v0.6, all movable object have a fixed texture in order to make them easier to differentiate from non movable objects.     
-
-#### Light Cardboard Box
-<img align="right" height="100" src="PrefabsPictures/Movable/Cardbox1.png">
-
-* name: `Cardbox1`
-* size range: `(0.5,0.5,0.5)-(10,10,10)`
-* cannot change color
-
-#### Heavy Cardboard Box
-<img align="right" height="100" src="PrefabsPictures/Movable/Cardbox2.png">
-
-* name: `Cardbox2`
-* size range: `(0.5,0.5,0.5)-(10,10,10)`
-* cannot change color
-
-#### U-shaped Object
-<img align="right" height="100" src="PrefabsPictures/Movable/UObject.png">
-
-* name: `UObject`
-* size range: `(1,0.3,3)-(5,2,20)`
-* cannot change color
-
-#### L-shaped Object
-<img align="right" height="100" src="PrefabsPictures/Movable/LObject.png">a L-shaped object with a wooden texture
-
-* name: `LObject`
-* size range: `(1,0.3,3)-(5,2,20)`
-* cannot change color
-
-#### L-shaped Object Variation
-<img align="right" height="100" src="PrefabsPictures/Movable/LObject2.png">symmetric of the L-shaped object
- 
-* name: `LObject2`
-* size range: `(1,0.3,3)-(5,2,20)`
-* cannot change color
-    
-## Rewards
-
-Objects that give a reward and may terminate the event if the agents collides with one. **Important note:** for sphere goals the `y` and `z` components of the provided sizes are ignored and only `x` is used.
-
-#### Stationary Positive Goal
-<img align="right" height="100" src="PrefabsPictures/Rewards/GoodGoal.png">
-Green spheres with a positive reward equal to their size. Ends the episode on collection.
-
-* name: `GoodGoal`
-* size range: `0.5-5`
-* cannot change color
-
-#### Moving Positive Goal
-<img align="right" height="100" src="PrefabsPictures/Rewards/GoodGoal.png">
-Moving food with positive reward. Starts by moving in the direction provided by the rotation parameter.
-
-* name: `GoodGoalBounce`
-* size range: `0.5-5`
-* cannot change color
-
-#### Stationary Negative Goal
-<img align="right" height="100" src="PrefabsPictures/Rewards/BadGoal.png">
-Red spheres with a negative reward equal to their size. Ends the episode on collection.
-       
-* name: `BadGoal`
-* size range: `0.5-5`
-* cannot change color
-
-#### Moving Negative Goal
-<img align="right" height="100" src="PrefabsPictures/Rewards/BadGoal.png">
-Moving food with negative reward. Starts by moving in the direction provided by the rotation parameter.
-
-* name: `BadGoalBounce`
-* size range: `0.5-5`
-* cannot change color
-
-#### Stationary Positive Reward
-<img align="right" height="100" src="PrefabsPictures/Rewards/GoodGoalMulti.png">
-Golden spheres with a positive reward equal to their size. Does **not** terminate the episode. The episode **is** terminated if all goals are collected. So, in an episode with only these rewards the episode will terminate when the last one is obtained.
-
-* name: `GoodGoalMulti`
-* size range: `0.5-5`
-* cannot change color
-
-#### Moving Positive Reward
-<img align="right" height="100" src="PrefabsPictures/Rewards/GoodGoalMulti.png">
-Moving food with positive reward (non-terminating). Starts by moving in the direction provided by the rotation parameter.
-   
-* name: `GoodGoalMultiBounce`
-* size range: `0.5-5`
-* cannot change color
-
-#### DeathZone: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/DeathZone.png">
-A red zone with reward -1 that terminates the episode on contact.
-
-* name: `DeathZone`
-* size range: `(1,0.5,1)-(40,10,40)`
-* terminates an episode
-* cannot change color
-
-#### HotZone: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/HotZone.png">
-An orange zone with reward `min(-10/T,-1e-5)` (or `-1e-5` if `T=0`) that **does not** end an episode.
-        
-* name: `HotZone`
-* size range: `(1,0.5,1)-(40,10,40)`
-* does not terminate an episode
-* cannot change color
-* if a `DeathZone` and a `HotZone` overlap the `DeathZone` prevails
-
-#### Decay Goal: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/DecayGoal.png">
-Variable-reward spheres whose reward 'decays' over time, following a (configurable) delay time. Colour changes (from purple to grey) and a radial-timer depletes over time during decay process. **Does not** end an episode except if all goals collected.
-
-* name: `DecayGoal`
-* initial/final reward value range: `0-5`
-* size automatically sets to initial reward value
-* fixed frame delay value range: `0-inf` (default is `150` frames)
-
-#### Anti-Decay Goal: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/AntiDecayGoal.png">
-Variable-reward spheres whose reward 'ripens' over time, following a (configurable) delay time. Colour changes (from grey to purple) and a radial-timer fills up over time during anti-decay process. **Does not** end an episode except if all goals collected.
-
-* name: `AntiDecayGoal`
-* initial/final reward value range: `0-5`
-* size automatically sets to final reward value
-* fixed frame delay value range: `0-inf` (default is `150` frames)
-
-#### Grow Goal: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/GrowGoal.png">
-Variable-reward spheres whose physical size grows over time, following a (configurable) delay time. Reward tracks size change. **Does not** end an episode except if all goals collected.
-
-* name: `GrowGoal`
-* initial/final reward value range: `0-5`
-* reward increases along with size value
-* fixed frame delay value range: `0-inf` (default is `0` frames)
-* growth halts when `GrowGoal` is trapped between/underneath other objects
-
-#### Shrink Goal: 
-<img align="right" height="100" src="PrefabsPictures/Rewards/ShrinkGoal.png">
-Variable-reward spheres whose physical size shrinks over time, following a (configurable) delay time. Reward tracks size change. **Does not** end an episode except if all goals collected.
-
-* name: `ShrinkGoal`
-* initial/final reward value range: `0-5`
-* reward decreases along with size value
-* fixed frame delay value range: `0-inf` (default is `0` frames)
-
-
-## Other/Unique
-
-Special objects with unique functionality. *Spawners* create and deposit new food into the arena, whilst *Signs* communicate visual information to the agent. These objects tend to have fixed dimensions (that may still be *scaled* by the `size` parameter).
-
-#### Tree Spawner
-<img align="right" height="110" src="PrefabsPictures/Other-Unique/SpawnerTree.PNG">
-Tree that grows new food over time. Food objects spawn and grow in the tree branches, then fall to the ground after a configurable 'ripening' time.
-
-* name: `SpawnerTree`
-* fixed size: dimensions `5.19 x 5.95 x 5.02` *(may be scalable in future version)*
-* spawned goal size range: `0.2-3`
-* #spawns range: `0-inf` (leave blank or set to `-1` to spawn infinitely)
-* cannot change color of spawner; can change color of spawned goals
-
-#### Goal Dispenser
-<img align="right" height="110" src="PrefabsPictures/Other-Unique/SpawnerDispenser.PNG">
-Spawns new goal objects (finitely or otherwise) like a vending machine. After an optional, configurable time delay, the dispenser door can open and close at a regular specified interval. Food rolls out of the machine whenever the door is open.
-
-* name: `SpawnerDispenser`
-* fixed size: dimensions `1.67 x 4.46 x 1.67` *(may be scalable in future version)*
-* spawned goal size range: `0.2-1`
-* #spawns range: `0-inf` (leave blank or set to `-1` to spawn infinitely)
-* can change color of spawner/goals
-
-#### Goal Container
-<img align="right" height="110" src="PrefabsPictures/Other-Unique/SpawnerContainer.PNG">
-Spawns new goal objects (finitely or otherwise) in a small transparent container. After an optional, configurable time delay, the container door can open and close at a regular specified interval. Food stays within the container and can only be accessed by the agent when the door is open.
-
-* name: `SpawnerContainer`
-* fixed size: dimensions `1.67 x 1.67 x 1.67` *(may be scalable in future version)*
-* spawned goal size range: `0.2-1`
-* #spawns range: `0-inf` (leave blank or set to `-1` to spawn infinitely)
-* can change color of spawner/goals
-
-#### Sign Posterboard
-<img align="right" height="90" src="PrefabsPictures/Other-Unique/SignPosterboard.PNG">
-Posterboard communicating visual information to the agent. Features a 'symbol' that can be chosen from a list of presets, or generated as a matrix of pixels from a special code (see [configFile.md](configFile.md)).
-
-* name: `SignPosterboard`
-* size range: `0.5-2.5` (**note:** `x` is posterboard thickness, `y` is height, `z` is width - size values for posterboards are a *scale factor*, not the actual size)
-* color change overrides the color of the *symbol*, not the posterboard itself - leave empty for the symbol's default color to be used
-* symbol is specified using the `symbolNames` parameter
-&nbsp;
-
-#### Spawner Button
-
-Pillar that spawns new goals into the enviroment. The probability with which different goals are spawned into the environment by the pillar can be defined by the user.
-
-* name: `Pillar-Button`
-* fixed size: dimensions `insert here` 
-* spawned goal size range: `insert here`
-* #spawns range: `0-inf` (leave blank or set to `-1` to spawn infinitely)
-* moveDurations: A value which defines the delay period between the pillar button being activated and the reward object being spawned.
-* resetDurations: A value which defines the delay between period betweeen the pillar button spawning a reward and when it is next able to spawn another.
-* rewardNames: A list object which specifices the reward(s) that a pliiar button will spawn. For example, ["GoodGoal"] would only spawn green reward objects, whilst ["GoodGoal", "BadGoal", "GoodGoalMulti"] would spawn each of these three rewards with varuing probabilities. 
-* rewardWeights: A list of values which specifices the likelihood with which each reward object is likely to be spawned by the pillar button. For example, [1, 0, 0] would always spawn a "GoodGoal" from the rewardNames example, whilst [0.5,0.5,0] whould spawn a "GoodGoal" or a "BadGoal" with equal probability. 
-* spawnProbability: A value between `0.0-1.0` which defines the likelihood that the pillar button will spawn a reward on a given occassion
-* rewardSpawnPos: The location that the reward objects will be spawned.
diff --git a/docs/figs/Agent-HUD/agent-health.png b/docs/figs/Agent-HUD/agent-health.png
new file mode 100644
index 000000000..4e9f770b4
Binary files /dev/null and b/docs/figs/Agent-HUD/agent-health.png differ
diff --git a/docs/figs/Agent-HUD/agent-reward.png b/docs/figs/Agent-HUD/agent-reward.png
new file mode 100644
index 000000000..10410e0e5
Binary files /dev/null and b/docs/figs/Agent-HUD/agent-reward.png differ
diff --git a/docs/figs/Agent-HUD/notification-bad.png b/docs/figs/Agent-HUD/notification-bad.png
new file mode 100644
index 000000000..c7e5a2235
Binary files /dev/null and b/docs/figs/Agent-HUD/notification-bad.png differ
diff --git a/docs/figs/Agent-HUD/notification-good.png b/docs/figs/Agent-HUD/notification-good.png
new file mode 100644
index 000000000..c1ee99212
Binary files /dev/null and b/docs/figs/Agent-HUD/notification-good.png differ
diff --git a/docs/ExampleGallery/SignPosterboard-preset-symbols.PNG b/docs/figs/exampleGallery/SignPosterboard-preset-symbols.PNG
similarity index 100%
rename from docs/ExampleGallery/SignPosterboard-preset-symbols.PNG
rename to docs/figs/exampleGallery/SignPosterboard-preset-symbols.PNG
diff --git a/docs/ExampleGallery/SignPosterboard-special-symbols-annotated.png b/docs/figs/exampleGallery/SignPosterboard-special-symbols-annotated.png
similarity index 100%
rename from docs/ExampleGallery/SignPosterboard-special-symbols-annotated.png
rename to docs/figs/exampleGallery/SignPosterboard-special-symbols-annotated.png
diff --git a/docs/ExampleGallery/TestCompetition02-28-02.PNG b/docs/figs/exampleGallery/TestCompetition02-28-02.PNG
similarity index 100%
rename from docs/ExampleGallery/TestCompetition02-28-02.PNG
rename to docs/figs/exampleGallery/TestCompetition02-28-02.PNG
diff --git a/docs/ExampleGallery/TestCompetition10-13-01.PNG b/docs/figs/exampleGallery/TestCompetition10-13-01.PNG
similarity index 100%
rename from docs/ExampleGallery/TestCompetition10-13-01.PNG
rename to docs/figs/exampleGallery/TestCompetition10-13-01.PNG
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example1.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example1.png
new file mode 100644
index 000000000..b07d31029
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example1.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example2.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example2.png
new file mode 100644
index 000000000..9a5870f46
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example2.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example3.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example3.png
new file mode 100644
index 000000000..ae8e2541b
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example3.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example4.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example4.png
new file mode 100644
index 000000000..9bbe8fe5e
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example4.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example5.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example5.png
new file mode 100644
index 000000000..bc48f5331
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example5.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example6.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example6.png
new file mode 100644
index 000000000..7faaeae1e
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example6.png differ
diff --git a/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example7.png b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example7.png
new file mode 100644
index 000000000..c13bf2d14
Binary files /dev/null and b/docs/figs/exampleGallery/Yaml-Config-Syntax-Arenas/example7.png differ
diff --git a/docs/figs/prefabs/DefaultArena.png b/docs/figs/prefabs/DefaultArena.png
new file mode 100644
index 000000000..44fa7c605
Binary files /dev/null and b/docs/figs/prefabs/DefaultArena.png differ
diff --git a/docs/figs/prefabs/Dispensers/SpawnerButton.png b/docs/figs/prefabs/Dispensers/SpawnerButton.png
new file mode 100644
index 000000000..8a42e8bd3
Binary files /dev/null and b/docs/figs/prefabs/Dispensers/SpawnerButton.png differ
diff --git a/docs/figs/prefabs/Dispensers/SpawnerContainerShort.png b/docs/figs/prefabs/Dispensers/SpawnerContainerShort.png
new file mode 100644
index 000000000..e6b84d612
Binary files /dev/null and b/docs/figs/prefabs/Dispensers/SpawnerContainerShort.png differ
diff --git a/docs/figs/prefabs/Dispensers/SpawnerDispenserTall.png b/docs/figs/prefabs/Dispensers/SpawnerDispenserTall.png
new file mode 100644
index 000000000..4449d45ae
Binary files /dev/null and b/docs/figs/prefabs/Dispensers/SpawnerDispenserTall.png differ
diff --git a/docs/figs/prefabs/Dispensers/SpawnerTree.png b/docs/figs/prefabs/Dispensers/SpawnerTree.png
new file mode 100644
index 000000000..3371bc569
Binary files /dev/null and b/docs/figs/prefabs/Dispensers/SpawnerTree.png differ
diff --git a/docs/PrefabsPictures/Immovable/CylinderTunnel.png b/docs/figs/prefabs/Immovable/CylinderTunnel.png
similarity index 100%
rename from docs/PrefabsPictures/Immovable/CylinderTunnel.png
rename to docs/figs/prefabs/Immovable/CylinderTunnel.png
diff --git a/docs/PrefabsPictures/Immovable/CylinderTunnelTransparent.png b/docs/figs/prefabs/Immovable/CylinderTunnelTransparent.png
similarity index 100%
rename from docs/PrefabsPictures/Immovable/CylinderTunnelTransparent.png
rename to docs/figs/prefabs/Immovable/CylinderTunnelTransparent.png
diff --git a/docs/PrefabsPictures/Immovable/Ramp.png b/docs/figs/prefabs/Immovable/Ramp.png
similarity index 100%
rename from docs/PrefabsPictures/Immovable/Ramp.png
rename to docs/figs/prefabs/Immovable/Ramp.png
diff --git a/docs/PrefabsPictures/Immovable/Wall.png b/docs/figs/prefabs/Immovable/Wall.png
similarity index 100%
rename from docs/PrefabsPictures/Immovable/Wall.png
rename to docs/figs/prefabs/Immovable/Wall.png
diff --git a/docs/PrefabsPictures/Immovable/WallTransparent.png b/docs/figs/prefabs/Immovable/WallTransparent.png
similarity index 100%
rename from docs/PrefabsPictures/Immovable/WallTransparent.png
rename to docs/figs/prefabs/Immovable/WallTransparent.png
diff --git a/docs/figs/prefabs/Movable/HeavyBlock.png b/docs/figs/prefabs/Movable/HeavyBlock.png
new file mode 100644
index 000000000..cf920dbc8
Binary files /dev/null and b/docs/figs/prefabs/Movable/HeavyBlock.png differ
diff --git a/docs/figs/prefabs/Movable/JBlock.png b/docs/figs/prefabs/Movable/JBlock.png
new file mode 100644
index 000000000..c5a868476
Binary files /dev/null and b/docs/figs/prefabs/Movable/JBlock.png differ
diff --git a/docs/figs/prefabs/Movable/LBlock.png b/docs/figs/prefabs/Movable/LBlock.png
new file mode 100644
index 000000000..671c5e98e
Binary files /dev/null and b/docs/figs/prefabs/Movable/LBlock.png differ
diff --git a/docs/figs/prefabs/Movable/LightBlock.png b/docs/figs/prefabs/Movable/LightBlock.png
new file mode 100644
index 000000000..e2e6a3ad0
Binary files /dev/null and b/docs/figs/prefabs/Movable/LightBlock.png differ
diff --git a/docs/figs/prefabs/Movable/UBlock.png b/docs/figs/prefabs/Movable/UBlock.png
new file mode 100644
index 000000000..a4690d38a
Binary files /dev/null and b/docs/figs/prefabs/Movable/UBlock.png differ
diff --git a/docs/figs/prefabs/Other-Unique/SignBoard.png b/docs/figs/prefabs/Other-Unique/SignBoard.png
new file mode 100644
index 000000000..9a36aad06
Binary files /dev/null and b/docs/figs/prefabs/Other-Unique/SignBoard.png differ
diff --git a/docs/PrefabsPictures/Referential.png b/docs/figs/prefabs/Referential.png
similarity index 100%
rename from docs/PrefabsPictures/Referential.png
rename to docs/figs/prefabs/Referential.png
diff --git a/docs/PrefabsPictures/Rewards/BadGoal.png b/docs/figs/prefabs/ValencedObjects/BadGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/BadGoal.png
rename to docs/figs/prefabs/ValencedObjects/BadGoal.png
diff --git a/docs/PrefabsPictures/Rewards/DeathZone.png b/docs/figs/prefabs/ValencedObjects/DeathZone.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/DeathZone.png
rename to docs/figs/prefabs/ValencedObjects/DeathZone.png
diff --git a/docs/PrefabsPictures/Rewards/DecayGoal.png b/docs/figs/prefabs/ValencedObjects/DecayGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/DecayGoal.png
rename to docs/figs/prefabs/ValencedObjects/DecayGoal.png
diff --git a/docs/PrefabsPictures/Rewards/GoodGoal.png b/docs/figs/prefabs/ValencedObjects/GoodGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/GoodGoal.png
rename to docs/figs/prefabs/ValencedObjects/GoodGoal.png
diff --git a/docs/PrefabsPictures/Rewards/GoodGoalMulti.png b/docs/figs/prefabs/ValencedObjects/GoodGoalMulti.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/GoodGoalMulti.png
rename to docs/figs/prefabs/ValencedObjects/GoodGoalMulti.png
diff --git a/docs/PrefabsPictures/Rewards/GrowGoal.png b/docs/figs/prefabs/ValencedObjects/GrowGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/GrowGoal.png
rename to docs/figs/prefabs/ValencedObjects/GrowGoal.png
diff --git a/docs/PrefabsPictures/Rewards/HotZone.png b/docs/figs/prefabs/ValencedObjects/HotZone.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/HotZone.png
rename to docs/figs/prefabs/ValencedObjects/HotZone.png
diff --git a/docs/PrefabsPictures/Rewards/AntiDecayGoal.png b/docs/figs/prefabs/ValencedObjects/RipenGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/AntiDecayGoal.png
rename to docs/figs/prefabs/ValencedObjects/RipenGoal.png
diff --git a/docs/PrefabsPictures/Rewards/ShrinkGoal.png b/docs/figs/prefabs/ValencedObjects/ShrinkGoal.png
similarity index 100%
rename from docs/PrefabsPictures/Rewards/ShrinkGoal.png
rename to docs/figs/prefabs/ValencedObjects/ShrinkGoal.png
diff --git a/docs/figs/prefabs/agent-skins/agent-hedgehog.png b/docs/figs/prefabs/agent-skins/agent-hedgehog.png
new file mode 100644
index 000000000..ba66292ea
Binary files /dev/null and b/docs/figs/prefabs/agent-skins/agent-hedgehog.png differ
diff --git a/docs/figs/prefabs/agent-skins/agent-panda.png b/docs/figs/prefabs/agent-skins/agent-panda.png
new file mode 100644
index 000000000..330fdc3d9
Binary files /dev/null and b/docs/figs/prefabs/agent-skins/agent-panda.png differ
diff --git a/docs/figs/prefabs/agent-skins/agent-pig.png b/docs/figs/prefabs/agent-skins/agent-pig.png
new file mode 100644
index 000000000..3e2bcff09
Binary files /dev/null and b/docs/figs/prefabs/agent-skins/agent-pig.png differ
diff --git a/docs/figs/prefabs/arena/arena-2DView.png b/docs/figs/prefabs/arena/arena-2DView.png
new file mode 100644
index 000000000..a3880d774
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-2DView.png differ
diff --git a/docs/figs/prefabs/arena/arena-FP.png b/docs/figs/prefabs/arena/arena-FP.png
new file mode 100644
index 000000000..2fee1cd1b
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-FP.png differ
diff --git a/docs/figs/prefabs/arena/arena-Ground.png b/docs/figs/prefabs/arena/arena-Ground.png
new file mode 100644
index 000000000..25e7e6f85
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-Ground.png differ
diff --git a/docs/figs/prefabs/arena/arena-New.png b/docs/figs/prefabs/arena/arena-New.png
new file mode 100644
index 000000000..2827578ba
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-New.png differ
diff --git a/docs/figs/prefabs/arena/arena-TP.png b/docs/figs/prefabs/arena/arena-TP.png
new file mode 100644
index 000000000..06b80eccc
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-TP.png differ
diff --git a/docs/figs/prefabs/arena/arena-Walls.png b/docs/figs/prefabs/arena/arena-Walls.png
new file mode 100644
index 000000000..531f4f633
Binary files /dev/null and b/docs/figs/prefabs/arena/arena-Walls.png differ
diff --git a/docs/figs/steampunkFOURcrop.png b/docs/figs/steampunkFOURcrop.png
deleted file mode 100644
index d56d3322d..000000000
Binary files a/docs/figs/steampunkFOURcrop.png and /dev/null differ
diff --git a/docs/gettingStarted/Arena-Environment-Guide.md b/docs/gettingStarted/Arena-Environment-Guide.md
new file mode 100644
index 000000000..667140015
--- /dev/null
+++ b/docs/gettingStarted/Arena-Environment-Guide.md
@@ -0,0 +1,326 @@
+# Arena Environment Guide
+
+#### Table of Contents
+
+* [Introduction](#introduction)
+* [The Arena](#the-arena)
+* [The Agent](#the-agent)
+  + [Agent HUD (Heads-Up Display)](#agent-hud-heads-up-display)
+  + [Arena/Agent Limitations](#arenaagent-limitations)
+  + [Agent Properties](#agent-properties)
+  + [Complex Agent Properties (ML-Agents / Training)](#complex-agent-properties-ml-agents--training)
+* [GameObjects](#gameobjects)
+  + [Unique/Special Object Parameters](#uniquespecial-object-parameters)
+  + [Agent-Specific Parameters](#agent-specific-parameters)
+  + [Goal-Related Parameters](#goal-related-parameters)
+  + [Spawner Parameters](#spawner-parameters)
+  + [SignBoard Parameters](#signboard-parameters)
+* [Blackouts](#blackouts)
+* [Rules and Notes for Arena Configurations](#rules-and-notes-for-arena-configurations)
+  + [Spawning GameObjects](#spawning-gameobjects)
+  + [Configuration File Values](#configuration-file-values)
+
+
+## Introduction
+
+This guide will help you understand the structure of the physical Arena Environment as developed in Unity. We will explain the various functions of the arena environment, and their purposes and uses. We will also outline the various parameters that can be used to configure the arena environment, and how to use them. Please see the [YAML Config Syntax](/docs/configGuide/YAML-Config-Syntax.md) guide for a detailed explanation of the syntax used in the configuration files for additional information. Be aware that this guide is not a comprehensive guide to Unity, and assumes that you have a basic understanding of the Unity Engine. If you are unfamiliar with Unity, please refer to the [Background - Unity](/docs/Background-Unity.md) guide for a brief overview of the Unity Engine as well as relevant useful links.
+
+## The Arena
+
+<table>
+  <tr>
+
+    <td><img src="../../docs/figs/prefabs/arena/arena-2DView.png" width="500"/>
+    <p>2D view of the Arena</p></td>
+    <td><img src="../../docs/figs/prefabs/arena/arena-FP.png" width="500"/><p>First-person view of agent</p></td>
+    <td><img src="../../docs/figs/prefabs/arena/arena-New.png" width="500"/><p>Full view of arena</p></td>
+
+  </tr>
+  <tr>
+
+    <td><img src="../../docs/figs/prefabs/arena/arena-Ground.png" width="500"/><p>Close-up of arena ground</p></td>
+    <td><img src="../../docs/figs/prefabs/arena/arena-TP.png" width="500"/><p>Third Persion view of one of the agent skins</p></td>
+    <td><img src="../../docs/figs/prefabs/arena/arena-Walls.png" width="500"/><p>Side view of walls</p></td>
+
+  </tr>
+</table>
+
+Each **episode** (a single run) contains an _arena_ environment. Currently, an arena can only support a single agent (with spherical animal skins - _hedgehog_, _pig_, or _panda_). It is currently a square of fixed size `40x40` , meaning the size of the arena is immutable, with the origin of the arena is set to `(0,0)` . You can provide coordinates for objects in the range `[0,40]x[0,40]` as floats.
+
+The default arena is made up of a set of gameobjects, which itself is contained in a _Unity Scene_, which are as follows:
+
+* **Walls**: The walls of the arena, which are 10 units high and 40 units long. The walls are made up of 4 gameobjects, one for each wall, which are named `Wall1`,  `Wall2`,  `Wall3`, and `Wall4`, each with a set of childobjects called `fences`, which contain the textures for the walls. The walls are all children of the `Walls` gameobject, which is itself a child of the `Arena` gameobject.
+* **Ground**: The ground of the arena, which is 40 units long and 40 units wide. The ground is a child of the `Arena` gameobject.
+* **Lights**: The lights of the arena, which are 4 spotlights, one for each corner of the arena. The lights are all children of the `Lights` gameobject, which is a child of the `Arena` gameobject.
+* **SpawnArea**: The spawn gameobject responsible for spawning objects defined in the configuration file, which is a child of the `Arena` gameobject. This gameobject essentially controls the size of the spawn area, currently set to within the bounds of the walls of the arena.
+* **Agent**: The agent, which is a child of the `Arena` gameobject, must be spawned in every arena.
+
+<p align="center">
+  <img height="300" src="../../docs/figs/prefabs/DefaultArena.png">
+</p>
+
+In the above picture with the agent on the ground in the center of the environment its coordinates are `(20, 0, 20)` . Below is a sample configuration file for the default arena as shown above:
+
+```YAML
+!ArenaConfig
+randomizeArenas: false
+showNotification: false 
+canResetEpisode: true 
+canChangePerspective: true 
+arenas:
+  n: !Arena # note that the n is a placeholder integer between 0 and n, but the first arena must start with 0
+    pass_mark: 0
+    t: 250
+    items:
+    - !Item
+      name: Agent
+      positions:
+      - !Vector3 {x: 20, y: 0, z: 20}
+      rotations: [0]
+```
+
+* `n: !Arena` an `int`, denotes the unique arena number, which is used to identify the arena in the configuration file. The first arena must start with `0`, upto `n`, where `n` is the number of arenas defined in a single configuration file. 
+* `t` an `int`, defines the length of an episode which can change from one episode to the other. A value of `0` means that the episode will not terminate until a reward has been collected (setting `t=0` and having no reward will lead to an infinite episode). This value is converted into a decay rate for the health of the agent. A `t` of 100 means that the agent's health will decay to 0, and the episode will end, after 100 time steps.
+* `pass_mark` an `int`, defines the reward threshold that should constitute a ‘pass’ in the enviroment. Leaving this parameter undefined leads to the default value of 0, whereby any reward value obtained by the Agent results in a pass. This parameter also determines the notifications that players receive at the end of an episode. If used, this parameter should be defined with consideration to the reward size that can feasibly be obtained by the agent in each configuration file.
+* `canChangePerspective` a `bool`, defines whether the agent can change its camera perspective during an episode (first-person, third-person or eagle-view). If set to `false`, the agent will be unable to change its camera perspective during an episode by pressing the C button on their keyboards, which will cycle through the cameras attached to the Agent in-gasme. If set to `true`, the agent will be able to change its perspective during an episode. This parameter is set to `true` by default.
+* `randomizeArenas` a `bool`, defines whether the arena will be randomized between episodes. If set to `true`, the arena will be randomized between the defined Arenas in the configuration file. If set to `false`, the order to which the arenas are spawned are sequential and top-to-bottom as specified in the configuration file. This parameter is set to `false` by default.
+* `showNotification` a `bool`, defines whether the player will receive a notification at the end of an episode. If set to `true`, the player will be shown a notification at the end of an episode for approximately 2.5 seconds, then move on to the next episode (arena). If set to `false`, the agent will not receive a notification at the end of an episode and episode-to-episode termination is back-to-back. This parameter is set to `false` by default.
+* `blackouts` a `list`, defines the frames at which the lights are on or off during an episode. If omitted, the lights will be on for the entire episode. For more information on blackouts, [see here](#blackouts)
+
+**N. B:** These parameters are optional (except `t` and `pass_mark` ) and can be omitted from the configuration file. If omitted, the default values will be used, which are explained in detail in our [YAML Config Syntax](/docs/configGuide/YAML-Config-Syntax.md) guide.
+
+## The Agent
+
+The agent is the main character in the arena, for playing and training. It is a spherical animal with a set of controls that can be used to move it around the arena. The agent can be configured to have a set of different skins, which can be specified in the configuration file, under it's parameters. The agent has a set of controls that can be used to move it around the arena. 
+
+The controls are as follows:
+
+* `W` - move forward
+* `A` - move left
+* `S` - move backward
+* `D` - move right
+* `C` - change camera perspective (first-person, third-person, eagle-view, only if `canChangePerspective` is `true`)
+* `R` - reset the arena (cycles to the next episode if `canResetEpisode` is `true`)
+* `Q` - quit (exits the application upon press)
+
+<table>
+  <tr>
+
+    <td><img src="../../docs/figs/prefabs/Agent-Skins/agent-hedgehog.png" width="500"/>
+    <p>Hedgehog</p></td>
+    <td><img src="../../docs/figs/prefabs/Agent-Skins/agent-panda.png" width="500"/><p>Panda</p></td>
+    <td><img src="../../docs/figs/prefabs/Agent-Skins/agent-pig.png" width="500"/><p>Pig</p></td>
+
+</table>
+
+### Agent HUD (Heads-Up Display)
+
+The agent has a HUD (_Heads-Up Display_) that displays the following information per episode by default:
+
+* **Health**: The health of the agent, which is a value between `0` and `1`. The agent's health decays over time, and is reset to `1` when the agent collects a reward. The agent's health is displayed as a blue-green-red bar at the bottom of the HUD.
+* **Reward**: The reward collected by the agent, which is a value between `-1` and `1`. The agent's reward is displayed as a text at the top of the HUD, which is updated in real-time as the agent collects rewards. It contains the previous episode's reward, as well as the current episode's reward, respectively.
+* **Episode**: The episode number, which is the number of episodes the agent has played in the arena. The episode number is displayed as a white number at the top of the HUD. **(This is a feature to be added in the future.)**
+* **Notification**: The notification displayed to the agent at the end of an episode. The notification is currently a combination of color gradients and a short animated GIF. This is an optional HUD and only appears if `showNotification` parameter is set to `true` in the configuration file. _Note that this feature has no effect on training, and is only used for playing the game._
+
+| 
+
+![](../../docs/figs/Agent-HUD/agent-health.png) | ![](../../docs/figs/Agent-HUD/agent-REWARD.png)
+
+ |
+|---|---|
+| 
+
+![](../../docs/figs/Agent-HUD/notification-bad.png) | ![](../../docs/figs/Agent-HUD/notification-good.png)
+
+ |
+
+### Arena/Agent Limitations
+
+The arena has a few limitations, which are as follows:
+
+1. Only a single agent _per_ arena is supported, both for play and training.
+2. The agent can only move on the ground, and cannot move on the walls.
+3. The agent cannot move through objects (except for the hot/death zones).
+4. The agent cannot jump or fly.
+5. The agent cannot pick up objects (however, this is a feature to be added in the future).
+
+### Agent Properties
+
+The agent has a Physics component attached to it, which allows it to interact with other objects in the arena. Please read our [Background - Unity](/docs/Background-Unity.md) guide for more information. 
+
+_Essentially, you can expect that the Physics of Unity game engine are modelled to mimic our three-dimensional reality as much as possible_. The agent has the following properties:
+
+* **Scale**: The scale of the agent, which is set to `1x1x1` by default.
+* **Mass**: The mass of the agent, which is set to `100` by default.
+* **Drag**: The drag of the agent, which is set to `1.2` by default.
+* **Angular Drag**: The angular drag of the agent, which is set to `0.05` by default.
+* **Gravity**: Enabled for the agent (and for all other objects for that matter), which means that the Agent will fall to the ground when spawned if it's `y` coordinate `> 0`.
+* **Speed**: The speed of the agent, which is set to `30` by code. This is the speed at which the agent moves when the `W`,  `A`,  `S`, and `D` keys are pressed. Note that the speed of the agent is affected by the `drag` and `angular drag` properties, which means that the agent will slow down over time if the keys are not pressed.
+* **Rotation Speed**: The rotation speed of the agent, which is set to `100` by code. This is the speed at which the agent rotates when the `A` and `D` keys are pressed. Rotation speed is unaffected by the `drag` and `angular drag` properties.
+* **Rotation Angle**: The angle of rotation of the agent, which is `0.25` by code. This property is used to dictate the angle of rotating the agent when the `A` and `D` keys are pressed. Rotation angle is unaffected by the `drag` and `angular drag` properties.
+
+### Complex Agent Properties (ML-Agents / Training)
+
+Please refer to ML-Agents for documentation for a full breakdown of the Agent's Properties: [ML-Agent's Documentation](https://github.com/Unity-Technologies/ml-agents/blob/f442194297f878a84eb60c04eccf7662cbc9ff60/docs/Learning-Environment-Design-Agents.md#L467). Here is a brief overview of the properties:
+
+* **Behavior Parameters**
+This component dictates the policy the agent will follow and includes several sub-settings:
+
+* **Behavior Name**
+A unique identifier for the agent's behavior. Agents with the same name share the same policy.
+
+* **Vector Observation**
+  + **Space Size**: Defines the length of the vector observation for the agent.
+  + **Stacked Vectors**: Number of previous vector observations to be stacked together.
+
+* **Actions**
+  + **Continuous Actions**: Number of concurrent continuous actions the agent can take.
+  + **Discrete Branches**: An array defining multiple concurrent discrete actions.
+
+* **Model**
+Refers to the neural network model used for decision-making.
+
+* **Inference Device**
+Determines whether to use CPU or GPU during inference.
+
+* **Behavior Type**
+Sets the mode of operation for the agent:
+  + **Default**: Trains if connected to a Python trainer; otherwise, performs inference.
+  + **Heuristic Only**: Uses a heuristic method for decision-making.
+  + **Inference Only**: Always uses its trained model for decision-making.
+
+* **Max Step**
+Defines the maximum number of steps an agent can take in an episode. Currently, this is not implemented as we have the Health of the agent as the episode termination condition, which is custom to our environment.
+
+## GameObjects
+
+All objects can be configured in the same manner, using a set of parameters for each `item` Unity gameobject:
+
+* `name`: the name of the object you want to spawn, which must match the object name specified in [Arena Object Definitions](/docs/Arena-Object-Definitions.md). You can spawn the same object as many times as required, but they must be in different positions from one another.
+* `positions`: a list of `Vector3` positions within the arena where you want to spawn items, if the list is empty the position will be sampled randomly in the arena. Any position vector set to -1 will spawn randomly. Also note that Animal-AI enforces a constraint where objects cannot spawn within 0.1 units of each other, so if you try to spawn objects too close together there will be object collision clashes and the objects will not spawn.
+* `sizes`: a list of `Vector3` sizes, if the list is empty the size will be sampled randomly (within preset bounds for that particular object). You can set any size to -1 to spawn randomly along that vector only.
+* `rotations`: a list of `float` in the range `[0,360]`, if the list is empty the rotation is sampled randomly. Default is 0 degrees.
+* `colors`: a list of `RGB` values (integers in the range `[0,255]`), if the list is empty the color is sampled randomly. Note that not all objects can have their colour changed and for those (e.g. transparent objects) this value will be ignored.
+
+**N. B:** Any of these parameters can be omitted in the configuration files per object, in which case the omitted fields are automatically randomized. However, we advise that you specify these parameters as this will allow you to have a more controlled environment in your arena(s). Any Vector3 that contains a -1 for any of its dimensions will spawn that dimension randomly `(e.g. x: -1, y: 10, z: 2 --> will spawn the object randomly along the x axis)` . Finally, some objects have specific parameters applicable only to them, which are described in the [Unique/Special Objects](#uniquespecial-object-parameters).
+
+**All value ranges for the above fields can be found in [Arena Object Definitions](/docs/Arena-Object-Definitions.md)**. If you go above or below the range for size it will automatically be set to the max or min respectively. If you try to spawn objects outside the arena (i.e. with a configuration like this: `x = 41, z = 41` ) or overlapping with another object with very close spawn positions, then that object will not be spawned. Objects are placed in the order defined such that the second overlapping object is the one that does not spawn.
+
+## Unique/Special Object Parameters
+
+Some objects have unique/special parameters that only apply to them or a select few objects - they can be written in the configuration in exactly the same way as the 'standard' parameters, but will only be applied if assigned to a valid object:
+
+### Agent-Specific Parameters
+
+* **Skins**:
+  List of animal skins for the agent model.
+  + **Applies to:** Agent
+  + **Default:** "random" (any animal from the list)
+  + **Options:** "panda", "pig", "hedgehog", "random", etc.
+
+* **Frozen Agent Delays**:
+  Time (in frames) the agent is frozen at the start of an episode.
+  + **Applies to:** Agent
+  + **Default:** 0 (no delay), n (delay of n frames)
+
+### Goal-Related Parameters
+
+* **Delays**:
+  Time delay before special behavior initiation.
+  + **Applies to:** DecayGoal, AntiDecayGoal, GrowGoal, ShrinkGoal, SpawnerTree, SpawnerDispenser, SpawnerContainer
+  + **Default:** 0
+
+* **Initial Values**:
+  Starting reward/size values.
+  + **Applies to:** DecayGoal, AntiDecayGoal, GrowGoal, ShrinkGoal, SpawnerTree
+  + **Default:** Varies by goal type
+
+* **Final Values**:
+  Ending reward/size values.
+  + **Applies to:** DecayGoal, AntiDecayGoal, GrowGoal, ShrinkGoal, SpawnerTree
+  + **Default:** Varies by goal type
+
+* **Change Rates**:
+  Rate at which reward/size changes.
+  + **Applies to:** DecayGoal, AntiDecayGoal, GrowGoal, ShrinkGoal
+  + **Default:** 0.005 (negative for decaying/shrinking)
+
+### Spawner Parameters
+
+* **Spawn Counts**:
+  Number of goals spawned.
+  + **Applies to:** SpawnerTree, SpawnerDispenser, SpawnerContainer
+  + **Default:** -1 (infinite)
+
+* **Spawn Colors**:
+  Color of spawned objects.
+  + **Applies to:** SpawnerTree, SpawnerDispenser, SpawnerContainer
+  + **Default:** Varies by spawner
+
+* **Times Between Spawns**:
+  Interval between spawns.
+  + **Applies to:** SpawnerTree, SpawnerDispenser, SpawnerContainer
+  + **Default:** 4.0 for trees, 1.5 otherwise
+
+* **Ripen Times**:
+  Duration for goals to ripen in a tree.
+  + **Applies to:** SpawnerTree
+  + **Default:** 6.0
+
+* **Door Delays**:
+  Time for a spawner's door to open.
+  + **Applies to:** SpawnerDispenser, SpawnerContainer
+  + **Default:** 10.0
+
+* **Times Between Door Opens**:
+  Interval for a spawner's door to open.
+  + **Applies to:** SpawnerDispenser, SpawnerContainer
+  + **Default:** -1 (stays open once opened)
+
+### SignBoard Parameters
+
+* **Symbol Names**:
+  Names of symbols to be drawn.
+  + **Applies to:** SignBoard
+  + **Default:** "default"
+  + **Options:** "left-arrow", "right-arrow", etc.
+
+## Blackouts
+
+_Blackouts_ define when the lights are on or off during an episode in each arena, resulting in a black screen/view in any camera angle. This is an optional parameter in the configuration file, and can be omitted if you don't want to use it. If omitted, the lights will be on for the entire episode.
+
+* **Default Behavior**: Lights are on for the entire episode if no blackout parameter is provided.
+* **List of Frames**: Provide a list like `[5,10,15,20,25]` to toggle lights. Lights will be off between frames 5-9, 15-19, etc., and on at other times.
+* **Regular Intervals**: Use a negative number like `[-20]` to toggle lights every 20 frames.
+* **Infinite Episodes**: For episodes with `t=0`, lights will follow the pattern indefinitely.
+
+**Note**: With a list of frames, the lights will stay off after the last frame in the list for infinite episodes. 
+
+See the [YAML Config Syntax](/docs/configGuide/YAML-Config-Syntax.md) guide for a detailed tutorial on how to use blackouts.
+
+## Rules and Notes for Arena Configurations
+
+When configuring an arena, follow these rules and be aware of certain behaviors:
+
+### Spawning GameObjects
+
+* **Non-Overlapping**: Objects can only spawn if they don't overlap with others. Overlapping attempts discard the latter object (i.e. the object that is spawned later in the configuration file). This is to avoid object collision issues during runtime.
+* **Spawn Order**: Objects are spawned in the order listed. Randomized objects (i.e. the object is set to spawn randomly) try to spawn up to 20 times concurrently in any given arena/episode; if unsuccessful, the object is discarded and the arena continues to spawn the next object in the list (if any).
+* **Spawn Likelihood**: Early list objects are more likely to spawn than later ones. This is because the configuration file is scanned from top to bottom, and objects are spawned in the order they are found.
+* **Agent Spawning**:
+  + The Agent spawns randomly within the arena bounds if it's spawn position is not specified.
+  + Specified Agent positions are processed _first_, which might conflict with randomly spawned objects that are spawned _after_ the Agent, as the Agent's position is not known until runtime.
+  + If you have defined the Agent's position and another object tries to spawn at the same position as the Agent then the environment will always spawn the Agent in that position always, as _the Agent has priority above every other object_. This is to avoid a potential conflict during runtime.
+  + Some objects can spawn on top of each other (a `0.1` height buffer added to accomodate this). 
+
+### Configuration File Values
+
+* **n: ! Arena**: The `n` in `n: !Arena` is a placeholder integer between `0` and `n`, where `n` is the number of arenas defined in a single configuration file. The first arena must start with `0`, upto `n` arenas. Any negative arena numbers are automatically converted to positive integers accordingly, resulting in flexible and robust arena numbering and management.
+* **Object Names**: Must match names from [Arena Object Definitions](/docs/Arena-Object-Definitions.md). Unmatched names are ignored and may result in unexpected behavior or fatal errors.
+* **Randomization**: Use `-1` or leave blank in `positions`,  `sizes`, and `rotations` for random values for any object that supports randomization (see [Arena Object Definitions](/docs/Arena-Object-Definitions.md)).
+* **Ground Level Spawning**: Setting `positions.y = 0` spawns objects at ground level (with a `0.1` height buffer to prevent gameobject clipping).
+* **Goal Scaling**: Goals (except red zone) scale equally on all axes. For sphere goals, only the `x` component of `Vector3` scales all axes.
+* **Arena Height Bounds**: Currently, objects can spawn at any height within the arena, which translates to the `y` component of `Vector3` in the configuration file. However, a recommended height range is between `0` and `50` units, as anything above `50` units will be out of the camera's view until the object falls from the sky and lands on the ground at the specified `x` and `z` coordinates, which may take a while depending on the object's mass and drag properties. This is not an issue for objects that spawn on the ground, as they will spawn at the specified `x` and `z` coordinates, and at ground level (i.e. `y = 0`).
+* **Arena Size Bounds**: The arena is currently a square of fixed size `40x40`, meaning the size of the arena is immutable, with the origin of the arena is set to `(0,0)`. You can provide coordinates for objects in the range `[0,40]x[0,40]` as floats. Any coordinates outside this range will be discarded and the object will not spawn. We plan to make the arena size configurable in the future.
+
+---
diff --git a/docs/gettingStarted/Getting-Started.md b/docs/gettingStarted/Getting-Started.md
new file mode 100644
index 000000000..30b8c8091
--- /dev/null
+++ b/docs/gettingStarted/Getting-Started.md
@@ -0,0 +1,78 @@
+# Getting Started
+
+This document should be your introductory document to Animal-AI, which outlines the process of getting started with the project, in  recommended order of material exposure. It is essentially a spiderweb connecting the project with the various documentation and resources available.
+
+#### Table of Contents
+
+* [What is Animal-AI?](#what-is-animal-ai)
+      - [What is the aim of the project?](#what-is-the-aim-of-the-project)
+      - [What is the background of the project?](#what-is-the-background-of-the-project)
+* [If you are a researcher](#if-you-are-a-researcher)
+  + [Recommended Order of Exposure](#recommended-order-of-exposure)
+* [If you are a contributor](#if-you-are-a-contributor)
+
+  
+# What is Animal-AI?
+
+Animal-AI is a platform for training and testing AI agents and human participants on a variety of tasks that require a rich understanding of the environment. The platform is built upon the Unity game engine, with Ml-Agents Toolkit used for backend functionality for training, and is designed to be extensible and easy to use. The platform is being used to study cognitive capabilities across humans, animals and AI agents comparatively across a variety of tasks and experiments. 
+
+The platform is designed to be used by both researchers and developers as an open-source project. If you are a researcher, you can use the platform to train and test your own AI agents on a variety of tasks, as well as use the same tasks as computer games to assess cognitive capablities in humans. If you are a developer, you can contribute to the platform by adding new tasks, environments, and features.
+
+#### What is the aim of the project?
+
+The aim of the project is to create a platform that enables researchers to study cognitive capabilities across humans, animals and AI agents using the same tasks. These tasks are designed to be cognitively informative and meaningful such that pattern of performance across tasks can be triangulated and brought together into a "cognitive profile". This approach enables direct comparison of the cognitive profile of different kinds of mind. For AI this translates to robust evaluation of underlying capabilities, facilitating preditability and capabilites-oriented development. For cognitive scientists this allows the direct exploration of theories of cognition as well as identifying key tasks useful in distinguisihing them.
+
+**You can find the project Roadmap [here](/project/AAI-RoadMap.md).**
+
+#### What is the background of the project?
+
+The project originates from the Kinds of Intelligence (KOI) programme within the Leverhulme Centre for the Future of Intelligence (LCFI). It started as a collaboration between the Cambridge (Dr Lucy Cheke, Dr Marta Halina) and Imperial (Dr Matthew Crosby, Prof Murray Shanahan) branches of the centre, and continues as an open and collaborative venture across these institutions and more (e.g. Universitat Politècnica de València; Prof Jose Hernendez-Orallo).
+
+Please check our website for more information on the team [here](https://sites.google.com/csah.cam.ac.uk/animalai/).
+
+# If you are a researcher
+
+We assume you have basic understanding and/or experience of Python programming and Artificial Intelligence paradigms (pariticularly Reinforcement Learning). Animal-AI enables researchers with little to no experience in game development to train and test their own AI agents on a variety of tasks. The platform is designed to be easy to use, and is built upon the Unity game engine. We provide a number of example tasks known as configuration files, which are the main way of interacting with the platform. These configuration files can be used to train and test your own AI agents, and can be easily modified to create new tasks. These configuratuion files are written in YAML, which is a human-readable data serialization language, meaning little to no programming experience is required to use the platform.
+
+_You can start your journey in the recommended order of exposure below, which will facilitate a smooth introduction and understanding of the platform:_
+
+### Recommended Order of Exposure
+
+Assuming you haven't already, you can install the platform by following the detailed installation guide here:
+
+* [Installation Guide](/docs/gettingStarted/Installation-Guide.md) 
+  
+You may then proceed to an introduction on the Arena Environment and the Agent here:
+
+* [Arena Environment Guide](/docs/gettingStarted/Arena-Environment-Guide.md)
+
+Furthermore, a comprehensive guide on the available objects and their properties can be found here which will enhance ytou understanding of the Arena Environment and it's many objects:
+
+* [Arena Objects Guide](/docs/Arena-Object-Definitions.md)
+
+Once you are familiar with the Arena Environment and the objects you can use to populate your custom environments, you can proceed to the following guides which will guide you on creating your own configuration files:
+
+If you would like a brief introduction to YAML, you can find it here (If you have experience or are familiar with YAML, bypass this step):
+
+* [Background on YAML](/docs/Background-YAML.md)
+
+You may then proceed to the guide on using YAML in Animal-AI, which is tailored to the platform:
+
+* [YAML Configuration Guide](/docs/configGuide/YAML-Config-Syntax.md)
+
+You are now ready to launch the platform and run your first configuration file. The next guide will show you how to do this from downloading the platform for your operating system to running your first configuration file:
+
+* [Launching Animal-AI](/docs/gettingStarted/Launching-Animal-AI.md)
+
+An example of a configuration file can be found here where you can simply download/copy to your IDE of choice and run it:
+
+* [Example Configuration File](/docs/configGuide/Example-YAML-File.yaml)
+# If you are a contributor
+
+We assume you have a good understanding of and/or experience with programming languages **chsarp** and **python**. A good level of knowledge/experience is required to contribute to the project in very technical terms, especially on the Unity game engine. Note that having good knowledge/experience in other aspects of development such as 3D prefab model design, animation, and other general game designing is also very welcome. However, having a computer science background is not a requirement, and we welcome contributions from all backgrounds. 
+
+Before you start contributing to the project, you should first familiarize yourself with the project structure and the various components that make up the project. You can find a detailed guide on the project structure [here](/docs/Technical-Overview.md). This documentation will explain the various components of the project, and how they interact with each other. It will also explain how to set up the project for development, and how to run the project in the Unity editor.
+
+Once you are familiar with the project structure, you can start contributing to the project in either or both codebases, located [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-unity) (Unity/csharp) and [here](https://github.com/Kinds-of-Intelligence-CFI/animal-ai-python) (Python).
+
+For a detailed guide on acceptable contributions, see the [Contributing Guide](/docs/Contributing-Guide.md).
diff --git a/docs/gettingStarted/Installation-Guide.md b/docs/gettingStarted/Installation-Guide.md
new file mode 100644
index 000000000..61612aca5
--- /dev/null
+++ b/docs/gettingStarted/Installation-Guide.md
@@ -0,0 +1,87 @@
+# Detailed Installation Guide
+
+#### Table of Contents
+
+* [Introduction](#introduction)
+  + [Steps:](#steps)
+  + [1. Installing Python](#1-installing-python)
+  + [2. Cloning the Animal-AI Repository (Optional)](#2-cloning-the-animal-ai-repository-optional)
+  + [3. Setting Up a Virtual Environment (Optional)](#3-setting-up-a-virtual-environment-optional)
+  + [4. Installing Dependencies](#4-installing-dependencies)
+  + [5. Downloading the Animal-AI Environment](#5-downloading-the-animal-ai-environment)
+  + [6. Starting Animal-AI](#6-starting-animal-ai)
+  + [General Notes](#general-notes)
+  + [Troubleshooting](#troubleshooting)
+
+## Introduction
+
+Welcome to the comprehensive installation guide for Animal-AI. This guide is tailored for users who may not be familiar with Python dependencies, navigating GitHub repositories, or working with Unity. It's also here to help you smoothly navigate through any installation hiccups – because let's face it, *it's custom software installation... when **isn't** there a hiccup or two?*.
+
+For **Windows** Users:
+This guide is primarily written with Windows users in mind. We've tried to make it as straightforward as possible, so you can get started with Animal-AI without any hassle.
+
+For **Mac** and **Linux** Users:
+Similarly for Mac, most of the instructions for Windows users should still apply to you. If you are using MacOS, you may also need to run this command: `chmod -R 777 AnimalAI.app` in your MacOS terminal to unlock permissions for running the application.
+
+If you're a Linux user, you're likely more comfortable with command-line interfaces and installations. Please **note** that if you are using Linux, you may need to make the .exe file executable: Simply run this command in your terminal: `chmod +x env/AnimalAI.x86_64` . Please also make sure that when you extract the folder, you move the files inside the sub-directory to its parent folder.
+
+## Steps:
+
+### 1. Installing Python
+* **Download Python**: Obtain Python 3.9.x from [Python's official website](https://www.python.org/downloads/).
+* **Run the Installer**: Follow the installation instructions. Ensure to **add Python to your PATH** (via the checkbox). Note: if you're doing a custom intallation, it is recommended to keep the `install pip` box ticked and use `pip` to install dependencies. 
+* **Check Installation**: Open a Command Prompt terminal and run `python --version`. You should see the version you installed. Make sure it's Python 3.9.x.
+* todo: if using conda, specify python to 3.9 in the conda environment setup (conda create --name your_env_name python=3.9) or application 
+
+### 2. Cloning the Animal-AI Repository (Optional)
+
+* **Prepare a Directory**: Create a root folder for the AnimalAI project for better organization.
+* **Clone the Repository**: Options include:
+  + Downloading the `.zip` file from [Animal-AI GitHub](https://github.com/Kinds-of-Intelligence-CFI/animal-ai) and extracting it.
+  + Using [GitHub Desktop](https://desktop.github.com/) for direct cloning.
+  + Cloning via the [GitHub CLI](https://docs.github.com/en/github-cli/github-cli/about-github-cli).
+* **Check**: The root folder should contain the `animal-ai-main` folder.
+
+### 3. Setting Up a Virtual Environment (Optional)
+
+* **Creating a Virtual Environment**: Useful for managing dependencies.
+  + **Python**: Use `python -m venv your_env_name` and activate it in the `Scripts` directory with `activate`.
+  + **Conda**: Use `conda create --name your_env_name` and activate with `conda activate your_env_name`.
+
+For more information on virtual environments, refer to the [Python Documentation](https://docs.python.org/3/tutorial/venv.html) or [Conda Documentation](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html).
+
+### 4. Installing Dependencies
+
+* **Navigate to the Repository**: Go to `animal-ai-main`.
+* **Install Dependencies**: 
+  + **Using pip**: Run `pip install animalai`. This will install the dependencies necessary to run Animal-AI, located in the `animalai` package from PyPI (Python Package Index).
+  + **Using Conda**: Install pip (`conda install pip`), then run `pip install animalai`.
+  + **Using a Virtual Environment**: Activate your virtual environment, then run `pip install animalai`.
+* **Check**: Run `pip list` to see if `animalai` is installed. You should obtain the latest version of the package automatically.
+
+### 5. Downloading the Animal-AI Environment
+
+* **Download**: Get the version for your OS from the `Releases` section in the repository.
+* **Extract**: Unzip into the `env` folder in the main repository. We use the `env` folder to store the environment files. You can use WinRAR or 7-Zip to extract the files.
+* **Check**: The `env` folder should contain the `.exe` file and other files from the `.zip/.rar` download.
+
+### 6. Starting Animal-AI
+
+* You can now start using Animal-AI by launching the application for your OS, located in the directory where you saved the folder, typically in your Downloads folder. _Note that Animal-AI does not need to be installed in your system to run._
+  + **Windows**: Run `env/AnimalAI.exe`.
+  + **Mac**: Run `env/AnimalAI.app`.
+  + **Linux**: Run `env/AnimalAI.x86_64`.
+* **Note**: If you're using a virtual environment, make sure to activate it before running Animal-AI.
+* **Check**: The Animal-AI application should open in a new window, with a brief Unity loading screen, which indicates you have successfully installed and started Animal-AI.
+
+### General Notes
+
+Folder navigation in Windows is performed using the `cd` command, e.g. if the current directory is shown as `:C\Users\Name` and you want to go to your new Animal-AI root folder called "AAI", you would type `cd AAI` and it will now show you are at `:C\Users\Name\AAI` . To go to the *parent* directory (e.g. in this case `:C\Users` ), you would type `cd..` and if your directory name contains spaces, use speech marks e.g. `cd "AAI Folder"` . You can also use the `dir` command to list the contents of the current directory, and `dir /b` to list the contents without any additional information.
+
+Everything you need to run scripts in Animal-AI (including the correct version of Unity's `ml-agents` package) is found in the Python Index Package `animalai` . This is installed using `pip` or `conda` as described above. The `animalai` package is a Python wrapper for the Unity environment, and is the only dependency you need to install. The `animalai` package is also the only dependency you need to import in your scripts, and it will import everything else you need from the `animalai` package itself.
+
+### Troubleshooting
+
+You can then start using Animal-AI! Any problems, please get in touch (ia424@cam.ac.uk / [alhasacademy96](https://github.com/alhasacademy96/)) or post an issue on the GitHub repository.
+
+Visit our FAQ page for more information on common issues and solutions [here](/docs/FAQ.md).
diff --git a/docs/installationGuide.md b/docs/installationGuide.md
deleted file mode 100644
index a60dd220d..000000000
--- a/docs/installationGuide.md
+++ /dev/null
@@ -1,69 +0,0 @@
-## Detailed Installation Guide
-
-This is a more detailed installation guide for AnimalAI v3, written for users who don't have lots of experience with python dependencies, Github repositories, and/or Unity -- or in case you run into trouble with the installation *(it's custom software installation... when **isn't** there a bug or two?)*
-
-This guide is *currently* designed predominantly for Windows users; a more detailed Mac installation guide is a work-in-progress, but most of the guide will still be useful nonetheless. Linux users tend to have stronger command-line-interface/installation experience (this coming from a Windows user!) so the quick install guide on `README.md` should be sufficient -- but please get in touch (ia424@cam.ac.uk / [alhasacademy96](https://github.com/alhasacademy96/) GitHub) should you run into trouble.
-
-### Installing Python
-
-We recommend a newer version of Python be installed, but any version 3.x is fine. Python is generally easy to install:
-* [Download](https://www.python.org/downloads/) -- default `.exe` download is fine, but unpacking a `.zip` download or Mac `.pkg` will also work
-* Run the download and follow the installation guide. Default installation settings are fine, but it is recommended to tick the `"Add to PATH"` box, so that Python can be run via the Windows Command Prompt by typing 'python' in any directory:
-<p align="center">
-  <img width="400" src="InstallationGuide_screenshots/python-installation-Add_to_PATH.PNG">
-</p>
-
-* If you're doing a custom intallation, it is recommended to keep the "install pip" box ticked and use `pip` to install dependencies later on -- but you can use an alternative method e.g. `conda`
-
-### AnimalAI v3 Repository
-
-It's a good idea to create a 'root' folder ready for cloning the main repository, so that you can also keep your own training scripts, a Python virtual environment, and any other external AAI-related work in the same location, and any unrelated folders are kept separate.
-
-Cloning this repository can then be done either by:
-* Downloading the `.zip` directly and extracting it into your 'root' folder
-* If you have [GitHub Desktop](https://desktop.github.com/) (available on Windows **and** Mac), you can clone it directly by clicking "Open with GitHub Desktop" on the repo webpage
-* Cloning using GitHub's command line interface [(GitHub CLI)](https://docs.github.com/en/github-cli/github-cli/about-github-cli)
-
-It will be saved by default as "animal-ai-main" but can be renamed to something more obvious like "animal-ai-repo" or "animal-ai-python" if you have other AAI folders (e.g. if you have also cloned the [AAI Unity Project repo](https://github.com/mdcrosby/animal-ai-unity-project))
-
-### (Optional) Creating/Activating a Virtual Environment
-
-Virtual environments in Python are useful for managing packages for separate projects; sometimes you might only want specific packages for a specific project, so you can create a virtual environment for a project and install packages *local* to that environment / project, that will not be accessible to Python when you use it outside of the virtual environment.
-
-To create one for AnimalAI:
-* Using Python directly:
-    * Open a Command Prompt terminal and navigate to a convenient folder (`:C\`, `:C\Users\Name` and `:C\Users\Name\NewlyCreatedAAIRootFolder` are all good choices!)
-    * Type `python -m venv your_env_name`, where `your_env_name` can be anything you like e.g. "AAI_venv", so long as it doesn't contain spaces
-    * To use the virtual environment, navigate to its folder, then type `cd Scripts`, then `activate`. Your Command Prompt should now show your virtual environment name next to the directory you are in
-
-* For **[conda](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)** users:
-    * In any directory run `conda create --name your_env_name` and by default it will be created in the `envs` folder wherever you have installed conda
-    * To activate it, type `conda activate your_env_name`
-
-**Note:** folder navigation in Windows is performed using the `cd` command, e.g. if the current directory is shown as `:C\Users\Name` and you want to go to your new AAI root folder called "AAI", you would type `cd AAI` and it will now show you are at `:C\Users\Name\AAI`. To go to the *parent* directory (e.g. in this case `:C\Users`), you would type `cd..` and if your directory name contains spaces, use speech marks e.g. `cd "AAI Folder"` 
-
-### Python Dependencies
-
-Everything you need to run scripts in AnimalAI v3 (including the correct version of Unity's `ml-agents` package) is found in the Python package `animalai`. You can install this via `pip` or `conda`, with or without a virtual environment created -- if you're more familiar with a particular method here it's probably best to stick to it.
-
-* Open a Command Prompt terminal and, if you are using a virtual environment, make sure to `activate` the environment first! (See above)
-* Navigate to your AAI root folder, then go to your cloned repository "animal-ai-main" (or whatever you named it)
-* If using **pip**:
-    * Run `pip install -e animalai` (if this doesn't work, ensure pip is installed correctly; `pip --version` shows the version you have installed to confirm this)
-* If using **conda**:
-    * AnimalAI does not have a package build that is directly compatible with conda itself, but you can still install it indirectly for use in conda
-    * Run `conda install pip` then (making sure you're in the main repository folder as instructed above) run `pip install -e animalai` as described for pip users
-
-### Downloading the AAI Environment
-
-Find the Windows/Mac/Linux environment download links as seen in `README.md`, and download a `.zip` copy of the environment according to your operating system. The **entire content** of the `.zip` download needs to then be extracted/unzipped into the `env` folder found in the main repository (along with `configs`, `docs`, `examples` and so on...)
-
-Sometimes `.zip` folders unzip themselves into their own sub-folder, so it can get a bit confusing. Your `env` should look like this:
-<p align="center">
-  <img width="400" src="InstallationGuide_screenshots/aai_installation_env_contents.PNG">
-</p>
-
-In other words, the AnimalAI Unity `.exe` should be directly contained in the `env` folder along with everything else from the `.zip` contents.
-
-You can then start using AnimalAI v3! Any problems, please get in touch (ia424@cam.ac.uk / [alhasacademy96](https://github.com/alhasacademy96/) and we can try to help.
-
diff --git a/docs/lowLevelAPI.md b/docs/lowLevelAPI.md
deleted file mode 100644
index a830a1789..000000000
--- a/docs/lowLevelAPI.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Python Low Level API: Braitenberg Agent Example
-
-AnimalAI is built with mlagents which provides a low level python API for interacting with agents. This tutorial shows how to run a hand-coded Braitenberg-style agent in AnimalAI using the low level API. This is intended mainly to show how the low level api works.
-
-The low level API allows you to quickly setup a reward/observation loop for a particular configuration and to test or train agents.
-
-For further documentation on the mlagents low level API see the Unithy docs [here](https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Python-API.md).
-
-## The lowlevelapi.py script.
-
-You can find this script in the examples folder. If you run it, it will load a random competition configuration in agent mode and then run a Braitenberg agent through the configuration 3 times. The agent and environment are deterministic so you should find that the reward is the same all three times. 
-
-The agent is pretty simple. It can solve quite a few tests in the competition by turning towards yellow and green objects and avoiding red ones. For example, it solves `01-05-01` (run `python lowlevelapi.py configs/competition/01-05-01.yaml`) very efficiently (Episode Reward: 0.91419995), but, of course, cannot solve any of the harder tasks in category 10 (those numbered `10-xx-0y`).
-
-By default the screen size is set very small possible in agent mode. It is not needed by the agent (that instead works directly on the observations sent by the environment). Unfortunately, it is needed for unity to be able to render the environment so you cannot run it completely without this. If you really want to run headless and not use any camera observations it may be possible (see [here](https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Learning-Environment-Executable.md)), but is not supported.
-
-The first part of the lowlevelapi script sets up the environment:
-
-```python
-totalRays = 5
-env = AnimalAIEnvironment(
-    file_name=env_path,
-    arenas_configurations=configuration,
-    seed = 0,
-    play=False,
-    useCamera=False, #The Braitenberg agent works with raycasts
-    useRayCasts=True,
-    raysPerSide=int((totalRays-1)/2),
-    rayMaxDegrees = 30,
-)
-```
-
-The Braitenberg agent uses the raycast sensor (see [here](observations.md) for a description). You can play around with the configuration, but if the rays are too far apart it will not be able to navigate successfully. 
-
-The second part runs the episode and provides an initial example that can be used as a template for your own experiments:
-
-```python
-firststep = True
-for _episode in range(3): #Run episodes with the Braitenberg-style agent
-    if firststep:
-        env.step() # Need to make a first step in order to get an observation.
-        firstep = False
-    dec, term = env.get_steps(behavior)
-    done = False
-    episodeReward = 0
-    while not done:
-        raycasts = env.get_obs_dict(dec.obs)["rays"] # Get the raycast data
-        # print(braitenbergAgent.prettyPrint(raycasts)) #print raycasts in more readable format
-        action = braitenbergAgent.get_action(raycasts)
-        # print(action)
-        env.set_actions(behavior, action.action_tuple)
-        env.step()      
-        dec, term = env.get_steps(behavior)
-        if len(dec.reward) > 0:
-            episodeReward += dec.reward
-        if len(term) > 0: #Episode is over
-            episodeReward += term.reward
-            print(F"Episode Reward: {episodeReward}")
-            done = True
-            firststep = True
-env.close()
-```
diff --git a/docs/observations.md b/docs/observations.md
deleted file mode 100644
index aa09cf3fa..000000000
--- a/docs/observations.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Agent Observations
-
-This page details the observations available to the agent.
-
-The agent currently has access to a Camera, Raycasts, and Extra Observations. You can disable either the camera or raycasts (or both). The enabled observations are ordered in an array with Camera first (if enabled), then raycasts (if enabled), then the extra observations.
-
-## Camera Observations
-
-With the camera enabled (via useCamera) the agent receives 1st-person pixel observations of its environment with configurable (square) resolution (via resolution parameter). Grayscale can be toggled on/off. 
-
-## Raycast observations
-
-Raycasts are implemented to make it easier to work with a wide range of algorithms within AnimalAI. They are not designed to compete with pixel inputs as they naturally contain much less information about the environment. Nevertheless, they can be extremely useful for prototyping and for testing certain cognitive abilities or when analysing network dynamics compared to performance on many tasks. They can also be used as an auxilliary input or to help learn a more symbolic-like representation of the environment.
-
-There are four relevant arguments to pass to the environment when using raycasts. See the lowLevelAPI.py script for examples.
-* useCamera: set to false if you do not also want pixel observations
-* useRayCasts: set to true to use raycast observations
-* raysPerSide: sets the number of rays to cast to the left and right of the central one. e.g raysPerSide=2 means 5 rays total
-* rayMaxDegrees: sets the maximum degrees for the left/right rays. e.g. 90 means the agent casts rays exactly to the left and right. other rays are spaced equally between the center and the max.
-
-There are currently 6 types of objects that the rays report. This is intentional to keep the observation space down, but does limit the types of problem solvable. In order they are:
-* arena: this is the outside of the arena and should usually be hit by a ray if it misses other objects (this is useful for the distance)
-* Immovable: Inner Walls, Cylinders, ramps i.e. all the objects listed under immovable [here](definitionsOfObjects.md)
-* Movable: Cardboxes and L/U objects i.e. all the objects listed as movable [here](definitionsOfObjects.md)
-* goodGoal: A green goal
-* goodGoalMulti: A yellow goal
-* badGoal: Both red goals and death zones.
-
-Note that this means that ramps and transparent objects are not distinguished from opaque walls, thus limiting the number of tasks it is possible for a raycast only agent to solve. This set may be extended in future versions.
-
-For each ray:
-* The first 6 elements of the returned observation are a one-hot vector for the type of object hit (ordered as above).
-* The next element is 0 if the ray hit something (1 otherwise).
-* The next element is the normalised distance to the object that was hit.
-
-So the full observation space is of size 8 * (2*raysPerSide + 1)
-
-Note that Unity implementation of rays orders the central ray first and then each ray (left or negative offset first) in increasing distance from the centre as follows:
-
-```
-  1 0 2
-   \|/
-3 --@-- 4
-```
-
-AnimalAI contains a [helper class](../animalai/envs/raycastparser.py) as a starting point for manipulating raycasts.
-
-## Health, Velocity and Position
-
-The agent also receives a vector of length 7 containing its health (1 float), velocity (x, y, z), and (global) position (x, y, z).
diff --git a/docs/quickStart.md b/docs/quickStart.md
deleted file mode 100644
index 17ce2f253..000000000
--- a/docs/quickStart.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Quick Start Guide
-
-## Running the standalone arena
-
-You can run the executable for your system directly. This will load a single arena with all the possible objects in AnimalAI randomly resized and positioned. The environment will load in `play` mode, meaning that you will be able to control the agent directly. Of course, this is a very messy environment to work with and only useful for initial exploration. See other tutorials for how to design and run configuration files and how to train agents.
-
-In play mode you can toggle the camera between first person, third person and Bird's eye view using the `C` key on your keyboard. The agent can then be controlled using `W,A,S,D` on your keyboard. Hitting `R` or collecting certain rewards (green or red) will reset the arena.
-
-| Keyboard Key  | Action    |
-| --- | --- |
-| W   | move agent forwards |
-| S   | move agent backwards|
-| A   | turn agent left     |
-| D   | turn agent right    |
-| C   | switch camera       |
-| R   | reset environment   |
-
-## Running and designing specific configurations
-
-Once you are familiarized with the environment and its physics, you can start building and visualizing your own. Assuming you followed the [installation instruction](../README.md#requirements), go to the `examples/` folder and run `python play.py`. This loads a random configuration from the competition we ran in 2019.
-
-The [configuration files](../configs/competition) folder contains all the configurations from the competition. In a configuration you can select (or randomise) objects, their size, location, rotation and color. For more details on the configuration options and syntax please read the relevant documentation:
- - The [configuration file documentation page](configFile.md) explains how to write the configuration files.
- - The [definitions of objects page](definitionsOfObjects.md) contains a detailed list of all the objects and their properties.
diff --git a/docs/roadMap.md b/docs/roadMap.md
deleted file mode 100644
index f4b530cf3..000000000
--- a/docs/roadMap.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# AnimalAI RoadMap to 3.0 (last updated 23/08/2021)
-
-A (tentative) roadmap for AnimalAI (AAI) to get from where it is now to a tool for supporting and tracking AI progress towards currently unsolved cognitive capabilities. We want AAI to support interdisciplinary research to help better understand human, animal, and artificial cognition. We also want it to be a useful resource for making AI progress on these unsolved problems and also act as a way of tracking such progress so that we can stay on top of any AI breakthroughs that may have important societal implications.
-
-## 2.1 Initial Port + RayCasts (Released 01/07/2021)
-
-- [x] Port Unity Environment from ml-agents 0.15 to 2.0
-- [x] Port basic python scripts from ml-agents 0.15 to 2.0
-- [x] Add RayCast observations
-
-The environment was ported to ml-agents 2.0. Raycast observations added and ensured to be roughly backwards compatible with 2.0.
-
-## 2.2 Health and Basic Scripts (Released 13/07/2021)
-
-- [x] Switched from reward system to health system (from DRL perspective functionally similar but unlocks more tasks and better integration with a continual learning setting)
-- [x] Added decaying rewards
-- [x] Improved Hotzone/Deathzone graphics and allow scaling
-- [x] Added/improved python wrappers for all main usecases (play, openAIgym, lowlevelAPI, mlagents-learn)
-- [x] Added heuristic agent for testing/debugging
-- [x] Improved play mode overlay
-
-Previous setting had an abstract system where food = +ve reward and time = -ve reward. This will be converted to decaying health that must be maintained by seeking our reward. Many tasks are functionally identical, but this setup is better for future tasks and also persistent survival. Other additions are improvements to the environment that go with this change and the initial setup of scripts as tutorials for using different training settings.
-
-## 2.3 Experiment, Object, and Graphical Improvements (In Progress)
-
-- [x] Major graphics update to all items
-- [x] Goals that decay/ripen/change size.
-- [x] More items for setting up experiments
-- [ ] Can set number of observation frames before agent can move
-- [ ] Can change starting velocities of objects
-- [ ] Better support for randomisation of starting values in config files
-- [ ] Flag for 'test-only' where physics can be broken
-- [ ] Test-only objects appearing/changing after given times
-- [ ] Textures on objects
-- [ ] Containers (with/without wheels)
-- [ ] Adjustable arena size
-- [ ] This release may also incorporate some of the changes originally scheduled for 2.5.
-
-One of the golden rules of AAI2 was that it should never be possible to break physics just for the sake of setting up an experiment. This was quite limiting for setting up psychology experiments that test for violation of expectations. We will add an extra flag for test environments to mark them as 'test-only' and support some methods for setting up these experiments. We will also add a number of features for improving the types of experiments that AAI can be used for.
-
-
-## 2.4 Training, Debugging, and Testing Improvements
-
-- [ ] Proper FPS testing - for analysis of the impact of new features and running multiple agents at once.
-- [ ] Improved support for running multiple agents in the same environment (or in multiple envs if better).
-- [ ] Implementations and documentation for running a number of different baselines.
-- [ ] Automatic testing scripts for running a series of baseline agents on the existing (public & private) configs.
-- [ ] Incorporation of testing and debugging inside the Unity Environment editory for easier further development. 
-- [ ] Dockers to make the environment easier to use (if useful). 
-- [ ] More options for the Gym Wrapper to use different types of observations (and multi-obs for SB3)
-
-Most of the methods for training agents are directly using ml-agents implementations (for algorithms or wrappers). Yet, this may not be the most useful for many use-cases given the number of different ways it is possible to use the environment. This update will improve on the methods for analysing environment performance and also provide methods and tutorials for getting the most out of the environment. It will also include many internal changes that will improve future development and maintenence.
-
-## 2.5 Behavioural Analysis
-
-- [ ] Better format for storing experiment data for analysis.
-- [ ] Automatic annotated task screenshots with agent trajectories.
-- [ ] Ability to watch back agents easily regardless of interaction method.
-- [ ] Automatically output an events log that details certain interactions that happened within a run.
-
-For use as a proper comparison with Comparative Cognition and other animal cognition work, it is important to analyse agent (and human behaviour). We could do this with 2.0 to some extent, as [this paper](https://psyarxiv.com/me3xy) shows. The [web version](http://animalaiolympics.com/AAI/) allows for testing and playing back and directly comparing human and AI solutions. However, we currently do not utilise the wealth of extra analysis possibilities that working in a simulated environment allows for. This release plans to add some functionality in this direction.
-
-## 2.6 Object Interactions
-
-- [ ] Add the ability to pickup objects and interact with them in more ways than just bumping into them.
-
-Not having any ways to interact with objects was a design choice to keep the environment as simple as possible whilst still allowing for a lot of tasks. However, a simple interaction mechanism would unlock a lot of currently impossible tasks without increasing the environment complexity too much.
-
-## 2.7 WebGL Version
-
-- [ ] Release updated version on [animalaiolympics.com](http://animalaiolympics.com/AAI/)
-- [ ] Improve look and feel of AAI-as-game for human players.
-- [ ] Add backend support for running psychology experiments.
-
-A key part of AAI is the ability to compare humans, animals, and AI. The previous web-based setup was very useful for running human experiments. We plan to improve it for the new version.
-
-## 2.8 Multiagent
-
-- [ ] Add other agents to the environment that act independently.
-- [ ] Support training multiple agents in same environment. 
-
-Multiagent support is a very obvious area of cognitive intelligence that is currently missing from AAI. 
-
-## 2.x
-
-There are many other features/possibilities on the private ToDo list and in the possibility space that could be added depending on progress, interest, collaborations, and funding.
-
-## 3.0 Bounties.
-
-- [ ] Setup testing server where anyone can upload agents to run on private tests.
-- [ ] Release bounties for particular hidden test sets that could be markers for progress in AI that is important from both a research and societal implications perspective. 
-
-As we approach 3.0, we will transition from improving the capabilities of AnimalAI to improving its use as a public tool to support and track AI progress on currently missing components of general cognitive problem solving. 
-
diff --git a/docs/training.md b/docs/training.md
deleted file mode 100644
index 7beb09cf1..000000000
--- a/docs/training.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Training
-
-We expect everyone will have a different setup for training agents. Here you can find two ways to wrap or use the environment as a standard reinforcement learning task. You can use a gym wrapper to wrap the environment for use with your favourite deep learning library. You can also use Unity ml-agents custom training scripts directly.
-
-## gymwrapper.py
-
-The example script `gymwrapper.py` shows a simple way to run an AnimalAI task using stable baselines 3. To run this you will also need to install stable-baselines3 (this version was tested with stable-baselines3==1.2.0).
-
-## trainaai.py
-
-The example script `trainaai.py` shows how to run ml-agents training. Documentation for this can be found [here](https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Training-ML-Agents.md). 
diff --git a/docs/tutorials/configuration_tutorial.ipynb b/docs/tutorials/configuration_tutorial.ipynb
deleted file mode 100644
index cc2faa2e1..000000000
--- a/docs/tutorials/configuration_tutorial.ipynb
+++ /dev/null
@@ -1,815 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Animal-AI Configuration tutorial\n",
-    "\n",
-    "This tutorial is an introduction of configurating arenas in the Animal-AI environment. \n",
-    "\n",
-    "**We present the format and content of configuration files and show an example of how to generate your own arenas by provided scripts.**"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Introduction of arena configurations\n",
-    "\n",
-    "The Animal-AI environment provides a 3d physical arena with an agent that can move and a number of types of objects. The initial status of arenas is configured by `yaml` configuration files. Such files contain:\n",
-    "\n",
-    "- experiment parameters (pass mark, maximum steps, steps at which the light is turned on/off)\n",
-    "- a list of arenas\n",
-    "    - a number of object types\n",
-    "        - a list of objects\n",
-    "        - object specifications (positions, rotations, sizes, colors) which are randomized if not provided\n",
-    "\n",
-    "Below is an example configuration file:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example 1 showing basic usage.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    t: 250\n",
-      "    items:\n",
-      "    - !Item\n",
-      "      name: Wall\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 21, y: 0, z: 10}\n",
-      "      rotations: [0]\n",
-      "      sizes: \n",
-      "      - !Vector3 {x: 5, y: 3, z: 1}\n",
-      "      colors: \n",
-      "      - !RGB {r: 255, g: 0, b: 255}\n",
-      "    - !Item\n",
-      "      name: GoodGoalBounce\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 18, y: 0, z: 22}\n",
-      "      - !Vector3 {x: 26, y: 0, z: 15}\n",
-      "      rotations: [90, 60]\n",
-      "      sizes: \n",
-      "      - !Vector3 {x: 1, y: 1, z: 1}\n",
-      "      - !Vector3 {x: 3, y: 3, z: 3}\n",
-      "    - !Item\n",
-      "      name: Agent\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 20, y: 0, z: 15}\n",
-      "      rotations: [0]\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "with open('example1.yaml') as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "This file contains the configuration of one arena (`!Arena`), with an agent `Agent`, two green moving spheres `GoodGoalBounce` and a wall `Wall`. Note that two spheres are declared at once.\n",
-    "\n",
-    "\n",
-    "You can now use this to load an environment and play yourself (`load_config_and_play.py` does that for you). Make sure you have followed the [installation guide](https://github.com/beyretb/AnimalAI-Olympics#requirements) and then create an `AnimalAIEnvironment` in play mode:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from animalai.envs.arena_config import ArenaConfig\n",
-    "from animalai.envs.environment import AnimalAIEnvironment\n",
-    "from mlagents_envs.exception import UnityCommunicationException\n",
-    "\n",
-    "try:\n",
-    "    environment = AnimalAIEnvironment(\n",
-    "            file_name='env/AnimalAI',\n",
-    "            base_port=5005,\n",
-    "            arenas_configurations=ArenaConfig('example1.yaml'),\n",
-    "            play=True,\n",
-    "        )\n",
-    "except UnityCommunicationException:\n",
-    "    # you'll end up here if you close the environment window directly\n",
-    "    # always try to close it from script\n",
-    "    environment.close()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Press **C** to change the viewpoint (bird's eye, first person, third person), and move with **W,A,S,D** or the **arrows** on your keyboard. \n",
-    "\n",
-    "Press **R** to reset the arena. Note that every time this arena reset, it has **same setup** (rotations, colors, positions, sizes). It is for reason that we explicitly set all configurable attributes of each object in this arena.\n",
-    "\n",
-    "Once you're done, let's close this environment:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if environment:\n",
-    "    environment.close() # takes a few seconds"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Write arena configurations \n",
-    "\n",
-    "This section presents how to use provided scripts to design arenas.\n",
-    "\n",
-    "We use functions in `generate_configs.py` to write new configuration files.\n",
-    "First we need to instantiate an `AAIObj`, which holds attributes of target objects as below."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from generate_configs import AAIObj\n",
-    "\n",
-    "# Create a purple wall\n",
-    "wall = AAIObj(\"Wall\", positions=[(21,0,10)],rotations=[0],sizes=[(5,3,1)],colors=[(255,0,255)])"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "We may configure **position**, **rotation**, **size** and **color** of an object. For those attributes not explicitly set, they will be randomized each time arena resets (by pressing **R** in play mode).\n",
-    "\n",
-    "The position is (x, y, z) float values, where y is the altitude. The middle of arena is (20, 0, 20).\n",
-    "\n",
-    "The rotation is in 0 ~ 360 float values. It is possible to set to 720 or -720, but it might not function properly. It decides the direction object is facing initially.\n",
-    "\n",
-    "The size is a float value. \n",
-    "\n",
-    "The color is (R, G, B) float values in 0~255.\n",
-    "\n",
-    "Several different objects of same type can be configured at once as below."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Create two green moving spheres at once\n",
-    "spheres = AAIObj(\"GoodGoalBounce\", positions=[(18,0,22),(26,0,15)],rotations=[90, 60],sizes=[(1,1,1), (3,3,3)])"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Note that we do not need to configure color for `spheres` since \"GoodGoalBounce\" is always green regardless of `colors` values.\n",
-    "\n",
-    "Then we need an agent."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Create an agent\n",
-    "agent = AAIObj(\"Agent\",positions=[(20,0,15)],rotations=[0])"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Again, we cannot change the size and color of an agent. It is always (1,1,1) large and in cyan.\n",
-    "\n",
-    "Now we have a purple warll, two moving green spheres and an agent. We are ready to write the objects into a `yaml` file.\n",
-    "\n",
-    "We may use `ConfigWriter` class in `generate_configs.py`. It provides some functions to format object attributes."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#An example configure file\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 2.0\n",
-      "    t: 250\n",
-      "    items:\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "from generate_configs import ConfigWriter\n",
-    "# Instantiate \n",
-    "cw = ConfigWriter()\n",
-    "file1 = \"config_first.yaml\"\n",
-    "\n",
-    "# Write file and arena header\n",
-    "cw.writeHeader(file=file1, passMark=2.0, time=250, notes=\"An example configure file\")\n",
-    "\n",
-    "with open(file1) as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "`writeHeader` is useful when we have only one arena in configuration file. It writes the file header and first arena header.\n",
-    "\n",
-    "`passMark` is a float value. Agent need to reach that score by collecting goal balls to show it has ideal performance in this arena. \n",
-    "\n",
-    "`time` is an integer value representing time steps limit of this arena. The arena is terminated when reaching time limit. By setting time to 0 to make the arena permanent.\n",
-    "\n",
-    "Different arena in one configuration file may have _different_ pass mark and time limit.\n",
-    "\n",
-    "`notes` is an optional message at the top of the configuration file.\n",
-    "\n",
-    "Then we need to write the objects defined above into configuration file."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#An example configure file\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 2.0\n",
-      "    t: 250\n",
-      "    items:\n",
-      "    - !Item\n",
-      "      name: Wall\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 21, y: 0, z: 10}\n",
-      "      rotations: [0]\n",
-      "      sizes: \n",
-      "      - !Vector3 {x: 5, y: 3, z: 1}\n",
-      "      colors: \n",
-      "      - !RGB {r: 255, g: 0, b: 255}\n",
-      "    - !Item\n",
-      "      name: GoodGoalBounce\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 18, y: 0, z: 22}\n",
-      "      - !Vector3 {x: 26, y: 0, z: 15}\n",
-      "      rotations: [90, 60]\n",
-      "      sizes: \n",
-      "      - !Vector3 {x: 1, y: 1, z: 1}\n",
-      "      - !Vector3 {x: 3, y: 3, z: 3}\n",
-      "    - !Item\n",
-      "      name: Agent\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 20, y: 0, z: 15}\n",
-      "      rotations: [0]\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Write objects\n",
-    "objs = [wall, spheres, agent] # put all objects in a list\n",
-    "cw.writeItems(file1, objs) # append objects to the file\n",
-    "\n",
-    "with open(file1) as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "An arena which has same configuration as the one we see in previous section is configured now.\n",
-    "\n",
-    "You may load and play it as before."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from animalai.envs.arena_config import ArenaConfig\n",
-    "from animalai.envs.environment import AnimalAIEnvironment\n",
-    "from mlagents_envs.exception import UnityCommunicationException\n",
-    "import random\n",
-    "\n",
-    "try:\n",
-    "    environment = AnimalAIEnvironment(\n",
-    "            file_name='env/AnimalAI',\n",
-    "            base_port=5005 + \n",
-    "                random.randint(0, 100), # use a random port so (probably) do not need to wait for previous to close if need to relaunch\n",
-    "            arenas_configurations=ArenaConfig(file1),\n",
-    "            play=True,\n",
-    "        )\n",
-    "except UnityCommunicationException:\n",
-    "    # you'll end up here if you close the environment window directly\n",
-    "    # always try to close it from script\n",
-    "    environment.close()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if environment:\n",
-    "    environment.close() # takes a few seconds"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Generate your own arenas\n",
-    "\n",
-    "In last section, we have seen 4 attributes of objects (positions, rotations, sizes, colors) and two attributes of arenas (pass mark, time). We also present how to write a configuration file with one arena.\n",
-    "\n",
-    "In this section, we will have a look at some advanced features which might be helpful when configuring your experiments.\n",
-    "\n",
-    "First of all, let's see how arenas randomize unspecified attributes."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example showing how arena randomize attributes.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 1\n",
-      "    t: 0\n",
-      "    items:\n",
-      "    - !Item\n",
-      "      name: Agent\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 20, y: 0, z: 10}\n",
-      "      rotations: [0]\n",
-      "    - !Item\n",
-      "      name: GoodGoal\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "from generate_configs import *\n",
-    "cw = ConfigWriter()\n",
-    "file2 = \"config_random.yaml\"\n",
-    "cw.writeHeader(file2, passMark=1, time=0, notes=\"Example showing how arena randomize attributes.\") \n",
-    "\n",
-    "# Create a fixed agent and a randomized green sphere\n",
-    "objs=[AAIObj(\"Agent\", positions=[(20,0,10)], rotations=[0]), AAIObj(\"GoodGoal\", None,None,None)]\n",
-    "cw.writeItems(file2, objs)\n",
-    "\n",
-    "with open(file2) as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Load the configuration and play by cell below, press **R** to see the difference.\n",
-    "\n",
-    "Remember that the color of \"GoodGoal\" is always green."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from animalai.envs.arena_config import ArenaConfig\n",
-    "from animalai.envs.environment import AnimalAIEnvironment\n",
-    "from mlagents_envs.exception import UnityCommunicationException\n",
-    "import random\n",
-    "\n",
-    "try:\n",
-    "    environment = AnimalAIEnvironment(\n",
-    "            file_name='env/AnimalAI',\n",
-    "            base_port=5005 + \n",
-    "                random.randint(0, 100), # use a random port so (probably) do not need to wait for previous to close if need to relaunch\n",
-    "            arenas_configurations=ArenaConfig(file2),\n",
-    "            play=True,\n",
-    "        )\n",
-    "except UnityCommunicationException:\n",
-    "    # you'll end up here if you close the environment window directly\n",
-    "    # always try to close it from script\n",
-    "    environment.close()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if environment:\n",
-    "    environment.close() # takes a few seconds"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "As you see, the position, rotation and size of green sphere is randomized each time the area resets.\n",
-    "\n",
-    "It is also possible to have an object with some attributes fixed and some randomized; or a wall fixed and another wall randomized by adding two `AAIObj`.\n",
-    "\n",
-    "Next, we are going to see some other configurations for arenas and how to add new attributes not available now."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example showing advanced arena configurations.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "from generate_configs import *\n",
-    "cw = ConfigWriter()\n",
-    "file3 = \"config_blackouts.yaml\"\n",
-    "#cw.writeHeader(file3, passMark=1, time=0, notes=\"Example showing advanced arena configurations.\") \n",
-    "\n",
-    "# separate file header and arena header\n",
-    "cw.writeConfigHeader(file3,notes=\"Example showing advanced arena configurations.\")\n",
-    "\n",
-    "with open(file3) as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The helper function `writeHeader` does not support attributes other than pass mark and time. We need to use two functions `writeConfigHeader` and `writeArenaHeader` to declare configration header and arena header separately.\n",
-    "\n",
-    "As you see, `writeConfigHeader` does not have any parameters related to the arena initialized."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 14,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example showing advanced arena configurations.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 1\n",
-      "    t: 0\n",
-      "    blackouts: [30, 50]\n",
-      "    items:\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "cw.writeArenaHeader(file3,passMark=1,time=0,blackouts=[30,50],arena=0,additional=None)\n",
-    "\n",
-    "with open(file3) as f:\n",
-    "    print(f.read())"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "`writeArenaHeader` has 4 parameters and accepts additional parameters.\n",
-    "\n",
-    "As dicussed above, pass mark is the score to complete this arena and time is the time limit. \n",
-    "\n",
-    "The `arena` parameter sets the index of current arena. You may put several arenas in one configuration file by calling `writeArenaHeader` multiple times. As a tradition, the first arena is indexed 0, the second is 1, etc.\n",
-    "\n",
-    "The `blackouts` parameter accepts a list of integer numbers which sets which frames at which the lights turn off/on. By setting it to [30, 50] means to turn off lights at frame 30 then switch on at frame 50. \n",
-    "It is also possible to set it to a negative number such as [-10], which turns off/on the lights every 10 frames.\n",
-    "\n",
-    "Then we add same objects we have in last section to this arena with blackouts."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "\n",
-    "# Create a fixed agent and a randomized green sphere\n",
-    "objs=[AAIObj(\"Agent\", positions=[(20,0,10)], rotations=[0]), AAIObj(\"GoodGoal\", None,None,None)]\n",
-    "cw.writeItems(file3, objs)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Now let's load and play this new configuration.\n",
-    "\n",
-    "Remember pressing **C** to switch to first-person view to see the blackouts.\n",
-    "You may reset the arena by pressing **R** to watch the blackouts again and find how green sphere is randomized."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from animalai.envs.arena_config import ArenaConfig\n",
-    "from animalai.envs.environment import AnimalAIEnvironment\n",
-    "from mlagents_envs.exception import UnityCommunicationException\n",
-    "import random\n",
-    "\n",
-    "try:\n",
-    "    environment = AnimalAIEnvironment(\n",
-    "            file_name='env/AnimalAI',\n",
-    "            base_port=5005 + \n",
-    "                random.randint(0, 100), # use a random port so (probably) do not need to wait for previous to close if need to relaunch\n",
-    "            arenas_configurations=ArenaConfig(file3),\n",
-    "            play=True,\n",
-    "        )\n",
-    "except UnityCommunicationException:\n",
-    "    # you'll end up here if you close the environment window directly\n",
-    "    # always try to close it from script\n",
-    "    environment.close()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if environment:\n",
-    "    environment.close() # takes a few seconds"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "To better support flexible experiment design, `writeArenaHeader` accepts additional parameters to arenas, not objects.\n",
-    "\n",
-    "`additional` takes a list of (\"name\", values) and append the parameters to the 4 parameters introduced above.\n",
-    "\n",
-    "Below is an example of configuring blackouts by `additional`."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example showing additional arena parameters.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 1\n",
-      "    t: 0\n",
-      "    blackouts: [30, 50]\n",
-      "    items:\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "from generate_configs import *\n",
-    "cw = ConfigWriter()\n",
-    "file4 = \"config_additional.yaml\"\n",
-    "\n",
-    "# separate file header and arena header\n",
-    "cw.writeConfigHeader(file4,notes=\"Example showing additional arena parameters.\")\n",
-    "\n",
-    "# pass blackouts parameters by additional parameter\n",
-    "cw.writeArenaHeader(file4, passMark=1, time=0, \n",
-    "    blackouts=None, arena=0, additional=[(\"blackouts\", [30,50])])\n",
-    "    \n",
-    "# you may check that the arena header is same as the one in file3\n",
-    "with open(file4) as f:\n",
-    "    print(f.read())\n",
-    "    \n",
-    "\n",
-    "# Create a fixed agent and a randomized green sphere\n",
-    "objs=[AAIObj(\"Agent\", positions=[(20,0,10)], rotations=[0]), AAIObj(\"GoodGoal\", None,None,None)]\n",
-    "cw.writeItems(file4, objs)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The class `AAIObj` also accepts additional attributes of objects. However, since object attributes are more complicated, the format is not defined. When `ConfigWriter` meets an object with additional attributes, it calls `writeAdditional` in `AAIObj` and pass the file hanlder. It is adviced to inherit `AAIObj` and define your own `writeAdditional` function.\n",
-    "\n",
-    "Below is an example showing how to extend `AAIObj` to write additional attributes."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 18,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "#Example showing additional object attributes.\n",
-      "!ArenaConfig\n",
-      "arenas:\n",
-      "  0: !Arena\n",
-      "    pass_mark: 1\n",
-      "    t: 0\n",
-      "    blackouts: [30, 50]\n",
-      "    items:\n",
-      "    - !Item\n",
-      "      name: Agent\n",
-      "      positions: \n",
-      "      - !Vector3 {x: 20, y: 0, z: 10}\n",
-      "      rotations: [0]\n",
-      "    - !Item\n",
-      "      name: GoodGoal\n",
-      "      sizes: \n",
-      "      - !Vector3 {x: 1, y: 1, z: 1}\n",
-      "      - !Vector3 {x: 2, y: 2, z: 2}\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "from generate_configs import *\n",
-    "cw = ConfigWriter()\n",
-    "file5 = \"config_attributes.yaml\"\n",
-    "\n",
-    "# separate file header and arena header\n",
-    "cw.writeConfigHeader(file5,notes=\"Example showing additional object attributes.\")\n",
-    "\n",
-    "# pass blackouts parameters by additional parameter\n",
-    "cw.writeArenaHeader(file5, passMark=1, time=0, \n",
-    "    blackouts=None, arena=0, additional=[(\"blackouts\", [30,50])])\n",
-    "\n",
-    "# create a class that extends AAIObj\n",
-    "class AAIObj2(AAIObj):\n",
-    "    def __init__(self, name, positions=None, rotations=None, sizes=None, colors=None, additional=None, warning=True) -> None:\n",
-    "        super().__init__(name=name, positions=positions, rotations=rotations, sizes=sizes, colors=colors, additional=additional, warning=warning)\n",
-    "        \n",
-    "    # define your own function to format the additional attributes\n",
-    "    def writeAdditional(self, file):\n",
-    "        for attribute in self.additional: # additional [(\"name\", [values]), ...]\n",
-    "            name = attribute[0] # \"      sizes: \\n\"\n",
-    "            values = attribute[1] # [(1,1,1), (2,2,2)]\n",
-    "            file.write(name)\n",
-    "            for val in values:\n",
-    "                file.write(\"      - !Vector3 {{x: {}, y: {}, z: {}}}\\n\".format(val[0], val[1], val[2]))\n",
-    "            \n",
-    "\n",
-    "# Create a fixed agent and two randomized green spheres\n",
-    "# configure size of spheres by additional attribute\n",
-    "name = \"      sizes: \\n\" # name for additional attribute\n",
-    "values = [(1,1,1), (2,2,2)] # values for additional attribute\n",
-    "objs=[AAIObj2(\"Agent\", positions=[(20,0,10)], rotations=[0]), \n",
-    "    AAIObj2(\"GoodGoal\", None,None,None, additional=[(name, values)])]\n",
-    "cw.writeItems(file5, objs)\n",
-    "\n",
-    "with open(file5) as f:\n",
-    "    print(f.read())\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Load and play the configuration use the cell below. It is expected to have an agent and two green spheres with fixed sizes but randomized locations every time the arena is reset by pressing **R**."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from animalai.envs.arena_config import ArenaConfig\n",
-    "from animalai.envs.environment import AnimalAIEnvironment\n",
-    "from mlagents_envs.exception import UnityCommunicationException\n",
-    "import random\n",
-    "\n",
-    "try:\n",
-    "    environment = AnimalAIEnvironment(\n",
-    "            file_name='env/AnimalAI',\n",
-    "            base_port=5005 + \n",
-    "                random.randint(0, 100), # use a random port so (probably) do not need to wait for previous to close if need to relaunch\n",
-    "            arenas_configurations=ArenaConfig(file5),\n",
-    "            play=True,\n",
-    "        )\n",
-    "except UnityCommunicationException:\n",
-    "    # you'll end up here if you close the environment window directly\n",
-    "    # always try to close it from script\n",
-    "    environment.close()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "if environment:\n",
-    "    environment.close() # takes a few seconds"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Congratulations! You have successfully complete this tutorial. We have seen what is configuration file, how to write it with provided scripts, and how to design your own configuration file to support your experiments.\n",
-    "\n",
-    "Now you must be ready to setup your own arenas and cannot wait to start experiments in the Animal-AI environment. You might find two other tutorials helpful. `environment_tutorial` intoduces the Animal-AI environment and the basic functionality of it. `training_tutorial` makes you familiar with the procedure of training an agent using animalai-train. Go and find your treasures!"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.8.8"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/docs/tutorials/example1.yaml b/docs/tutorials/example1.yaml
deleted file mode 100644
index 2b3e55f1a..000000000
--- a/docs/tutorials/example1.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-#Example 1 showing basic usage.
-!ArenaConfig
-arenas:
-  0: !Arena
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      positions: 
-      - !Vector3 {x: 21, y: 0, z: 10}
-      rotations: [0]
-      sizes: 
-      - !Vector3 {x: 5, y: 3, z: 1}
-      colors: 
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: GoodGoalBounce
-      positions: 
-      - !Vector3 {x: 18, y: 0, z: 22}
-      - !Vector3 {x: 26, y: 0, z: 15}
-      rotations: [90, 60]
-      sizes: 
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 3, y: 3, z: 3}
-    - !Item
-      name: Agent
-      positions: 
-      - !Vector3 {x: 20, y: 0, z: 15}
-      rotations: [0]
diff --git a/docs/tutorials/generate_configs.py b/docs/tutorials/generate_configs.py
deleted file mode 100644
index 695df4465..000000000
--- a/docs/tutorials/generate_configs.py
+++ /dev/null
@@ -1,149 +0,0 @@
-# script for AAI arena configuration generation
-
-class AAIObj:
-    """A class to hold AnimalAI objects attributes"""
-    def __init__(self, name, positions=None, rotations=None, sizes=None, colors=None, additional=None, warning=True) -> None:
-        """Initialization of several objects of the same type.
-        :param name: Official name of target type of object
-        :param positions: (x,y,z) position of each object of target type, randomized by default 
-        :param rotations: 0~360 degree rotation of each object of target type, randomized by default 
-        :param sizes: (x,y,z) size of each object of target type, randomized by default 
-        :param colors: (r,g,b) color of each object of target type, randomized by default 
-        :param additional: additional parameters, not defined here, leave for extension
-        :param warning: True, prompt a warning message when length of attribute list is different from number of objects; False, turn off the warning message
-        """
-        
-        self. name = name
-        self.positions = positions
-        self.rotations = rotations
-        self.sizes = sizes
-        self.colors = colors
-        self.additional = additional
-        
-        if warning: # prompt a warning message when any object miss any attributes
-            length = 0 # number of objects in an attribute, should be same in all attributes
-            if positions != None:
-                length = len(positions)
-                
-            if rotations != None: # check number of objects in rotations
-                if length > 0:
-                    if len(rotations) != length:
-                        print("Error: wrong rotations length for "+name+"!\n")
-                else:
-                    length = len(rotations)
-                    
-            if sizes != None: # check number of objects in rotations
-                if length > 0:
-                    if len(sizes) != length:
-                        print("Error: wrong sizes length for "+name+"!\n")
-                else:
-                    length = len(sizes)
-                    
-            if colors != None: # check number of objects in rotations
-                if length > 0:
-                    if len(colors) != length:
-                        print("Error: wrong colors length for "+name+"!\n")
-                else:
-                    length = len(colors)
-        return
-        
-
-class ConfigWriter:
-    """A class to write AnimalAI objects into configuration files"""
-    def __init__(self) -> None:
-        return
-        
-    def writeHeader(self, file, passMark=None, time=None, notes=None):
-        """Write configuration file header and default arena header. 
-        Useful when having only one arena in a configuration file
-        :param file: path of target configuration file
-        :param passMark: pass mark of first arena, float
-        :param time: time limit of first arena, integer
-        :param notes: Optional notes at the top of file introducing arena"""
-        self.writeConfigHeader(file, notes)
-        self.writeArenaHeader(file, passMark, time)
-            
-    def writeConfigHeader(self, file, notes=None):
-        """Write configuration file header 
-        :param file: path of target configuration file
-        :param notes: Optional notes at the top of file introducing arenas"""
-        with open(file, 'w') as f:
-            if notes != None:
-                f.write("#{}\n".format(notes))
-            f.write("!ArenaConfig\narenas:\n")
-            
-    
-            
-    def writeArenaHeader(self, file, passMark=None, time=None, blackouts=None, arena=0, additional=None):
-        """Write arena header. Useful when having multiple arenas in a configuration file
-        :param file: path of target configuration file
-        :param passMark: pass mark of this arena, float
-        :param time: time limit of this arena, integer, setting to values <=0 to make arena permanent
-        :param arena: index of this arena
-        :param addition: a list of additional attributes of this arena, [("title", values),...]"""
-        with open(file, 'a') as f:
-            f.write("  {}: !Arena\n".format(arena))
-            if passMark != None:
-                f.write("    pass_mark: {}\n".format(passMark))
-            if time != None:
-                f.write("    t: {}\n".format(time))
-            if blackouts != None:
-                f.write("    blackouts: {}\n".format(blackouts))
-            if additional != None:
-                for attr in additional:
-                    f.write("    {}: {}\n".format(attr[0],attr[1]))
-            f.write("    items:\n")
-            
-    def writeItems(self, file, objects):
-        """Write a list of different type of objects in same arena
-        :param file: path of target configuration file
-        :param objects: list of different type of objects"""
-        with open(file, 'a') as f:
-            for obj in objects:
-                self.writeObject(f, obj)
-            
-    def writeObject(self, f, obj):
-        """Write a type of objects in same arena
-        :param f: handler of target configuration file
-        :param obj: a type of objects, instantiation of AAIObj class"""
-        f.write("    - !Item\n")
-        f.write("      name: {}\n".format(obj.name))
-        if obj.positions != None:
-            f.write("      positions: \n")
-            for pos in obj.positions:
-                f.write("      - !Vector3 {{x: {}, y: {}, z: {}}}\n".format(pos[0], pos[1], pos[2]))
-        if obj.rotations != None:
-            f.write("      rotations: {}\n".format(obj.rotations))
-        if obj.sizes != None:
-            f.write("      sizes: \n")
-            for size in obj.sizes:
-                f.write("      - !Vector3 {{x: {}, y: {}, z: {}}}\n".format(size[0], size[1], size[2]))
-        if obj.colors != None:
-            f.write("      colors: \n")
-            for color in obj.colors:
-                f.write("      - !RGB {{r: {}, g: {}, b: {}}}\n".format(color[0], color[1], color[2]))
-        if obj.additional != None:
-            obj.writeAdditional(f)
-
-if __name__ == "__main__":
-    cw = ConfigWriter()
-    file1 = "example1.yml"
-    cw.writeHeader(file1, None, 250, "Example 1 showing basic usage.")
-    
-    objs = []
-    objs.append(AAIObj("Wall", positions=[(21,0,10)],rotations=[0],sizes=[(5,3,1)],colors=[(255,0,255)]))
-    objs.append(AAIObj("GoodGoalBounce", positions=[(18,0,22),(26,0,15)],rotations=[90, 60],sizes=[(1,1,1), (3,3,3)])) # GoodGoalBounce cannot change color
-    objs.append(AAIObj("Agent",positions=[(20,0,15)],rotations=[0]))
-    cw.writeItems(file1, objs)
-    
-    file2 = "example2.yml"
-    cw.writeConfigHeader(file2, "Example 2 showing additional attributes and ranomization.")
-    cw.writeArenaHeader(file2, passMark=1, time=250, blackouts=None, arena=0, additional=[("blackouts", [20,50])])
-    
-    objs = []
-    objs.append(AAIObj("Wall", positions=[(10,0,10),(21,0,10)],rotations=None,sizes=None,colors=None))
-    objs.append(AAIObj("GoodGoalBounce", positions=None,rotations=None,sizes=None))
-    objs.append(AAIObj("Agent",positions=None,rotations=None))
-    cw.writeItems(file2, objs)
-    
-    print("Done.")
\ No newline at end of file
diff --git a/env/.gitignore b/env/.gitignore
deleted file mode 100644
index e7a210ec7..000000000
--- a/env/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*
-*/
-!.gitignore
\ No newline at end of file
diff --git a/examples/gymwrapper.py b/examples/gymwrapper.py
deleted file mode 100644
index 3c5a0aef2..000000000
--- a/examples/gymwrapper.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# from stable_baselines3 import PPO
-from stable_baselines3 import DQN
-import torch as th
-
-import sys
-import random
-import os
-# from stable_baselines3.common.vec_env.dummy_vec_env import DummyVecEnv
-from gym_unity.envs import UnityToGymWrapper
-from animalai.envs.environment import AnimalAIEnvironment
-
-def train_agent_single_config(configuration_file):
-
-    aai_env = AnimalAIEnvironment(
-        seed = 123,
-        file_name="../env/AnimalAI",
-        arenas_configurations=configuration_file,
-        play=False,
-        base_port=5000,
-        inference=False,
-        useCamera=True,
-        resolution=36,
-        useRayCasts=False,
-        # raysPerSide=1,
-        # rayMaxDegrees = 30,
-    )
-
-    # env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=False)
-    # def make_env():
-    #     def _thunk():
-    #         env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-    #         return env
-    #     return _thunk
-    # env = DummyVecEnv([make_env()])
-    env = UnityToGymWrapper(aai_env, uint8_visual=True, allow_multiple_obs=False, flatten_branched=True)
-    runname = "inserrunname"
-
-    policy_kwargs = dict(activation_fn=th.nn.ReLU)
-    model = DQN("CnnPolicy", env, policy_kwargs=policy_kwargs, verbose=1, tensorboard_log=("./dqn_tensorboard/" + runname))
-
-    no_saves = 100
-    no_steps = 1000000
-    reset_num_timesteps = True
-    for i in range(no_saves):
-        model.learn(no_steps, reset_num_timesteps=reset_num_timesteps)
-        model.save("results/" + runname + "/model_" + str( (i+1)*no_steps ))
-        reset_num_timesteps = False
-    env.close()
-    
-# Loads a random competition configuration unless a link to a config is given as an argument.
-if __name__ == "__main__":
-    if len(sys.argv) > 1:
-        configuration_file = sys.argv[1]
-    else:   
-        competition_folder = "../configs/competition/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = (
-            competition_folder + configuration_files[configuration_random]
-        )
-    train_agent_single_config(configuration_file=configuration_file)
diff --git a/examples/lowlevelapi.py b/examples/lowlevelapi.py
deleted file mode 100644
index 0b1d8d597..000000000
--- a/examples/lowlevelapi.py
+++ /dev/null
@@ -1,88 +0,0 @@
-import sys
-import random
-import os
-
-from animalai.envs.environment import AnimalAIEnvironment
-from animalai.envs.braitenberg import Braitenberg
-
-def run_agent_single_config(configuration_file: str) -> None:
-    """
-    Loads a configuration file for a single arena and gives some example usage of mlagent python Low Level API
-    See https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Python-API.md for details.
-    For demo purposes uses a simple braitenberg vehicle-inspired agent that solves most tasks from category 1.
-    """
-    env_path = "../env/AnimalAI"
-    
-    configuration = configuration_file
-
-    totalRays = 9
-    env = AnimalAIEnvironment(
-        file_name=env_path,
-        arenas_configurations=configuration,
-        seed = 0,
-        play=False,
-        useCamera=False, #The Braitenberg agent works with raycasts
-        useRayCasts=True,
-        raysPerSide=int((totalRays-1)/2),
-        rayMaxDegrees = 30,
-    )
-    print("Environment Loaded")
-
-    braitenbergAgent = Braitenberg(totalRays) #A simple BraitenBerg Agent that heads towards food items.
-    behavior = list(env.behavior_specs.keys())[0] # by default should be AnimalAI?team=0
-    
-    firststep = True
-    for _episode in range(2): #Run episodes with the Braitenberg-style agent
-        if firststep:
-            env.step() # Need to make a first step in order to get an observation.
-            firstep = False
-        dec, term = env.get_steps(behavior)
-        done = False
-        episodeReward = 0
-        while not done:
-            raycasts = env.get_obs_dict(dec.obs)["rays"] # Get the raycast data
-            # print(braitenbergAgent.prettyPrint(raycasts)) #print raycasts in more readable format
-            action = braitenbergAgent.get_action(raycasts)
-            # print(action)
-            env.set_actions(behavior, action.action_tuple)
-            env.step()      
-            dec, term = env.get_steps(behavior)
-            if len(dec.reward) > 0:
-                episodeReward += dec.reward
-            if len(term) > 0: #Episode is over
-                episodeReward += term.reward
-                print(F"Episode Reward: {episodeReward}")
-                done = True
-                firststep = True
-
-    env.close()
-    print("Environment Closed")
-       
-# Loads a random competition configuration unless a link to a config is given as an argument.
-if __name__ == "__main__":
-    if len(sys.argv) > 1:
-        configuration_file = sys.argv[1]
-    else:
-        competition_folder = "../configs/competition/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = (
-            competition_folder + configuration_files[configuration_random]
-        )
-    run_agent_single_config(configuration_file=configuration_file)
-
-
-# # # # # # # # # #
-# # Observation examples
-# obs = (env.get_steps(behavior)[0].obs)
-# print(obs)
-# o = env.getDict(obs)
-# print(o["camera"])
-# print(o["rays"])
-# print("health: " + str(o["health"]))
-# print("velocity: " + str(o["velocity"]))
-# print("position: " + str(o["position"]))
-# sys.exit()
-# # # # # # # # # #
-
-    
\ No newline at end of file
diff --git a/examples/play.py b/examples/play.py
deleted file mode 100644
index 9eaa45e63..000000000
--- a/examples/play.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import sys
-import random
-import os
-
-from animalai.envs.environment import AnimalAIEnvironment
-
-def load_config_and_play(configuration_file: str) -> None:
-    """
-    Loads a configuration file for a single arena and lets you play manually
-    :param configuration_file: str path to the yaml configuration
-    :return: None
-    """
-    env_path = "../env/AnimalAI"
-    port = 5005 + random.randint(
-        0, 1000
-    )  # use a random port to avoid problems if a previous version exits slowly
-
-    print("Initializing AAI environment")
-    environment = AnimalAIEnvironment(
-        file_name=env_path,
-        base_port=port,
-        arenas_configurations=configuration_file,
-        play=True,
-        timescale = 1,
-        targetFrameRate = 60,
-        captureFrameRate = 0
-    )
-
-    # Run the environment until signal to it is lost
-    try:
-        while environment._process:
-            continue
-    except KeyboardInterrupt:
-        pass
-    finally:
-        environment.close()
-
-
-# If an argument is provided then assume it is path to a configuration and use that
-# Otherwise load a random competition config.
-if __name__ == "__main__":
-    if len(sys.argv) > 1:
-        configuration_file = sys.argv[1]
-    else:
-        competition_folder = "../configs/competition/"
-        configuration_files = os.listdir(competition_folder)
-        configuration_random = random.randint(0, len(configuration_files))
-        configuration_file = competition_folder + configuration_files[configuration_random]
-        print(F"Using configuration file {configuration_file}")
-    
-    load_config_and_play(configuration_file=configuration_file)
diff --git a/examples/readme.md b/examples/readme.md
deleted file mode 100644
index 74be07f38..000000000
--- a/examples/readme.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Example Scripts
-
-This directory contains a few scripts that can be used as starting points for interacting with animalai. Note that some of the training scripts require additional packages to be installed to use - this should be obvious from the scripts. See the docs directory for more description/explanation.
-
-- `play.py` shows how to load a configuration in player mode.
-- `lowlevelapi.py` shows off the ml-agents low level python api for intereacting with the environment and demonstrates inference with a hand-coded agent.
-- `trainaai.py` shows how to use the ml-agents training. See the ml-agents repo for documentation.
-- `gymwrapper.py` shows how to wrap animalai as a gym environment. 
-- `watchmodel.py` gives an example of loading a trained model for viewing.
diff --git a/examples/trainaai.py b/examples/trainaai.py
deleted file mode 100644
index c55932148..000000000
--- a/examples/trainaai.py
+++ /dev/null
@@ -1,20 +0,0 @@
-import re
-import sys
-
-from animalai.train.train import main as runAAILearn
-from animalai.envs.settings import AAIOptions
-
-if __name__ == "__main__":
-    if len(sys.argv) == 1:
-        print("  This script lets you use AnimalAI with mlagents-learn")
-        print("  The first argument should be the relative path to your AnimalAI training config.yml")
-        print("  The following arguments should be the same as for using mlagents-learn directly")
-        print(" e.g. python trainaai.py training_configs/aai_tinyrays.yml training_configs/ppo_tiny.yaml --env=../env/AnimalAI --run-id=foo")
-        sys.exit()
-
-    aai_opt = AAIOptions.load_config(sys.argv[1])
-    sys.argv.pop(1)
-
-    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
-    
-    sys.exit(runAAILearn(aai_opt))
\ No newline at end of file
diff --git a/examples/training_configs/aai_c32_r5.yaml b/examples/training_configs/aai_c32_r5.yaml
deleted file mode 100644
index 84568ec1d..000000000
--- a/examples/training_configs/aai_c32_r5.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-arenaConfig: "../configs/competition/01-01-01.yml"
-useCamera: true
-resolution: 32
-grayscale: false
-useRayCasts: true
-raysPerSide: 5
-rayMaxDegrees: 60
\ No newline at end of file
diff --git a/examples/training_configs/aai_tinyrays.yml b/examples/training_configs/aai_tinyrays.yml
deleted file mode 100644
index e2508d298..000000000
--- a/examples/training_configs/aai_tinyrays.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-arenaConfig: "../configs/basic/synergy4.yml"
-useCamera: false
-resolution: 32
-grayscale: false
-useRayCasts: true
-raysPerSide: 2
-rayMaxDegrees: 60
\ No newline at end of file
diff --git a/examples/training_configs/ppo_tiny.yaml b/examples/training_configs/ppo_tiny.yaml
deleted file mode 100644
index 9f4c279c6..000000000
--- a/examples/training_configs/ppo_tiny.yaml
+++ /dev/null
@@ -1,34 +0,0 @@
-behaviors:
-  AnimalAI:
-    trainer_type: ppo
-    hyperparameters:
-      batch_size: 128
-      buffer_size: 2048
-      learning_rate: 0.0003
-      beta: 0.01
-      epsilon: 0.2
-      lambd: 0.95
-      num_epoch: 3
-      learning_rate_schedule: linear
-    network_settings:
-      normalize: false
-      hidden_units: 10
-      num_layers: 2
-      vis_encode_type: simple
-    reward_signals:
-      extrinsic:
-        gamma: 0.99
-        strength: 1.0
-    keep_checkpoints: 5
-    max_steps: 2000000
-    time_horizon: 64
-    summary_freq: 60000
-
-engine_settings:
-  width: 32
-  height: 32
-  quality_level: 1
-  time_scale: 20
-  target_frame_rate: -1
-  capture_frame_rate: 0
-  no_graphics: false
\ No newline at end of file
diff --git a/examples/training_configs/ppocuriosity.yaml b/examples/training_configs/ppocuriosity.yaml
deleted file mode 100644
index cd70c63fe..000000000
--- a/examples/training_configs/ppocuriosity.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-behaviors:
-  AnimalAI:
-    trainer_type: ppo
-    hyperparameters:
-      batch_size: 1024
-      buffer_size: 10240
-      learning_rate: 3.0e-4
-      learning_rate_schedule: linear
-
-      beta: 5.0e-3
-      epsilon: 0.2
-      lambd: 0.95
-      num_epoch: 3
-
-    network_settings:
-      normalize: false
-      hidden_units: 128
-      num_layers: 2
-      vis_encode_type: simple
-      memory:
-        sequence_length: 64
-        memory_size: 256
-
-    max_steps: 5.0e5 
-    time_horizon: 64
-    summary_freq: 10000
-    keep_checkpoints: 5
-    checkpoint_interval: 50000
-    threaded: false
-    init_path: null
-
-    reward_signals:
-      extrinsic:
-        gamma: 0.99
-        strength: 1.0
-      curiosity:
-        strength: 0.02
-        gamma: 0.99
-        encoding_size: 256
-        learning_rate: 3.0e-4        
-
-
-engine_settings:
-  width: 32
-  height: 32
-  quality_level: 1
-  time_scale: 20
-  target_frame_rate: -1
-  capture_frame_rate: 60
-  no_graphics: false
\ No newline at end of file
diff --git a/examples/watchmodel.py b/examples/watchmodel.py
deleted file mode 100644
index 5450f0b73..000000000
--- a/examples/watchmodel.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from stable_baselines3 import PPO
-
-from gym_unity.envs import UnityToGymWrapper
-from animalai.envs.environment import AnimalAIEnvironment
-
-def train_agent_single_config(configuration_file):
-    
-    base_port = 5000 if training else 5001
-
-    # AnimalAI settings must be the same as used for training except with inference = true
-    # best to load from a common config file
-    aai_env = AnimalAIEnvironment( 
-        inference=True, #Set true when watching the agent
-        # seed = 123,
-        # file_name="env/AnimalAI",
-        # arenas_configurations=configuration_file,
-        # play=False,
-        # base_port=base_port,
-        # useCamera=True,
-        # resolution=36,
-        # useRayCasts=True,
-        # raysPerSide=1,
-        # rayMaxDegrees = 30,
-    )
-
-    env = UnityToGymWrapper(aai_env, uint8_visual=False, allow_multiple_obs=True, flatten_branched=True)
-    runname = "runname" #Assume you have your model saved in results/runname/
-    model_no = "1234567890"
-
-    model = PPO.load(F"results/{runname}/model_{model_no}")
-    obs = env.reset()
-    while True:
-        action, _states = model.predict(obs, deterministic=True)
-        obs, reward, done, info = env.step(action)
-        # print(obs)
-        env.render()
-        if done:
-            obs=env.reset()
-    
-if __name__ == "__main__":
-    print("This is an example script that shows how you might load and watch a trained agent.")
-    print("You will need to edit it for your needs.")
-
-    # if len(sys.argv) > 1:
-    #     configuration_file = sys.argv[1]
-    # else:   
-    #     competition_folder = "configs/competition/"
-    #     configuration_files = os.listdir(competition_folder)
-    #     configuration_random = random.randint(0, len(configuration_files))
-    #     configuration_file = (
-    #         competition_folder + configuration_files[configuration_random]
-    #     )
-    # train_agent_single_config(configuration_file=configuration_file)
diff --git a/project/AAI-RoadMap.md b/project/AAI-RoadMap.md
new file mode 100644
index 000000000..2cc84c0a0
--- /dev/null
+++ b/project/AAI-RoadMap.md
@@ -0,0 +1,56 @@
+# Animal-AI RoadMap
+
+#### Table of Contents
+
+* [Project Overview](#overview)
+* [Roadmap](#roadmap)
+
+
+# Project Overview
+
+We wish to enable the possibility of interdisciplinary research to better understand human, animal, and artificial cognition. We also want it to be a useful resource for making AI progress on these unsolved problems and also act as a way of tracking such progress so that we can stay on top of any AI breakthroughs that may have important societal implications.
+
+# - - - Roadmap - - - 
+
+## 2.1 Initial Port + RayCasts (Released 01/07/2021)
+
+* [x] Port Unity Environment from ml-agents 0.15 to 2.0
+* [x] Port basic python scripts from ml-agents 0.15 to 2.0
+* [x] Add RayCast observations
+
+The environment was ported to ml-agents 2.0. Raycast observations added and ensured to be roughly backwards compatible with 2.0.
+
+## 2.2 Health and Basic Scripts (Released 13/07/2021)
+
+* [x] Switched from reward system to health system (from DRL perspective functionally similar but unlocks more tasks and better integration with a continual learning setting)
+* [x] Added decaying rewards
+* [x] Improved Hotzone/Deathzone graphics and allow scaling
+* [x] Added/improved python wrappers for all main usecases (play, openAIgym, lowlevelAPI, mlagents-learn)
+* [x] Added heuristic agent for testing/debugging
+* [x] Improved play mode overlay
+
+Previous setting had an abstract system where food = +ve reward and time = -ve reward. This will be converted to decaying health that must be maintained by seeking our reward. Many tasks are functionally identical, but this setup is better for future tasks and also persistent survival. Other additions are improvements to the environment that go with this change and the initial setup of scripts as tutorials for using different training settings.
+
+## 2.3 Experiment, Object, and Graphical Improvements (Released 13/10/2021)
+
+* [x] Major graphics update to all items
+* [x] Goals that decay/ripen/change size
+* [x] More items for setting up experiments
+* [x] Improved documentation
+
+This update is focused on improving the environment for experimentation. This includes a major graphics update to all items, the addition of goals that decay/ripen/change size, and more items for setting up experiments. This update also includes improved documentation which enhances user experience.
+
+## 3.3 Animal-AI 'Version 3' [Major Release - 25/12/2023]
+
+* [x] Migrate to Unity Editor 2022
+* [x] Migrate to ml-agents 0.30.0
+* [x] Fix major graphical bugs affecting shadows and object placement
+* [x] Add interactive objects to environment
+    - [x] Add new objects to the environment that are interactable (SpawnerButton) by user and agents
+* [x] Add more objects to the RayCast Parser (Unity and Python sides) 
+* [x] Overhaul documentation and tutorials for the environment (play and training)
+    - [x] Restructure documentation and GitHub repository to be more user friendly and easier to navigate
+
+---
+
+_This roadmap is subject to change and is currently a work in progress._
diff --git a/docs/oldVersions.md b/project/AAI-Versions-Archive.md
similarity index 75%
rename from docs/oldVersions.md
rename to project/AAI-Versions-Archive.md
index ad0e08f4b..2a683a552 100644
--- a/docs/oldVersions.md
+++ b/project/AAI-Versions-Archive.md
@@ -1,7 +1,13 @@
-Old versions can be found here as long as they continue to be hosted.
+# Older Versions of Animal-AI 
+
+Please note that we may not be able to respond to a problem related to the older versions below. Please use the latest version of Animal-AI to expect full support and improvements.
 
 | OS | Environment link | Old Versions |
 | --- | --- | --- |
 | Linux | [v3.0.1](https://kv301.user.srcf.net/wp-content/uploads/2022/04/AAI_v3.0.1_build_linux_090422.zip)  | [v2.2.3](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.2.3.zip), [v2.2.2](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.2.2.zip), [v2.2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.2.1.zip), [v2.2.0](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.2.0.zip), [v2.1.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.1.1.zip), [v2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_LINUX_2.1.zip) |
 | Mac | [v3.0.1](https://kv301.user.srcf.net/wp-content/uploads/2022/04/AAI_v3.0.1_build_macOS_090422.zip) | [v2.2.3](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.2.3.zip), [v2.2.2](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.2.2.zip), [v2.2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.2.1.zip) [v2.2.0](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.2.0.zip), [v2.1.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.1.1.zip), [v2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_MAC_2.1.zip) |
-| Windows | [v3.0.1](https://kv301.user.srcf.net/wp-content/uploads/2022/04/AAI_v3.0.1_build_windows_090422.zip) | [v2.2.3](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.3.zip), [v2.2.2](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.2.zip), [v2.2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.1.zip) [v2.2.0](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.0.zip), [v2.1.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.1.1.zip), [v2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.1.zip) |
\ No newline at end of file
+| Windows | [v3.0.1](https://kv301.user.srcf.net/wp-content/uploads/2022/04/AAI_v3.0.1_build_windows_090422.zip) | [v2.2.3](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.3.zip), [v2.2.2](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.2.zip), [v2.2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.1.zip) [v2.2.0](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.2.0.zip), [v2.1.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.1.1.zip), [v2.1](https://www.doc.ic.ac.uk/~mcrosby/aai_builds/AnimalAI_WINDOWS_2.1.zip) |
+
+_If you'd like to use any of the previous versions, please download the corresponding version of the environment from the table above._ The installation instructions for the older versions are the same as the latest version. Please refer to the [Installation Guide](/docs/gettingStarted/Installation-Guide.md) for more details.
+
+---
diff --git a/docs/figs/agent-cyl-fail.gif b/project/figs/agent-cyl-fail.gif
similarity index 100%
rename from docs/figs/agent-cyl-fail.gif
rename to project/figs/agent-cyl-fail.gif
diff --git a/docs/figs/agent-cyl-pass.gif b/project/figs/agent-cyl-pass.gif
similarity index 100%
rename from docs/figs/agent-cyl-pass.gif
rename to project/figs/agent-cyl-pass.gif
diff --git a/docs/figs/animal-cyl-fail.gif b/project/figs/animal-cyl-fail.gif
similarity index 100%
rename from docs/figs/animal-cyl-fail.gif
rename to project/figs/animal-cyl-fail.gif
diff --git a/docs/figs/animal-cyl-pass.gif b/project/figs/animal-cyl-pass.gif
similarity index 100%
rename from docs/figs/animal-cyl-pass.gif
rename to project/figs/animal-cyl-pass.gif
diff --git a/docs/PrefabsPictures/steampunkFOURcrop.png b/project/figs/steampunkFOURcrop.png
similarity index 100%
rename from docs/PrefabsPictures/steampunkFOURcrop.png
rename to project/figs/steampunkFOURcrop.png


Test patch:
diff --git a/animalai/animalai/envs/tests/__init__.py b/animalai/animalai/envs/tests/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/animalai/animalai/envs/tests/test_arena_config.py b/animalai/animalai/envs/tests/test_arena_config.py
deleted file mode 100644
index b7651302a..000000000
--- a/animalai/animalai/envs/tests/test_arena_config.py
+++ /dev/null
@@ -1,162 +0,0 @@
-import pytest
-import yaml
-from unittest.mock import patch, mock_open
-
-from animalai.envs.arena_config import (
-    Vector3,
-    RGB,
-    Item,
-    Arena,
-    ArenaConfig,
-    constructor_arena,
-    constructor_item,
-)
-
-item_yaml = """
-!Item
-  name: Wall
-  positions:
-  - !Vector3 {x: 13.3, y: 0, z: 33}
-  - !Vector3 {x: 26.6, y: 0, z: 33}
-  sizes:
-  - !Vector3 {x: 14, y: 3, z: 1}
-  - !Vector3 {x: 14, y: 3, z: 1}
-  - !Vector3 {x: 14, y: 3, z: 1}
-  rotations: [90, 90,100,200]
-  colors:
-  - !RGB {r: 153, g: 153, b: 153}
-"""
-
-arena_yaml = """
-!Arena
-    pass_mark: 0
-    t: 250
-    blackouts: [50, 55, 75, 80, 100, 105, 115, 120, 125]
-    items:
-    - !Item
-      name: WallTransparent
-    - !Item
-      name: GoodGoal
-    - !Item
-      name: Agent
-"""
-
-arena_config_yaml = """
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 2
-    t: 250
-    items:
-    - !Item
-      name: GoodGoalMulti
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-  1: !Arena
-    pass_mark: -1
-    t: 250
-    items:
-    - !Item
-      name: BadGoal
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: GoodGoal
-"""
-
-arena_config_bad_yaml = """
-!ArenaConfig
-aaarenas:
-  0: !Arena
-    pass_mark: 2
-    t: 250
-    items:
-    - !Item
-      name: GoodGoalMulti
-"""
-
-
-@pytest.fixture(scope="session", autouse=True)
-def yaml_config():
-    print("called")
-    yaml.add_constructor(u"!Arena", constructor_arena)
-    yaml.add_constructor(u"!Item", constructor_item)
-
-
-def test_vector3():
-    vector3 = Vector3(x=10, y=15, z=20)
-    assert vector3.x == 10
-    assert vector3.y == 15
-    assert vector3.z == 20
-
-    vector3_proto = vector3.to_proto()
-    assert vector3_proto.x == 10
-    assert vector3_proto.y == 15
-    assert vector3_proto.z == 20
-
-
-def test_rgb():
-    rgb = RGB(r=10, g=15, b=20)
-    assert rgb.r == 10
-    assert rgb.g == 15
-    assert rgb.b == 20
-
-    rgb_proto = rgb.to_proto()
-    assert rgb_proto.x == 10
-    assert rgb_proto.y == 15
-    assert rgb_proto.z == 20
-
-
-def test_item():
-    item: Item = yaml.load(item_yaml, Loader=yaml.Loader)
-
-    assert item.name == "Wall"
-    assert len(item.positions) == 2
-    assert len(item.sizes) == 3
-    assert len(item.rotations) == 4
-    assert len(item.colors) == 1
-
-    item_proto = item.to_proto()
-    assert item_proto.name == "Wall"
-    assert len(item_proto.positions) == 2
-    assert len(item_proto.sizes) == 3
-    assert len(item_proto.rotations) == 4
-    assert len(item_proto.colors) == 1
-
-
-def test_arena():
-    arena: Arena = yaml.load(arena_yaml, Loader=yaml.Loader)
-    assert arena.pass_mark == 0
-    assert arena.t == 250
-    assert len(arena.blackouts) == 9
-    assert len(arena.items) == 3
-
-    arena_proto = arena.to_proto()
-    assert arena.pass_mark == 0
-    assert arena_proto.t == 250
-    assert len(arena_proto.blackouts) == 9
-    assert len(arena_proto.items) == 3
-
-
-@patch("builtins.open", new_callable=mock_open, read_data=arena_config_yaml)
-def test_arena_config(mock_yaml):
-
-    arena_config = ArenaConfig(" ")
-    assert len(arena_config.arenas) == 3
-
-    arena_config_proto = arena_config.to_proto()
-    assert len(arena_config_proto.arenas) == 3
-
-
-@patch("builtins.open", new_callable=mock_open, read_data=arena_config_bad_yaml)
-def test_bad_arena_config(mock_yaml):
-    with pytest.raises(AttributeError):
-        ArenaConfig(" ")
-
-
-if __name__ == "__main__":
-    pytest.main()
diff --git a/animalai/animalai/envs/tests/test_envs_aai.py b/animalai/animalai/envs/tests/test_envs_aai.py
deleted file mode 100644
index 71ffbfb22..000000000
--- a/animalai/animalai/envs/tests/test_envs_aai.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from unittest.mock import patch, mock_open
-import pytest
-
-from animalai.envs.environment import AnimalAIEnvironment
-from animalai.envs.arena_config import ArenaConfig
-from mlagents_envs.mock_communicator import MockCommunicator
-from mlagents_envs.base_env import BatchedStepResult
-
-arena_config_yaml = """
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 2
-    t: 250
-    items:
-    - !Item
-      name: GoodGoalMulti
-  1: !Arena
-    pass_mark: -1
-    t: 250
-    items:
-    - !Item
-      name: BadGoal
-"""
-
-
-@patch("animalai.envs.environment.AnimalAIEnvironment.reset")
-@patch("mlagents_envs.environment.UnityEnvironment.executable_launcher")
-@patch("mlagents_envs.environment.UnityEnvironment.get_communicator")
-def test_basic_initialization(mock_communicator, mock_launcher, mock_reset):
-    mock_communicator.return_value = MockCommunicator(
-        discrete_action=True, visual_inputs=1, num_agents=32, vec_obs_size=2
-    )
-
-    env = AnimalAIEnvironment(file_name=" ", n_arenas=32, resolution=126,)
-    assert env.get_agent_groups() == ["RealFakeBrain"]
-    mock_launcher.assert_called_once()
-    launcher_args, _ = mock_launcher.call_args
-    executable_args = launcher_args[3]
-    assert executable_args == [
-        "--playerMode",
-        "0",
-        "--numberOfArenas",
-        "32",
-        "--resolution",
-        "126",
-    ]
-    env.close()
-
-
-@patch("animalai.envs.environment.AnimalAIEnvironment.reset")
-@patch("mlagents_envs.environment.UnityEnvironment.executable_launcher")
-@patch("mlagents_envs.environment.UnityEnvironment.get_communicator")
-def test_play_initialization(mock_communicator, mock_launcher, mock_reset):
-    mock_communicator.return_value = MockCommunicator()
-
-    env = AnimalAIEnvironment(file_name=" ", n_arenas=1, play=True)
-    mock_launcher.assert_called_once()
-    launcher_args, _ = mock_launcher.call_args
-    executable_args = launcher_args[3]
-    assert executable_args == ["--playerMode", "1", "--numberOfArenas", "1"]
-    env.close()
-
-
-@patch("builtins.open", new_callable=mock_open, read_data=arena_config_yaml)
-@patch("mlagents_envs.side_channel.raw_bytes_channel.RawBytesChannel.send_raw_data")
-@patch("mlagents_envs.environment.UnityEnvironment.executable_launcher")
-@patch("mlagents_envs.environment.UnityEnvironment.get_communicator")
-def test_reset_arena_config(
-    mock_communicator, mock_launcher, mock_byte_channel, mock_yaml
-):
-    mock_communicator.return_value = MockCommunicator(
-        discrete_action=True, visual_inputs=0, num_agents=2, vec_obs_size=2
-    )
-    arena_config = ArenaConfig(" ")
-    env = AnimalAIEnvironment(
-        file_name=" ", n_arenas=2, arenas_configurations=arena_config,
-    )
-
-    mock_byte_channel.assert_called_once()
-    bytes_arg = bytes(arena_config.to_proto().SerializeToString(deterministic=True))
-    # we cannot call assert_called_with
-    mock_byte_channel.assert_called_with(bytes_arg)
-
-    batched_step_result = env.get_step_result("RealFakeBrain")
-    spec = env.get_agent_group_spec("RealFakeBrain")
-    env.close()
-    assert isinstance(batched_step_result, BatchedStepResult)
-    assert len(spec.observation_shapes) == len(batched_step_result.obs)
-    n_agents = batched_step_result.n_agents()
-    for shape, obs in zip(spec.observation_shapes, batched_step_result.obs):
-        assert (n_agents,) + shape == obs.shape
-
-
-if __name__ == "__main__":
-    pytest.main()
diff --git a/configs/example-tests/competition-sample/01-10-3.yml b/configs/example-tests/competition-sample/01-10-3.yml
deleted file mode 100644
index e69de29bb..000000000
diff --git a/configs/example-tests/competition-sample/03-03-1.yml b/configs/example-tests/competition-sample/03-03-1.yml
deleted file mode 100644
index e69de29bb..000000000
diff --git a/configs/example-tests/competition-sample/10-01-1.yml b/configs/example-tests/competition-sample/10-01-1.yml
deleted file mode 100644
index e69de29bb..000000000
diff --git a/configs/example-tests/competition-sample/3-23-1.yml b/configs/example-tests/competition-sample/3-23-1.yml
deleted file mode 100644
index e69de29bb..000000000
diff --git a/configs/example-tests/multi-object-tests/1y1g-size1.yml b/configs/example-tests/multi-object-tests/1y1g-size1.yml
deleted file mode 100644
index 3ae2acc2b..000000000
--- a/configs/example-tests/multi-object-tests/1y1g-size1.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: GoodGoalMulti
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/1y1g.yml b/configs/example-tests/multi-object-tests/1y1g.yml
deleted file mode 100644
index deda3798a..000000000
--- a/configs/example-tests/multi-object-tests/1y1g.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-    - !Item
-      name: GoodGoalMulti
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/1y1g1r-size1.yml b/configs/example-tests/multi-object-tests/1y1g1r-size1.yml
deleted file mode 100644
index 8ba9dfec6..000000000
--- a/configs/example-tests/multi-object-tests/1y1g1r-size1.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: GoodGoalMulti
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: BadGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/1y1g1r.yml b/configs/example-tests/multi-object-tests/1y1g1r.yml
deleted file mode 100644
index 3c8f52416..000000000
--- a/configs/example-tests/multi-object-tests/1y1g1r.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-    - !Item
-      name: GoodGoalMulti
-    - !Item
-      name: BadGoal
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/1y1g1r1w-size1.yml b/configs/example-tests/multi-object-tests/1y1g1r1w-size1.yml
deleted file mode 100644
index 7f4a83d6b..000000000
--- a/configs/example-tests/multi-object-tests/1y1g1r1w-size1.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: -1, y: 5, z: 2}
-    - !Item
-      name: GoodGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: GoodGoalMulti
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: BadGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/allobjs-10000.yml b/configs/example-tests/multi-object-tests/allobjs-10000.yml
deleted file mode 100644
index f9fb6bd87..000000000
--- a/configs/example-tests/multi-object-tests/allobjs-10000.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: -0.1
-    t: 10000
-    items:
-    - !Item
-      name: Wall
-    - !Item
-      name: WallTransparent
-    - !Item
-      name: Ramp
-    - !Item
-      name: CylinderTunnel
-    - !Item
-      name: CylinderTunnelTransparent
-    - !Item
-      name: Cardbox1
-    - !Item
-      name: Cardbox2
-    - !Item
-      name: LObject
-    - !Item
-      name: LObject2
-    - !Item
-      name: UObject
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/hunger-neq-reward.yml b/configs/example-tests/multi-object-tests/hunger-neq-reward.yml
deleted file mode 100644
index 0f3f3b484..000000000
--- a/configs/example-tests/multi-object-tests/hunger-neq-reward.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 600
-    items:
-    - !Item
-      name: Agent
-      positions: 
-      - !Vector3 {x: 1, y: 0, z: 1}
-      rotations: [45]
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 26, y: 0, z: 32.5}
-      sizes:
-      - !Vector3 {x: 5, y: .6, z: 5}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 32.5}
-      sizes:
-      - !Vector3 {x: 5, y: .6, z: 5}      
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-      rotations: [270]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 26, y: .7, z: 32.5}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 5}
-    - !Item
-      name: GoodGoalMulti
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 10}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: GoodGoalMulti
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: GoodGoalMulti
-      positions:
-      - !Vector3 {x: 30, y: 0, z: 10}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-    - !Item
-      name: HotZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}    
-      rotations: [0]  
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 10}
-    - !Item
-      name: Cardbox2
-      positions:
-      - !Vector3 {x: 15, y: 0, z: 10}      
-      sizes:
-      - !Vector3 {x: 2, y: .7, z: 2}
-      rotations: [0]
-    - !Item
-      name: Cardbox2
-      positions:
-      - !Vector3 {x: 25, y: 0, z: 10}      
-      sizes:
-      - !Vector3 {x: 2, y: .7, z: 2}
-      rotations: [0]
-    # - !Item
-    #   name: Cardbox2
-    #   positions:
-    #   - !Vector3 {x: 25, y: 0, z: 10}      
-    #   sizes:
-    #   - !Vector3 {x: 5, y: .5, z: 5}
-    
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergy4.yml b/configs/example-tests/multi-object-tests/synergy4.yml
deleted file mode 100644
index a12322812..000000000
--- a/configs/example-tests/multi-object-tests/synergy4.yml
+++ /dev/null
@@ -1,182 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  1: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 2.5}      
-      - !Vector3 {x: 26.25, y: 0, z: 2.5}
-      - !Vector3 {x: 35, y: 0, z: 10}      
-      - !Vector3 {x: 26.25, y: 0, z: 10}
-      - !Vector3 {x: 35, y: 0, z: 20}      
-      - !Vector3 {x: 26.25, y: 0, z: 20}
-      - !Vector3 {x: 35, y: 0, z: 30}      
-      - !Vector3 {x: 26.25, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 2.5}      
-      - !Vector3 {x: 13.75, y: 0, z: 2.5}
-      - !Vector3 {x: 5, y: 0, z: 10}      
-      - !Vector3 {x: 13.75, y: 0, z: 10}
-      - !Vector3 {x: 5, y: 0, z: 20}      
-      - !Vector3 {x: 13.75, y: 0, z: 20}
-      - !Vector3 {x: 5, y: 0, z: 30}      
-      - !Vector3 {x: 13.75, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 2.5}      
-      - !Vector3 {x: 26.25, y: 0, z: 2.5}
-      - !Vector3 {x: 35, y: 0, z: 10}      
-      - !Vector3 {x: 26.25, y: 0, z: 10}
-      - !Vector3 {x: 35, y: 0, z: 20}      
-      - !Vector3 {x: 26.25, y: 0, z: 20}
-      - !Vector3 {x: 35, y: 0, z: 30}      
-      - !Vector3 {x: 26.25, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-  3: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 2.5}      
-      - !Vector3 {x: 13.75, y: 0, z: 2.5}
-      - !Vector3 {x: 5, y: 0, z: 10}      
-      - !Vector3 {x: 13.75, y: 0, z: 10}
-      - !Vector3 {x: 5, y: 0, z: 20}      
-      - !Vector3 {x: 13.75, y: 0, z: 20}
-      - !Vector3 {x: 5, y: 0, z: 30}      
-      - !Vector3 {x: 13.75, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergydrop_unq.yml b/configs/example-tests/multi-object-tests/synergydrop_unq.yml
deleted file mode 100644
index 9175f627e..000000000
--- a/configs/example-tests/multi-object-tests/synergydrop_unq.yml
+++ /dev/null
@@ -1,2386 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  1: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  2: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  3: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergydrop_xor.yml b/configs/example-tests/multi-object-tests/synergydrop_xor.yml
deleted file mode 100644
index 49bcae5d7..000000000
--- a/configs/example-tests/multi-object-tests/synergydrop_xor.yml
+++ /dev/null
@@ -1,2386 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  1: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  2: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Cardbox2
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
-  3: !Arena
-    pass_mark: 1
-    t: 250
-    items:
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 26.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 21.5}
-      sizes:
-      - !Vector3 {x: 13, y: 1, z: 1}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 12, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 3, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-    - !Item
-      name: Wall
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 26.6, y: 4, z: 24}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 5}
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-    - !Item
-      name: Wall
-      rotations: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #,0,0,0,0,0,0,0,0,0,0,0,0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 10} #Bottom half full
-#Top half full of holes (comment out)
-      - !Vector3 {x: 1, y: 0, z: 21}
-      - !Vector3 {x: 3, y: 0, z: 21}
-      - !Vector3 {x: 5, y: 0, z: 21}
-      - !Vector3 {x: 7, y: 0, z: 21}
-      - !Vector3 {x: 9, y: 0, z: 21}
-      - !Vector3 {x: 11, y: 0, z: 21}
-      - !Vector3 {x: 13, y: 0, z: 21}
-      - !Vector3 {x: 15, y: 0, z: 21}
-      - !Vector3 {x: 17, y: 0, z: 21}
-      - !Vector3 {x: 19, y: 0, z: 21}
-      - !Vector3 {x: 21, y: 0, z: 21}
-      - !Vector3 {x: 23, y: 0, z: 21}
-      - !Vector3 {x: 25, y: 0, z: 21}
-      - !Vector3 {x: 27, y: 0, z: 21}
-      - !Vector3 {x: 29, y: 0, z: 21}
-      - !Vector3 {x: 31, y: 0, z: 21}
-      - !Vector3 {x: 33, y: 0, z: 21}
-      - !Vector3 {x: 35, y: 0, z: 21}
-      - !Vector3 {x: 37, y: 0, z: 21}
-      - !Vector3 {x: 39, y: 0, z: 21}
-      - !Vector3 {x: 1, y: 0, z: 23}
-      - !Vector3 {x: 3, y: 0, z: 23}
-      # - !Vector3 {x: 5, y: 0, z: 23}
-      # - !Vector3 {x: 7, y: 0, z: 23}
-      - !Vector3 {x: 9, y: 0, z: 23}
-      - !Vector3 {x: 11, y: 0, z: 23}
-      # - !Vector3 {x: 13, y: 0, z: 23}
-      # - !Vector3 {x: 15, y: 0, z: 23}
-      - !Vector3 {x: 17, y: 0, z: 23}
-      - !Vector3 {x: 19, y: 0, z: 23}
-      - !Vector3 {x: 21, y: 0, z: 23}
-      # - !Vector3 {x: 23, y: 0, z: 23}
-      # - !Vector3 {x: 25, y: 0, z: 23}
-      - !Vector3 {x: 27, y: 0, z: 23}
-      - !Vector3 {x: 29, y: 0, z: 23}
-      # - !Vector3 {x: 31, y: 0, z: 23}
-      # - !Vector3 {x: 33, y: 0, z: 23}
-      - !Vector3 {x: 35, y: 0, z: 23}
-      - !Vector3 {x: 37, y: 0, z: 23}
-      - !Vector3 {x: 39, y: 0, z: 23}
-      - !Vector3 {x: 1, y: 0, z: 25}
-      - !Vector3 {x: 3, y: 0, z: 25}
-      # - !Vector3 {x: 5, y: 0, z: 25}
-      # - !Vector3 {x: 7, y: 0, z: 25}
-      - !Vector3 {x: 9, y: 0, z: 25}
-      - !Vector3 {x: 11, y: 0, z: 25}
-      # - !Vector3 {x: 13, y: 0, z: 25}
-      # - !Vector3 {x: 15, y: 0, z: 25}
-      - !Vector3 {x: 17, y: 0, z: 25}
-      - !Vector3 {x: 19, y: 0, z: 25}
-      - !Vector3 {x: 21, y: 0, z: 25}
-      # - !Vector3 {x: 23, y: 0, z: 25}
-      # - !Vector3 {x: 25, y: 0, z: 25}
-      - !Vector3 {x: 27, y: 0, z: 25}
-      - !Vector3 {x: 29, y: 0, z: 25}
-      # - !Vector3 {x: 31, y: 0, z: 25}
-      # - !Vector3 {x: 33, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 25}
-      - !Vector3 {x: 37, y: 0, z: 25}
-      - !Vector3 {x: 39, y: 0, z: 25}
-      - !Vector3 {x: 1, y: 0, z: 27}
-      - !Vector3 {x: 3, y: 0, z: 27}
-      - !Vector3 {x: 5, y: 0, z: 27}
-      - !Vector3 {x: 7, y: 0, z: 27}
-      - !Vector3 {x: 9, y: 0, z: 27}
-      - !Vector3 {x: 11, y: 0, z: 27}
-      - !Vector3 {x: 13, y: 0, z: 27}
-      - !Vector3 {x: 15, y: 0, z: 27}
-      - !Vector3 {x: 17, y: 0, z: 27}
-      - !Vector3 {x: 19, y: 0, z: 27}
-      - !Vector3 {x: 21, y: 0, z: 27}
-      - !Vector3 {x: 23, y: 0, z: 27}
-      - !Vector3 {x: 25, y: 0, z: 27}
-      - !Vector3 {x: 27, y: 0, z: 27}
-      - !Vector3 {x: 29, y: 0, z: 27}
-      - !Vector3 {x: 31, y: 0, z: 27}
-      - !Vector3 {x: 33, y: 0, z: 27}
-      - !Vector3 {x: 35, y: 0, z: 27}
-      - !Vector3 {x: 37, y: 0, z: 27}
-      - !Vector3 {x: 39, y: 0, z: 27}
-      - !Vector3 {x: 1, y: 0, z: 29}
-      - !Vector3 {x: 3, y: 0, z: 29}
-      # - !Vector3 {x: 5, y: 0, z: 29}
-      # - !Vector3 {x: 7, y: 0, z: 29}
-      - !Vector3 {x: 9, y: 0, z: 29}
-      - !Vector3 {x: 11, y: 0, z: 29}
-      # - !Vector3 {x: 13, y: 0, z: 29}
-      # - !Vector3 {x: 15, y: 0, z: 29}
-      - !Vector3 {x: 17, y: 0, z: 29}
-      - !Vector3 {x: 19, y: 0, z: 29}
-      - !Vector3 {x: 21, y: 0, z: 29}
-      # - !Vector3 {x: 23, y: 0, z: 29}
-      # - !Vector3 {x: 25, y: 0, z: 29}
-      - !Vector3 {x: 27, y: 0, z: 29}
-      - !Vector3 {x: 29, y: 0, z: 29}
-      # - !Vector3 {x: 31, y: 0, z: 29}
-      # - !Vector3 {x: 33, y: 0, z: 29}
-      - !Vector3 {x: 35, y: 0, z: 29}
-      - !Vector3 {x: 37, y: 0, z: 29}
-      - !Vector3 {x: 39, y: 0, z: 29}
-      - !Vector3 {x: 1, y: 0, z: 31}
-      - !Vector3 {x: 3, y: 0, z: 31}
-      # - !Vector3 {x: 5, y: 0, z: 31}
-      # - !Vector3 {x: 7, y: 0, z: 31}
-      - !Vector3 {x: 9, y: 0, z: 31}
-      - !Vector3 {x: 11, y: 0, z: 31}
-      # - !Vector3 {x: 13, y: 0, z: 31}
-      # - !Vector3 {x: 15, y: 0, z: 31}
-      - !Vector3 {x: 17, y: 0, z: 31}
-      - !Vector3 {x: 19, y: 0, z: 31}
-      - !Vector3 {x: 21, y: 0, z: 31}
-      # - !Vector3 {x: 23, y: 0, z: 31}
-      # - !Vector3 {x: 25, y: 0, z: 31}
-      - !Vector3 {x: 27, y: 0, z: 31}
-      - !Vector3 {x: 29, y: 0, z: 31}
-      # - !Vector3 {x: 31, y: 0, z: 31}
-      # - !Vector3 {x: 33, y: 0, z: 31}
-      - !Vector3 {x: 35, y: 0, z: 31}
-      - !Vector3 {x: 37, y: 0, z: 31}
-      - !Vector3 {x: 39, y: 0, z: 31}
-      - !Vector3 {x: 1, y: 0, z: 33}
-      - !Vector3 {x: 3, y: 0, z: 33}
-      - !Vector3 {x: 5, y: 0, z: 33}
-      - !Vector3 {x: 7, y: 0, z: 33}
-      - !Vector3 {x: 9, y: 0, z: 33}
-      - !Vector3 {x: 11, y: 0, z: 33}
-      - !Vector3 {x: 13, y: 0, z: 33}
-      - !Vector3 {x: 15, y: 0, z: 33}
-      - !Vector3 {x: 17, y: 0, z: 33}
-      - !Vector3 {x: 19, y: 0, z: 33}
-      - !Vector3 {x: 21, y: 0, z: 33}
-      - !Vector3 {x: 23, y: 0, z: 33}
-      - !Vector3 {x: 25, y: 0, z: 33}
-      - !Vector3 {x: 27, y: 0, z: 33}
-      - !Vector3 {x: 29, y: 0, z: 33}
-      - !Vector3 {x: 31, y: 0, z: 33}
-      - !Vector3 {x: 33, y: 0, z: 33}
-      - !Vector3 {x: 35, y: 0, z: 33}
-      - !Vector3 {x: 37, y: 0, z: 33}
-      - !Vector3 {x: 39, y: 0, z: 33}
-      - !Vector3 {x: 1, y: 0, z: 35}
-      - !Vector3 {x: 3, y: 0, z: 35}
-      # - !Vector3 {x: 5, y: 0, z: 35}
-      # - !Vector3 {x: 7, y: 0, z: 35}
-      - !Vector3 {x: 9, y: 0, z: 35}
-      - !Vector3 {x: 11, y: 0, z: 35}
-      # - !Vector3 {x: 13, y: 0, z: 35}
-      # - !Vector3 {x: 15, y: 0, z: 35}
-      - !Vector3 {x: 17, y: 0, z: 35}
-      - !Vector3 {x: 19, y: 0, z: 35}
-      - !Vector3 {x: 21, y: 0, z: 35}
-      # - !Vector3 {x: 23, y: 0, z: 35}
-      # - !Vector3 {x: 25, y: 0, z: 35}
-      - !Vector3 {x: 27, y: 0, z: 35}
-      - !Vector3 {x: 29, y: 0, z: 35}
-      # - !Vector3 {x: 31, y: 0, z: 35}
-      # - !Vector3 {x: 33, y: 0, z: 35}
-      - !Vector3 {x: 35, y: 0, z: 35}
-      - !Vector3 {x: 37, y: 0, z: 35}
-      - !Vector3 {x: 39, y: 0, z: 35}
-      - !Vector3 {x: 1, y: 0, z: 37}
-      - !Vector3 {x: 3, y: 0, z: 37}
-      # - !Vector3 {x: 5, y: 0, z: 37}
-      # - !Vector3 {x: 7, y: 0, z: 37}
-      - !Vector3 {x: 9, y: 0, z: 37}
-      - !Vector3 {x: 11, y: 0, z: 37}
-      # - !Vector3 {x: 13, y: 0, z: 37}
-      # - !Vector3 {x: 15, y: 0, z: 37}
-      - !Vector3 {x: 17, y: 0, z: 37}
-      - !Vector3 {x: 19, y: 0, z: 37}
-      - !Vector3 {x: 21, y: 0, z: 37}
-      # - !Vector3 {x: 23, y: 0, z: 37}
-      # - !Vector3 {x: 25, y: 0, z: 37}
-      - !Vector3 {x: 27, y: 0, z: 37}
-      - !Vector3 {x: 29, y: 0, z: 37}
-      # - !Vector3 {x: 31, y: 0, z: 37}
-      # - !Vector3 {x: 33, y: 0, z: 37}
-      - !Vector3 {x: 35, y: 0, z: 37}
-      - !Vector3 {x: 37, y: 0, z: 37}
-      - !Vector3 {x: 39, y: 0, z: 37}
-      - !Vector3 {x: 1, y: 0, z: 39}
-      - !Vector3 {x: 3, y: 0, z: 39}
-      - !Vector3 {x: 5, y: 0, z: 39}
-      - !Vector3 {x: 7, y: 0, z: 39}
-      - !Vector3 {x: 9, y: 0, z: 39}
-      - !Vector3 {x: 11, y: 0, z: 39}
-      - !Vector3 {x: 13, y: 0, z: 39}
-      - !Vector3 {x: 15, y: 0, z: 39}
-      - !Vector3 {x: 17, y: 0, z: 39}
-      - !Vector3 {x: 19, y: 0, z: 39}
-      - !Vector3 {x: 21, y: 0, z: 39}
-      - !Vector3 {x: 23, y: 0, z: 39}
-      - !Vector3 {x: 25, y: 0, z: 39}
-      - !Vector3 {x: 27, y: 0, z: 39}
-      - !Vector3 {x: 29, y: 0, z: 39}
-      - !Vector3 {x: 31, y: 0, z: 39}
-      - !Vector3 {x: 33, y: 0, z: 39}
-      - !Vector3 {x: 35, y: 0, z: 39}
-      - !Vector3 {x: 37, y: 0, z: 39}
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      - !Vector3 {x: 2, y: 3, z: 2}
-      colors: 
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 0, b: 255}
-    - !Item
-      name: Ramp
-      positions:
-      - !Vector3 {x: 20, y: 3, z: 10}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 40, y: 3, z: 20}
-      colors:
-      - !RGB {r: 255, g: 0, b: 255}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 14, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 24, y: 0, z: 24}      
-      rotations: [270]
-      sizes:
-      - !Vector3 {x: 2.5, y: 2.5, z: 2.5}
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 19.3, y: 3, z: 24}
-      rotations: [0]
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple-unq-all.yaml b/configs/example-tests/multi-object-tests/synergysimple-unq-all.yaml
deleted file mode 100644
index 9659ccf7c..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple-unq-all.yaml
+++ /dev/null
@@ -1,254 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  1: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  3: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple-xor-all.yaml b/configs/example-tests/multi-object-tests/synergysimple-xor-all.yaml
deleted file mode 100644
index 5ccdd39f0..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple-xor-all.yaml
+++ /dev/null
@@ -1,254 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  1: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
-  3: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple1.yml b/configs/example-tests/multi-object-tests/synergysimple1.yml
deleted file mode 100644
index 7bffdddf1..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple1.yml
+++ /dev/null
@@ -1,53 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple2.yml b/configs/example-tests/multi-object-tests/synergysimple2.yml
deleted file mode 100644
index ae28b795d..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple2.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple3.yml b/configs/example-tests/multi-object-tests/synergysimple3.yml
deleted file mode 100644
index a7d78e446..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple3.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 20}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 10, z: 40}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 17}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 30.25}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergysimple4.yml b/configs/example-tests/multi-object-tests/synergysimple4.yml
deleted file mode 100644
index 900116501..000000000
--- a/configs/example-tests/multi-object-tests/synergysimple4.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 5, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-      rotations: [0]
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 5, y: 5, z: 1}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 5}      
-      - !Vector3 {x: 13.75, y: 0, z: 5}
-      - !Vector3 {x: 5, y: 0, z: 15}      
-      - !Vector3 {x: 13.75, y: 0, z: 15}
-      - !Vector3 {x: 5, y: 0, z: 25}      
-      - !Vector3 {x: 13.75, y: 0, z: 25}
-      - !Vector3 {x: 5, y: 0, z: 35}      
-      - !Vector3 {x: 13.75, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 5}      
-      - !Vector3 {x: 26.25, y: 0, z: 5}
-      - !Vector3 {x: 35, y: 0, z: 15}      
-      - !Vector3 {x: 26.25, y: 0, z: 15}
-      - !Vector3 {x: 35, y: 0, z: 25}      
-      - !Vector3 {x: 26.25, y: 0, z: 25}
-      - !Vector3 {x: 35, y: 0, z: 35}      
-      - !Vector3 {x: 26.25, y: 0, z: 35}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-      - !Vector3 {x: 10, y: 10, z: 10}
-      - !Vector3 {x: 7.5, y: 10, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 23}
-      - !Vector3 {x: 20, y: 0, z: 27}
-      sizes:
-      - !Vector3 {x: 4, y: 4, z: 4}
-      - !Vector3 {x: 4, y: 4, z: 4}
-    - !Item
-      name: DeathZone
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 9.75}
-      rotations: [0]
-      sizes:
-      - !Vector3 {x: 5, y: 10, z: 19.5}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergytmaze1.yml b/configs/example-tests/multi-object-tests/synergytmaze1.yml
deleted file mode 100644
index 1e6cfdf03..000000000
--- a/configs/example-tests/multi-object-tests/synergytmaze1.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergytmaze2.yml b/configs/example-tests/multi-object-tests/synergytmaze2.yml
deleted file mode 100644
index 1a4dffe76..000000000
--- a/configs/example-tests/multi-object-tests/synergytmaze2.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 8.75, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 2.5}      
-      - !Vector3 {x: 26.25, y: 0, z: 2.5}
-      - !Vector3 {x: 35, y: 0, z: 10}      
-      - !Vector3 {x: 26.25, y: 0, z: 10}
-      - !Vector3 {x: 35, y: 0, z: 20}      
-      - !Vector3 {x: 26.25, y: 0, z: 20}
-      - !Vector3 {x: 35, y: 0, z: 30}      
-      - !Vector3 {x: 26.25, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergytmaze3.yml b/configs/example-tests/multi-object-tests/synergytmaze3.yml
deleted file mode 100644
index 4859dd599..000000000
--- a/configs/example-tests/multi-object-tests/synergytmaze3.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 2.5}      
-      - !Vector3 {x: 13.75, y: 0, z: 2.5}
-      - !Vector3 {x: 5, y: 0, z: 10}      
-      - !Vector3 {x: 13.75, y: 0, z: 10}
-      - !Vector3 {x: 5, y: 0, z: 20}      
-      - !Vector3 {x: 13.75, y: 0, z: 20}
-      - !Vector3 {x: 5, y: 0, z: 30}      
-      - !Vector3 {x: 13.75, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 2.5}      
-      - !Vector3 {x: 26.25, y: 0, z: 2.5}
-      - !Vector3 {x: 35, y: 0, z: 10}      
-      - !Vector3 {x: 26.25, y: 0, z: 10}
-      - !Vector3 {x: 35, y: 0, z: 20}      
-      - !Vector3 {x: 26.25, y: 0, z: 20}
-      - !Vector3 {x: 35, y: 0, z: 30}      
-      - !Vector3 {x: 26.25, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/multi-object-tests/synergytmaze4.yml b/configs/example-tests/multi-object-tests/synergytmaze4.yml
deleted file mode 100644
index 186e7cad8..000000000
--- a/configs/example-tests/multi-object-tests/synergytmaze4.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      rotations: [0]
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 20}
-    - !Item
-      name: Cardbox1
-      positions:
-      - !Vector3 {x: 5, y: 0, z: 2.5}      
-      - !Vector3 {x: 13.75, y: 0, z: 2.5}
-      - !Vector3 {x: 5, y: 0, z: 10}      
-      - !Vector3 {x: 13.75, y: 0, z: 10}
-      - !Vector3 {x: 5, y: 0, z: 20}      
-      - !Vector3 {x: 13.75, y: 0, z: 20}
-      - !Vector3 {x: 5, y: 0, z: 30}      
-      - !Vector3 {x: 13.75, y: 0, z: 30}
-      rotations: [0,0,0,0,0,0,0,0]
-      sizes:
-      - !Vector3 {x: 10, y: 5, z: 5}
-      - !Vector3 {x: 7.5, y: 5, z: 5}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-      - !Vector3 {x: 10, y: 5, z: 10}
-      - !Vector3 {x: 7.5, y: 5, z: 10}
-    - !Item
-      name: Wall
-      positions:
-      - !Vector3 {x: 31.25, y: 0, z: 17.5}
-      rotations: [0]
-      colors: 
-      - !RGB {r: 153, g: 153, b: 153}
-      sizes:
-      - !Vector3 {x: 17.5, y: 5, z: 35}
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 35, y: 0, z: 37.5}
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
\ No newline at end of file
diff --git a/configs/example-tests/single-object-tests/signposterboards.yml b/configs/example-tests/single-object-tests/signposterboards.yml
deleted file mode 100644
index f91a8b689..000000000
--- a/configs/example-tests/single-object-tests/signposterboards.yml
+++ /dev/null
@@ -1,146 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 8}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      - !Vector3 {x: 20, y: 0, z: 20}
-      - !Vector3 {x: 20, y: 0, z: 26}
-      - !Vector3 {x: 20, y: 0, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "left-arrow"    
-      - "letter-a"    
-      - "circle"    
-      - "u-turn-arrow"    
-      - "tick"
-      colors:
-      - !RGB {r: 0, g: 0, b: 0}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 255, b: 0}
-      - !RGB {r: 255, g: 0, b: 0}
-      - !RGB {r: 255, g: 255, b: 255}
-  1: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 0, z: 8}
-      - !Vector3 {x: 20, y: 0, z: 14}
-      - !Vector3 {x: 20, y: 0, z: 20}
-      - !Vector3 {x: 20, y: 0, z: 26}
-      - !Vector3 {x: 20, y: 0, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "01/10"    
-      - "111/110/001"    
-      - "001010/011000/100001/101010/111001"    
-      - "0101/**10/0010/0***"
-      - "13x11"
-      colors:
-      - !RGB {r: 0, g: 0, b: 0}
-      - !RGB {r: 0, g: 0, b: 255}
-      - !RGB {r: 0, g: 255, b: 0}
-      - !RGB {r: 255, g: 0, b: 0}
-      - !RGB {r: 255, g: 255, b: 255}
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 10, z: 8}
-      - !Vector3 {x: 20, y: 10, z: 14}
-      - !Vector3 {x: 20, y: 10, z: 20}
-      - !Vector3 {x: 20, y: 10, z: 26}
-      - !Vector3 {x: 20, y: 10, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "left-arrow"    
-      - "letter-a"    
-      - "circle"    
-      - "u-turn-arrow"    
-      - "tick"
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      - !RGB {r: 255, g: 0, b: 255}
-      - !RGB {r: 255, g: 255, b: 0}
-      - !RGB {r: 0, g: 255, b: 255}
-      - !RGB {r: 0, g: 153, b: 255}
-  3: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 10, y: 0, z: 20}
-      rotations: [90]
-    - !Item
-      name: SignPosterboard
-      positions:
-      - !Vector3 {x: 20, y: 10, z: 8}
-      - !Vector3 {x: 20, y: 10, z: 14}
-      - !Vector3 {x: 20, y: 10, z: 20}
-      - !Vector3 {x: 20, y: 10, z: 26}
-      - !Vector3 {x: 20, y: 10, z: 32}
-      rotations: [0, 0, 0, 0, 0]
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      - !Vector3 {x: 1, y: 1, z: 1}
-      symbolNames:
-      - "01/10"    
-      - "111/110/001"    
-      - "001010/011000/100001/101010/111001"    
-      - "0101/**10/0010/0***"
-      - "13x11"
-      colors:
-      - !RGB {r: 153, g: 153, b: 153}
-      - !RGB {r: 255, g: 0, b: 255}
-      - !RGB {r: 255, g: 255, b: 0}
-      - !RGB {r: 0, g: 255, b: 255}
-      - !RGB {r: 0, g: 155, b: 255}
diff --git a/configs/example-tests/single-object-tests/tree-spawner.yml b/configs/example-tests/single-object-tests/tree-spawner.yml
deleted file mode 100644
index 6cb017c02..000000000
--- a/configs/example-tests/single-object-tests/tree-spawner.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-!ArenaConfig 
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: SpawnerTree
-  1: !Arena
-    pass_mark: 20
-    t: 500
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: SpawnerTree
-      spawnCounts: [5]
-      finalValues: [5]
-
diff --git a/configs/example-tests/single-object-tests/valenced-objects-goals.yml b/configs/example-tests/single-object-tests/valenced-objects-goals.yml
deleted file mode 100644
index 0d22ab2f2..000000000
--- a/configs/example-tests/single-object-tests/valenced-objects-goals.yml
+++ /dev/null
@@ -1,237 +0,0 @@
-!ArenaConfig
-arenas:
-  0: !Arena
-    pass_mark: 0
-    t: 500
-    items:
-    - !Item
-      name: Agent
-  1: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-  2: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      positions:
-      - !Vector3 {x: -1, y: 5, z: -1}
-  3: !Arena
-    pass_mark: -0.5
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 1, y: 0, z: 1}
-      rotations: [45]
-    - !Item
-      name: GoodGoal
-      positions:
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: .5, y: .5, z: .5}
-  4: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoalMulti
-  5: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoalMulti
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      positions:
-      - !Vector3 {x: -1, y: 5, z: -1}
-  7: !Arena
-    pass_mark: -0.5
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 1, y: 0, z: 1}
-      rotations: [45]
-    - !Item
-      name: GoodGoalMulti
-      positions:
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: .5, y: .5, z: .5}
-  8: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: BadGoal
-  9: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: BadGoal
-      sizes:
-      - !Vector3 {x: 1, y: 1, z: 1}
-      positions:
-      - !Vector3 {x: -1, y: 5, z: -1}
-  10: !Arena
-    pass_mark: -0.5
-    t: 250
-    items:
-    - !Item
-      name: Agent
-      positions:
-      - !Vector3 {x: 1, y: 0, z: 1}
-      rotations: [45]
-    - !Item
-      name: BadGoal
-      positions:
-      - !Vector3 {x: 39, y: 0, z: 39}
-      sizes:
-      - !Vector3 {x: .5, y: .5, z: .5}
-  11: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoalBounce
-  12: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GoodGoalMultiBounce
-  13: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: BadGoalBounce
-  14: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: DeathZone
-  15: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: HotZone
-  16: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: DecayGoal
-  17: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: AntiDecayGoal
-  18: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: DecayGoal
-      initialValues: [4]
-      finalValues: [3]
-      delays: [250]
-      changeRates: [-0.003]
-  19: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: AntiDecayGoal
-      initialValues: [1]
-      finalValues: [1.5]
-      delays: [300]
-      changeRates: [-0.007]
-  20: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GrowGoal
-  21: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: ShrinkGoal
-  22: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: GrowGoal
-      initialValues: [1]
-      finalValues: [3.5]
-      delays: [100]
-      changeRates: [0.01]
-  23: !Arena
-    pass_mark: 0
-    t: 250
-    items:
-    - !Item
-      name: Agent
-    - !Item
-      name: ShrinkGoal
-      initialValues: [3.5]
-      finalValues: [1]
-      delays: [100]
-      changeRates: [0.01]
-
-
-
-
diff --git a/docs/ExampleGallery/decay-sizechange-goal-test-changes.PNG b/docs/figs/exampleGallery/decay-sizechange-goal-test-changes.PNG
similarity index 100%
rename from docs/ExampleGallery/decay-sizechange-goal-test-changes.PNG
rename to docs/figs/exampleGallery/decay-sizechange-goal-test-changes.PNG
diff --git a/docs/ExampleGallery/decay-sizechange-goal-test.PNG b/docs/figs/exampleGallery/decay-sizechange-goal-test.PNG
similarity index 100%
rename from docs/ExampleGallery/decay-sizechange-goal-test.PNG
rename to docs/figs/exampleGallery/decay-sizechange-goal-test.PNG