diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
new file mode 100644
index 000000000..6d4addf81
--- /dev/null
+++ b/.github/workflows/build-docs.yml
@@ -0,0 +1,42 @@
+name: Build and Deploy Docs
+on:
+ push:
+ branches: [master]
+
+permissions:
+ contents: write
+
+jobs:
+ docs:
+ name: Generate Website
+ runs-on: ubuntu-latest
+ env:
+ SPHINX_GITHUB_CHANGELOG_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.9'
+
+ - name: Install docs dependencies
+ run: pip install -r docs/requirements.txt
+
+ - name: Install ViZDoom
+ run: pip install -e .
+
+ - name: Build
+ run: sphinx-build -b dirhtml -v docs _build
+
+ - name: Move 404
+ run: mv _build/404/index.html _build/404.html
+
+ - name: Update 404 links
+ run: python docs/_scripts/move_404.py _build/404.html
+
+ - name: Remove .doctrees
+ run: rm -r _build/.doctrees
+
+ - name: Upload to GitHub Pages
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ folder: _build
diff --git a/.gitignore b/.gitignore
index 9ec396527..a1a7f833d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -126,3 +126,6 @@ src/vizdoom/zlib/x64/
# Dockerfiles
tmp_dockerfiles
+
+# Documentation
+docs_html
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 76e92d5af..202b5b8fb 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -26,8 +26,12 @@ repos:
rev: v2.2.2
hooks:
- id: codespell
+ exclude: >
+ (?x)^(
+ .*\.svg
+ )$
args:
- - --ignore-words-list=msdos,MSDOS,LTS,STLE,parms,bord,partialy,nd,siz,ore,CLER,
+ - --ignore-words-list=msdos,MSDOS,LTS,STLE,parms,bord,partialy,nd,siz,ore,CLER
- repo: https://github.com/python/black
rev: 22.10.0
hooks:
diff --git a/README.md b/README.md
index 7a849529d..d15eb08b9 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,14 @@
[![PyPI version](https://badge.fury.io/py/vizdoom.svg)](https://badge.fury.io/py/vizdoom) ![Build](https://github.com/mwydmuch/ViZDoom/workflows/Build/badge.svg) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://pre-commit.com/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
-
+
ViZDoom allows developing AI **bots that play Doom using only visual information** (the screen buffer). It is primarily intended for research in machine visual learning, and deep reinforcement learning, in particular.
ViZDoom is based on [ZDoom](https://github.com/rheit/zdoom) to provide the game mechanics.
-![vizdoom_deadly_corridor](http://www.cs.put.poznan.pl/mkempka/misc/vizdoom_gifs/vizdoom_corridor_segmentation.gif)
+![ViZDoom Demo](https://raw.githubusercontent.com/Farama-Foundation/ViZDoom/master/docs/_static/img/vizdoom-demo.gif)
## Features
@@ -26,7 +26,7 @@ ViZDoom is based on [ZDoom](https://github.com/rheit/zdoom) to provide the game
- Access to the list of actors/objects and map geometry,
- Off-screen rendering,
- Episodes recording,
-- Time scaling in async mode.
+- In-game time scaling in async mode.
ViZDoom API is **reinforcement learning** friendly (suitable also for learning from demonstration, apprenticeship learning or apprenticeship via inverse reinforcement learning, etc.).
diff --git a/doc/Changelog.md b/doc/Changelog.md
deleted file mode 100644
index 80b360dea..000000000
--- a/doc/Changelog.md
+++ /dev/null
@@ -1,286 +0,0 @@
-# Changelog
-
-## Changes in 1.1.14
-
-#### Support for Apple Silicon
-- Fixed building on Apple Silicon Macbooks.
-
-#### Gym
-- OpenAI Gym environment wrappers were updated to the Gym v0.26 API version.
-
----
-
-## Changes in 1.1.13
-
-#### Releases
-- The pybind11 library and freedoom2.wad are now part of the source release instead of being downloaded during building.
-
-#### Consts
-- Added new consts: `DEFAULT_FPS` (= `DEFAULT_TICRATE`), `DEFAULT_FRAMETIME_S` (= `1.0 / DEFAULT_TICRATE`), `DEFAULT_FRAMETIME_MS` (= `DEFAULT_FRAMETIME_S * 1000`);
-
----
-
-## Changes in 1.1.12
-
-#### New OpenAI Gym wrapper
-- Added a new wrapper for OpenAI Gym.
-
----
-
-## Changes in 1.1.11
-
-#### Python
-- Fixed issues with installing/building Python package.
-
----
-
-## Changes in 1.1.10
-
-#### Python Bindings
-- Fixed support for Python 3.10
-- Removed dependency on Numpy and simplified the process of building Windows wheels.
-
-#### Input/output
-- Added support for tuples and ndarrays as arguments in many functions, where previously only lists were accepted.
-
----
-
-## Changes in 1.1.9
-
-#### Audio buffer
-- Added `audio_buffer` to `State` and related methods `is/setAudioBufferEnabled`, `get/setAudioSamplingRate`, `get/setAudioBufferSize`.
-
-#### Save/load methods
-- Added `save` and `load` methods that allow saving/loading game to/from a file.
-
-#### Misc
-- Added `viz_bots_path` CVAR that allows specifying path to custom bots configuration.
-
----
-
-## Changes in 1.1.8
-
-#### Objects and sectors
-- Added `is/setObjectsInfoEnabled`, `is/setSectorsInfoEnabled` methods to Python and C++ than enable information about all objects or/and sectors (map layout) present in the current episode/level.
-- Added `objects` and `sectors` fields to `GameState` in Python and C++.
-
-#### Config files
-- Added missing GameVariables introduced in 1.1.5 to Config parser.
-- Added missing GameVariables introduced in 1.1.7 to Config parser.
-- Added `objectsInfoEnabled/objects_info_enabled`
-
-#### Python, Java, Lua
-- Dropped support for Python 2.7
-- Dropped support for Java bindings
-- Dropped support for Lua/Torch bindings
-
----
-
-## Changes in 1.1.7
-
-#### Python & Julia
-- Added missing `is_multiplayer_game` method to Python and Julia binding.
-
-#### CVARS
-- Added `VIEW_HEIGHT`, `CAMERA_POSITION_X`/`Y`/`Z`, `CAMERA_ANGLE`, `CAMERA_PITCH`, `CAMERA_ROLL` and `CAMERA_FOV` GameVariables.
-
----
-
-## Changes in 1.1.6
-
-#### Julia specific
-- Julia binding added.
-
-#### Server state
-- Added `getServerState` method that returns `ServerState` object.
-
-#### Multiplayer
-- Added timeout for network game synchronization controlled by `viz_connect_timeout` CVAR.
-- Fixed `viz_spectator` CVAR.
-
-#### Python specific
-- Added Python interpreter version check.
-
----
-
-## Changes in 1.1.5
-
-#### Automap
-- Added `viz_am_scale` CVAR (CVAR version of `am_scale` CCMD).
-- Added `viz_am_center` CVAR (and `am_center` CCMD).
-
-#### Buttons and actions
-- **Added `getButton` method.**
-
-#### Episode recording and replaying
-- Added `isRecordingEpisode` and `isReplayingEpisode` methods.
-
-#### GameVariables
-- **`KILLCOUNT` counts all kills, including multilayer kills.**
-- **`HITCOUNT`, `HITS_TAKEN`, `DAMAGECOUNT`, `DAMAGE_TAKEN` game variables added.**
-
-#### Labels
-- **Added appending "Dead" prefix to label's name when actor is a corpse.**
-- **Added bounding box information to Label object in `x`, `y`, `width` and `height` fields.**
-- **Added `objectAngle`, `objectPitch`, `objectRoll`, `objectVelocityX/Y/Z` fields to Label object.**
-
-#### Windows specific
-- Fixed problem with building on Windows 8.1 and 10.
-- Added scripts for downloading freedoom2.wad and assembling Python packages.
-
-#### Rendering
-- Fixed minor rendering issue in depth and labels buffers.
-- Fixed order of color values in `RGB/BGR` modes of `ScreenFormat`.
-
----
-
-## Changes in 1.1.4
-
-#### Automap
-- Added `am_scale` CCMD.
-
-#### Scenarios
-- Fixed `KILLCOUNT` GameVariable for ChainsawMarine in `defend_the_center` and `deathmatch` scenarios.
-
-#### Python specific
-- **Ported Python binding to pybind11 as a replacement for Boost.Python.**
-- Fixed problems with `pip install` detecting Python interpreter, includes and libraries from different Python versions.
-
----
-
-## Changes in 1.1.3
-
-#### Rendering options
-- Added `setRenderScreenFlashes` and `setRenderAllFrames` methods.
-- Added `viz_ignore_render_mode` CVAR which disables overriding rendering settings.
-
-#### GameVariables
-- **Added `ANGLE`, `PITCH`, `ROLL`, `VELOCITY_X`/`Y`/`Z` GameVariables.**
-
-#### Missing config keys
-- Added support for `DEATHCOUNT`, `USER31` - `USER60`, `PLAYER_NUMBER`, `PLAYER_COUNT`, `PLAYER1_FRAGCOUNT` - `PLAYER16_FRAGCOUNT`, `POSITION_X`/`Y`/`Z` GameVariables in the config file.
-- Added support for `ALTATTACK` Button in the config file.
-
-#### Java specific
-- Fixed `makeAction`.
-- Added missing `POSITION_X`/`Y`/`Z` Game Variables.
-
-#### Python specific
-- Added manual GIL management for better performance when used with Python threads.
-
-#### Windows specific
-- Fixed building for Windows 10.
-
----
-
-## Changes in 1.1.2
-
-#### Multiplayer
-- Added `isMultiplayerGame` method.
-- Added `viz_respawn_delay` CVAR, which allows controlling the delay between respawns in multiplayer game.
-- Added `viz_spectator` CVAR which allows connecting to multiplayer game as a spectator.
-- **Maximum number of connected players raised to 16, `PLAYER9_FRAGCOUNT` - `PLAYER16_FRAGCOUNT` GameVariables added.**
-
-#### Missing methods
-- Added `isRunning`, `isDepthBufferEnabled`, `isLabelsBufferEnabled` and `isAutomapBufferEnabled` missing methods to Python and Lua bindings.
-
----
-
-## Changes in 1.1.1
-
-#### GameState
-- Added `tic` field.
-- `GameVariable.DEATHCOUNT` fixed.
-
-#### Lua specific
-- Fixed crash when calling `getState` in a terminal state.
-
-#### Python specific
-- Fixed minor memory leak
-- Fixed crash when calling `getState` in a terminal state.
-
----
-
-## Changes in 1.1.0
-
-#### Buffers
-
-- Depth buffer is now a separate buffer in state and `ScreenFormat` values with it were removed - `is/setDepthBufferEnabled` added.
-- Added in frame actors labeling feature -`is/setLabelsBufferEnabled` added.
-- Added buffer with in game automap - `is/setAutomapBufferEnabled`, `setAutomapMode`, `setAutomapRoate`, `setAutomapRenderTextures`, `AutomapMode` enum added.
-
-
-#### GameState
-
-- `getState` will now return `nullptr/null/None` if game is in the terminal state.
-- `imageBuffer` renamed to `screenBuffer`.
-- Added `depthBuffer`, `labelsBuffer` and `automapBuffer` and `labels` fields.
-
-
-#### Rendering options
-
-- The option to use minimal hud instead of default full hud - `setRenderMinimalHud` added.
-- The option to enable/disable effects that use sprites - `setRenderEffectsSprites` added.
-- The option to enable/disable in game messages independently of the console output - `setRenderMessages` added.
-- The option to enable/disable corpses - `setRenderCorpses` added.
-
-
-#### Episode recording and replaying
-
-- The option to record and replay episodes, based on adapted ZDoom's demo mechanism -
-recording `filePath` argument added to `newEpisode`, `replayEpisode` added.
-- The option to replay demo from other players' perspective.
-
-
-#### Ticrate
-
-- The option to set number of tics executed per second in ASNYC Modes.
-- New `ticrate` optional argument in `doomTicsToMs`, `msToDoomTics`.
-- `doomTicsToSec` and `secToDoomTics` added.
-
-
-#### Paths
-
-- **Paths in config files are now relative to config file.**
-- setting **vizdoom_path** and **doom_game_path** is no longer needed - they default to location(installation) of vizdoom.so.
-
-
-#### Others
-
-- ZDoom engine updated to 2.8.1.
-- **Basic support for multiplayer in PLAYER and SPECTATOR Modes.**
-- Improved exceptions messages.
-- Bugs associated with paths handling were fixed.
-- Many minor bugs were fixed.
-- Possibility to change scenario wad during runtime (only first map from WAD file).
-- Added `viz_debug` CVAR to control some diagnostic messages.
-
-
-#### C++ specific
-
-- A lot of overloaded methods turned into a methods with default arguments.
-- `getState()` now returns `GameStatePtr (std::shared_ptr)` instead of `GameState`.
-- Buffers are now copied.
-- GameState's buffer has now `ImageBufferPtr (std::shared_ptr)` type - `Buffer (std::vector)`.
-- GameState's gameVariables are now vector of doubles instead of ints.
-
-
-#### Lua specific
-
-- Lua binding added.
-- Support for LuaRocks installation for Linux and MacOS.
-
-
-#### Java specific
-
-- GameState buffers type changed to byte[].
-- Performance improved.
-- Java exceptions handling fixed.
-- Few functions fixed.
-
-
-#### Python specific
-
-- Consts added to Python.
-- Aliases for `doom_fixed_to_double` - `doom_fixed_to_float` added.
-- Support for pip installation for Linux and MacOS.
diff --git a/doc/DoomGame.md b/doc/DoomGame.md
deleted file mode 100644
index e8ee8859b..000000000
--- a/doc/DoomGame.md
+++ /dev/null
@@ -1,1619 +0,0 @@
-# DoomGame
-
-## [Flow control methods](#flow)
-* [init](#init)
-* [close](#close)
-* [newEpisode](#newEpisode)
-* [replayEpisode](#replayEpisode)
-* [isRunning](#isRunning)
-* [isMultiplayerGame](#isMultiplayerGame)
-* [isRecordingEpisode](#isRecordingEpisode)
-* [isReplayingEpisode](#isReplayingEpisode)
-* [setAction](#setAction)
-* [advanceAction](#advanceAction)
-* [makeAction](#makeAction)
-* [isNewEpisode](#isNewEpisode)
-* [isEpisodeFinished](#isEpisodeFinished)
-* [isPlayerDead](#isPlayerDead)
-* [respawnPlayer](#respawnPlayer)
-* [sendGameCommand](#sendGameCommand)
-* [getState](#getState)
-* [getServerState](#getServerState)
-* [getLastAction](#getLastAction)
-* [getEpisodeTime](#getEpisodeTime)
-* [save](#save)
-* [load](#load)
-
-## [Buttons settings methods](#buttons)
-* [getAvailableButtons](#getAvailableButtons)
-* [setAvailableButtons](#setAvailableButtons)
-* [addAvailableButton](#addAvailableButton)
-* [clearAvailableButtons](#clearAvailableButtons)
-* [getAvailableButtonsSize](#getAvailableButtonsSize)
-* [setButtonMaxValue](#setButtonMaxValue)
-* [getButtonMaxValue](#getButtonMaxValue)
-* [getButton](#getButton)
-
-## [GameVariables methods](#vars)
-* [getAvailableGameVariables](#getAvailableGameVariables)
-* [setAvailableGameVariables](#setAvailableGameVariables)
-* [addAvailableGameVariable](#addAvailableGameVariable)
-* [clearAvailableGameVariables](#clearAvailableGameVariables)
-* [getAvailableGameVariablesSize](#getAvailableGameVariablesSize)
-* [getGameVariable](#getGameVariable)
-
-## [Game Arguments methods](#args)
-* [addGameArgs](#addGameArgs)
-* [clearGameArgs](#clearGameArgs)
-
-## [Rewards methods](#rewards)
-* [getLivingReward](#getLivingReward)
-* [setLivingReward](#setLivingReward)
-* [getDeathPenalty](#getDeathPenalty)
-* [setDeathPenalty](#setDeathPenalty)
-* [getLastReward](#getLastReward)
-* [getTotalReward](#getTotalReward)
-
-## [General game configuration methods](#settings)
-* [loadConfig](#loadConfig)
-* [getMode](#getMode)
-* [setMode](#setMode)
-* [getTicrate](#getTicrate)
-* [setTicrate](#setTicrate)
-* [setViZDoomPath](#setViZDoomPath)
-* [setDoomGamePath](#setDoomGamePath)
-* [setDoomScenarioPath](#setDoomScenarioPath)
-* [setDoomMap](#setDoomMap)
-* [setDoomSkill](#setDoomSkill)
-* [setDoomConfigPath](#setDoomConfigPath)
-* [getSeed](#getSeed)
-* [setSeed](#setSeed)
-* [getEpisodeStartTime](#getEpisodeStartTime)
-* [setEpisodeStartTime](#setEpisodeStartTime)
-* [getEpisodeTimeout](#getEpisodeTimeout)
-* [setEpisodeTimeout](#setEpisodeTimeout)
-
-## [Output/rendering setting methods](#rendering)
-* [setScreenResolution](#setScreenResolution)
-* [getScreenFormat](#getScreenFormat)
-* [setScreenFormat](#setScreenFormat)
-* [isDepthBufferEnabled](#isDepthBufferEnabled)
-* [setDepthBufferEnabled](#setDepthBufferEnabled)
-* [isLabelsBufferEnabled](#isLabelsBufferEnabled)
-* [setLabelsBufferEnabled](#setLabelsBufferEnabled)
-* [isAutomapBufferEnabled](#isAutomapBufferEnabled)
-* [setAutomapBufferEnabled](#setAutomapBufferEnabled)
-* [setAutomapMode](#setAutomapMode)
-* [setAutomapRotate](#setAutomapRotate)
-* [setAutomapRenderTextures](#setAutomapRenderTextures)
-* [setRenderHud](#setRenderHud)
-* [setRenderMinimalHud](#setRenderMinimalHud)
-* [setRenderWeapon](#setRenderWeapon)
-* [setRenderCrosshair](#setRenderCrosshair)
-* [setRenderDecals](#setRenderDecals)
-* [setRenderParticles](#setRenderParticles)
-* [setRenderEffectsSprites](#setRenderEffectsSprites)
-* [setRenderMessages](#setRenderMessages)
-* [setRenderCorpses](#setRenderCorpses)
-* [setRenderScreenFlashes](#setRenderScreenFlashes)
-* [setRenderAllFrames](#setRenderAllFrames)
-* [setWindowVisible](#setWindowVisible)
-* [setConsoleEnabled](#setConsoleEnabled)
-* [setSoundEnabled](#setSoundEnabled)
-* [getScreenWidth](#getScreenWidth)
-* [getScreenHeight](#getScreenHeight)
-* [getScreenChannels](#getScreenChannels)
-* [getScreenPitch](#getScreenPitch)
-* [getScreenSize](#getScreenSize)
-* [isObjectsInfoEnabled](#isObjectsInfoEnabled)
-* [setObjectsInfoEnabled](#setObjectsInfoEnabled)
-* [isSectorsInfoEnabled](#isSectorsInfoEnabled)
-* [setSectorsInfoEnabled](#setSectorsInfoEnabled)
-* [isAudioBufferEnabled](#isAudioBufferEnabled)
-* [setAudioBufferEnabled](#setAudioBufferEnabled)
-* [getAudioSamplingFreq](#getAudioSamplingFreq)
-* [setAudioSamplingFreq](#setAudioSamplingFreq)
-* [getAudioBufferSize](#getAudioBufferSize)
-* [setAudioBufferSize](#setAudioBufferSize)
-
-
-## Flow control methods:
-
----
-### `init`
-
-| C++ | `bool init()` |
-| :-- | :-- |
-| Python | `bool init()` |
-
-Initializes ViZDoom game instance and starts a new episode.
-After calling this method, the first state from a new episode will be available.
-Some configuration options cannot be changed after calling this method.
-Init returns true when the game was started properly and false otherwise.
-
-
----
-### `close`
-
-| C++ | `void close()` |
-| :-- | :-- |
-| Python | `void close()` |
-
-Closes ViZDoom game instance.
-It is automatically invoked by the destructor.
-The game can be initialized again after being closed.
-
-
----
-### `newEpisode`
-
-| C++ | `void newEpisode(std::string recordFilePath = "")` |
-| :-- | :-- |
-| Python | `void new_episode(str recordFilePath = "")` |
-
-Changed in 1.1.0
-
-Initializes a new episode. The state of an environment is completely restarted (all variables and rewards are reset to their initial values).
-After calling this method, the first state from the new episode will be available.
-If the `recordFilePath` is not empty, the new episode will be recorded to this file (as a Doom lump).
-
-In a multiplayer game, the host can call this method to finish the game.
-Then the rest of the players must also call this method to start a new episode.
-
-
----
-### `replayEpisode`
-
-| C++ | `void replayEpisode(std::string filePath, unsigned int player = 0)` |
-| :-- | :-- |
-| Python | `void replay_episode(str filePath, int player = 0)` |
-
-Added in 1.1.0
-
-Replays a recorded episode from the given file using the perspective of the specified player.
-Players are numbered from 1, `player` equal to 0 results in replaying the demo using the perspective of the default player in the recording file.
-After calling this method, the first state from the replay will be available.
-All rewards, variables, and states are available during the replaying episode.
-
-See also:
-- [examples/python/record_episodes.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/record_episodes.py)
-- [examples/python/record_multiplayer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/record_multiplayer.py)
-
-
----
-### `isRunning`
-
-| C++ | `bool isRunning()` |
-| :-- | :-- |
-| Python | `bool is_running()` |
-
-Checks if the ViZDoom game instance is running.
-
-
----
-### `isMultiplayerGame`
-
-| C++ | `bool isMultiplayerGame()` |
-| :-- | :-- |
-| Python | `bool is_multiplayer_game()` |
-
-Added in 1.1.2
-
-Checks if the game is in multiplayer mode.
-
-
----
-### `isRecordingEpisode`
-
-| C++ | `bool isRecordingEpisode()` |
-| :-- | :-- |
-| Python | `bool is_recording_episode()` |
-
-Added in 1.1.5
-
-Checks if the game is in recording mode.
-
-
----
-### `isReplayingEpisode`
-
-| C++ | `bool isReplayingEpisode()` |
-| :-- | :-- |
-| Python | `bool is_replaying_episode()` |
-
-Added in 1.1.5
-
-Checks if the game is in replaying mode.
-
-
----
-### `setAction`
-
-| C++ | `void setAction(std::vector const &actions)` |
-| :-- | :-- |
-| Python | `void set_action(list actions)` |
-
-Sets the player's action for the next tics.
-Each value corresponds to a button specified with [`addAvailableButton`](#addAvailableButton) method
-or in the configuration file (in order of appearance).
-
-
----
-### `advanceAction`
-
-| C++ | `void advanceAction(unsigned int tics = 1, bool updateState = true)` |
-| :-- | :-- |
-| Python | `void advance_action(int tics = 1, bool updateState = True)` |
-
-Processes a specified number of tics. If `updateState` is set,
-the state will be updated after the last processed tic and a new reward will be calculated.
-To get the new state, use `getState` and to get the new reward use `getLastReward`.
-If `updateState` is not set, the state will not be updated.
-
-
----
-### `makeAction`
-
-| C++ | `double makeAction(std::vector const &actions, unsigned int tics = 1)` |
-| :-- | :-- |
-| Python | `float make_action(list actions, int tics = 1)` |
-
-Method combining usability of [`setAction`](#setAction), [`advanceAction`](#advanceAction) and [`getLastReward`](#getLastReward).
-Sets the player's action for the next tics, processes a specified number of tics,
-updates the state and calculates a new reward, which is returned.
-
-
----
-### `isNewEpisode`
-
-| C++ | `bool isNewEpisode()` |
-| :-- | :-- |
-| Python | `bool is_new_episode()` |
-
-Returns true if the current episode is in the initial state - the first state, no actions were performed yet.
-
-
----
-### `isEpisodeFinished`
-
-| C++ | `bool isEpisodeFinished()` |
-| :-- | :-- |
-| Python | `bool is_episode_finished()` |
-
-Returns true if the current episode is in the terminal state (is finished).
-[`makeAction`](#makeAction) and [`advanceAction`](#advanceAction) methods will take no effect after this point (unless [`newEpisode`](#newEpisode) method is called).
-
-
----
-### `isPlayerDead`
-
-| C++ | `bool isPlayerDead()` |
-| :-- | :-- |
-| Python | `bool is_player_dead()` |
-
-Returns true if the player is dead.
-In singleplayer, the player's death is equivalent to the end of the episode.
-In multiplayer, when the player is dead [`respawnPlayer`](#respawnPlayer) method can be called.
-
-
----
-### `respawnPlayer`
-
-| C++ | `void respawnPlayer()` |
-| :-- | :-- |
-| Python | `void respawn_player()` |
-
-This method respawns the player after death in multiplayer mode.
-After calling this method, the first state after the respawn will be available.
-
-See also:
-- [`isMultiplayerGame`](#isMultiplayerGame)
-
-
----
-### `sendGameCommand`
-
-| C++ | `void sendGameCommand(std::string cmd)` |
-| :-- | :-- |
-| Python | `void send_game_command(str cmd)` |
-
-Sends the command to Doom console. It can be used for controlling the game, changing settings, cheats, etc.
-Some commands will be blocked in some modes.
-
-See also:
-- [ZDoom Wiki: Console](http://zdoom.org/wiki/Console)
-- [ZDoom Wiki: CVARs (console variables)](https://zdoom.org/wiki/CVARs)
-- [ZDoom Wiki: CCMD (console commands)](https://zdoom.org/wiki/CCMDs)
-
-
----
-### `getState`
-
-| C++ | `GameStatePtr (std::shared_ptr) GameState getState()` |
-| :-- | :-- |
-| Python | `GameState get_state()` |
-
-Changed in 1.1.0
-
-Returns [`GameState`](Types.md#gamestate) object with the current game state.
-If the current episode is finished, `nullptr/null/None` will be returned.
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-
-
----
-### `getServerState`
-
-| C++ | `ServerStatePtr (std::shared_ptr) ServerState getServerState()` |
-| :-- | :-- |
-| Python | `ServerState get_state_state()` |
-
-Added in 1.1.6
-
-Returns [`ServerState`](Types.md#serverstate) object with the current server state.
-
-See also:
-- [`Types: ServerState`](Types.md#serverstate)
-
-
----
-### `getLastAction`
-
-| C++ | `std::vector getLastAction()` |
-| :-- | :-- |
-| Python | `list get_last_action()` |
-
-Returns the last action performed.
-Each value corresponds to a button added with `[addAvailableButton](#addAvailableButton)` (in order of appearance).
-Most useful in `SPECTATOR` mode.
-
-
----
-### `getEpisodeTime`
-
-| C++ | `unsigned int getEpisodeTime()` |
-| :-- | :-- |
-| Python | `int get_episode_time()` |
-
-Returns number of current episode tic.
-
-
----
-### `save`
-
-| C++ | `void save(std::string filePath)` |
-| :-- | :-- |
-| Python | `void save(str filePath)` |
-
-Added in 1.1.9
-
-Saves a game's internal state to the file using ZDoom's save game functionality.
-
-
----
-### `load`
-
-| C++ | `void load(std::string filePath)` |
-| :-- | :-- |
-| Python | `void load(str filePath)` |
-
-Added in 1.1.9
-
-Loads a game's internal state from the file using ZDoom's load game functionality.
-A new state is available after loading.
-Loading the game state does not reset the current episode state,
-tic counter/time and total reward state keep their values.
-
-
-## Buttons settings methods
-
----
-### `getAvailableButtons`
-
-| C++ | `std::vector getAvailableButtons()` |
-| :-- | :-- |
-| Python | `list get_available_buttons()` |
-
-Returns the list of available `Buttons`.
-
-See also:
-- [`Types: Button`](Types.md#button)
-- [`addAvailableButton`](#addAvailableButton)
-- [`setAvailableButtons`](#addAvailableButtons)
-
-
----
-### `setAvailableButtons`
-
-| C++ | `void setAvailableButtons(std::vector buttons)` |
-| :-- | :-- |
-| Python | `void add_available_button(list)` |
-
-Set given list of `Button`s (e.g. `TURN_LEFT`, `MOVE_FORWARD`) as available `Buttons`,
-
-Config key: `availableButtons/available_buttons` (list)
-
-See also:
-- [`Types: Button`](Types.md#button)
-- [`ConfigFile: List`](ConfigFile.md#list)
-- [`addAvailableButton`](#addAvailableButton)
-
-
----
-### `addAvailableButton`
-
-| C++ | `void addAvailableButton(Button button, double maxValue = 0)` |
-| :-- | :-- |
-| Python | `void add_available_button(Button button, float maxValue = 0)` |
-
-Add [`Button`](Types.md#button) type (e.g. `TURN_LEFT`, `MOVE_FORWARD`) to available `Buttons` and sets the maximum allowed, absolute value for the specified button.
-If the given button has already been added, it will not be added again, but the maximum value is overridden.
-
-Config key: `availableButtons/available_buttons` (list)
-
-See also:
-- [`Types: Button`](Types.md#button)
-- [`ConfigFile: List`](ConfigFile.md#list)
-- [`setAvailableButtons`](#addAvailableButtons)
-- [`setButtonMaxValue`](#setButtonMaxValue)
-
-
----
-### `clearAvailableButtons`
-
-| C++ | `void clearAvailableButtons()` |
-| :-- | :-- |
-| Python | `void clear_available_buttons()` |
-
-Clears all available `Buttons` added so far.
-
-See also:
-- [`Types: Button`](Types.md#button)
-
-
----
-### `getAvailableButtonsSize`
-
-| C++ | `int getAvailableButtonsSize()` |
-| :-- | :-- |
-| Python | `int get_available_buttons_size()` |
-
-Returns the number of available `Buttons`.
-
-See also:
-- [`Types: Button`](Types.md#button)
-
-
----
-### `setButtonMaxValue`
-
-| C++ | `void setButtonMaxValue(Button button, double maxValue = 0)` |
-| :-- | :-- |
-| Python | `void set_button_max_value(Button button, float maxValue = 0)` |
-
-Sets the maximum allowed absolute value for the specified button.
-Setting the maximum value to 0 results in no constraint at all (infinity).
-This method makes sense only for delta buttons.
-The constraints limit applies in all Modes.
-
-See also:
-- [`Types: Button`](Types.md#button)
-
-
----
-### `getButtonMaxValue`
-
-| C++ | `unsigned int getButtonMaxValue(Button button)` |
-| :-- | :-- |
-| Python | `int get_button_max_value(Button button)` |
-
-Returns the maximum allowed absolute value for the specified button.
-
-See also:
-- [`Types: Button`](Types.md#button)
-
-
----
-### `getButton`
-
-| C++ | `double getButton(Button button)` |
-| :-- | :-- |
-| Python | `float get_button(Button button)` |
-
-Returns the current state of the specified button (`ATTACK`, `USE` etc.).
-
-See also:
-- [`Types: Button`](Types.md#button)
-
-
-## GameVariables methods
-
----
-### `getAvailableGameVariables`
-
-| C++ | `std::vector getAvailableGameVariables()` |
-| :-- | :-- |
-| Python | `list get_available_game_variables()` |
-
-Returns the list of available `GameVariables`.
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-- [`addAvailableGameVariable`](#addAvailableGameVariable)
-- [`setAvailableGameVariables`](#setAvailableGameVariables)
-
-
----
-### `setAvailableGameVariables`
-
-| C++ | `void setAvailableGameVariables(std::vector variables)` |
-| :-- | :-- |
-| Python | `void set_available_game_variables(list variables)` |
-
-Set list of [`GameVariable`](Types.md#gamevariable) as available `GameVariables` in the [`GameState`](Types.md#gamestate) returned by `getState` method.
-
-Config key: `availableGameVariables/available_game_variables` (list)
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-- [`ConfigFile: List`](ConfigFile.md#list)
-- [`addAvailableGameVariable`](#addAvailableGameVariable)
-
-
----
-### `addAvailableGameVariable`
-
-| C++ | `void addAvailableGameVariable(GameVariable variable)` |
-| :-- | :-- |
-| Python | `void add_available_game_variable(GameVariable variable)` |
-
-Adds the specified [`GameVariable`](Types.md#gamevariable) to the list of available game variables (e.g. `HEALTH`, `AMMO1`, `ATTACK_READY`) in the [`GameState`](Types.md#gamestate) returned by `getState` method.
-
-Config key: `availableGameVariables/available_game_variables` (list)
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-- [`ConfigFile: List`](ConfigFile.md#list)
-- [`setAvailableGameVariables`](#setAvailableGameVariables)
-
-
----
-### `clearAvailableGameVariables`
-
-| C++ | `void clearAvailableGameVariables()` |
-| :-- | :-- |
-| Python | `void clear_available_game_variables()` |
-
-Clears the list of available `GameVariables` that are included in the GameState returned by [`getState`](#getState) method.
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-- [`ConfigFile: List`](ConfigFile.md#list)
-
-
----
-### `getAvailableGameVariablesSize`
-
-| C++ | `unsigned int getAvailableGameVariablesSize()` |
-| :-- | :-- |
-| Python | `int get_available_game_variables_size()` |
-
-Returns the number of available `GameVariables`.
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-- [`ConfigFile: List`](ConfigFile.md#list)
-
-
----
-### `getGameVariable`
-
-| C++ | `double getGameVariable(GameVariable variable)` |
-| :-- | :-- |
-| Python | `float get_game_variable(GameVariable variable)` |
-
-Returns the current value of the specified game variable (`HEALTH`, `AMMO1` etc.).
-The specified game variable does not need to be among available game variables (included in the state).
-It could be used for e.g. shaping. Returns 0 in case of not finding given `GameVariable`.
-
-See also:
-- [`Types: GameVariable`](Types.md#gamevariable)
-
-
-## Game Arguments methods
-
----
-### `addGameArgs`
-
-| C++ | `void addGameArgs(std::string args)` |
-| :-- | :-- |
-| Python | `void add_game_args(str args)` |
-
-Adds a custom argument that will be passed to ViZDoom process during initialization.
-Useful for changing additional game settings.
-
-Config key: `gameArgs/game_args`
-
-See also:
-- [ZDoom Wiki: Command line parameters](http://zdoom.org/wiki/Command_line_parameters)
-- [ZDoom Wiki: CVARs (Console Variables)](http://zdoom.org/wiki/CVARS)
-
-
----
-### `clearGameArgs`
-
-| C++ | `void clearGameArgs()` |
-| :-- | :-- |
-| Python | `void clear_game_args()` |
-
-Clears all arguments previously added with [`addGameArgs`](#addGameArgs) method.
-
-
-## Reward methods
-
----
-### `getLivingReward`
-
-| C++ | `double getLivingReward()` |
-| :-- | :-- |
-| Python | `double get_living_reward()` |
-
-Returns the reward granted to the player after every tic.
-
-
----
-### `setLivingReward`
-
-| C++ | `void setLivingReward(double livingReward)` |
-| :-- | :-- |
-| Python | `void set_living_reward(float livingReward)` |
-
-Sets the reward granted to the player after every tic. A negative value is also allowed.
-
-Default value: 0
-
-Config key: `livingReward/living_reward`
-
-
----
-### `getDeathPenalty`
-
-| C++ | `double getDeathPenalty()` |
-| :-- | :-- |
-| Python | `double get_death_penalty()` |
-
-Returns the penalty for the player's death.
-
-
----
-### `setDeathPenalty`
-
-| C++ | `void setDeathPenalty(double deathPenalty)` |
-| :-- | :-- |
-| Python | `void set_death_penalty(float deathPenalty)` |
-
-Sets a penalty for the player's death. Note that in case of a negative value, the player will be rewarded upon dying.
-
-Default value: 0
-
-Config key: `deathPenalty/death_penalty`
-
-
----
-### `getLastReward`
-
-| C++ | `double getLastReward()` |
-| :-- | :-- |
-| Python | `float get_last_reward()` |
-
-Returns a reward granted after the last update of state.
-
-
----
-### `getTotalReward`
-
-| C++ | `double getTotalReward()` |
-| :-- | :-- |
-| Python | `float get_total_reward()` |
-
-Returns the sum of all rewards gathered in the current episode.
-
-
-## General game setting methods
-
----
-### `loadConfig`
-
-| C++ | `bool loadConfig(std::string filePath)` |
-| :-- | :-- |
-| Python | `bool load_config(str filePath)` |
-
-Loads configuration (resolution, available buttons, game variables etc.) from a configuration file.
-In case of multiple invocations, older configurations will be overwritten by the recent ones.
-Overwriting does not involve resetting to default values. Thus only overlapping parameters will be changed.
-The method returns true if the whole configuration file was correctly read and applied,
-false if the file contained errors.
-
-See also:
-- [ConfigFile](ConfigFile.md)
-
-
----
-### `getMode`
-
-| C++ | `Mode getMode()` |
-| :-- | :-- |
-| Python | `Mode get_mode()` |
-
-Returns current mode.
-
-
----
-### `setMode`
-
-| C++ | `void setMode(Mode mode)` |
-| :-- | :-- |
-| Python | `void set_mode(Mode mode)` |
-
-Sets mode (`PLAYER`, `SPECTATOR`, `ASYNC_PLAYER`, `ASYNC_SPECTATOR`) in which the game will be running.
-
-Default value: `PLAYER`.
-
-Config key: `mode`
-
-See also:
-- [`Types: Mode`](Types.md#mode)
-
-
----
-### `getTicrate`
-
-| C++ | `unsigned int getTicrate()` |
-| :-- | :-- |
-| Python | `int get_ticrate()` |
-
-Added in 1.1.0
-
-Returns current ticrate.
-
-
----
-### `setTicrate`
-
-| C++ | `void setTicrate(unsigned int ticrate)` |
-| :-- | :-- |
-| Python | `void set_ticrate(int ticrate)` |
-
-Added in 1.1.0
-
-Sets ticrate for ASNYC Modes - number of logic tics executed per second.
-The default Doom ticrate is 35. This value will play a game at normal speed.
-
-Default value: 35 (default Doom ticrate).
-
-Config key: `ticrate`
-
-See also:
-- [examples/python/ticrate.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/ticrate.py)
-
-
----
-### `setViZDoomPath`
-
-| C++ | `void setViZDoomPath(std::string filePath)` |
-| :-- | :-- |
-| Python | `void set_vizdoom_path(str filePath)` |
-
-Sets path to the ViZDoom engine executable vizdoom.
-
-Default value: "{vizdoom.so location}/{vizdoom or vizdoom.exe (on Windows)}".
-
-Config key: `ViZDoomPath/vizdoom_path`
-
-
----
-### `setDoomGamePath`
-
-| C++ | `void setDoomGamePath(std::string filePath)` |
-| :-- | :-- |
-| Python | `void set_doom_game_path(str filePath)` |
-
-Sets the path to the Doom engine based game file (wad format).
-If not used DoomGame will look for doom2.wad and freedoom2.wad (in that order) in the directory of ViZDoom's installation (where vizdoom.so/pyd is).
-
-Default value: "{vizdoom.so location}/{doom2.wad, doom.wad, freedoom2.wad or freedoom.wad}"
-
-Config key: `DoomGamePath/doom_game_path`
-
-
----
-### `setDoomScenarioPath`
-
-| C++ | `void setDoomScenarioPath(std::string filePath)` |
-| :-- | :-- |
-| Python | `void set_doom_scenario_path(str filePath)` |
-
-Sets the path to an additional scenario file (wad format).
-If not provided, the default Doom single-player maps will be loaded.
-
-Default value: ""
-
-Config key: `DoomScenarioPath/set_doom_scenario_path`
-
-
----
-### `setDoomMap`
-
-| C++ | `void setDoomMap(std::string map)` |
-| :-- | :-- |
-| Python | `void set_doom_map(str map)` |
-
-Sets the map name to be used.
-
-Default value: "map01", if set to empty "map01" will be used.
-
-Config key: `DoomMap/doom_map`
-
-
----
-### `setDoomSkill`
-
-| C++ | `void setDoomSkill(int skill)` |
-| :-- | :-- |
-| Python | `void set_doom_skill(int skill)` |
-
-Sets Doom game difficulty level, which is called skill in Doom.
-The higher the skill, the harder the game becomes.
-Skill level affects monsters' aggressiveness, monsters' speed, weapon damage, ammunition quantities, etc.
-Takes effect from the next episode.
-
-- 1 - VERY EASY, “I'm Too Young to Die” in Doom.
-- 2 - EASY, “Hey, Not Too Rough" in Doom.
-- 3 - NORMAL, “Hurt Me Plenty” in Doom.
-- 4 - HARD, “Ultra-Violence” in Doom.
-- 5 - VERY HARD, “Nightmare!” in Doom.
-
-Default value: 3
-
-Config key: `DoomSkill/doom_skill`
-
-
----
-### `setDoomConfigPath`
-
-| C++ | `void setDoomConfigPath(std::string filePath)` |
-| :-- | :-- |
-| Python | `void set_doom_config_path(str filePath)` |
-
-Sets the path for ZDoom's configuration file.
-The file is responsible for the configuration of the ZDoom engine itself.
-If it does not exist, it will be created after the `vizdoom` executable is run.
-This method is not needed for most of the tasks and is added for the convenience of users with hacking tendencies.
-
-Default value: "", if left empty "_vizdoom.ini" will be used.
-
-Config key: `DoomConfigPath/doom_config_path`
-
-
----
-### `getSeed`
-
-| C++ | `unsigned int getSeed()` |
-| :-- | :-- |
-| Python | `int getSeed()` |
-
-Return ViZDoom's seed.
-
-
----
-### `setSeed`
-
-| C++ | `void setSeed(unsigned int seed)` |
-| :-- | :-- |
-| Python | `void set_seed(int seed)` |
-
-Sets the seed of the ViZDoom's RNG that generates seeds (initial state) for episodes.
-
-Default value: randomized in constructor
-
-Config key: `seed`
-
-See also:
-- [examples/python/seed.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/seed.py)
-
-
-
----
-### `getEpisodeStartTime`
-
-| C++ | `unsigned int getEpisodeStartTime()` |
-| :-- | :-- |
-| Python | `int get_episode_start_time()` |
-
-Returns start delay of every episode in tics.
-
-
----
-### `setEpisodeStartTime`
-
-| C++ | `void setEpisodeStartTime(unsigned int tics)` |
-| :-- | :-- |
-| Python | `void set_episode_start_time(int tics)` |
-
-Sets start delay of every episode in tics.
-Every episode will effectively start (from the user's perspective) after the provided number of tics.
-
-Default value: 1
-
-Config key: `episodeStartTime/episode_start_time`
-
-
----
-### `getEpisodeTimeout`
-
-| C++ | `unsigned int getEpisodeTimeout()` |
-| :-- | :-- |
-| Python | `int get_episode_timeout()` |
-
-Returns the number of tics after which the episode will be finished.
-
-
----
-### `setEpisodeTimeout`
-
-| C++ | `void setEpisodeTimeout(unsigned int tics)` |
-| :-- | :-- |
-| Python | `void set_episode_timeout(int tics)` |
-
-Sets the number of tics after which the episode will be finished. 0 will result in no timeout.
-
-Config key: `episodeTimeout/episode_timeout`
-
-
-## Output/rendering setting methods
-------------------------------------------------------------------------------------------------------------
-
----
-### `setScreenResolution`
-
-| C++ | `void setScreenResolution(ScreenResolution resolution)` |
-| :-- | :-- |
-| Python | `void set_screen_resolution(ScreenResolution resolution)` |
-
-Sets the screen resolution. ZDoom engine supports only specific resolutions.
-Supported resolutions are part of ScreenResolution enumeration (e.g., `RES_320X240`, `RES_640X480`, `RES_1920X1080`).
-The buffers, as well as the content of ViZDoom's display window, will be affected.
-
-Default value: `RES_320X240`
-
-Config key: `screenResolution/screen_resolution`
-
-
-See also:
-- [`Types: ScreenResolution`](Types.md#screenresolution)
-
-
----
-### `getScreenFormat`
-
-| C++ | `ScreenFormat getScreenFormat()` |
-| :-- | :-- |
-| Python | `ScreenFormat get_screen_format()` |
-
-Returns the format of the screen buffer and the automap buffer.
-
-
----
-### `setScreenFormat`
-
-| C++ | `void setScreenFormat(ScreenFormat format)` |
-| :-- | :-- |
-| Python | `void set_screen_format(ScreenFormat format)` |
-
-Sets the format of the screen buffer and the automap buffer.
-Supported formats are defined in `ScreenFormat` enumeration type (e.g. `CRCGCB`, `RGB24`, `GRAY8`).
-The format change affects only the buffers, so it will not have any effect on the content of ViZDoom's display window.
-
-Default value: `CRCGCB`
-
-Config key: `screenFormat/screen_format`
-
-See also:
-- [`Types: ScreenFormat`](Types.md#screenformat)
-
-
----
-### `isDepthBufferEnabled`
-
-| C++ | `bool isDepthBufferEnabled()` |
-| :-- | :-- |
-| Python | `bool isDepthBufferEnabled()` |
-
-Added in 1.1.0
-
-Returns true if the depth buffer is enabled.
-
-
----
-### `setDepthBufferEnabled`
-
-| C++ | `void setDepthBufferEnabled(bool depthBuffer)` |
-| :-- | :-- |
-| Python | `void set_depth_buffer_enabled(bool depthBuffer)` |
-
-Added in 1.1.0
-
-Enables rendering of the depth buffer, it will be available in the state.
-Depth buffer will contain noise if `viz_nocheat` is enabled.
-
-Default value: false
-
-Config key: `depthBufferEnabled/depth_buffer_enabled`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py)
-
-
----
-### `isLabelsBufferEnabled`
-
-| C++ | `bool isLabelsBufferEnabled()` |
-| :-- | :-- |
-| Python | `bool isLabelsBufferEnabled()` |
-
-Added in 1.1.0
-
-Returns true if the labels buffer is enabled.
-
-
----
-### `setLabelsBufferEnabled`
-
-| C++ | `void setLabelsBufferEnabled(bool labelsBuffer)` |
-| :-- | :-- |
-| Python | `void set_labels_buffer_enabled(bool labelsBuffer)` |
-
-Added in 1.1.0
-
-Enables rendering of the labels buffer, it will be available in the state with the vector of `Label`s.
-LabelsBuffer will contain noise if `viz_nocheat` is enabled.
-
-Default value: false
-
-Config key: `labelsBufferEnabled/labels_buffer_enabled`
-
-See also:
-- [`Types: Label`](Types.md#label)
-- [`Types: GameState`](Types.md#gamestate)
-- [examples/python/labels.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/labels.py)
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py)
-
-
----
-### `isAutomapBufferEnabled`
-
-| C++ | `bool isAutomapBufferEnabled()` |
-| :-- | :-- |
-| Python | `bool is_automap_buffer_enabled()` |
-
-Added in 1.1.0
-
-Returns true if the automap buffer is enabled.
-
-
----
-### `setAutomapBufferEnabled`
-
-| C++ | `void setAutomapBufferEnabled(bool automapBuffer)` |
-| :-- | :-- |
-| Python | `void set_automap_buffer_enabled(bool automapBuffer)` |
-
-Added in 1.1.0
-
-Enables rendering of the automap buffer, it will be available in the state.
-
-Default value: false
-
-Config key: `automapBufferEnabled/automap_buffer_enabled`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py),
-
-
----
-### `setAutomapMode`
-
-| C++ | `void setAutomapMode(AutomapMode mode)` |
-| :-- | :-- |
-| Python | `void set_automap_mode(AutomapMode mode)` |
-
-Added in 1.1.0
-
-Sets the automap mode (`NORMAL`, `WHOLE`, `OBJECTS`, `OBJECTS_WITH_SIZE`),
-which determines what will be visible on it.
-
-Default value: `NORMAL`
-
-Config key: `automapMode/set_automap_mode`
-
-See also:
-- [`Types: AutomapMode`](Types.md#automapmode)
-
-
----
-### `setAutomapRotate`
-
-| C++ | `void setAutomapRotate(bool rotate)` |
-| :-- | :-- |
-| Python | `void set_automap_rotate(bool rotate)` |
-
-Added in 1.1.0
-
-Determine if the automap will be rotating with the player.
-If false, north always will be at the top of the buffer.
-
-Default value: false
-
-Config key: `automapRotate/automap_rotate`
-
-
----
-### `setAutomapRenderTextures`
-
-| C++ | `void setAutomapRenderTextures(bool textures)` |
-| :-- | :-- |
-| Python | `void set_automap_render_textures(bool textures)` |
-
-Added in 1.1.0
-
-Determine if the automap will be textured, showing the floor textures.
-
-Default value: true
-
-Config key: `automapRenderTextures/automap_render_textures`
-
-
----
-### `setRenderHud`
-
-| C++ | `void setRenderHud(bool hud)` |
-| :-- | :-- |
-| Python | `void set_render_hud(bool hud)` |
-
-Determine if the hud will be rendered in the game.
-
-Default value: false
-
-Config key: `renderHud/render_hud`
-
-
----
-### `setRenderMinimalHud`
-
-| C++ | `void setRenderMinimalHud(bool minHud)` |
-| :-- | :-- |
-| Python | `void set_render_minimal_hud(bool minHud)` |
-
-Added in 1.1.0
-
-Determine if the minimalistic version of the hud will be rendered instead of the full hud.
-
-Default value: false
-
-Config key: `renderMinimalHud/render_minimal_hud`
-
-
----
-### `setRenderWeapon`
-
-| C++ | `void setRenderWeapon(bool weapon)` |
-| :-- | :-- |
-| Python | `void set_render_weapon(bool weapon)` |
-
-Determine if the weapon held by the player will be rendered in the game.
-
-Default value: true
-
-Config key: `renderWeapon/render_weapon`
-
-
----
-### `setRenderCrosshair`
-
-| C++ | `void setRenderCrosshair(bool crosshair)` |
-| :-- | :-- |
-| Python | `void set_render_crosshair(bool crosshair)` |
-
-Determine if the crosshair will be rendered in the game.
-
-Default value: false
-
-Config key: `renderCrosshair/render_crosshair`
-
-
----
-### `setRenderDecals`
-
-| C++ | `void setRenderDecals(bool decals)` |
-| :-- | :-- |
-| Python | `void set_render_decals(bool decals)` |
-
-Determine if the decals (marks on the walls) will be rendered in the game.
-
-Default value: true
-
-Config key: `renderDecals/render_decals`
-
-
----
-### `setRenderParticles`
-
-| C++ | `void setRenderParticles(bool particles)` |
-| :-- | :-- |
-| Python | `void set_render_particles(bool particles)` |
-
-Determine if the particles will be rendered in the game.
-
-Default value: true
-
-Config key: `renderParticles/render_particles`
-
-
----
-### `setRenderEffectsSprites`
-
-| C++ | `void setRenderEffectsSprites(bool sprites)` |
-| :-- | :-- |
-| Python | `void set_render_effects_sprites(bool sprites)` |
-
-Added in 1.1.0
-
-Determine if some effects sprites (gun puffs, blood splats etc.) will be rendered in the game.
-
-Default value: true
-
-Config key: `renderEffectsSprites/render_effects_sprites`
-
-
----
-### `setRenderMessages`
-
-| C++ | `void setRenderMessages(bool messages)` |
-| :-- | :-- |
-| Python | `void set_render_messages(bool messages)` |
-
-Added in 1.1.0
-
-Determine if in-game messages (information about pickups, kills, etc.) will be rendered in the game.
-
-Default value: false
-
-Config key: `renderMessages/render_messages`
-
-
----
-### `setRenderCorpses`
-
-| C++ | `void setRenderCorpses(bool corpses)` |
-| :-- | :-- |
-| Python | `void set_render_corpsess(bool corpses)` |
-
-Added in 1.1.0
-
-Determine if actors' corpses will be rendered in the game.
-
-Default value: true
-
-Config key: `renderCorpses/render_corpses`
-
-
----
-### `setRenderScreenFlashes`
-
-| C++ | `void setRenderScreenFlashes(bool flashes)` |
-| :-- | :-- |
-| Python | `void set_render_screen_flashes(bool flashes)` |
-
-Added in 1.1.3
-
-Determine if the screen flash effect upon taking damage or picking up items will be rendered in the game.
-
-Default value: true
-
-Config key: `renderScreenFlashes/render_screen_flashes`
-
-
----
-### `setRenderAllFrames`
-
-| C++ | `void setRenderAllFrames(bool allFrames)` |
-| :-- | :-- |
-| Python | `void set_render_all_frames(bool all_frames)` |
-
-Added in 1.1.3
-
-Determine if all frames between states will be rendered (when skip greater than 1 is used).
-Allows smooth preview but can reduce performance.
-It only makes sense to use it if the window is visible.
-
-Default value: false
-
-Config key: `renderAllFrames/render_all_frames`
-
-See also:
-- [`setWindowVisible`](#setWindowVisible)
-
-
----
-### `setWindowVisible`
-
-| C++ | `void setWindowVisible(bool visibility)` |
-| :-- | :-- |
-| Python | `void set_window_visible(bool visibility)` |
-
-Determines if ViZDoom's window will be visible.
-ViZDoom with window disabled can be used on Linux systems without X Server.
-
-Default value: false
-
-Config key: `windowVisible/window_visible`
-
-
----
-### `setConsoleEnabled`
-
-| C++ | `void setConsoleEnabled(bool console)` |
-| :-- | :-- |
-| Python | `void set_console_enabled(bool console)` |
-
-Determines if ViZDoom's console output will be enabled.
-
-Default value: false
-
-Config key: `consoleEnabled/console_enabled`
-
-
----
-### `setSoundEnabled`
-
-| C++ | `void setSoundEnabled(bool sound)` |
-| :-- | :-- |
-| Python | `void set_sound_enabled(bool sound)` |
-
-Determines if ViZDoom's sound will be played.
-
-Default value: false
-
-Config key: `soundEnabled/sound_enabled`
-
-
----
-### `getScreenWidth`
-
-| C++ | `int getScreenWidth()` |
-| :-- | :-- |
-| Python | `int get_screen_width()` |
-
-Returns game's screen width - width of all buffers.
-
-
----
-### `getScreenHeight`
-
-| C++ | `int getScreenHeight()` |
-| :-- | :-- |
-| Python | `int get_screen_height()` |
-
-Returns game's screen height - height of all buffers.
-
-
----
-### `getScreenChannels`
-
-| C++ | `int getScreenChannels()` |
-| :-- | :-- |
-| Python | `int get_screen_channels()` |
-
-Returns number of channels in screen buffer and map buffer (depth and labels buffer always have one channel).
-
-
----
-### `getScreenPitch`
-
-| C++ | `size_t getScreenPitch()` |
-| :-- | :-- |
-| Python | `int get_screen_pitch()` |
-
-Returns size in bytes of one row in screen buffer and map buffer.
-
-
----
-### `getScreenSize`
-
-| C++ | `size_t getScreenSize()` |
-| :-- | :-- |
-| Python | `int get_screen_size()` |
-
-Returns size in bytes of screen buffer and map buffer.
-
-
----
-### `isObjectsInfoEnabled`
-
-| C++ | `bool isAutomapBufferEnabled()` |
-| :-- | :-- |
-| Python | `bool isAutomapBufferEnabled()` |
-
-Added in 1.1.8
-
-Returns true if the objects information is enabled.
-
-
----
-### `setObjectsInfoEnabled`
-
-| C++ | `void setObjectsInfoEnabled(bool objectsInfo)` |
-| :-- | :-- |
-| Python | `void set_objects_info_enabled(bool objectsInfo)` |
-
-Added in 1.1.8
-
-Enables information about all objects present in the current episode/level.
-It will be available in the state.
-
-Default value: false
-
-Config key: `objectsInfoEnabled/objects_info_enabled`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [`Types: Object`](Types.md#object)
-- [examples/python/objects_and_sectors.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/objects_and_sectors.py),
-
-
----
-### `isSectorsInfoEnabled`
-
-| C++ | `bool isSectorsInfoEnabled()` |
-| :-- | :-- |
-| Python | `bool is_sectors_info_enabled()` |
-
-Added in 1.1.8
-
-Returns true if the information about sectors is enabled.
-
-
----
-### `setSectorsInfoEnabled`
-
-| C++ | `void setSectorsInfoEnabled(bool sectorsInfo)` |
-| :-- | :-- |
-| Python | `void set_sectors_info_enabled(bool sectorsInfo)` |
-
-Added in 1.1.8
-
-Enables information about all sectors (map layout) present in the current episode/level.
-It will be available in the state.
-
-Default value: false
-
-Config key: `sectorsInfoEnabled/sectors_info_enabled`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [`Types: Sector`](Types.md#sector)
-- [examples/python/objects_and_sectors.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/objects_and_sectors.py)
-
-
----
-### `isAudioBufferEnabled`
-
-| C++ | `bool isAudioBufferEnabled()` |
-| :-- | :-- |
-| Python | `bool is_audio_buffer_enabled()` |
-
-Added in 1.1.9
-
-Returns true if the audio buffer is enabled.
-
-
----
-### `setSectorsInfoEnabled`
-
-| C++ | `void setAudioBufferEnabled(bool audioBuffer)` |
-| :-- | :-- |
-| Python | `void set_audio_buffer_enabled(bool audioBuffer)` |
-
-Added in 1.1.9
-
-Returns true if the audio buffer is enabled.
-
-Default value: false
-
-Config key: `audioBufferEnabled/audio_buffer_enabled`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [`Types: SamplingRate`](Types.md#sampling-rate)
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py)
-
-
----
-### `getAudioSamplingRate`
-
-| C++ | `int getAudioSamplingRate()` |
-| :-- | :-- |
-| Python | `int get_audio_sampling_rate()` |
-
-Added in 1.1.9
-
-Returns the sampling rate of the audio buffer.
-
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [`Types: SamplingRate`](Types.md#sampling-rate)
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py)
-
-
----
-### `setAudioSamplingRate`
-
-| C++ | `void setAudioSamplingRate(SamplingRate samplingRate)` |
-| :-- | :-- |
-| Python | `void set_audio_sampling_rate(SamplingRate samplingRate)` |
-
-Added in 1.1.9
-
-Sets the sampling rate of the audio buffer.
-
-Default value: false
-
-Config key: `audioSamplingRate/audio_samping_rate`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [`Types: SamplingRate`](Types.md#sampling-rate)
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py)
-
-
----
-### `getAudioBufferSize`
-
-| C++ | `int getAudioBufferSize()` |
-| :-- | :-- |
-| Python | `int get_audio_buffer_size()` |
-
-Added in 1.1.9
-
-Returns the size of the audio buffer.
-
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py)
-
-
----
-### `setAudioBufferSize`
-
-| C++ | `void setAudioBufferSize(int size)` |
-| :-- | :-- |
-| Python | `void set_audio_buffer_size(int size)` |
-
-Added in 1.1.9
-
-Sets the size of the audio buffer. The size is defined by a number of logic tics.
-After each action audio buffer will contain audio from the specified number of the last processed tics.
-Doom uses 35 ticks per second.
-
-Default value: 4
-
-Config key: `audioBufferSize/audio_buffer_size`
-
-See also:
-- [`Types: GameState`](Types.md#gamestate)
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py)
diff --git a/doc/Exceptions.md b/doc/Exceptions.md
deleted file mode 100644
index 8ff05215c..000000000
--- a/doc/Exceptions.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Exceptions
-* FileDoesNotExistException - means that file specified as part of a configuration does not exist.
-
-* MessageQueueException/SharedMemoryException - means that communication with ViZDoom's instance failed. Usually, means a problem with permissions or system configuration.
-
-* SignalException - means that a signal was cached by ViZDoom's instance.
-
-* ViZDoomErrorException - means that an error in the ViZDoom engine occurred.
-
-* ViZDoomIsNotRunningException - means that called method cannot be used when ViZDoom instance is not running.
-
-* ViZDoomUnexpectedExitException - means that ViZDoom's instance was closed/terminated/killed from the outside.
-
-Most of the exceptions contain more information in "what()" message.
diff --git a/doc/Gym.md b/doc/Gym.md
deleted file mode 100644
index a7dfe5c3c..000000000
--- a/doc/Gym.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# OpenAI Gym wrappers
-
-Installing ViZDoom with `pip install vizdoom[gym]` will include
-Gym wrappers to interact with ViZDoom over Gym API. Note that Gym is deprecated in favour of Gymnasium and these wrappers will be removed in the future.
-
-These wrappers are under `gym_wrappers`, containing the basic environment and
-few example environments based on the built-in scenarios. This environment
-simply initializes ViZDoom with the settings from the scenario config files
-and implements the necessary API to function as a Gym API.
-
-See following examples for use:
- - `examples/python/gym_wrapper.py` for basic usage
diff --git a/doc/Quickstart.md b/doc/Quickstart.md
deleted file mode 100644
index 6ffea6c4a..000000000
--- a/doc/Quickstart.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Quickstart
-
-> This guide can be a little bit outdated.
-
-* [Quickstart for MacOS with Anaconda3](#quickstart_macos_anaconda)
-
-TODO:
-* Quickstart for Ubuntu
-* Quickstart for Windows
-* Change "Quickstart for MacOS" to use PyPI
-
-## Quickstart for MacOS and Anaconda3 (Python 3.6)
-
-Install [homebrew](https://brew.sh/), and [Anaconda3](https://www.continuum.io/downloads) (Python 3.6).
-
-1. Install dependencies
-
-```sh
-brew install \
- cmake \
- boost \
- boost-python --with-python3
-```
-
-2. Clone the repository
-
-```sh
-git clone https://github.com/mwydmuch/ViZDoom
-cd ViZDoom
-```
-
-3. Run cmake against anaconda and native boost libraries.
-
-The library version numbers will change over time (e.g. `python3.6m`, `boost-python/1.64.0`) and may need to be updated.
-
-```sh
-mkdir build
-cd build
-cmake .. -DCMAKE_BUILD_TYPE=Release \
--DBUILD_PYTHON3=ON \
--DPYTHON_INCLUDE_DIR=$HOME/anaconda3/include/python3.6m \
--DPYTHON_LIBRARY=$HOME/anaconda3/lib/libpython3.6m.dylib \
--DPYTHON_EXECUTABLE=$HOME/anaconda3/bin/python3 \
--DBOOST_PYTHON3_LIBRARY=/usr/local/Cellar/boost-python/1.64.0/lib/libboost_python3.dylib \
--DNUMPY_INCLUDES=$HOME/anaconda3/lib/python3.6/site-packages/numpy/core/include
-```
-
-4. Build it!
-
-```sh
-make
-```
-
-5. Move the output to anaconda's `site-packages` directory, or your local virtual environments `site-packages` directory.
-
-```sh
-mv -r build/bin/python3/pip_package/ $HOME/anaconda3/lib/python3.6/site-packages/vizdoom
-```
-
-6. Test if it works.
-
-```sh
-cd examples/python
-./basic.py
-```
diff --git a/doc/Types.md b/doc/Types.md
deleted file mode 100644
index 819c28ae0..000000000
--- a/doc/Types.md
+++ /dev/null
@@ -1,445 +0,0 @@
-# Types
-
-* [Label](#label)
-* [Object](#object)
-* [Line](#line)
-* [Sector](#sector)
-* [GameState](#gamestate)
-* [ServerState](#serverstate)
-* [Enums](#enums)
- * [Mode](#mode)
- * [ScreenFormat](#screenformat)
- * [ScreenResolution](#screenresolution)
- * [AutomapMode](#automapmode)
- * [GameVariable](#gamevariable)
- * [Button](#button)
- * [binary buttons](#binary-buttons)
- * [delta buttons](#delta-buttons)
- * [SamplingRate](#sampling-rate)
-
-## C++ only
-
-- `Buffer (std::vector)`
-- `ImageBufferPtr (std::shared_ptr)`
-- `GameStatePtr (std::shared_ptr)`
-
-
-## Structures
-
----
-### `Label`
-(`C++ type / Python type` **name**)
-
-- `unsigned int / int` **objectId / object_id**
-- `std::string / str` **objectName / object_name**
-- `uint8_t / int` **value**
-- `unsigned int / int` **x**
-- `unsigned int / int` **y**
-- `unsigned int / int` **width**
-- `unsigned int / int` **height**
-- `double / float` **objectPositionX / object_position_x**
-- `double / float` **objectPositionY / object_position_y**
-- `double / float` **objectPositionZ / object_position_z**
-- `double / float` **objectAngle / object_angle**
-- `double / float` **objectPitch / object_pitch**
-- `double / float` **objectRoll / object_roll**
-- `double / float` **objectVelocityX / object_velocity_x**
-- `double / float` **objectVelocityY / object_velocity_y**
-- `double / float` **objectVelocityZ / object_velocity_z**
-
-**objectId / object_id** - unique object ID, if both Labels and Objects information is enabled, this will be the same as **id** in corresponding**Object**.
-
-**objectName / object_name** - ingame object name, many different objects can have the same name (e.g. Medikit, Clip, Zombie).
-
-**value** - value that represents this particular object in **labelsBuffer**.
-
-**x**, **y**, **width**, **height** - describes bounding box of this particular object in **labelsBuffer**. Added in 1.1.5.
-
-
----
-### `Object`
-(`C++ type / Python type` **name**)
-
-- `unsigned int / int` **id**
-- `std::string / str` **name**
-- `double / float` **positionX / position_x**
-- `double / float` **positionY / position_y**
-- `double / float` **positionZ / position_z**
-- `double / float` **angle**
-- `double / float` **pitch**
-- `double / float` **roll**
-- `double / float` **velocityX / velocity_x**
-- `double / float` **velocityY / velocity_y**
-- `double / float` **velocityZ / velocity_z**
-
-**id** - unique object ID.
-
-**name** - ingame object name, many different objects can have the same name (e.g. Medikit, Clip, Zombie).
-
-Right now `Object` is only available to C++ and Python.
-Added in 1.1.8.
-
-See also:
-- [`DoomGame: setObjectsInfoEnabled`](DoomGame.md#setSectorsInfoEnabled),
-- [examples/python/objects_and_sectors.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
-
-
----
-### `Line`
-(`C++ type / Python type` **name**)
-
-- `double / float` **x1**
-- `double / float` **y1**
-- `double / float` **x2**
-- `double / float` **y2**
-- `bool / bool` **isBlocking / is_blocking**
-
-**x1**, **y1** - position of the line's first vertex.
-
-**x2**, **y2** - position of the line's second vertex.
-
-**isBlocking / is_blocking** - is true, if line is a wall that can't be passed.
-
-Right now `Line` is only available to C++ and Python.
-Added in 1.1.8.
-
-See also:
-- [examples/python/objects_and_sectors.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
-
-
----
-### `Sector`
-(`C++ type / Python type` **name**)
-
-- `double / float` **floorHeight / floor_height**
-- `double / float` **ceilingHeight / ceiling_height**
-- `std::vector / list` **lines**
-
-**floorHeight / floor_height** - height of the sector's floor.
-
-**ceilingHeight / ceiling_height** - height of the sector's ceiling.
-
-**lines** - contains list of line segments, that forms sector.
-
-Right now `Sector` is only available to C++ and Python.
-Added in 1.1.8.
-
-See also:
-- [`DoomGame: setSectorsInfoEnabled`](DoomGame.md#setSectorsInfoEnabled),
-- [examples/python/objects_and_sectors.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
-
-
----
-### `GameState`
-(`C++ type / Python type` **name**)
-
-- `unsigned int / int` **number**
-- `unsigned int / int` **tic**
-- `std::vector / numpy.double[]` **gameVariables / game_variables**
-- `ImageBufferPtr / numpy.uint8[]` **screenBuffer / screen_buffer**
-- `ImageBufferPtr / numpy.uint8[]` **depthBuffer / depth_buffer**
-- `ImageBufferPtr / numpy.uint8[]` **labelsBuffer / labels_buffer**
-- `ImageBufferPtr / numpy.uint8[]` **automapBuffer / automap_buffer**
-- `AudioBufferPtr / numpy.int16[]` **audioBuffer / audio_buffer**
-- `std::vector / list` **labels**
-
-**number** - number of the state in the episode.
-**tic** - ingame time, 1 tic is 1/35 of second in the game world. Added in 1.1.1.
-
-See also:
-- [`DoomGame: getState`](DoomGame.md#getState),
-- [examples/python/basic.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/basic.py),
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py).
-- [examples/python/audio_buffer.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/audio_buffer.py).
-
-
----
-#### `ServerState`
-(`C++ type / Python type` **name**)
-
-- `unsigned int / int` **tic**
-- `unsigned int / int` **playerCount / player_count**
-- `bool[] / list` **playersInGame / players_in_game**
-- `int[] / list` **playersFrags / players_frags**
-- `std::string[] / list` **playersNames / players_names**
-- `bool[] / list` **playersAfk / players_afk**
-- `unsigned int[] / list` **playersLastActionTic / players_last_action_tic **
-- `unsigned int[] / list` **playersLastKillTic / players_last_kill_tic **
-
-Right now `ServerInfo` is only available to C++ and Python.
-Added in 1.1.6.
-
-## Enums
-
----
-### `Mode`
-
-Enum type that defines all supported modes.
-
-- **PLAYER** - synchronous player mode
-- **SPECTATOR** - synchronous spectator mode
-- **ASYNC_PLAYER** - asynchronous player mode
-- **ASYNC_SPECTATOR** - asynchronous spectator mode
-
-In **PLAYER** and **ASYNC_PLAYER** modes, the agent controls ingame character.
-
-In **SPECTATOR** and **ASYNC_SPECTATOR** modes, ingame character should be controlled by the human and the agent gets information about the human action.
-
-In **PLAYER** and **SPECTATOR** modes, the game waits for agent action or permission to continue.
-
-In **ASYNC** modes the game progress with constant speed (default 35 tics per second, this can be set) without waiting for the agent actions.
-
-All modes can be used in singleplayer and multiplayer.
-
-See also:
-- [`DoomGame: getMode`](DoomGame.md#getMode),
-- [`DoomGame: setMode`](DoomGame.md#setMode),
-- [`DoomGame: getTicrate`](DoomGame.md#getTicrate),
-- [`DoomGame: setTicrate`](DoomGame.md#setTicrate).
-
-
----
-### `ScreenFormat`
-
-Enum type that defines all supported **screenBuffer** and **automapBuffer** formats.
-
-- **CRCGCB** - 3 channels of 8-bit values in RGB order
-- **RGB24** - channel of RGB values stored in 24 bits, where R value is stored in the oldest 8 bits
-- **RGBA32** - channel of RGBA values stored in 32 bits, where R value is stored in the oldest 8 bits
-- **ARGB32** - channel of ARGB values stored in 32 bits, where A value is stored in the oldest 8 bits
-- **CBCGCR** - 3 channels of 8-bit values in BGR order
-- **BGR24** - channel of BGR values stored in 24 bits, where B value is stored in the oldest 8 bits
-- **BGRA32** - channel of BGRA values stored in 32 bits, where B value is stored in the oldest 8 bits
-- **ABGR32** - channel of ABGR values stored in 32 bits, where A value is stored in the oldest 8 bits
-- **GRAY8** - 8-bit gray channel
-- **DOOM_256_COLORS8** - 8-bit channel with Doom palette values
-
-
-In **CRCGCB** and **CBCGCR** format **screenBuffer** and **automapBuffer** store all red 8-bit values then all green values and then all blue values, each channel is considered separately. As matrices they have [3, y, x] shape.
-
-In **RGB24** and **BGR24** format **screenBuffer** and **automapBuffer** store 24 bit RGB triples. As matrices they have [y, x, 3] shape.
-
-In **RGBA32**, **ARGB32**, **BGRA32** and **ABGR32** format **screenBuffer** and **automapBuffer** store 32 bit sets of RBG + alpha values. As matrices they have [y, x, 4] shape.
-
-In **GRAY8** and **DOOM_256_COLORS8** format **screenBuffer** and **automapBuffer** store single 8 bit values. As matrices they have [y, x] shape.
-
-**depthBuffer** and **lablesBuffer** always store single 8-bit values, so they always have [y, x] shape.
-
-See also:
-- [`DoomGame: getScreenFormat`](DoomGame.md#getScreenFormat),
-- [`DoomGame: setScreenFormat`](DoomGame.md#setScreenFormat),
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py).
-
-
----
-### `ScreenResolution`
-
-Enum type that defines all supported resolutions - shapes of **screenBuffer**, **depthBuffer**, **labelsBuffer** and **automapBuffer** in **State**.
-
-- **RES_160X120** (4:3)
-- **RES_200X125** (16:10)
-- **RES_200X150** (4:3)
-- **RES_256X144** (16:9)
-- **RES_256X160** (16:10)
-- **RES_256X192** (4:3)
-- **RES_320X180** (16:9)
-- **RES_320X200** (16:10)
-- **RES_320X240** (4:3)
-- **RES_320X256** (5:4)
-- **RES_400X225** (16:9)
-- **RES_400X250** (16:10)
-- **RES_400X300** (4:3)
-- **RES_512X288** (16:9)
-- **RES_512X320** (16:10)
-- **RES_512X384** (4:3)
-- **RES_640X360** (16:9)
-- **RES_640X400** (16:10)
-- **RES_640X480** (4:3)
-- **RES_800X450** (16:9)
-- **RES_800X500** (16:10)
-- **RES_800X600** (4:3)
-- **RES_1024X576** (16:9)
-- **RES_1024X640** (16:10)
-- **RES_1024X768** (4:3)
-- **RES_1280X720** (16:9)
-- **RES_1280X800** (16:10)
-- **RES_1280X960** (4:3)
-- **RES_1280X1024** (5:4)
-- **RES_1400X787** (16:9)
-- **RES_1400X875** (16:10)
-- **RES_1400X1050** (4:3)
-- **RES_1600X900** (16:9)
-- **RES_1600X1000** (16:10)
-- **RES_1600X1200** (4:3)
-- **RES_1920X1080** (16:9)
-
-See also:
-- [`DoomGame: setScreenResolution`](DoomGame.md#setScreenResolution),
-- [`DoomGame: getScreenWidth`](DoomGame.md#getScreenWidth),
-- [`DoomGame: getScreenHeight`](DoomGame.md#getScreenHeight).
-
-
----
-### `AutomapMode`
-
-Enum type that defines all **automapBuffer** modes.
-
-- **NORMAL** - Only level architecture the player has seen is shown.
-- **WHOLE** - All architecture is shown, regardless of whether or not the player has seen it.
-- **OBJECTS** - In addition to the previous, shows all things in the map as arrows pointing in the direction they are facing.
-- **OBJECTS_WITH_SIZE** - In addition to the previous, all things are wrapped in a box showing their size.
-
-See also:
-- [`DoomGame: setAutomapMode`](DoomGame.md#setAutomapMode),
-- [examples/python/buffers.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/buffers.py).
-
-
----
-### `GameVariable`
-
-Enum type that defines all variables that can be obtained from the game.
-
-#### Defined variables
-- **KILLCOUNT** - Counts the number of monsters killed during the current episode. ~Killing other players/bots do not count towards this.~ From 1.1.5 killing other players/bots counts towards this.
-- **ITEMCOUNT** - Counts the number of picked up items during the current episode.
-- **SECRETCOUNT** - Counts the number of secret location/objects discovered during the current episode.
-- **FRAGCOUNT** - Counts the number of players/bots killed, minus the number of committed suicides. Useful only in multiplayer mode.
-- **DEATHCOUNT** - Counts the number of players deaths during the current episode. Useful only in multiplayer mode.
-- **HITCOUNT** - Counts number of hit monsters/players/bots during the current episode. Added in 1.1.5.
-- **HITS_TAKEN** - Counts number of hits taken by the player during the current episode. Added in 1.1.5.
-- **DAMAGECOUNT** - Counts number of damage dealt to monsters/players/bots during the current episode. Added in 1.1.5.
-- **DAMAGE_TAKEN** - Counts number of damage taken by the player during the current episode. Added in 1.1.5.
-- **HEALTH** - Can be higher then 100!
-- **ARMOR** - Can be higher then 100!
-- **DEAD** - True if the player is dead.
-- **ON_GROUND** - True if the player is on the ground (not in the air).
-- **ATTACK_READY** - True if the attack can be performed.
-- **ALTATTACK_READY** - True if the altattack can be performed.
-- **SELECTED_WEAPON** - Selected weapon's number.
-- **SELECTED_WEAPON_AMMO** - Ammo for selected weapon.
-- **AMMO0** - **AMMO9** - Number of ammo for weapon in N slot.
-- **WEAPON0** - **WEAPON9** - Number of weapons in N slot.
-- **POSITION_X** - Position of the player, not available if `viz_nocheat` is enabled.
-- **POSITION_Y**
-- **POSITION_Z**
-- **ANGLE** - Orientation of the player, not available if `viz_nocheat` is enabled.
-- **PITCH**
-- **ROLL**
-- **VIEW_HEIGHT** - View high of the player, not available if `viz_nocheat` is enabled. Position of the camera in Z axis is equal to **POSITION_Z** + **VIEW_HEIGHT**. Added in 1.1.7.
-- **VELOCITY_X** - Velocity of the player, not available if `viz_nocheat` is enabled.
-- **VELOCITY_Y**
-- **VELOCITY_Z**
-- **CAMERA_POSITION_X** - Position of the camera, not available if `viz_nocheat` is enabled. Added in 1.1.7.
-- **CAMERA_POSITION_Y**
-- **CAMERA_POSITION_Z**
-- **CAMERA_ANGLE** - Orientation of the camera, not available if `viz_nocheat` is enabled. Added in 1.1.7.
-- **CAMERA_PITCH**
-- **CAMERA_ROLL**
-- **CAMERA_FOV** - Field of view in degrees, not available if `viz_nocheat` is enabled. Added in 1.1.7.
-- **PLAYER_NUMBER** - Player's number in multiplayer game.
-- **PLAYER_COUNT** - Number of players in multiplayer game.
-- **PLAYER1_FRAGCOUNT** - **PLAYER16_FRAGCOUNT** - Number of N player's frags
-
-
-#### User (ACS) variables
-- **USER1** - **USER60**
-
-ACS global int variables can be accessed as USER GameVariables.
-global int 0 is reserved for reward and is always threaded as Doom's fixed point numeral.
-Other from 1 to 60 (global int 1-60) can be accessed as USER1 - USER60 GameVariables.
-
-See also:
-- [ZDoom Wiki: ACS](http://zdoom.org/wiki/ACS),
-- [`DoomGame: getAvailableGameVariables`](DoomGame.md#getAvailableGameVariables),
-- [`DoomGame: setAvailableGameVariables`](DoomGame.md#setAvailableGameVariables),
-- [`DoomGame: addAvailableGameVariable`](DoomGame.md#addAvailableGameVariable),
-- [`DoomGame: getGameVariable`](DoomGame.md#getGameVariable),
-- [`Utilities: doomFixedToDouble`](Utilities.md#doomFixedToDouble),
-- [examples/python/basic.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/basic.py),
-- [examples/python/shaping.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/shaping.py).
-
-
----
-### `Button`
-
-Enum type that defines all buttons that can be "pressed" by the agent.
-
-#### Binary buttons
-
-Binary buttons have only 2 states "not pressed" if value 0 and "pressed" if value other then 0.
-
-- **ATTACK**
-- **USE**
-- **JUMP**
-- **CROUCH**
-- **TURN180**
-- **ALTATTACK**
-- **RELOAD**
-- **ZOOM**
-- **SPEED**
-- **STRAFE**
-- **MOVE_RIGHT**
-- **MOVE_LEFT**
-- **MOVE_BACKWARD**
-- **MOVE_FORWARD**
-- **TURN_RIGHT**
-- **TURN_LEFT**
-- **LOOK_UP**
-- **LOOK_DOWN**
-- **MOVE_UP**
-- **MOVE_DOWN**
-- **LAND**
-- **SELECT_WEAPON1**
-- **SELECT_WEAPON2**
-- **SELECT_WEAPON3**
-- **SELECT_WEAPON4**
-- **SELECT_WEAPON5**
-- **SELECT_WEAPON6**
-- **SELECT_WEAPON7**
-- **SELECT_WEAPON8**
-- **SELECT_WEAPON9**
-- **SELECT_WEAPON0**
-- **SELECT_NEXT_WEAPON**
-- **SELECT_PREV_WEAPON**
-- **DROP_SELECTED_WEAPON**
-- **ACTIVATE_SELECTED_ITEM**
-- **SELECT_NEXT_ITEM**
-- **SELECT_PREV_ITEM**
-- **DROP_SELECTED_ITEM**
-
-
-#### Delta buttons
-
-Buttons whose value defines the speed of movement.
-A positive value indicates movement in the first specified direction and a negative value in the second direction.
-For example: value 10 for MOVE_LEFT_RIGHT_DELTA means slow movement to the right and -100 means fast movement to the left.
-
-- **`LOOK_UP_DOWN_DELTA`**
-- **TURN_LEFT_RIGHT_DELTA**
-- **MOVE_FORWARD_BACKWARD_DELTA**
-- **MOVE_LEFT_RIGHT_DELTA**
-- **MOVE_UP_DOWN_DELTA**
-
-In case of **TURN_LEFT_RIGHT_DELTA** and **LOOK_UP_DOWN_DELTA** values correspond to degrees.
-In case of **MOVE_FORWARD_BACKWARD_DELTA**, **MOVE_LEFT_RIGHT_DELTA**, **MOVE_UP_DOWN_DELTA** values correspond to Doom Map unit (see Doom Wiki if you want to know how it translates into real life units).
-
-See also:
-- [Doom Wiki: Map unit](https://doomwiki.org/wiki/Map_unit),
-- [`DoomGame: getAvailableButtons`](DoomGame.md#getAvailableButtons),
-- [`DoomGame: setAvailableButtons`](DoomGame.md#setAvailableButtons),
-- [`DoomGame: addAvailableButton`](DoomGame.md#addAvailableButton),
-- [`DoomGame: setButtonMaxValue`](DoomGame.md#setButtonMaxValue),
-- [`DoomGame: getButtonMaxValue`](DoomGame.md#getButtonMaxValue),
-- [examples/python/basic.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/basic.py),
-- [examples/python/delta_buttons.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/delta_buttons.py),
-- [GitHub issue: Angle changes by executing certain commands](https://github.com/mwydmuch/ViZDoom/issues/182).
-
-
-### `SamplingRate`
-
-Enum type that defines all supported sampling rates for **audioBuffer** in **State**.
-Added in 1.1.9.
-
-- **SR_11025**
-- **SR_22050**
-- **SR_44100**
diff --git a/doc/Utilities.md b/doc/Utilities.md
deleted file mode 100644
index cec4b0156..000000000
--- a/doc/Utilities.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Utilities
-
-* [doomTicsToMs](#doomTicsToMs)
-* [msToDoomTics](#msToDoomTics)
-* [doomTicsToSec](#doomTicsToSec)
-* [secToDoomTics](#secToDoomTics)
-* [doomFixedToDouble](#doomFixedToDouble)
-* [isBinaryButton](#isBinaryButton)
-* [isDeltaButton](#isDeltaButton)
-
-
----
-### `doomTicsToMs`
-
-| C++ | `double doomTicsToMs(double tics, unsigned int ticrate = 35)` |
-| :-- | :-- |
-| Python | `float doom_tics_to_ms(float tics, int ticrate = 35)` |
-
-Changed in 1.1
-
-Calculates how many tics will be made during given number of milliseconds.
-
-
----
-### `msToDoomTics`
-
-| C++ | `double msToDoomTics(double ms, unsigned int ticrate = 35)` |
-| :-- | :-- |
-| Python | `float ms_to_doom_tics(float ms, int ticrate = 35)` |
-
-Changed in 1.1
-
-Calculates the number of milliseconds that will pass during specified number of tics.
-
-
----
-### `doomTicsToSec`
-
-| C++ | `double doomTicsToSec(double tics, unsigned int ticrate = 35)` |
-| :-- | :-- |
-| Python | `float doom_tics_to_sec(float tics, int ticrate = 35)` |
-
-Added in 1.1
-
-Calculates how many tics will be made during given number of seconds.
-
-
----
-### `secToDoomTics`
-
-| C++ | `double secToDoomTics(double sec, unsigned int ticrate = 35)` |
-| :-- | :-- |
-| Python | `float sec_to_doom_tics(float sec, int ticrate = 35)` |
-
-Added in 1.1
-
-Calculates the number of seconds that will pass during specified number of tics.
-
-
----
-### `doomFixedToDouble`
-
-| C++ | `double doomFixedToDouble(int / double doomFixed)` |
-| :-- | :-- |
-| Python | `float doom_fixed_to_double(int / float doomFixed)` |
-
-Converts Doom's fixed point numeral to a floating point value.
-
-See also:
-- Types: `User variables` in `GameVariables`
-
-Python aliases (added in 1.1):
-`float doom_fixed_to_float(int / float doomFixed)`
-
-
----
-### `isBinaryButton`
-
-| C++ | `bool isBinaryButton(Button button)` |
-| :-- | :-- |
-| Python | `bool is_binary_button(Button button)` |
-
-Returns true if button is binary button.
-
-
----
-### `isDeltaButton`
-
-| C++ | `bool isDeltaButton(Button button)` |
-| :-- | :-- |
-| Python | `bool is_delta_button(Button button)` |
-
-Returns true if button is delta button.
diff --git a/doc/index.md b/doc/index.md
deleted file mode 100644
index b3772f085..000000000
--- a/doc/index.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# ViZDoom
-[http://vizdoom.cs.put.edu.pl](http://vizdoom.cs.put.edu.pl)
-
-ViZDoom allows developing AI **bots that play Doom using only the visual information** (the screen buffer). It is primarily intended for research in machine visual learning, and deep reinforcement learning, in particular.
-
-ViZDoom is based on [ZDoom](https://github.com/rheit/zdoom) to provide the game mechanics.
-
-## Features
-- Multi-platform,
-- API for Python, C++ and Julia
-- Easy-to-create custom scenarios (visual editors, scripting language and examples available),
-- Async and sync single-player and multi-player modes,
-- Fast (up to 7000 fps in sync mode, single threaded),
-- Lightweight (few MBs),
-- Customizable resolution and rendering parameters,
-- Access to the depth buffer (3D vision),
-- Automatic labeling game objects visible in the frame,
-- Off-screen rendering,
-- Episodes recording,
-- Time scaling in async mode.
-
-ViZDoom API is **reinforcement learning** friendly (suitable also for learning from demonstration, apprenticeship learning or apprenticeship via inverse reinforcement learning, etc.).
-
-
-## Cite as
-> M Wydmuch, M Kempka & W Jaśkowski, ViZDoom Competitions: Playing Doom from Pixels, IEEE Transactions on Games, in print,
-[arXiv:1809.03470](https://arxiv.org/abs/1809.03470)
-```
-@article{wydmuch2018vizdoom,
- title={ViZDoom Competitions: Playing Doom from Pixels},
- author={Wydmuch, Marek and Kempka, Micha{\l} and Ja{\'s}kowski, Wojciech},
- journal={IEEE Transactions on Games},
- year={2018},
- publisher={IEEE}
-}
-```
-or
-
-> M. Kempka, M. Wydmuch, G. Runc, J. Toczek & W. Jaśkowski, ViZDoom: A Doom-based AI Research Platform for Visual Reinforcement Learning, IEEE Conference on Computational Intelligence and Games, pp. 341-348, Santorini, Greece, 2016 ([arXiv:1605.02097](http://arxiv.org/abs/1605.02097))
-```
-@inproceedings{Kempka2016ViZDoom,
- author = {Micha{\l} Kempka and Marek Wydmuch and Grzegorz Runc and Jakub Toczek and Wojciech Ja\'skowski},
- title = {{ViZDoom}: A {D}oom-based {AI} Research Platform for Visual Reinforcement Learning},
- booktitle = {IEEE Conference on Computational Intelligence and Games},
- year = {2016},
- url = {http://arxiv.org/abs/1605.02097},
- address = {Santorini, Greece},
- Month = {Sep},
- Pages = {341--348},
- Publisher = {IEEE},
- Note = {The best paper award}
-}
-```
-
-## Documentation
-
-Detailed description of all types and methods:
-
-- **[DoomGame](doc/DoomGame.md)**
-- **[Types](doc/Types.md)**
-- [Configuration files](doc/ConfigFile.md)
-- [Exceptions](doc/Exceptions.md)
-- [Utilities](doc/Utilities.md)
-
-Additional documents:
-
-- **[FAQ](doc/FAQ.md)**
-- [Changelog](doc/Changelog.md) for 1.1.X version.
-
-Also full documentation of engine and ACS scripting language can be found on
-[ZDoom Wiki](https://zdoom.org/wiki/).
-
-Useful parts:
-
-- [ZDoom Wiki: ACS (scripting language)](https://zdoom.org/wiki/ACS)
-- [ZDoom Wiki: CVARs (console variables)](https://zdoom.org/wiki/CVARs)
-- [ZDoom Wiki: CCMD (console commands)](https://zdoom.org/wiki/CCMDs)
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 000000000..5b8364a2d
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,21 @@
+.DS_Store
+__pycache__
+.vscode/
+build/
+_build/
+
+tutorials/**/*.pickle
+tutorials/**/images/
+tutorials/**/*.rst
+tutorials/**/*.ipynb
+tutorials/**/*.zip
+!tutorials/**/README.rst
+
+environments/**/list.html
+environments/**/complete_list.html
+environments/**/complete_list.md
+environments/box2d/*.md
+environments/classic_control/*.md
+environments/mujoco/*.md
+environments/third_party_environments/*.md
+environments/toy_text/*.md
diff --git a/docs/404.md b/docs/404.md
new file mode 100644
index 000000000..87805720a
--- /dev/null
+++ b/docs/404.md
@@ -0,0 +1,7 @@
+---
+hide-toc: true
+---
+
+# 404 - Page Not Found
+
+## The requested page could not be found.
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..41c50068c
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,5 @@
+# ViZDoom documentation
+
+This directory contains the documentation for ViZDOOm.
+
+For more information about how to contribute to the documentation go to our [CONTRIBUTING.md](https://github.com/Farama-Foundation/Celshast/blob/main/CONTRIBUTING.md)
diff --git a/docs/_scripts/ipynb_to_gallery.py b/docs/_scripts/ipynb_to_gallery.py
new file mode 100644
index 000000000..6817d722e
--- /dev/null
+++ b/docs/_scripts/ipynb_to_gallery.py
@@ -0,0 +1,63 @@
+"""Convert jupyter notebook to sphinx gallery notebook styled examples.
+
+Usage: python ipynb_to_gallery.py
+
+Dependencies: pypandoc, beautifulsoup4, numpy
+install using `pip install pypandoc, beautifulsoup4, numpy`
+"""
+import json
+import warnings
+
+import numpy as np
+import pypandoc as pdoc
+from bs4 import BeautifulSoup
+
+
+warnings.filterwarnings(
+ "ignore",
+ message="The input looks more like a filename than markup. You may want to open this file and pass the filehandle into Beautiful Soup",
+)
+
+
+def convert_ipynb_to_gallery(file_name):
+ python_file = ""
+
+ nb_dict = json.load(open(file_name))
+ cells = nb_dict["cells"]
+
+ for i, cell in enumerate(cells):
+ if i == 0:
+ assert cell["cell_type"] == "markdown", "First cell has to be markdown"
+
+ md_source = "".join(cell["source"])
+ rst_source = pdoc.convert_text(md_source, "rst", "md")
+ python_file = '"""\n' + rst_source + '\n"""'
+ else:
+ if cell["cell_type"] == "markdown":
+ md_source = "".join(cell["source"])
+ is_all_lines_html = np.all(
+ [
+ bool(BeautifulSoup(line, "html.parser").find())
+ for line in cell["source"]
+ ]
+ )
+ if is_all_lines_html:
+ rst_source = pdoc.convert_text(
+ source=md_source, to="rst", format="html"
+ )
+ else:
+ rst_source = pdoc.convert_text(md_source, "rst", "md")
+ commented_source = "\n".join(["# " + x for x in rst_source.split("\n")])
+ python_file = python_file + "\n\n\n" + "# %%" + "\n" + commented_source
+ elif cell["cell_type"] == "code":
+ source = "".join(cell["source"])
+ python_file = python_file + "\n" * 2 + source
+
+ python_file = python_file.replace("\n%", "\n# %")
+ open(file_name.replace(".ipynb", ".py"), "w").write(python_file)
+
+
+if __name__ == "__main__":
+ import sys
+
+ convert_ipynb_to_gallery(sys.argv[-1])
diff --git a/docs/_scripts/move_404.py b/docs/_scripts/move_404.py
new file mode 100644
index 000000000..05364776e
--- /dev/null
+++ b/docs/_scripts/move_404.py
@@ -0,0 +1,15 @@
+import sys
+
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print("Provide a path")
+ filePath = sys.argv[1]
+
+ with open(filePath, "r+") as fp:
+ content = fp.read()
+ content = content.replace('href="../', 'href="/').replace('src="../', 'src="/')
+ fp.seek(0)
+ fp.truncate()
+
+ fp.write(content)
diff --git a/docs/_static/img/favicon.png b/docs/_static/img/favicon.png
new file mode 100644
index 000000000..74a791bf3
Binary files /dev/null and b/docs/_static/img/favicon.png differ
diff --git a/docs/_static/img/vizdoom-black.svg b/docs/_static/img/vizdoom-black.svg
new file mode 100644
index 000000000..3c8086f27
--- /dev/null
+++ b/docs/_static/img/vizdoom-black.svg
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_static/img/vizdoom-demo.gif b/docs/_static/img/vizdoom-demo.gif
new file mode 100644
index 000000000..9494b5207
Binary files /dev/null and b/docs/_static/img/vizdoom-demo.gif differ
diff --git a/docs/_static/img/vizdoom-github.png b/docs/_static/img/vizdoom-github.png
new file mode 100644
index 000000000..6dd7fa93a
Binary files /dev/null and b/docs/_static/img/vizdoom-github.png differ
diff --git a/vizdoom-text.png b/docs/_static/img/vizdoom-text.png
similarity index 100%
rename from vizdoom-text.png
rename to docs/_static/img/vizdoom-text.png
diff --git a/docs/_static/img/vizdoom-white.svg b/docs/_static/img/vizdoom-white.svg
new file mode 100644
index 000000000..ba9eb6a40
--- /dev/null
+++ b/docs/_static/img/vizdoom-white.svg
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/ConfigFile.md b/docs/api_cpp/configurationFiles.md
similarity index 93%
rename from doc/ConfigFile.md
rename to docs/api_cpp/configurationFiles.md
index 00bbbd854..debf30139 100644
--- a/doc/ConfigFile.md
+++ b/docs/api_cpp/configurationFiles.md
@@ -1,7 +1,8 @@
# Configuration files
+
Instead of configuring the ViZDoom in code, you can load it from the configuration file(s). Each file is read sequentially, so multiple entries with the same key will overwrite previous entries.
-## Format
+## Format
Each entry in a configraution file is a pair of **key** and **value** separated by an equal sign (**"="**). The file format should also abide the following rules:
* one entry per line (except for list parameters),
@@ -12,10 +13,10 @@ Each entry in a configraution file is a pair of **key** and **value** separated
A violation of any of these rules will result in ignoring **only** the line with the error and sending a warning message to stderr ("WARNING! Loading config from: ...").
-### List of values
+### List of values
**available_buttons** and **available_game_variables** are special parameters, which use multiple values and instead of a single value they expect a list of values separated by whitespaces and enclosed within braces ("{" and "}"). The list can stretch throughout multiple lines as long as all values are separated from each other by whitespaces.
-### Appending values
+### Appending values
Each list assignment (**KEY = { VALUES }**)clears values specified for this key before (in other configuration files or in the code). That is why the **append operator(*KEY += { VALUES })** is available. This way you can more easily combine multiple configuration files and tinker in code.
### Supported configuration keys:
@@ -67,7 +68,7 @@ Each list assignment (**KEY = { VALUES }**)clears values specified for this key
See also: [`DoomGame`](DoomGame.md) for config keys and functions related to them.
-### Sample configuration file content:
+### Sample configuration file content:
```ini
vizdoom_path = ../../bin/vizdoom
@@ -114,4 +115,4 @@ doom_skill = 5
```
-Other examples of configuration files can be found [here](../scenarios)
+Other examples of configuration files can be found in [https://github.com/Farama-Foundation/ViZDoom/tree/master/scenarios](https://github.com/Farama-Foundation/ViZDoom/tree/master/scenarios)
diff --git a/docs/api_cpp/doomGame.md b/docs/api_cpp/doomGame.md
new file mode 100644
index 000000000..bfd616538
--- /dev/null
+++ b/docs/api_cpp/doomGame.md
@@ -0,0 +1,1502 @@
+# DoomGame
+
+DoomGame is the main object of the ViZDoom library, representing a single instance of the Doom game and providing the interface for a single agent/player to interact with the game. The object allows sending actions to the game, getting the game state, etc.
+
+Here we document all the methods of the DoomGame class and their corresponding Python bindings implemented as pybind11 module.
+
+
+## Flow control methods:
+
+### `init`
+
+| C++ | `bool init()` |
+| :-- | :-- |
+| Python | `init() -> bool` |
+
+Initializes ViZDoom game instance and starts a new episode.
+After calling this method, the first state from a new episode will be available.
+Some configuration options cannot be changed after calling this method.
+Init returns true when the game was started properly and false otherwise.
+
+
+---
+### `close`
+
+| C++ | `void close()` |
+| :-- | :-- |
+| Python | `close() -> None` |
+
+Closes ViZDoom game instance.
+It is automatically invoked by the destructor.
+The game can be initialized again after being closed.
+
+
+---
+### `newEpisode`
+
+| C++ | `void newEpisode(std::string recordingFilePath = "")` |
+| :-- | :-- |
+| Python | `new_episode(recordingFilePath: str = "") -> None` |
+
+Changed in 1.1.0
+
+Initializes a new episode. The state of an environment is completely restarted (all variables and rewards are reset to their initial values).
+After calling this method, the first state from the new episode will be available.
+If the `recordingFilePath` is not empty, the new episode will be recorded to this file (as a Doom lump).
+
+In a multiplayer game, the host can call this method to finish the game.
+Then the rest of the players must also call this method to start a new episode.
+
+
+---
+### `replayEpisode`
+
+| C++ | `void replayEpisode(std::string filePath, unsigned int player = 0)` |
+| :-- | :-- |
+| Python | `replay_episode(filePath: str, player: int = 0) -> None` |
+
+Added in 1.1.0
+
+Replays a recorded episode from the given file using the perspective of the specified player.
+Players are numbered from 1, `player` equal to 0 results in replaying the demo using the perspective of the default player in the recording file.
+After calling this method, the first state from the replay will be available.
+All rewards, variables, and states are available during the replaying episode.
+
+See also:
+- [examples/python/record_episodes.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/record_episodes.py)
+- [examples/python/record_multiplayer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/record_multiplayer.py)
+
+
+---
+### `isRunning`
+
+| C++ | `bool isRunning()` |
+| :-- | :-- |
+| Python | `is_running() -> bool` |
+
+Checks if the ViZDoom game instance is running.
+
+
+---
+### `isMultiplayerGame`
+
+| C++ | `bool isMultiplayerGame()` |
+| :-- | :-- |
+| Python | `is_multiplayer_game() -> bool` |
+
+Added in 1.1.2
+
+Checks if the game is in multiplayer mode.
+
+
+---
+### `isRecordingEpisode`
+
+| C++ | `bool isRecordingEpisode()` |
+| :-- | :-- |
+| Python | `is_recording_episode() -> bool` |
+
+Added in 1.1.5
+
+Checks if the game is in recording mode.
+
+
+---
+### `isReplayingEpisode`
+
+| C++ | `bool isReplayingEpisode()` |
+| :-- | :-- |
+| Python | `is_replaying_episode() -> bool` |
+
+Added in 1.1.5
+
+Checks if the game is in replaying mode.
+
+
+---
+### `setAction`
+
+| C++ | `void setAction(std::vector const &actions)` |
+| :-- | :-- |
+| Python | `set_action(actions: list | tuple | ndarray [float]) -> None` |
+
+Sets the player's action for the next tics.
+Each value corresponds to a button specified with [`addAvailableButton`](#addavailablebutton) method
+or in the configuration file (in order of appearance).
+
+
+---
+### `advanceAction`
+
+| C++ | `void advanceAction(unsigned int tics = 1, bool updateState = true)` |
+| :-- | :-- |
+| Python | `advance_action(tics: int = 1, updateState: bool = True) -> None` |
+
+Processes a specified number of tics. If `updateState` is set,
+the state will be updated after the last processed tic and a new reward will be calculated.
+To get the new state, use `getState` and to get the new reward use `getLastReward`.
+If `updateState` is not set, the state will not be updated.
+
+
+---
+### `makeAction`
+
+| C++ | `double makeAction(std::vector const &actions, unsigned int tics = 1)` |
+| :-- | :-- |
+| Python | `make_action(actions: list | tuple | ndarray [float], tics: int = 1) -> float` |
+
+Method combining usability of [`setAction`](#setaction), [`advanceAction`](#advanceaction) and [`getLastReward`](#getlastreward).
+Sets the player's action for the next tics, processes a specified number of tics,
+updates the state and calculates a new reward, which is returned.
+
+
+---
+### `isNewEpisode`
+
+| C++ | `bool isNewEpisode()` |
+| :-- | :-- |
+| Python | `is_new_episode() -> bool` |
+
+Returns true if the current episode is in the initial state - the first state, no actions were performed yet.
+
+
+---
+### `isEpisodeFinished`
+
+| C++ | `bool isEpisodeFinished()` |
+| :-- | :-- |
+| Python | `is_episode_finished() -> bool` |
+
+Returns true if the current episode is in the terminal state (is finished).
+[`makeAction`](#makeaction) and [`advanceAction`](#advanceaction) methods will take no effect after this point (unless [`newEpisode`](#newepisode) method is called).
+
+
+---
+### `isPlayerDead`
+
+| C++ | `bool isPlayerDead()` |
+| :-- | :-- |
+| Python | `is_player_dead() -> bool` |
+
+Returns true if the player is dead.
+In singleplayer, the player's death is equivalent to the end of the episode.
+In multiplayer, when the player is dead [`respawnPlayer`](#respawnplayer) method can be called.
+
+
+---
+### `respawnPlayer`
+
+| C++ | `void respawnPlayer()` |
+| :-- | :-- |
+| Python | `respawn_player() -> None` |
+
+This method respawns the player after death in multiplayer mode.
+After calling this method, the first state after the respawn will be available.
+
+See also:
+- [`isMultiplayerGame`](#ismultiplayergame)
+
+
+---
+### `sendGameCommand`
+
+| C++ | `void sendGameCommand(std::string cmd)` |
+| :-- | :-- |
+| Python | `send_game_command(cmd: str) -> None` |
+
+Sends the command to Doom console. It can be used for controlling the game, changing settings, cheats, etc.
+Some commands will be blocked in some modes.
+
+See also:
+- [ZDoom Wiki: Console](http://zdoom.org/wiki/Console)
+- [ZDoom Wiki: CVARs (console variables)](https://zdoom.org/wiki/CVARs)
+- [ZDoom Wiki: CCMD (console commands)](https://zdoom.org/wiki/CCMDs)
+
+
+---
+### `getState`
+
+| C++ | `GameStatePtr (std::shared_ptr) GameState getState()` |
+| :-- | :-- |
+| Python | `get_state() -> GameState` |
+
+Changed in 1.1.0
+
+Returns [`GameState`](./gameState.md#gamestate) object with the current game state.
+If the current episode is finished, `nullptr/null/None` will be returned.
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+
+
+---
+### `getServerState`
+
+| C++ | `ServerStatePtr (std::shared_ptr) ServerState getServerState()` |
+| :-- | :-- |
+| Python | `get_state_state() -> ServerState` |
+
+Added in 1.1.6
+
+Returns [`ServerState`](./gameState.md#serverstate) object with the current server state.
+
+See also:
+- [`ServerState`](./gameState.md#serverstate)
+
+
+---
+### `getLastAction`
+
+| C++ | `std::vector getLastAction()` |
+| :-- | :-- |
+| Python | `get_last_action() -> list` |
+
+Returns the last action performed.
+Each value corresponds to a button added with `[addAvailableButton](#addAvailableButton)` (in order of appearance).
+Most useful in `SPECTATOR` mode.
+
+
+---
+### `getEpisodeTime`
+
+| C++ | `unsigned int getEpisodeTime()` |
+| :-- | :-- |
+| Python | `get_episode_time() -> int` |
+
+Returns number of current episode tic.
+
+
+---
+### `save`
+
+| C++ | `void save(std::string filePath)` |
+| :-- | :-- |
+| Python | `save(filePath: str) -> None` |
+
+Added in 1.1.9
+
+Saves a game's internal state to the file using ZDoom's save game functionality.
+
+
+---
+### `load`
+
+| C++ | `void load(std::string filePath)` |
+| :-- | :-- |
+| Python | `load(filePath: str) -> None` |
+
+Added in 1.1.9
+
+Loads a game's internal state from the file using ZDoom's load game functionality.
+A new state is available after loading.
+Loading the game state does not reset the current episode state,
+tic counter/time and total reward state keep their values.
+
+
+## Buttons settings methods
+
+### `getAvailableButtons`
+
+| C++ | `std::vector getAvailableButtons()` |
+| :-- | :-- |
+| Python | `get_available_buttons() -> list[Button]` |
+
+Returns the list of available `Buttons`.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+- [`addAvailableButton`](#addavailablebutton)
+- [`setAvailableButtons`](#addavailablebuttons)
+
+
+---
+### `setAvailableButtons`
+
+| C++ | `void setAvailableButtons(std::vector buttons)` |
+| :-- | :-- |
+| Python | `add_available_button(buttons: list | tuple[Button]) -> None` |
+
+Set given list of `Button`s (e.g. `TURN_LEFT`, `MOVE_FORWARD`) as available `Buttons`,
+
+Config key: `availableButtons/available_buttons` (list)
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+- [`addAvailableButton`](#addavailablebutton)
+
+
+---
+### `addAvailableButton`
+
+| C++ | `void addAvailableButton(Button button, double maxValue = 0)` |
+| :-- | :-- |
+| Python | `add_available_button(button: Button, maxValue: float = 0) -> None` |
+
+Add [`Button`](./enums.md#button) type (e.g. `TURN_LEFT`, `MOVE_FORWARD`) to available `Buttons` and sets the maximum allowed, absolute value for the specified button.
+If the given button has already been added, it will not be added again, but the maximum value is overridden.
+
+Config key: `availableButtons/available_buttons` (list)
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+- [`setAvailableButtons`](#addavailablebuttons)
+- [`setButtonMaxValue`](#setbuttonmaxvalue)
+
+
+---
+### `clearAvailableButtons`
+
+| C++ | `void clearAvailableButtons()` |
+| :-- | :-- |
+| Python | `clear_available_buttons() -> None` |
+
+Clears all available `Buttons` added so far.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+---
+### `getAvailableButtonsSize`
+
+| C++ | `int getAvailableButtonsSize()` |
+| :-- | :-- |
+| Python | `get_available_buttons_size() -> int` |
+
+Returns the number of available `Buttons`.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+---
+### `setButtonMaxValue`
+
+| C++ | `void setButtonMaxValue(Button button, double maxValue = 0)` |
+| :-- | :-- |
+| Python | `set_button_max_value(button: Button, maxValue: float = 0) -> None` |
+
+Sets the maximum allowed absolute value for the specified button.
+Setting the maximum value to 0 results in no constraint at all (infinity).
+This method makes sense only for delta buttons.
+The constraints limit applies in all Modes.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+---
+### `getButtonMaxValue`
+
+| C++ | `unsigned int getButtonMaxValue(Button button)` |
+| :-- | :-- |
+| Python | `set_button_max_value(button: Button) -> int` |
+
+Returns the maximum allowed absolute value for the specified button.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+---
+### `getButton`
+
+| C++ | `double getButton(Button button)` |
+| :-- | :-- |
+| Python | `set_button(button: Button) -> float` |
+
+Returns the current state of the specified button (`ATTACK`, `USE` etc.).
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+## GameVariables methods
+
+
+### `getAvailableGameVariables`
+
+| C++ | `std::vector getAvailableGameVariables()` |
+| :-- | :-- |
+| Python | `get_available_game_variables() -> list[GameVariables]` |
+
+Returns the list of available `GameVariables`.
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+- [`addAvailableGameVariable`](#addavailablegamevariable)
+- [`setAvailableGameVariables`](#setavailablegamevariables)
+
+
+---
+### `setAvailableGameVariables`
+
+| C++ | `void setAvailableGameVariables(std::vector variables)` |
+| :-- | :-- |
+| Python | `set_available_game_variables(variables: list | tuple[GameVariables]) -> None` |
+
+Set list of [`GameVariable`](./enums.md#gamevariable) as available `GameVariables` in the [`GameState`](./gameState.md#gamestate) returned by `getState` method.
+
+Config key: `availableGameVariables/available_game_variables` (list)
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+- [`addAvailableGameVariable`](#addavailablegamevariable)
+
+
+---
+### `addAvailableGameVariable`
+
+| C++ | `void addAvailableGameVariable(GameVariable variable)` |
+| :-- | :-- |
+| Python | `add_available_game_variable(variable: GameVariable) -> None` |
+
+Adds the specified [`GameVariable`](./enums.md#gamevariable) to the list of available game variables (e.g. `HEALTH`, `AMMO1`, `ATTACK_READY`) in the [`GameState`](./gameState.md#gamestate) returned by `getState` method.
+
+Config key: `availableGameVariables/available_game_variables` (list)
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+- [`setAvailableGameVariables`](#setavailablegamevariables)
+
+
+---
+### `clearAvailableGameVariables`
+
+| C++ | `void clearAvailableGameVariables()` |
+| :-- | :-- |
+| Python | `clear_available_game_variables() -> None` |
+
+Clears the list of available `GameVariables` that are included in the [`GameState`](./gameState.md#gamestate) returned by [`getState`](#getstate) method.
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+
+
+---
+### `getAvailableGameVariablesSize`
+
+| C++ | `unsigned int getAvailableGameVariablesSize()` |
+| :-- | :-- |
+| Python | `get_available_game_variables_size() -> int` |
+
+Returns the number of available `GameVariables`.
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+- [`ConfigFile: List`](./configurationFiles.md#list)
+
+
+---
+### `getGameVariable`
+
+| C++ | `double getGameVariable(GameVariable variable)` |
+| :-- | :-- |
+| Python | `get_game_variable(variable: GameVariable) -> float` |
+
+Returns the current value of the specified game variable (`HEALTH`, `AMMO1` etc.).
+The specified game variable does not need to be among available game variables (included in the state).
+It could be used for e.g. shaping. Returns 0 in case of not finding given `GameVariable`.
+
+See also:
+- [`Enums: GameVariable`](./enums.md#gamevariable)
+
+
+## Game Arguments methods
+
+### `addGameArgs`
+
+| C++ | `void addGameArgs(std::string args)` |
+| :-- | :-- |
+| Python | `add_game_args(args: str) -> None` |
+
+Adds a custom argument that will be passed to ViZDoom process during initialization.
+Useful for changing additional game settings.
+
+Config key: `gameArgs/game_args`
+
+See also:
+- [ZDoom Wiki: Command line parameters](http://zdoom.org/wiki/Command_line_parameters)
+- [ZDoom Wiki: CVARs (Console Variables)](http://zdoom.org/wiki/CVARS)
+
+
+---
+### `clearGameArgs`
+
+| C++ | `void clearGameArgs()` |
+| :-- | :-- |
+| Python | `clear_game_args() -> None` |
+
+Clears all arguments previously added with [`addGameArgs`](#addgameargs) method.
+
+
+## Reward methods
+
+
+### `getLivingReward`
+
+| C++ | `double getLivingReward()` |
+| :-- | :-- |
+| Python | `get_living_reward() -> float` |
+
+Returns the reward granted to the player after every tic.
+
+
+---
+### `setLivingReward`
+
+| C++ | `void setLivingReward(double livingReward)` |
+| :-- | :-- |
+| Python | `set_living_reward(livingReward: float) -> None` |
+
+Sets the reward granted to the player after every tic. A negative value is also allowed.
+
+Default value: 0
+
+Config key: `livingReward/living_reward`
+
+
+---
+### `getDeathPenalty`
+
+| C++ | `double getDeathPenalty()` |
+| :-- | :-- |
+| Python | `get_death_penalty() -> float` |
+
+Returns the penalty for the player's death.
+
+
+---
+### `setDeathPenalty`
+
+| C++ | `void setDeathPenalty(double deathPenalty)` |
+| :-- | :-- |
+| Python | `set_death_penalty(deathPenalty: float) -> None` |
+
+Sets a penalty for the player's death. Note that in case of a negative value, the player will be rewarded upon dying.
+
+Default value: 0
+
+Config key: `deathPenalty/death_penalty`
+
+
+---
+### `getLastReward`
+
+| C++ | `double getLastReward()` |
+| :-- | :-- |
+| Python | `get_last_reward() -> float` |
+
+Returns a reward granted after the last update of state.
+
+
+---
+### `getTotalReward`
+
+| C++ | `double getTotalReward()` |
+| :-- | :-- |
+| Python | `get_total_reward() -> float` |
+
+Returns the sum of all rewards gathered in the current episode.
+
+
+## General game setting methods
+
+
+### `loadConfig`
+
+| C++ | `bool loadConfig(std::string filePath)` |
+| :-- | :-- |
+| Python | `load_config(filePath: str) -> bool` |
+
+Loads configuration (resolution, available buttons, game variables etc.) from a configuration file.
+In case of multiple invocations, older configurations will be overwritten by the recent ones.
+Overwriting does not involve resetting to default values. Thus only overlapping parameters will be changed.
+The method returns true if the whole configuration file was correctly read and applied,
+false if the file contained errors.
+
+See also:
+- [ConfigFile](./configurationFiles.md)
+
+
+---
+### `getMode`
+
+| C++ | `Mode getMode()` |
+| :-- | :-- |
+| Python | `get_mode() -> Mode` |
+
+Returns current mode (`PLAYER`, `SPECTATOR`, `ASYNC_PLAYER`, `ASYNC_SPECTATOR`).
+
+See also:
+- [`Enums: Mode`](./enums.md#mode)
+
+
+---
+### `setMode`
+
+| C++ | `void setMode(Mode mode)` |
+| :-- | :-- |
+| Python | `set_mode(mode: Mode) -> None` |
+
+Sets mode (`PLAYER`, `SPECTATOR`, `ASYNC_PLAYER`, `ASYNC_SPECTATOR`) in which the game will be running.
+
+Default value: `PLAYER`.
+
+Config key: `mode`
+
+See also:
+- [`Enums: Mode`](./enums.md#mode)
+
+
+---
+### `getTicrate`
+
+| C++ | `unsigned int getTicrate()` |
+| :-- | :-- |
+| Python | `get_ticrate() -> int` |
+
+Added in 1.1.0
+
+Returns current ticrate.
+
+
+---
+### `setTicrate`
+
+| C++ | `void setTicrate(unsigned int ticrate)` |
+| :-- | :-- |
+| Python | `set_ticrate(ticrate: int) -> None` |
+
+Added in 1.1.0
+
+Sets ticrate for ASNYC Modes - number of logic tics executed per second.
+The default Doom ticrate is 35. This value will play a game at normal speed.
+
+Default value: 35 (default Doom ticrate).
+
+Config key: `ticrate`
+
+See also:
+- [examples/python/ticrate.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/ticrate.py)
+
+
+---
+### `setViZDoomPath`
+
+| C++ | `void setViZDoomPath(std::string filePath)` |
+| :-- | :-- |
+| Python | `set_vizdoom_path(filePath: str) -> None` |
+
+Sets path to the ViZDoom engine executable vizdoom.
+
+Default value: "{vizdoom.so location}/{vizdoom or vizdoom.exe (on Windows)}".
+
+Config key: `ViZDoomPath/vizdoom_path
+
+| C++ | `void setDoomGamePath(std::string filePath)` |
+| :-- | :-- |
+| Python | `set_doom_game_path(filePath: str) -> None` |
+
+Sets the path to the Doom engine based game file (wad format).
+If not used DoomGame will look for doom2.wad and freedoom2.wad (in that order) in the directory of ViZDoom's installation (where vizdoom.so/pyd is).
+
+Default value: "{vizdoom.so location}/{doom2.wad, doom.wad, freedoom2.wad or freedoom.wad}"
+
+Config key: `DoomGamePath/doom_game_path`
+
+
+---
+### `setDoomScenarioPath`
+
+| C++ | `void setDoomScenarioPath(std::string filePath)` |
+| :-- | :-- |
+| Python | `set_doom_scenario_path(filePath: str) -> None` |
+
+Sets the path to an additional scenario file (wad format).
+If not provided, the default Doom single-player maps will be loaded.
+
+Default value: ""
+
+Config key: `DoomScenarioPath/set_doom_scenario_path`
+
+
+---
+### `setDoomMap`
+
+| C++ | `void setDoomMap(std::string map)` |
+| :-- | :-- |
+| Python | `set_doom_map(map: str) -> None` |
+
+Sets the map name to be used.
+
+Default value: "map01", if set to empty "map01" will be used.
+
+Config key: `DoomMap/doom_map`
+
+
+---
+### `setDoomSkill`
+
+| C++ | `void setDoomSkill(unsigned int skill)` |
+| :-- | :-- |
+| Python | `set_doom_skill(skill: int) -> None` |
+
+Sets Doom game difficulty level, which is called skill in Doom.
+The higher the skill, the harder the game becomes.
+Skill level affects monsters' aggressiveness, monsters' speed, weapon damage, ammunition quantities, etc.
+Takes effect from the next episode.
+
+- 1 - VERY EASY, “I'm Too Young to Die” in Doom.
+- 2 - EASY, “Hey, Not Too Rough" in Doom.
+- 3 - NORMAL, “Hurt Me Plenty” in Doom.
+- 4 - HARD, “Ultra-Violence” in Doom.
+- 5 - VERY HARD, “Nightmare!” in Doom.
+
+Default value: 3
+
+Config key: `DoomSkill/doom_skill`
+
+
+---
+### `setDoomConfigPath`
+
+| C++ | `void setDoomConfigPath(std::string filePath)` |
+| :-- | :-- |
+| Python | `set_doom_config_path(filePath: str) -> None` |
+
+Sets the path for ZDoom's configuration file.
+The file is responsible for the configuration of the ZDoom engine itself.
+If it does not exist, it will be created after the `vizdoom` executable is run.
+This method is not needed for most of the tasks and is added for the convenience of users with hacking tendencies.
+
+Default value: "", if left empty "_vizdoom.ini" will be used.
+
+Config key: `DoomConfigPath/doom_config_path`
+
+
+---
+### `getSeed`
+
+| C++ | `unsigned int getSeed()` |
+| :-- | :-- |
+| Python | `getSeed() -> int` |
+
+Return ViZDoom's seed.
+
+
+---
+### `setSeed`
+
+| C++ | `void setSeed(unsigned int seed)` |
+| :-- | :-- |
+| Python | `set_seed(seed: int) -> None` |
+
+Sets the seed of the ViZDoom's RNG that generates seeds (initial state) for episodes.
+
+Default value: randomized in constructor
+
+Config key: `seed`
+
+See also:
+- [examples/python/seed.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/seed.py)
+
+
+
+---
+### `getEpisodeStartTime`
+
+| C++ | `unsigned int getEpisodeStartTime()` |
+| :-- | :-- |
+| Python | `get_episode_start_time() -> int` |
+
+Returns start delay of every episode in tics.
+
+
+---
+### `setEpisodeStartTime`
+
+| C++ | `void setEpisodeStartTime(unsigned int tics)` |
+| :-- | :-- |
+| Python | `set_episode_start_time(tics: int) -> None` |
+
+Sets start delay of every episode in tics.
+Every episode will effectively start (from the user's perspective) after the provided number of tics.
+
+Default value: 1
+
+Config key: `episodeStartTime/episode_start_time`
+
+
+---
+### `getEpisodeTimeout`
+
+| C++ | `unsigned int getEpisodeTimeout()` |
+| :-- | :-- |
+| Python | `get_episode_timeout() -> int` |
+
+Returns the number of tics after which the episode will be finished.
+
+
+---
+### `setEpisodeTimeout`
+
+| C++ | `void setEpisodeTimeout(unsigned int tics)` |
+| :-- | :-- |
+| Python | `set_episode_timeout(tics: int) -> None` |
+
+Sets the number of tics after which the episode will be finished. 0 will result in no timeout.
+
+Config key: `episodeTimeout/episode_timeout`
+
+
+## Output/rendering setting methods
+
+
+### `setScreenResolution`
+
+| C++ | `void setScreenResolution(ScreenResolution resolution)` |
+| :-- | :-- |
+| Python | `set_screen_resolution(resolution: ScreenResolution) -> None` |
+
+Sets the screen resolution. ZDoom engine supports only specific resolutions.
+Supported resolutions are part of ScreenResolution enumeration (e.g., `RES_320X240`, `RES_640X480`, `RES_1920X1080`).
+The buffers, as well as the content of ViZDoom's display window, will be affected.
+
+Default value: `RES_320X240`
+
+Config key: `screenResolution/screen_resolution`
+
+
+See also:
+- [`Enums: ScreenResolution`](./enums.md#screenresolution)
+
+
+---
+### `getScreenFormat`
+
+| C++ | `ScreenFormat getScreenFormat()` |
+| :-- | :-- |
+| Python | `get_screen_format() -> ScreenFormat` |
+
+Returns the format of the screen buffer and the automap buffer.
+
+
+---
+### `setScreenFormat`
+
+| C++ | `void setScreenFormat(ScreenFormat format)` |
+| :-- | :-- |
+| Python | `set_screen_format(format: ScreenFormat) -> None` |
+
+Sets the format of the screen buffer and the automap buffer.
+Supported formats are defined in `ScreenFormat` enumeration type (e.g. `CRCGCB`, `RGB24`, `GRAY8`).
+The format change affects only the buffers, so it will not have any effect on the content of ViZDoom's display window.
+
+Default value: `CRCGCB`
+
+Config key: `screenFormat/screen_format`
+
+See also:
+- [`Enums: ScreenFormat`](./enums.md#screenformat)
+
+
+---
+### `isDepthBufferEnabled`
+
+| C++ | `bool isDepthBufferEnabled()` |
+| :-- | :-- |
+| Python | `is_depth_buffer_enabled() -> None` |
+
+Added in 1.1.0
+
+Returns true if the depth buffer is enabled.
+
+
+---
+### `setDepthBufferEnabled`
+
+| C++ | `void setDepthBufferEnabled(bool depthBuffer)` |
+| :-- | :-- |
+| Python | `set_depth_buffer_enabled(depthBuffer: bool) -> None` |
+
+Added in 1.1.0
+
+Enables rendering of the depth buffer, it will be available in the state.
+Depth buffer will contain noise if `viz_nocheat` is enabled.
+
+Default value: false
+
+Config key: `depthBufferEnabled/depth_buffer_enabled`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py)
+
+
+---
+### `isLabelsBufferEnabled`
+
+| C++ | `bool isLabelsBufferEnabled()` |
+| :-- | :-- |
+| Python | `is_labels_buffer_enabled() -> None` |
+
+Added in 1.1.0
+
+Returns true if the labels buffer is enabled.
+
+
+---
+### `setLabelsBufferEnabled`
+
+| C++ | `void setLabelsBufferEnabled(bool labelsBuffer)` |
+| :-- | :-- |
+| Python | `set_labels_buffer_enabled(bool labelsBuffer) -> None` |
+
+Added in 1.1.0
+
+Enables rendering of the labels buffer, it will be available in the state with the vector of `Label`s.
+LabelsBuffer will contain noise if `viz_nocheat` is enabled.
+
+Default value: false
+
+Config key: `labelsBufferEnabled/labels_buffer_enabled`
+
+See also:
+- [`GameState: Label`](./gameState.md#label)
+- [`GameState`](./gameState.md#gamestate)
+- [examples/python/labels.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/labels.py)
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py)
+
+
+---
+### `isAutomapBufferEnabled`
+
+| C++ | `bool isAutomapBufferEnabled()` |
+| :-- | :-- |
+| Python | `is_automap_buffer_enabled() -> bool` |
+
+Added in 1.1.0
+
+Returns true if the automap buffer is enabled.
+
+
+---
+### `setAutomapBufferEnabled`
+
+| C++ | `void setAutomapBufferEnabled(bool automapBuffer)` |
+| :-- | :-- |
+| Python | `set_automap_buffer_enabled(automapBuffer: bool) -> None` |
+
+Added in 1.1.0
+
+Enables rendering of the automap buffer, it will be available in the state.
+
+Default value: false
+
+Config key: `automapBufferEnabled/automap_buffer_enabled`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py),
+
+
+---
+### `setAutomapMode`
+
+| C++ | `void setAutomapMode(AutomapMode mode)` |
+| :-- | :-- |
+| Python | `set_automap_mode(mode: AutomapMode) -> None` |
+
+Added in 1.1.0
+
+Sets the automap mode (`NORMAL`, `WHOLE`, `OBJECTS`, `OBJECTS_WITH_SIZE`),
+which determines what will be visible on it.
+
+Default value: `NORMAL`
+
+Config key: `automapMode/set_automap_mode`
+
+See also:
+- [`Enums: AutomapMode`](./enums.md#automapmode)
+
+
+---
+### `setAutomapRotate`
+
+| C++ | `void setAutomapRotate(bool rotate)` |
+| :-- | :-- |
+| Python | `set_automap_rotate(rotate: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if the automap will be rotating with the player.
+If false, north always will be at the top of the buffer.
+
+Default value: false
+
+Config key: `automapRotate/automap_rotate`
+
+
+---
+### `setAutomapRenderTextures`
+
+| C++ | `void setAutomapRenderTextures(bool textures)` |
+| :-- | :-- |
+| Python | `set_automap_render_textures(textures: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if the automap will be textured, showing the floor textures.
+
+Default value: true
+
+Config key: `automapRenderTextures/automap_render_textures`
+
+
+---
+### `setRenderHud`
+
+| C++ | `void setRenderHud(bool hud)` |
+| :-- | :-- |
+| Python | `set_render_hud(hud: bool) -> None` |
+
+Determine if the hud will be rendered in the game.
+
+Default value: false
+
+Config key: `renderHud/render_hud`
+
+
+---
+### `setRenderMinimalHud`
+
+| C++ | `void setRenderMinimalHud(bool minHud)` |
+| :-- | :-- |
+| Python | `set_render_minimal_hud(minHud: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if the minimalistic version of the hud will be rendered instead of the full hud.
+
+Default value: false
+
+Config key: `renderMinimalHud/render_minimal_hud`
+
+
+---
+### `setRenderWeapon`
+
+| C++ | `void setRenderWeapon(bool weapon)` |
+| :-- | :-- |
+| Python | `set_render_weapon(weapon: bool) -> None` |
+
+Determine if the weapon held by the player will be rendered in the game.
+
+Default value: true
+
+Config key: `renderWeapon/render_weapon`
+
+
+---
+### `setRenderCrosshair`
+
+| C++ | `void setRenderCrosshair(bool crosshair)` |
+| :-- | :-- |
+| Python | `set_render_crosshair(crosshair: bool) -> None` |
+
+Determine if the crosshair will be rendered in the game.
+
+Default value: false
+
+Config key: `renderCrosshair/render_crosshair`
+
+
+---
+### `setRenderDecals`
+
+| C++ | `void setRenderDecals(bool decals)` |
+| :-- | :-- |
+| Python | `set_render_decals(decals: bool) -> None` |
+
+Determine if the decals (marks on the walls) will be rendered in the game.
+
+Default value: true
+
+Config key: `renderDecals/render_decals`
+
+
+---
+### `setRenderParticles`
+
+| C++ | `void setRenderParticles(bool particles)` |
+| :-- | :-- |
+| Python | `set_render_particles(particles: bool) -> None` |
+
+Determine if the particles will be rendered in the game.
+
+Default value: true
+
+Config key: `renderParticles/render_particles`
+
+
+---
+### `setRenderEffectsSprites`
+
+| C++ | `void setRenderEffectsSprites(bool sprites)` |
+| :-- | :-- |
+| Python | `set_render_effects_sprites(sprites: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if some effects sprites (gun puffs, blood splats etc.) will be rendered in the game.
+
+Default value: true
+
+Config key: `renderEffectsSprites/render_effects_sprites`
+
+
+---
+### `setRenderMessages`
+
+| C++ | `void setRenderMessages(bool messages)` |
+| :-- | :-- |
+| Python | `set_render_messages(messages: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if in-game messages (information about pickups, kills, etc.) will be rendered in the game.
+
+Default value: false
+
+Config key: `renderMessages/render_messages`
+
+
+---
+### `setRenderCorpses`
+
+| C++ | `void setRenderCorpses(bool corpses)` |
+| :-- | :-- |
+| Python | `set_render_corpsess(corpses: bool) -> None` |
+
+Added in 1.1.0
+
+Determine if actors' corpses will be rendered in the game.
+
+Default value: true
+
+Config key: `renderCorpses/render_corpses`
+
+
+---
+### `setRenderScreenFlashes`
+
+| C++ | `void setRenderScreenFlashes(bool flashes)` |
+| :-- | :-- |
+| Python | `set_render_screen_flashes(flashes: bool) -> None` |
+
+Added in 1.1.3
+
+Determine if the screen flash effect upon taking damage or picking up items will be rendered in the game.
+
+Default value: true
+
+Config key: `renderScreenFlashes/render_screen_flashes`
+
+
+---
+### `setRenderAllFrames`
+
+| C++ | `void setRenderAllFrames(bool allFrames)` |
+| :-- | :-- |
+| Python | `set_render_all_frames(all_frames: bool) -> None` |
+
+Added in 1.1.3
+
+Determine if all frames between states will be rendered (when skip greater than 1 is used).
+Allows smooth preview but can reduce performance.
+It only makes sense to use it if the window is visible.
+
+Default value: false
+
+Config key: `renderAllFrames/render_all_frames`
+
+See also:
+- [`setWindowVisible`](#setwindowvisible)
+
+
+---
+### `setWindowVisible`
+
+| C++ | `void setWindowVisible(bool visibility)` |
+| :-- | :-- |
+| Python | `set_window_visible(visibility: bool) -> None` |
+
+Determines if ViZDoom's window will be visible.
+ViZDoom with window disabled can be used on Linux systems without X Server.
+
+Default value: false
+
+Config key: `windowVisible/window_visible`
+
+
+---
+### `setConsoleEnabled`
+
+| C++ | `void setConsoleEnabled(bool console)` |
+| :-- | :-- |
+| Python | `set_console_enabled(console: bool) -> None` |
+
+Determines if ViZDoom's console output will be enabled.
+
+Default value: false
+
+Config key: `consoleEnabled/console_enabled`
+
+
+---
+### `setSoundEnabled`
+
+| C++ | `void setSoundEnabled(bool sound)` |
+| :-- | :-- |
+| Python | `set_sound_enabled(sound: bool) -> None` |
+
+Determines if ViZDoom's sound will be played.
+
+Default value: false
+
+Config key: `soundEnabled/sound_enabled`
+
+
+---
+### `getScreenWidth`
+
+| C++ | `int getScreenWidth()` |
+| :-- | :-- |
+| Python | `get_screen_width() -> int` |
+
+Returns game's screen width - width of all buffers.
+
+
+---
+### `getScreenHeight`
+
+| C++ | `int getScreenHeight()` |
+| :-- | :-- |
+| Python | `get_screen_height() -> int` |
+
+Returns game's screen height - height of all buffers.
+
+
+---
+### `getScreenChannels`
+
+| C++ | `int getScreenChannels()` |
+| :-- | :-- |
+| Python | `get_screen_channels() -> int` |
+
+Returns number of channels in screen buffer and map buffer (depth and labels buffer always have one channel).
+
+
+---
+### `getScreenPitch`
+
+| C++ | `size_t getScreenPitch()` |
+| :-- | :-- |
+| Python | `get_screen_pitch() -> int` |
+
+Returns size in bytes of one row in screen buffer and map buffer.
+
+
+---
+### `getScreenSize`
+
+| C++ | `size_t getScreenSize()` |
+| :-- | :-- |
+| Python | `get_screen_size() -> int` |
+
+Returns size in bytes of screen buffer and map buffer.
+
+
+---
+### `isObjectsInfoEnabled`
+
+| C++ | `bool isObjectInfoEnabled()` |
+| :-- | :-- |
+| Python | `is_object_info_enabled() -> bool` |
+
+Added in 1.1.8
+
+Returns true if the objects information is enabled.
+
+
+---
+### `setObjectsInfoEnabled`
+
+| C++ | `void setObjectsInfoEnabled(bool objectsInfo)` |
+| :-- | :-- |
+| Python | `set_objects_info_enabled(bool objectsInfo) -> None` |
+
+Added in 1.1.8
+
+Enables information about all objects present in the current episode/level.
+It will be available in the state.
+
+Default value: false
+
+Config key: `objectsInfoEnabled/objects_info_enabled`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [`GameState: Object`](./gameState.md#object)
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/objects_and_sectors.py),
+
+
+---
+### `isSectorsInfoEnabled`
+
+| C++ | `bool isSectorsInfoEnabled()` |
+| :-- | :-- |
+| Python | `is_sectors_info_enabled() -> bool` |
+
+Added in 1.1.8
+
+Returns true if the information about sectors is enabled.
+
+
+---
+### `setSectorsInfoEnabled`
+
+| C++ | `void setSectorsInfoEnabled(bool sectorsInfo)` |
+| :-- | :-- |
+| Python | `set_sectors_info_enabled(bool sectorsInfo) -> None` |
+
+Added in 1.1.8
+
+Enables information about all sectors (map layout) present in the current episode/level.
+It will be available in the state.
+
+Default value: false
+
+Config key: `sectorsInfoEnabled/sectors_info_enabled`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [`GameState: Sector`](./gameState.md#sector)
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/objects_and_sectors.py)
+
+
+---
+### `isAudioBufferEnabled`
+
+| C++ | `bool isAudioBufferEnabled()` |
+| :-- | :-- |
+| Python | `is_audio_buffer_enabled() -> bool` |
+
+Added in 1.1.9
+
+Returns true if the audio buffer is enabled.
+
+
+---
+### `setAudioBufferEnabled`
+
+| C++ | `void setAudioBufferEnabled(bool audioBuffer)` |
+| :-- | :-- |
+| Python | `set_audio_buffer_enabled(bool audioBuffer) -> None` |
+
+Added in 1.1.9
+
+Returns true if the audio buffer is enabled.
+
+Default value: false
+
+Config key: `audioBufferEnabled/audio_buffer_enabled`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [`Enums: SamplingRate`](./enums.md#sampling-rate)
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py)
+
+
+---
+### `getAudioSamplingRate`
+
+| C++ | `int getAudioSamplingRate()` |
+| :-- | :-- |
+| Python | `get_audio_sampling_rate() -> int` |
+
+Added in 1.1.9
+
+Returns the sampling rate of the audio buffer.
+
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [`Enums: SamplingRate`](./enums.md#sampling-rate)
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py)
+
+
+---
+### `setAudioSamplingRate`
+
+| C++ | `void setAudioSamplingRate(SamplingRate samplingRate)` |
+| :-- | :-- |
+| Python | `set_audio_sampling_rate(SamplingRate samplingRate) -> None` |
+
+Added in 1.1.9
+
+Sets the sampling rate of the audio buffer.
+
+Default value: false
+
+Config key: `audioSamplingRate/audio_samping_rate`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [`Enums: SamplingRate`](./enums.md#sampling-rate)
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py)
+
+
+---
+### `getAudioBufferSize`
+
+| C++ | `int getAudioBufferSize()` |
+| :-- | :-- |
+| Python | `get_audio_buffer_size() -> int` |
+
+Added in 1.1.9
+
+Returns the size of the audio buffer.
+
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py)
+
+
+---
+### `setAudioBufferSize`
+
+| C++ | `void setAudioBufferSize(unsigned int size)` |
+| :-- | :-- |
+| Python | `set_audio_buffer_size(size: int) -> None` |
+
+Added in 1.1.9
+
+Sets the size of the audio buffer. The size is defined by a number of logic tics.
+After each action audio buffer will contain audio from the specified number of the last processed tics.
+Doom uses 35 ticks per second.
+
+Default value: 4
+
+Config key: `audioBufferSize/audio_buffer_size`
+
+See also:
+- [`GameState`](./gameState.md#gamestate)
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py)
diff --git a/docs/api_cpp/enums.md b/docs/api_cpp/enums.md
new file mode 100644
index 000000000..8f094a410
--- /dev/null
+++ b/docs/api_cpp/enums.md
@@ -0,0 +1,273 @@
+# Enums
+
+## `Mode`
+
+Enum type that defines all supported modes.
+
+- **PLAYER** - synchronous player mode
+- **SPECTATOR** - synchronous spectator mode
+- **ASYNC_PLAYER** - asynchronous player mode
+- **ASYNC_SPECTATOR** - asynchronous spectator mode
+
+In **PLAYER** and **ASYNC_PLAYER** modes, the agent controls ingame character.
+
+In **SPECTATOR** and **ASYNC_SPECTATOR** modes, ingame character should be controlled by the human and the agent gets information about the human action.
+
+In **PLAYER** and **SPECTATOR** modes, the game waits for agent action or permission to continue.
+
+In **ASYNC** modes the game progress with constant speed (default 35 tics per second, this can be set) without waiting for the agent actions.
+
+All modes can be used in singleplayer and multiplayer.
+
+See also:
+- [`DoomGame: getMode`](./doomGame.md#getmode),
+- [`DoomGame: setMode`](./doomGame.md#setmode),
+- [`DoomGame: getTicrate`](./doomGame.md#getticrate),
+- [`DoomGame: setTicrate`](./doomGame.md#setticrate).
+
+
+---
+## `ScreenFormat`
+
+Enum type that defines all supported **screenBuffer** and **automapBuffer** formats.
+
+- **CRCGCB** - 3 channels of 8-bit values in RGB order
+- **RGB24** - channel of RGB values stored in 24 bits, where R value is stored in the oldest 8 bits
+- **RGBA32** - channel of RGBA values stored in 32 bits, where R value is stored in the oldest 8 bits
+- **ARGB32** - channel of ARGB values stored in 32 bits, where A value is stored in the oldest 8 bits
+- **CBCGCR** - 3 channels of 8-bit values in BGR order
+- **BGR24** - channel of BGR values stored in 24 bits, where B value is stored in the oldest 8 bits
+- **BGRA32** - channel of BGRA values stored in 32 bits, where B value is stored in the oldest 8 bits
+- **ABGR32** - channel of ABGR values stored in 32 bits, where A value is stored in the oldest 8 bits
+- **GRAY8** - 8-bit gray channel
+- **DOOM_256_COLORS8** - 8-bit channel with Doom palette values
+
+
+In **CRCGCB** and **CBCGCR** format **screenBuffer** and **automapBuffer** store all red 8-bit values then all green values and then all blue values, each channel is considered separately. As matrices they have [3, y, x] shape.
+
+In **RGB24** and **BGR24** format **screenBuffer** and **automapBuffer** store 24 bit RGB triples. As matrices they have [y, x, 3] shape.
+
+In **RGBA32**, **ARGB32**, **BGRA32** and **ABGR32** format **screenBuffer** and **automapBuffer** store 32 bit sets of RBG + alpha values. As matrices they have [y, x, 4] shape.
+
+In **GRAY8** and **DOOM_256_COLORS8** format **screenBuffer** and **automapBuffer** store single 8 bit values. As matrices they have [y, x] shape.
+
+**depthBuffer** and **lablesBuffer** always store single 8-bit values, so they always have [y, x] shape.
+
+See also:
+- [`DoomGame: getScreenFormat`](./doomGame.md#getscreenformat),
+- [`DoomGame: setScreenFormat`](./doomGame.md#setscreenformat),
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py).
+
+
+---
+## `ScreenResolution`
+
+Enum type that defines all supported resolutions - shapes of **screenBuffer**, **depthBuffer**, **labelsBuffer** and **automapBuffer** in **State**.
+
+- **RES_160X120** (4:3)
+- **RES_200X125** (16:10)
+- **RES_200X150** (4:3)
+- **RES_256X144** (16:9)
+- **RES_256X160** (16:10)
+- **RES_256X192** (4:3)
+- **RES_320X180** (16:9)
+- **RES_320X200** (16:10)
+- **RES_320X240** (4:3)
+- **RES_320X256** (5:4)
+- **RES_400X225** (16:9)
+- **RES_400X250** (16:10)
+- **RES_400X300** (4:3)
+- **RES_512X288** (16:9)
+- **RES_512X320** (16:10)
+- **RES_512X384** (4:3)
+- **RES_640X360** (16:9)
+- **RES_640X400** (16:10)
+- **RES_640X480** (4:3)
+- **RES_800X450** (16:9)
+- **RES_800X500** (16:10)
+- **RES_800X600** (4:3)
+- **RES_1024X576** (16:9)
+- **RES_1024X640** (16:10)
+- **RES_1024X768** (4:3)
+- **RES_1280X720** (16:9)
+- **RES_1280X800** (16:10)
+- **RES_1280X960** (4:3)
+- **RES_1280X1024** (5:4)
+- **RES_1400X787** (16:9)
+- **RES_1400X875** (16:10)
+- **RES_1400X1050** (4:3)
+- **RES_1600X900** (16:9)
+- **RES_1600X1000** (16:10)
+- **RES_1600X1200** (4:3)
+- **RES_1920X1080** (16:9)
+
+See also:
+- [`DoomGame: setScreenResolution`](./doomGame.md#setscreenresolution),
+- [`DoomGame: getScreenWidth`](./doomGame.md#getscreenwidth),
+- [`DoomGame: getScreenHeight`](./doomGame.md#getscreenheight).
+
+
+---
+## `AutomapMode`
+
+Enum type that defines all **automapBuffer** modes.
+
+- **NORMAL** - Only level architecture the player has seen is shown.
+- **WHOLE** - All architecture is shown, regardless of whether or not the player has seen it.
+- **OBJECTS** - In addition to the previous, shows all things in the map as arrows pointing in the direction they are facing.
+- **OBJECTS_WITH_SIZE** - In addition to the previous, all things are wrapped in a box showing their size.
+
+See also:
+- [`DoomGame: setAutomapMode`](./doomGame.md#setautomapmode),
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py).
+
+
+---
+## `GameVariable`
+
+Enum type that defines all variables that can be obtained from the game.
+
+### Defined variables
+- **KILLCOUNT** - Counts the number of monsters killed during the current episode. ~Killing other players/bots do not count towards this.~ From 1.1.5 killing other players/bots counts towards this.
+- **ITEMCOUNT** - Counts the number of picked up items during the current episode.
+- **SECRETCOUNT** - Counts the number of secret location/objects discovered during the current episode.
+- **FRAGCOUNT** - Counts the number of players/bots killed, minus the number of committed suicides. Useful only in multiplayer mode.
+- **DEATHCOUNT** - Counts the number of players deaths during the current episode. Useful only in multiplayer mode.
+- **HITCOUNT** - Counts number of hit monsters/players/bots during the current episode. Added in 1.1.5.
+- **HITS_TAKEN** - Counts number of hits taken by the player during the current episode. Added in 1.1.5.
+- **DAMAGECOUNT** - Counts number of damage dealt to monsters/players/bots during the current episode. Added in 1.1.5.
+- **DAMAGE_TAKEN** - Counts number of damage taken by the player during the current episode. Added in 1.1.5.
+- **HEALTH** - Can be higher then 100!
+- **ARMOR** - Can be higher then 100!
+- **DEAD** - True if the player is dead.
+- **ON_GROUND** - True if the player is on the ground (not in the air).
+- **ATTACK_READY** - True if the attack can be performed.
+- **ALTATTACK_READY** - True if the altattack can be performed.
+- **SELECTED_WEAPON** - Selected weapon's number.
+- **SELECTED_WEAPON_AMMO** - Ammo for selected weapon.
+- **AMMO0** - **AMMO9** - Number of ammo for weapon in N slot.
+- **WEAPON0** - **WEAPON9** - Number of weapons in N slot.
+- **POSITION_X** - Position of the player, not available if `viz_nocheat` is enabled.
+- **POSITION_Y**
+- **POSITION_Z**
+- **ANGLE** - Orientation of the player, not available if `viz_nocheat` is enabled.
+- **PITCH**
+- **ROLL**
+- **VIEW_HEIGHT** - View high of the player, not available if `viz_nocheat` is enabled. Position of the camera in Z axis is equal to **POSITION_Z** + **VIEW_HEIGHT**. Added in 1.1.7.
+- **VELOCITY_X** - Velocity of the player, not available if `viz_nocheat` is enabled.
+- **VELOCITY_Y**
+- **VELOCITY_Z**
+- **CAMERA_POSITION_X** - Position of the camera, not available if `viz_nocheat` is enabled. Added in 1.1.7.
+- **CAMERA_POSITION_Y**
+- **CAMERA_POSITION_Z**
+- **CAMERA_ANGLE** - Orientation of the camera, not available if `viz_nocheat` is enabled. Added in 1.1.7.
+- **CAMERA_PITCH**
+- **CAMERA_ROLL**
+- **CAMERA_FOV** - Field of view in degrees, not available if `viz_nocheat` is enabled. Added in 1.1.7.
+- **PLAYER_NUMBER** - Player's number in multiplayer game.
+- **PLAYER_COUNT** - Number of players in multiplayer game.
+- **PLAYER1_FRAGCOUNT** - **PLAYER16_FRAGCOUNT** - Number of N player's frags
+
+
+### User (ACS) variables
+- **USER1** - **USER60**
+
+ACS global int variables can be accessed as USER GameVariables.
+global int 0 is reserved for reward and is always threaded as Doom's fixed point numeral.
+Other from 1 to 60 (global int 1-60) can be accessed as USER1 - USER60 GameVariables.
+
+See also:
+- [ZDoom Wiki: ACS](http://zdoom.org/wiki/ACS),
+- [`DoomGame: getAvailableGameVariables`](./doomGame.md#getAvailableGameVariables),
+- [`DoomGame: setAvailableGameVariables`](./doomGame.md#setAvailableGameVariables),
+- [`DoomGame: addAvailableGameVariable`](./doomGame.md#addAvailableGameVariable),
+- [`DoomGame: getGameVariable`](./doomGame.md#getGameVariable),
+- [`Utilities: doomFixedToDouble`](Utilities.md#doomFixedToDouble),
+- [examples/python/basic.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/basic.py),
+- [examples/python/shaping.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/shaping.py).
+
+
+---
+## `Button`
+
+Enum type that defines all buttons that can be "pressed" by the agent.
+
+### Binary buttons
+
+Binary buttons have only 2 states "not pressed" if value 0 and "pressed" if value other then 0.
+
+- **ATTACK**
+- **USE**
+- **JUMP**
+- **CROUCH**
+- **TURN180**
+- **ALTATTACK**
+- **RELOAD**
+- **ZOOM**
+- **SPEED**
+- **STRAFE**
+- **MOVE_RIGHT**
+- **MOVE_LEFT**
+- **MOVE_BACKWARD**
+- **MOVE_FORWARD**
+- **TURN_RIGHT**
+- **TURN_LEFT**
+- **LOOK_UP**
+- **LOOK_DOWN**
+- **MOVE_UP**
+- **MOVE_DOWN**
+- **LAND**
+- **SELECT_WEAPON1**
+- **SELECT_WEAPON2**
+- **SELECT_WEAPON3**
+- **SELECT_WEAPON4**
+- **SELECT_WEAPON5**
+- **SELECT_WEAPON6**
+- **SELECT_WEAPON7**
+- **SELECT_WEAPON8**
+- **SELECT_WEAPON9**
+- **SELECT_WEAPON0**
+- **SELECT_NEXT_WEAPON**
+- **SELECT_PREV_WEAPON**
+- **DROP_SELECTED_WEAPON**
+- **ACTIVATE_SELECTED_ITEM**
+- **SELECT_NEXT_ITEM**
+- **SELECT_PREV_ITEM**
+- **DROP_SELECTED_ITEM**
+
+
+### Delta buttons
+
+Buttons whose value defines the speed of movement.
+A positive value indicates movement in the first specified direction and a negative value in the second direction.
+For example: value 10 for MOVE_LEFT_RIGHT_DELTA means slow movement to the right and -100 means fast movement to the left.
+
+- **LOOK_UP_DOWN_DELTA**
+- **TURN_LEFT_RIGHT_DELTA**
+- **MOVE_FORWARD_BACKWARD_DELTA**
+- **MOVE_LEFT_RIGHT_DELTA**
+- **MOVE_UP_DOWN_DELTA**
+
+In case of **TURN_LEFT_RIGHT_DELTA** and **LOOK_UP_DOWN_DELTA** values correspond to degrees.
+In case of **MOVE_FORWARD_BACKWARD_DELTA**, **MOVE_LEFT_RIGHT_DELTA**, **MOVE_UP_DOWN_DELTA** values correspond to Doom Map unit (see Doom Wiki if you want to know how it translates into real life units).
+
+See also:
+- [Doom Wiki: Map unit](https://doomwiki.org/wiki/Map_unit),
+- [`DoomGame: getAvailableButtons`](./doomGame.md#getavailablebuttons),
+- [`DoomGame: setAvailableButtons`](./doomGame.md#setavailablebuttons),
+- [`DoomGame: addAvailableButton`](./doomGame.md#addavailablebutton),
+- [`DoomGame: setButtonMaxValue`](./doomGame.md#setbuttonmaxvalue),
+- [`DoomGame: getButtonMaxValue`](./doomGame.md#getbuttonmaxvalue),
+- [examples/python/basic.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/basic.py),
+- [examples/python/delta_buttons.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/delta_buttons.py),
+- [GitHub issue: Angle changes by executing certain commands](https://github.com/Farama-Foundation/ViZDoom/issues/182).
+
+
+## `SamplingRate`
+
+Enum type that defines all supported sampling rates for **audioBuffer** in **State**.
+Added in 1.1.9.
+
+- **SR_11025**
+- **SR_22050**
+- **SR_44100**
diff --git a/docs/api_cpp/exceptions.md b/docs/api_cpp/exceptions.md
new file mode 100644
index 000000000..9d877416a
--- /dev/null
+++ b/docs/api_cpp/exceptions.md
@@ -0,0 +1,17 @@
+# Exceptions
+
+ViZDoom defines several exceptions that can be thrown by its API:
+
+* `FileDoesNotExistException` - means that file specified as part of a configuration does not exist.
+
+* `MessageQueueException/SharedMemoryException` - means that communication with ViZDoom's instance failed. Usually, means a problem with permissions or system configuration.
+
+* `SignalException` - means that a signal was cached by ViZDoom's instance.
+
+* `ViZDoomErrorException` - means that an error in the ViZDoom engine occurred.
+
+* `ViZDoomIsNotRunningException` - means that called method cannot be used when ViZDoom instance is not running.
+
+* `ViZDoomUnexpectedExitException` - means that ViZDoom's instance was closed/terminated/killed from the outside.
+
+Most of the exceptions contain more information in "what()" message.
diff --git a/docs/api_cpp/gameState.md b/docs/api_cpp/gameState.md
new file mode 100644
index 000000000..a584fa99c
--- /dev/null
+++ b/docs/api_cpp/gameState.md
@@ -0,0 +1,170 @@
+# GameState
+
+GameState is the main object returned by [`DoomGame: getState`](./doomGame.md#getstate) method.
+
+
+## `GameState`
+(`C++ type / Python type` **name**)
+
+- `unsigned int / int` **number**
+- `unsigned int / int` **tic**
+- `std::vector / numpy.double[]` **gameVariables / game_variables**
+- `ImageBufferPtr / numpy.uint8[]` **screenBuffer / screen_buffer**
+- `ImageBufferPtr / numpy.uint8[]` **depthBuffer / depth_buffer**
+- `ImageBufferPtr / numpy.uint8[]` **labelsBuffer / labels_buffer**
+- `ImageBufferPtr / numpy.uint8[]` **automapBuffer / automap_buffer**
+- `AudioBufferPtr / numpy.int16[]` **audioBuffer / audio_buffer**
+- `std::vector / list` **labels**
+
+**number** - number of the state in the episode.
+**tic** - ingame time, 1 tic is 1/35 of second in the game world. Added in 1.1.1.
+
+See also:
+- [`DoomGame: getState`](./doomGame.md#getstate),
+- [examples/python/basic.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/basic.py),
+- [examples/python/buffers.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/buffers.py).
+- [examples/python/audio_buffer.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/audio_buffer.py).
+
+
+
+### Types used only in C++
+
+- `Buffer (std::vector)`
+- `ImageBufferPtr (std::shared_ptr)`
+- `GameStatePtr (std::shared_ptr)`
+
+
+## Structures
+
+
+### `Label`
+(`C++ type / Python type` **name**)
+
+- `unsigned int / int` **objectId / object_id**
+- `std::string / str` **objectName / object_name**
+- `uint8_t / int` **value**
+- `unsigned int / int` **x**
+- `unsigned int / int` **y**
+- `unsigned int / int` **width**
+- `unsigned int / int` **height**
+- `double / float` **objectPositionX / object_position_x**
+- `double / float` **objectPositionY / object_position_y**
+- `double / float` **objectPositionZ / object_position_z**
+- `double / float` **objectAngle / object_angle**
+- `double / float` **objectPitch / object_pitch**
+- `double / float` **objectRoll / object_roll**
+- `double / float` **objectVelocityX / object_velocity_x**
+- `double / float` **objectVelocityY / object_velocity_y**
+- `double / float` **objectVelocityZ / object_velocity_z**
+
+**objectId / object_id** - unique object ID, if both Labels and Objects information is enabled, this will be the same as **id** in corresponding**Object**.
+
+**objectName / object_name** - ingame object name, many different objects can have the same name (e.g. Medikit, Clip, Zombie).
+
+**value** - value that represents this particular object in **labelsBuffer**.
+
+**x**, **y**, **width**, **height** - describes bounding box of this particular object in **labelsBuffer**. Added in 1.1.5.
+
+
+See also:
+- [`DoomGame: setLabelsBufferEnabled`](./doomGame.md#setlabelsbufferenabled),
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/labels_buffer.py).
+
+
+---
+### `Object`
+(`C++ type / Python type` **name**)
+
+- `unsigned int / int` **id**
+- `std::string / str` **name**
+- `double / float` **positionX / position_x**
+- `double / float` **positionY / position_y**
+- `double / float` **positionZ / position_z**
+- `double / float` **angle**
+- `double / float` **pitch**
+- `double / float` **roll**
+- `double / float` **velocityX / velocity_x**
+- `double / float` **velocityY / velocity_y**
+- `double / float` **velocityZ / velocity_z**
+
+**id** - unique object ID.
+
+**name** - ingame object name, many different objects can have the same name (e.g. Medikit, Clip, Zombie).
+
+Right now `Object` is only available to C++ and Python.
+Added in 1.1.8.
+
+See also:
+- [`DoomGame: setObjectsInfoEnabled`](./doomGame.md#setsectorsinfoenabled),
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
+
+
+---
+### `Line`
+(`C++ type / Python type` **name**)
+
+- `double / float` **x1**
+- `double / float` **y1**
+- `double / float` **x2**
+- `double / float` **y2**
+- `bool / bool` **isBlocking / is_blocking**
+
+**x1**, **y1** - position of the line's first vertex.
+
+**x2**, **y2** - position of the line's second vertex.
+
+**isBlocking / is_blocking** - is true, if line is a wall that can't be passed.
+
+Right now `Line` is only available to C++ and Python.
+Added in 1.1.8.
+
+See also:
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
+
+
+---
+### `Sector`
+(`C++ type / Python type` **name**)
+
+- `double / float` **floorHeight / floor_height**
+- `double / float` **ceilingHeight / ceiling_height**
+- `std::vector / list` **lines**
+
+**floorHeight / floor_height** - height of the sector's floor.
+
+**ceilingHeight / ceiling_height** - height of the sector's ceiling.
+
+**lines** - contains list of line segments, that forms sector.
+
+Right now `Sector` is only available to C++ and Python.
+Added in 1.1.8.
+
+See also:
+- [`DoomGame: setSectorsInfoEnabled`](./doomGame.md#setsectorsinfoenabled),
+- [examples/python/objects_and_sectors.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/objects_and_sectors.py).
+
+
+---
+## `ServerState`
+
+
+ServerState is the main object returned by [`DoomGame: getServerState`](./doomGame.md#getserverstate) method, and it purpose is to get more information about the state of the multi-player game.
+
+
+(`C++ type / Python type` **name**)
+
+- `unsigned int / int` **tic**
+- `unsigned int / int` **playerCount / player_count**
+- `bool[] / list` **playersInGame / players_in_game**
+- `int[] / list` **playersFrags / players_frags**
+- `std::string[] / list` **playersNames / players_names**
+- `bool[] / list` **playersAfk / players_afk**
+- `unsigned int[] / list` **playersLastActionTic / players_last_action_tic **
+- `unsigned int[] / list` **playersLastKillTic / players_last_kill_tic **
+
+Right now `ServerInfo` is only available to C++ and Python.
+Added in 1.1.6.
+
+
+See also:
+- [`DoomGame: getServerState`](./doomGame.md#getserverstate),
diff --git a/docs/api_cpp/utils.md b/docs/api_cpp/utils.md
new file mode 100644
index 000000000..ee580dfad
--- /dev/null
+++ b/docs/api_cpp/utils.md
@@ -0,0 +1,90 @@
+# Utilities
+
+
+## `doomTicsToMs`
+
+| C++ | `double doomTicsToMs(double tics, unsigned int ticrate = 35)` |
+| :-- | :-- |
+| Python | `doom_tics_to_ms(tics: float, ticrate: int = 35) -> float` |
+
+Changed in 1.1
+
+Calculates how many tics will be made during given number of milliseconds.
+
+
+---
+## `msToDoomTics`
+
+| C++ | `double msToDoomTics(double ms, unsigned int ticrate = 35)` |
+| :-- | :-- |
+| Python | `ms_to_doom_tics(ms: float, ticrate: int = 35) -> float` |
+
+Changed in 1.1
+
+Calculates the number of milliseconds that will pass during specified number of tics.
+
+
+---
+## `doomTicsToSec`
+
+| C++ | `double doomTicsToSec(double tics, unsigned int ticrate = 35)` |
+| :-- | :-- |
+| Python | `doom_tics_to_sec(tics: float, ticrate: int = 35) -> float` |
+
+Added in 1.1
+
+Calculates how many tics will be made during given number of seconds.
+
+
+---
+## `secToDoomTics`
+
+| C++ | `double secToDoomTics(double sec, unsigned int ticrate = 35)` |
+| :-- | :-- |
+| Python | `sec_to_doom_tics(sec: float, ticrate: int = 35) -> float` |
+
+Added in 1.1
+
+Calculates the number of seconds that will pass during specified number of tics.
+
+
+---
+## `doomFixedToDouble`
+
+| C++ | `double doomFixedToDouble(int / double doomFixed)` |
+| :-- | :-- |
+| Python | `doom_fixed_to_double(doomFixed: int | float) -> float` |
+
+Converts Doom's fixed point numeral to a floating point value.
+
+See also:
+- [`Enums: User variables` in `GameVariables`](./enums.md#user-acs-variables)
+
+Python aliases (added in 1.1):
+`doom_fixed_to_float(doomFixed: int | float) -> float`
+
+
+---
+## `isBinaryButton`
+
+| C++ | `bool isBinaryButton(Button button)` |
+| :-- | :-- |
+| Python | `is_binary_button(button: Button): bool` |
+
+Returns true if button is binary button.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
+
+
+---
+## `isDeltaButton`
+
+| C++ | `bool isDeltaButton(Button button)` |
+| :-- | :-- |
+| Python | `is_delta_button(button: Button) -> bool` |
+
+Returns true if button is delta button.
+
+See also:
+- [`Enums: Button`](./enums.md#button)
diff --git a/docs/api_python/doomGame.md b/docs/api_python/doomGame.md
new file mode 100644
index 000000000..082e86dd6
--- /dev/null
+++ b/docs/api_python/doomGame.md
@@ -0,0 +1,16 @@
+# DoomGame
+
+```{eval-rst}
+.. autoclass:: vizdoom.DoomGame
+```
+
+```{eval-rst}
+.. autofunction:: vizdoom.DoomGame.init
+.. autofunction:: vizdoom.DoomGame.close
+.. autofunction:: vizdoom.DoomGame.make_action
+.. autofunction:: vizdoom.DoomGame.get_state
+```
+
+```{eval-rst}
+.. autodoc:: vizdoom.DoomGame
+```
diff --git a/docs/api_python/enums.md b/docs/api_python/enums.md
new file mode 100644
index 000000000..d1e19d0ad
--- /dev/null
+++ b/docs/api_python/enums.md
@@ -0,0 +1,3 @@
+# Enums
+
+This page is under construction.
diff --git a/docs/api_python/gameState.md b/docs/api_python/gameState.md
new file mode 100644
index 000000000..8ce4a5e2f
--- /dev/null
+++ b/docs/api_python/gameState.md
@@ -0,0 +1,3 @@
+# GameState
+
+This page is under construction.
diff --git a/docs/api_python/gymnasium.md b/docs/api_python/gymnasium.md
new file mode 100644
index 000000000..605e42b71
--- /dev/null
+++ b/docs/api_python/gymnasium.md
@@ -0,0 +1,3 @@
+# Gymnasium
+
+This page is under construction.
diff --git a/docs/api_python/utils.md b/docs/api_python/utils.md
new file mode 100644
index 000000000..40982f269
--- /dev/null
+++ b/docs/api_python/utils.md
@@ -0,0 +1,3 @@
+# Utils
+
+This page is under construction.
diff --git a/docs/citation/index.md b/docs/citation/index.md
new file mode 100644
index 000000000..b1b273936
--- /dev/null
+++ b/docs/citation/index.md
@@ -0,0 +1,35 @@
+# How to cite
+
+If you use or reference to ViZDoom library in your publications, please cite the following papers:
+
+
+> M Wydmuch, M Kempka & W Jaśkowski, ViZDoom Competitions: Playing Doom from Pixels, IEEE Transactions on Games, in print,
+[arXiv:1809.03470](https://arxiv.org/abs/1809.03470)
+```
+@article{wydmuch2018vizdoom,
+ title = {ViZDoom Competitions: Playing Doom from Pixels},
+ author = {Wydmuch, Marek and Kempka, Micha{\l} and Ja{\'s}kowski, Wojciech},
+ journal = {IEEE Transactions on Games},
+ year = {2018},
+ publisher = {IEEE}
+ Note = {IEEE Transactions on Games outstanding paper award 2022}
+}
+```
+
+or
+
+> M. Kempka, M. Wydmuch, G. Runc, J. Toczek & W. Jaśkowski, ViZDoom: A Doom-based AI Research Platform for Visual Reinforcement Learning, IEEE Conference on Computational Intelligence and Games, pp. 341-348, Santorini, Greece, 2016 ([arXiv:1605.02097](http://arxiv.org/abs/1605.02097))
+```
+@inproceedings{Kempka2016ViZDoom,
+ author = {Micha{\l} Kempka and Marek Wydmuch and Grzegorz Runc and Jakub Toczek and Wojciech Ja\'skowski},
+ title = {{ViZDoom}: A {D}oom-based {AI} Research Platform for Visual Reinforcement Learning},
+ booktitle = {IEEE Conference on Computational Intelligence and Games},
+ year = {2016},
+ url = {http://arxiv.org/abs/1605.02097},
+ address = {Santorini, Greece},
+ Month = {Sep},
+ Pages = {341--348},
+ Publisher = {IEEE},
+ Note = {The best paper award}
+}
+```
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 000000000..9255186c9
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,95 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+# -- Project information -----------------------------------------------------
+import os
+from typing import Any, Dict # noqa
+
+import vizdoom # noqa
+
+
+project = "ViZDoom"
+copyright = "2023 Farama Foundation"
+author = "Farama Foundation"
+
+# The full version, including alpha/beta/rc tags
+# release = vizdoom.__version__
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.napoleon",
+ "sphinx.ext.doctest",
+ "sphinx.ext.autodoc",
+ "sphinx.ext.autosummary",
+ "sphinx.ext.githubpages",
+ "sphinx.ext.autosectionlabel",
+ "myst_parser",
+ "sphinx_github_changelog",
+]
+
+# Make sure the target is unique
+autosectionlabel_prefix_document = True
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+# Napoleon settings
+# napoleon_use_ivar = True
+napoleon_use_admonition_for_references = True
+# See https://github.com/sphinx-doc/sphinx/issues/9119
+napoleon_custom_sections = [("Returns", "params_style")]
+
+# Autodoc
+autoclass_content = "both"
+autodoc_preserve_defaults = True
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = "furo"
+html_title = "ViZDoom Documentation"
+html_baseurl = "https://vizdoom.farama.org"
+html_copy_source = False
+html_favicon = "_static/img/favicon.png"
+html_theme_options = {
+ "light_logo": "img/vizdoom-black.svg",
+ "dark_logo": "img/vizdoom-white.svg",
+ "gtag": "G-6H9C8TWXZ8",
+ "description": "",
+ "image": "img/vizdoom-github.png",
+ "versioning": True,
+ "source_repository": "https://github.com/Farama-Foundation/ViZDoom/",
+ "source_branch": "master",
+ "source_directory": "docs/",
+}
+
+html_static_path = ["_static"]
+html_css_files = []
+
+# -- Generate Changelog -------------------------------------------------
+
+sphinx_github_changelog_token = os.environ.get("SPHINX_GITHUB_CHANGELOG_TOKEN")
diff --git a/docs/environments/creatingCustom.md b/docs/environments/creatingCustom.md
new file mode 100644
index 000000000..a9d7ed500
--- /dev/null
+++ b/docs/environments/creatingCustom.md
@@ -0,0 +1,4 @@
+# Creating a custom environment
+
+This page is under development.
+For now you can check the original ViZDoom tutorial [here](https://vizdoom.cs.put.edu.pl/tutorial) that covers this topic.
diff --git a/docs/environments/default.md b/docs/environments/default.md
new file mode 100644
index 000000000..633f26ae7
--- /dev/null
+++ b/docs/environments/default.md
@@ -0,0 +1,176 @@
+# Default scenarios/environments
+
+Below we describe all default scenarios (original ViZDoom nomenclature)/environments (Gymnasium/Open AI Gym nomenclature) included with ViZDoom. The PRs with new scenarios are welcome!
+
+
+## Note on .wad, .cfg files, and rewards
+
+The scenarios consist of two files - .wad and .cfg ([see scenarios directory](https://github.com/Farama-Foundation/ViZDoom/tree/master/scenarios)). The .wad file contains the map and script, and the .cfg file contains additional settings. The maps contained in .wad files (Doom's engine format for storing maps and assets) usually do not implement action constraints, the death penalty, and living rewards (however it is possible). To make it easier, this can be specified in ViZDoom .cfg files as well as other options like access to additional information. These can also be overridden in the code when using the original ViZDoom API. Every mention of any settings that are not included in .wad files is specified with "(config)" in the descriptions below. ViZDoom does not support setting certain rewards (such as killing opponents) in .cfg files. These must be programmed in the .wad files instead.
+
+
+## BASIC
+The purpose of the scenario is just to check if using this
+framework to train some AI in a 3D environment is feasible.
+
+The map is a rectangle with gray walls, ceiling, and floor.
+The player is spawned along the longer wall in the center.
+A red, circular monster is spawned randomly somewhere along
+the opposite wall. A player can only (config) go left/right
+and shoot. 1 hit is enough to kill the monster. The episode
+finishes when the monster is killed or on timeout.
+
+__REWARDS:__
+
++101 for killing the monster
+-5 for missing
+The episode ends after killing the monster or on timeout.
+
+Further configuration:
+* living reward = -1,
+* 3 available buttons: move left, move right, shoot (attack)
+* timeout = 300
+
+## DEADLY CORRIDOR
+The purpose of this scenario is to teach the agent to navigate towards
+his fundamental goal (the vest) and make sure he survives at the
+same time.
+
+The map is a corridor with shooting monsters on both sides (6 monsters
+in total). A green vest is placed at the opposite end of the corridor.
+The reward is proportional (negative or positive) to the change in the
+distance between the player and the vest. If the player ignores monsters
+on the sides and runs straight for the vest, he will be killed somewhere
+along the way. To ensure this behavior doom_skill = 5 (config) is
+needed.
+
+__REWARDS:__
+
++dX for getting closer to the vest.
+-dX for getting further from the vest.
+
+Further configuration:
+* 5 available buttons: turn left, turn right, move left, move right, shoot (attack)
+* timeout = 4200
+* death penalty = 100
+* doom_skill = 5
+
+
+## DEFEND THE CENTER
+The purpose of this scenario is to teach the agent that killing the
+monsters is GOOD and when monsters kill you is BAD. In addition,
+wasting ammunition is not very good either. Agent is rewarded only
+for killing monsters so he has to figure out the rest for himself.
+
+The map is a large circle. A player is spawned in the exact center.
+5 melee-only, monsters are spawned along the wall. Monsters are
+killed after a single shot. After dying, each monster is respawned
+after some time. The episode ends when the player dies (it's inevitable
+because of limited ammo).
+
+__REWARDS:__
++1 for killing a monster
+
+Further configuration:
+* 3 available buttons: turn left, turn right, shoot (attack)
+* death penalty = 1
+
+## DEFEND THE LINE
+The purpose of this scenario is to teach an agent that killing the
+monsters is GOOD and when monsters kill you is BAD. In addition,
+wasting ammunition is not very good either. The agent is rewarded only
+for killing monsters, so it has to figure out the rest for itself.
+
+The map is a rectangle. A player is spawned along the longer wall in the
+center. 3 melee-only and 3 shooting monsters are spawned along the
+opposite wall. Monsters are killed after a single shot, at first.
+After dying, each monster is respawned after some time and can endure
+more damage. The episode ends when the player dies (it's inevitable
+because of limited ammo).
+
+__REWARDS:__
++1 for killing a monster
+
+Further configuration:
+* 3 available buttons: turn left, turn right, shoot (attack)
+* death penalty = 1
+
+## HEALTH GATHERING
+The purpose of this scenario is to teach the agent how to survive
+without knowing what makes him survive. An agent knows only that life
+is precious, and death is bad, so he must learn what prolongs his
+existence and that his health is connected with it.
+
+The map is a rectangle with a green, acidic floor, which hurts the player
+periodically. Initially, there are some medkits spread uniformly
+over the map. A new medkit falls from the skies every now and then.
+Medkits heal some portions of the player's health - to survive agent
+needs to pick them up. The episode finishes after the player's death or
+on timeout.
+
+
+Further configuration:
+* living_reward = 1
+* 3 available buttons: turn left, turn right, move forward
+* 1 available game variable: HEALTH
+* death penalty = 100
+
+## MY WAY HOME
+The purpose of this scenario is to teach the agent how to navigate
+in a labyrinth-like surrounding and reach his ultimate goal
+(and learn what it actually is).
+
+The map is a series of rooms with interconnection and 1 corridor
+with a dead end. Each room has a different color. There is a
+green vest in one of the rooms (the same room every time).
+The player is spawned in a randomly chosen room facing a random
+direction. The episode ends when the vest is reached or on timeout/
+
+__REWARDS:__
++1 for reaching the vest
+
+Further configuration:
+* 3 available buttons: turn left, turn right, move forward
+* living reward = -0.0001
+* timeout = 2100
+
+## PREDICT POSITION
+The purpose of the scenario is to teach an agent to synchronize
+missile weapon shot (involving a significant delay between
+shooting and hitting) with target movements. Agent should be
+able to shoot so that the missile and the monster meet each other.
+
+The map is a rectangular room. A player is spawned along the longer
+wall in the center. A monster is spawned randomly somewhere
+along the opposite wall and walks between left and right corners
+along the wall. The player is equipped with a rocket launcher and
+a single rocket. The episode ends when the missile hits a wall/the monster
+or on timeout.
+
+__REWARDS:__
++1 for killing the monster
+
+Further configuration:
+* living reward = -0.0001,
+* 3 available buttons: turn left, turn right, shoot (attack)
+* timeout = 300
+
+## TAKE COVER
+The purpose of this scenario is to teach an agent to link incoming
+missiles with his estimated lifespan. An agent should learn that
+being hit means health decrease, and this in turn will lead to
+death which is undesirable. In effect, the agent should avoid
+missiles.
+
+The map is a rectangle. A player is spawned along the longer wall,
+in the center. A couple of shooting monsters are spawned
+randomly somewhere along the opposite wall and try to kill
+the player with fireballs. The player can only (config) move
+left/right. More monsters appear with time. The episode ends when
+the player dies.
+
+__REWARDS:__
++1 for each tic of life
+
+Further configuration:
+* living reward = 1.0,
+* 2 available buttons: move left, move right
diff --git a/doc/FAQ.md b/docs/faq/index.md
similarity index 72%
rename from doc/FAQ.md
rename to docs/faq/index.md
index 6a0944a4e..d8d4df678 100644
--- a/doc/FAQ.md
+++ b/docs/faq/index.md
@@ -2,9 +2,9 @@
This file contains a list of questions that ViZDoom users may ask at some point.
You can find more questions and answers by searching for issues with "question" tag
-([is:issue label:question](https://github.com/mwydmuch/ViZDoom/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Aquestion)).
+([is:issue label:question](https://github.com/Farama-Foundation/ViZDoom/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Aquestion)).
-Did not find answer for your question? Post an [issue](https://github.com/mwydmuch/ViZDoom/issues)
+Did not find answer for your question? Post an [issue](https://github.com/Farama-Foundation/ViZDoom/issues)
## How to use original Doom's assets?
@@ -24,16 +24,16 @@ You should select ZDoom as your Doom engine version and UDMF map format (Univers
that supports the widest range of features.
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/319
+[https://github.com/Farama-Foundation/ViZDoom/issues/319](https://github.com/Farama-Foundation/ViZDoom/issues/319)
## How to stack frames?
ViZDoom does not automatically stacks frames for you.
-You have to manually store the states from [`DoomGame: getState`](DoomGame.md#getState). and build up stacked states for your agent.
+You have to manually store the states from [`DoomGame: getState`](doomGame.md#getState). and build up stacked states for your agent.
**Original issue and answer: (contains code an example)**
-https://github.com/mwydmuch/ViZDoom/issues/296
+[https://github.com/Farama-Foundation/ViZDoom/issues/296](https://github.com/Farama-Foundation/ViZDoom/issues/296)
## How to change keyboard binding for Spectator Mode?
@@ -41,10 +41,10 @@ https://github.com/mwydmuch/ViZDoom/issues/296
When you launch an instance of vizdoom, it will create `_vizdoom.ini` in your working directory (if it does not exist yet).
This file contains all the additional engine settings, including key bindings, that you can edit freely.
-You can also load .ini file from different location using [`DoomGame: setDoomConfigPath`](DoomGame.md#setDoomConfigPath).
+You can also load .ini file from different location using [`DoomGame: setDoomConfigPath`](doomGame.md#setDoomConfigPath).
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/253
+[https://github.com/Farama-Foundation/ViZDoom/issues/253](https://github.com/Farama-Foundation/ViZDoom/issues/253)
## Is it possible to generate maze navigation scenario from a text file (like in DeepMind Lab)?
@@ -52,28 +52,28 @@ https://github.com/mwydmuch/ViZDoom/issues/253
Try [NavDoom](https://github.com/agiantwhale/navdoom) or [MazeExplorer](https://github.com/microsoft/MazeExplorer).
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/308
+[https://github.com/Farama-Foundation/ViZDoom/issues/308](https://github.com/Farama-Foundation/ViZDoom/issues/308)
## How to control game speed in `ASYNC` modes?
-See: [`DoomGame: setTicrate`](DoomGame.md#setTicrate) and [examples/python/ticrate.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/ticrate.py)
+See: [`DoomGame: setTicrate`](DoomGame.md#setTicrate) and [examples/python/ticrate.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/ticrate.py)
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/209
+[https://github.com/Farama-Foundation/ViZDoom/issues/209](https://github.com/Farama-Foundation/ViZDoom/issues/209)
## How can to make an exact 90 degree turn in one action?
-See: [examples/python/delta_buttons.py](https://github.com/mwydmuch/ViZDoom/tree/master/examples/python/delta_buttons.py)
+See: [examples/python/delta_buttons.py](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/python/delta_buttons.py)
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/279
+[https://github.com/Farama-Foundation/ViZDoom/issues/279](https://github.com/Farama-Foundation/ViZDoom/issues/279)
See also:
- [`Types: Button`](Types.md#button)
-- [examples/python/DeltaDuttons.cpp](https://github.com/mwydmuch/ViZDoom/tree/master/examples/cpp/DeltaDuttons.cpp)
-- [examples/python/DeltaDuttons.java](https://github.com/mwydmuch/ViZDoom/tree/master/examples/java/DeltaDuttons.java)
+- [examples/python/DeltaDuttons.cpp](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/cpp/DeltaDuttons.cpp)
+- [examples/python/DeltaDuttons.java](https://github.com/Farama-Foundation/ViZDoom/tree/master/examples/java/DeltaDuttons.java)
## Agent does not fire after picking up ammo or weapon?
@@ -82,7 +82,7 @@ Some weapons have a `noautofire` flag for weapons to prevent using them by accid
Agent needs to release `ATTACK` button and then press it again to start firing after picking one of those weapons or ammo for them.
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/289
+https://github.com/Farama-Foundation/ViZDoom/issues/289
See also:
- List of weapon flags: [https://zdoom.org/wiki/Weapon_flags](https://zdoom.org/wiki/Weapon_flags)
@@ -95,7 +95,7 @@ CVARs implemented in ZDoom engine are very helpful in quickly modifying some asp
`game.add_game_args("+sv_unlimited_pickup 1")` adding before init will allow picking up unlimited items.
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/187
+[https://github.com/Farama-Foundation/ViZDoom/issues/187](https://github.com/Farama-Foundation/ViZDoom/issues/187)
See also:
- List of CVARs: [https://zdoom.org/wiki/CVARs:Configuration](https://zdoom.org/wiki/CVARs:Configuration)
@@ -108,7 +108,7 @@ Make sure you can run ZDoom binary inside the ViZDoom package.
If the game works, go to `Options -> Set Video Mode` and see the list of available resolutions there. Try one of these resolutions viz ViZDoom.
**Original issue and answer:**
-https://github.com/mwydmuch/ViZDoom/issues/404
+[https://github.com/Farama-Foundation/ViZDoom/issues/404](https://github.com/Farama-Foundation/ViZDoom/issues/404)
## Issues getting ViZDoom instances communicating between each-other in Kubernetes
@@ -116,7 +116,7 @@ https://github.com/mwydmuch/ViZDoom/issues/404
Try setting `tty=True` in all containers running ViZDoom.
**Original issue:**
-https://github.com/mwydmuch/ViZDoom/issues/329
+[https://github.com/Farama-Foundation/ViZDoom/issues/329](https://github.com/Farama-Foundation/ViZDoom/issues/329)
## Reading replays (invalid actions, wrong rewards)
@@ -125,8 +125,8 @@ Replay files are known to have wonky issues at times: Even when they are opened
the read variables may be different from what they were during recording. There are tricks
to fix this:
-- Try adding a small amount of sleep between proceeding actions (Original issue: https://github.com/mwydmuch/ViZDoom/issues/354)
-- Try using `GameMode.SPECTATOR` mode for reading replays. **Note** that processing of individual steps must be done fast, otherwise multiple steps get bundled up into one. (Original issue: https://github.com/mwydmuch/ViZDoom/issues/412)
+- Try adding a small amount of sleep between proceeding actions (Original issue: https://github.com/Farama-Foundation/ViZDoom/issues/354)
+- Try using `GameMode.SPECTATOR` mode for reading replays. **Note** that processing of individual steps must be done fast, otherwise multiple steps get bundled up into one. (Original issue: https://github.com/Farama-Foundation/ViZDoom/issues/412)
## Having multiple agents in one game / multiplayer issues
@@ -136,9 +136,9 @@ if you use `PLAYER` Mode, you can not use frameskip of the `make_actions` (each
server proceeds by one frame). See discussion in Issues below for more information.
**Original issues:**
-* https://github.com/mwydmuch/ViZDoom/issues/228
-* https://github.com/mwydmuch/ViZDoom/issues/391
-* https://github.com/mwydmuch/ViZDoom/issues/417
+- [https://github.com/Farama-Foundation/ViZDoom/issues/228](https://github.com/Farama-Foundation/ViZDoom/issues/228)
+- [https://github.com/Farama-Foundation/ViZDoom/issues/391](https://github.com/Farama-Foundation/ViZDoom/issues/391)
+- [https://github.com/Farama-Foundation/ViZDoom/issues/417](https://github.com/Farama-Foundation/ViZDoom/issues/417)
## Why `game.get_state()` when `game.is_episode_finished() == True`
@@ -146,8 +146,8 @@ server proceeds by one frame). See discussion in Issues below for more informati
After the end of the episode, ZDoom engine might change its state and exit the episode (map) resulting in some objects and variables being destroyed or reset. Because of that it's difficult to provide a proper state after that. When we were originally designing ViZDoom we wanted to have a simple logic and we only update state after complete logic tic. Because of that we are not able to detect end of episode early before to save a proper state and decided to provide null/none value instead. We believe that it's easy to provide dummy (e.g. filed with zeros) state if it's needed by an algorithm.
**Original issues:**
-* https://github.com/mwydmuch/ViZDoom/issues/183
-* https://github.com/mwydmuch/ViZDoom/issues/418
+- [https://github.com/Farama-Foundation/ViZDoom/issues/183](https://github.com/Farama-Foundation/ViZDoom/issues/183)
+- [https://github.com/Farama-Foundation/ViZDoom/issues/418](https://github.com/Farama-Foundation/ViZDoom/issues/418)
## I am trying to use audio/sound, but ViZDoom crashes or I there is no audio
@@ -159,11 +159,11 @@ Older versions of OpenAL library (1.19, default version as of writing on e.g. Ub
with ViZDoom. You have several options you can try (one of these steps has worked so far on all tested machines):
* If ViZDoom crashes on init when you have sound enabled, try `doom_game.add_game_args("+snd_efx 0")`. Note that this might remove some audio effects like reverberation.
-* If you can run ViZDoom with sound enabled but there is no audio being played, try steps [here](https://github.com/mwydmuch/ViZDoom/pull/486#issuecomment-889389185).
+* If you can run ViZDoom with sound enabled but there is no audio being played, try steps [here](https://github.com/Farama-Foundation/ViZDoom/pull/486#issuecomment-889389185).
* If that fails, try uninstalling OpenAL you have on your system and then repeating the above installation.
**Original issue:**
-* https://github.com/mwydmuch/ViZDoom/pull/486
+[https://github.com/Farama-Foundation/ViZDoom/pull/486](https://github.com/Farama-Foundation/ViZDoom/pull/486)
## How to display ViZDoom's window when running it on WSL (Windows Subsystem for Linux)
@@ -178,9 +178,18 @@ GUI apps do not work out-of-the-box on WSL on Windows 10/11. To make it work, yo
* Now you can lunch your graphical application inside Ubuntu WSL including ViZDoom.
**Original issue:**
-* https://github.com/mwydmuch/ViZDoom/issues/491
+[https://github.com/Farama-Foundation/ViZDoom/issues/491](https://github.com/Farama-Foundation/ViZDoom/issues/491)
## What is a difference between ViZDoom, ZDoom and GZDoom
ViZDoom is based on the last version of ZDoom (2.8.1). ZDoom was discontinued in 2016, and the development switched to GZDoom, which provides a new 3D renderer implemented in OpenGL. ViZDoom, however, sticks to the original 2D software renderer, which is much faster for small resolutions than OpenGL. Because of that, ViZDoom modernized the ZDoom engine by adding support for Apple Silicon and ARM Linux and removing old unused parts of the code base (e.g., by removing Assembler parts).
+
+15.1K Views
+90%
+1 month ago
+Add to
+Jump to
+Report
+28
+3
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..e388a393e
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,113 @@
+---
+hide-toc: true
+firstpage:
+lastpage:
+---
+
+```{project-logo} _static/img/vizdoom-text.png
+:alt: Gymnasium Logo
+```
+
+```{project-heading}
+Library for developing AI bots that play Doom using visual information.
+```
+
+```{figure} _static/img/vizdoom-demo.gif
+ :alt: ViZDoom Demo
+```
+
+This library allows creating of environments based on the Doom engine. It is primarily intended for research in machine visual learning and deep reinforcement learning, in particular. The library is written in C++ and provides Python API and wrappers for Gymnasium/OpenAI Gym interface. It is multi-platform (Linux, macOS, Windows), lightweight (just a few MB), and fast (capable of rendering even 7000 fps on a single CPU thread). The design of the library is meant to give high customization options; it supports single-player as well as multi-player modes and implements many additional features like access to the depth buffer (3D vision), automatic labeling of game objects visible in the frame, access to the audio buffer, access to the list of actors/objects and map geometry, off-screen rendering, episodes recording, in-game time scaling. While it provides a set of simple exemplary scenarios, it easily allows one to create custom ones thanks to the visual editors and scripting language supported by the engine.
+
+
+The Gymnasium interface allows to initialize and interact with the ViZDoom default environments as follows:
+
+```{code-block} python
+import gymnasium
+from vizdoom import gymnasium_wrapper
+env = gymnasium.make("VizdoomDeadlyCorridor-v0")
+observation, info = env.reset()
+for _ in range(1000):
+ action = policy(observation) # this is where you would insert your policy
+ observation, reward, terminated, truncated, info = env.step(action)
+
+ if terminated or truncated:
+ observation, info = env.reset()
+
+env.close()
+```
+
+There is also the original ViZDoom API:
+
+```{code-block} python
+import vizdoom as vzd
+game = DoomGame()
+game.load_config(os.path.join(vzd.scenarios_path, "deadly_corridor.cfg"))
+game.init()
+for _ in range(1000):
+ state = game.get_state()
+ action = policy(state) # this is where you would insert your policy
+ reward = game.make_action(action)
+
+ if game.is_episode_finished():
+ game.new_episode()
+
+game.close()
+```
+
+
+```{toctree}
+:hidden:
+:caption: Introduction
+
+introduction/pythonQuickstart
+introduction/building
+introduction/wrappers
+```
+
+```{toctree}
+:hidden:
+:caption: Python API
+
+api_python/gymnasium
+api_python/doomGame
+api_python/gameState
+api_python/enums
+api_python/utils
+```
+
+```{toctree}
+:hidden:
+:caption: C++ API
+
+api_cpp/doomGame
+api_cpp/gameState
+api_cpp/enums
+api_cpp/configurationFiles
+api_cpp/exceptions
+api_cpp/utils
+```
+
+```{toctree}
+:hidden:
+:caption: Environments
+
+environments/default
+environments/creatingCustom
+```
+
+```{toctree}
+:hidden:
+:caption: Others
+
+faq/index
+citation/index
+```
+
+```{toctree}
+:hidden:
+:caption: Development
+
+Github
+release_notes/index
+Contribute to the Docs
+```
diff --git a/doc/Installation.md b/docs/introduction/building.md
similarity index 90%
rename from doc/Installation.md
rename to docs/introduction/building.md
index e2faf7ba5..a1e595605 100644
--- a/doc/Installation.md
+++ b/docs/introduction/building.md
@@ -1,15 +1,17 @@
-# Installation and building
-
-* [Dependencies](#deps)
- * [Linux](#linux_deps)
- * [MacOS](#macos_deps)
- * [Windows](#windows_deps)
-* [Installation via pip](#pypi)
-* [Building (not recommended)](#build)
- * [Linux/MacOS](#linux_macos_build)
- * [Windows](#windows_build)
- * [Compilation output](#output)
- * [Manual installation](#manual-install)
+# Building from source
+
+- [Installation and building](#installation-and-building)
+ - [ Dependencies](#-dependencies)
+ - [ Linux](#-linux)
+ - [ MacOS](#-macos)
+ - [ Building](#-building)
+ - [ Windows](#-windows)
+ - [ Installation via pip (recommended for Python users)](#-installation-via-pip-recommended-for-python-users)
+ - [ Building manually (not recommended)](#-building-manually-not-recommended)
+ - [ Linux / MacOS](#-linux--macos)
+ - [ Windows](#-windows-1)
+ - [ Compilation output](#-compilation-output)
+ - [ Manual installation](#-manual-installation)
## Dependencies
diff --git a/docs/introduction/pythonQuickstart.md b/docs/introduction/pythonQuickstart.md
new file mode 100644
index 000000000..dca7fa1d1
--- /dev/null
+++ b/docs/introduction/pythonQuickstart.md
@@ -0,0 +1,54 @@
+# Python quick start
+
+## Linux
+Both x86-64 and ARM64 architectures are supported.
+ViZDoom requires C++11 compiler, CMake 3.4+, Boost 1.65+ SDL2, OpenAL (optional) and Python 3.7+. Below you will find instructrion how to install these dependencies.
+
+### apt-based distros (Ubuntu, Debian, Linux Mint, etc.)
+
+To install ViZDoom run (may take few minutes):
+```
+apt install cmake git libboost-all-dev libsdl2-dev libopenal-dev
+pip install vizdoom
+```
+We recommend using at least Ubuntu 18.04+ or Debian 10+ with Python 3.7+.
+
+### dnf/yum-based distros (Fedora, RHEL, CentOS, Alma/Rocky Linux, etc.)
+
+To install ViZDoom run (may take few minutes):
+```
+dnf install cmake git boost-devel SDL2-devel openal-soft-devel
+pip install vizdoom
+```
+We recommend using at least Fedora 35+ or RHEL/CentOS/Alma/Rocky Linux 9+ with Python 3.7+. To install openal-soft-devel on RHEL/CentOS/Alma/Rocky Linux 9, one needs to use `dnf --enablerepo=crb install`.
+
+### Conda-based installation
+To install ViZDoom on a conda environment (no system-wide installations required):
+```
+conda install -c conda-forge boost cmake sdl2
+git clone https://github.com/mwydmuch/ViZDoom.git --recurse-submodules
+cd ViZDoom
+python setup.py build && python setup.py install
+```
+Note that `pip install vizdoom` won't work with conda install and you have to follow these steps.
+
+
+## macOS
+Both Intel and Apple Silicon CPUs are supported.
+
+To install ViZDoom on run (may take few minutes):
+```
+brew install cmake git boost openal-soft sdl2
+pip install vizdoom
+```
+We recommend using at least macOS High Sierra 10.13+ with Python 3.7+.
+On Apple Silicon (M1 and M2), make sure you are using Python for Apple Silicon.
+
+
+## Windows
+To install pre-build release for Windows 10 or 11 64-bit and Python 3.7+ just run (should take few seconds):
+```
+pip install vizdoom
+```
+
+Please note that the Windows version is not as well-tested as Linux and macOS versions. It can be used for development and testing if you want to conduct experiments on Windows, please consider using [Docker](https://docs.docker.com/docker-for-windows/install/) or [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10).
diff --git a/doc/Gymnasium.md b/docs/introduction/wrappers.md
similarity index 53%
rename from doc/Gymnasium.md
rename to docs/introduction/wrappers.md
index a0c45d4c0..3c5e3e95e 100644
--- a/doc/Gymnasium.md
+++ b/docs/introduction/wrappers.md
@@ -1,4 +1,6 @@
-# Gymnasium wrappers
+# Wrapper
+
+## Gymnasium wrappers
Installing ViZDoom with `pip install vizdoom` will include
Gymnasium wrappers to interact with ViZDoom over [Gymnasium API](https://gymnasium.farama.org/).
@@ -11,3 +13,17 @@ and implements the necessary API to function as a Gymnasium API.
See following examples for use:
- `examples/python/gymnasium_wrapper.py` for basic usage
- `examples/python/learning_stable_baselines.py` for example training with [stable-baselines3](https://github.com/DLR-RM/stable-baselines3/) (Update - Currently facing issues, to be fixed)
+
+
+## OpenAI Gym wrappers
+
+Installing ViZDoom with `pip install vizdoom[gym]` will include
+Gym wrappers to interact with ViZDoom over Gym API. Note that Gym is deprecated in favour of Gymnasium and these wrappers will be removed in the future.
+
+These wrappers are under `gym_wrappers`, containing the basic environment and
+few example environments based on the built-in scenarios. This environment
+simply initializes ViZDoom with the settings from the scenario config files
+and implements the necessary API to function as a Gym API.
+
+See following examples for use:
+ - `examples/python/gym_wrapper.py` for basic usage
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 000000000..8084272b4
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/release_notes/index.md b/docs/release_notes/index.md
new file mode 100644
index 000000000..424e84f23
--- /dev/null
+++ b/docs/release_notes/index.md
@@ -0,0 +1,8 @@
+# Release Notes
+
+```{eval-rst}
+.. changelog::
+ :github: https://github.com/Farama-Foundation/ViZDoom/releases
+ :pypi: https://pypi.org/project/vizdoom/
+ :changelog-url:
+```
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 000000000..2ae0c04f9
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,5 @@
+sphinx
+sphinx-autobuild
+myst-parser
+git+https://github.com/Farama-Foundation/Celshast#egg=furo
+sphinx_github_changelog
diff --git a/scenarios/README.md b/scenarios/README.md
index 07547f2da..c9348d200 100644
--- a/scenarios/README.md
+++ b/scenarios/README.md
@@ -1,26 +1,29 @@
-# Scenarios Description:
+# Scenarios/Environments Descriptions:
-Scenarios contained in iwad files do not support action constraints, death penalty and living rewards.
-Every mention of any settings that are not included in iwads will be specified with "(config)".
+Below we describe all default scenarios (original ViZDoom nomenclature)/environments (Gymnasium/Open AI Gym nomenclature) included with ViZDoom. The PRs with new scenarios are welcome!
+
+
+### Note on .wad, .cfg files, and rewards:
+
+The scenarios consist of two files - .wad and .cfg ([see scenarios directory](https://github.com/Farama-Foundation/ViZDoom/tree/master/scenarios)). The .wad file contains the map and script, and the .cfg file contains additional settings. The maps contained in .wad files (Doom's engine format for storing maps and assets) usually do not implement action constraints, the death penalty, and living rewards (however it is possible). To make it easier, this can be specified in ViZDoom .cfg files as well as other options like access to additional information. These can also be overridden in the code when using the original ViZDoom API. Every mention of any settings that are not included in .wad files is specified with "(config)" in the descriptions below. ViZDoom does not support setting certain rewards (such as killing opponents) in .cfg files. These must be programmed in the .wad files instead.
-Note: ViZDoom does not support setting certain rewards (such as killing opponents) in .cfg files. These must be set in the .wad files instead
## BASIC
The purpose of the scenario is just to check if using this
framework to train some AI in a 3D environment is feasible.
-Map is a rectangle with gray walls, ceiling and floor.
-Player is spawned along the longer wall, in the center.
+The map is a rectangle with gray walls, ceiling, and floor.
+The player is spawned along the longer wall in the center.
A red, circular monster is spawned randomly somewhere along
-the opposite wall. Player can only (config) go left/right
-and shoot. 1 hit is enough to kill the monster. Episode
-finishes when monster is killed or on timeout.
+the opposite wall. A player can only (config) go left/right
+and shoot. 1 hit is enough to kill the monster. The episode
+finishes when the monster is killed or on timeout.
__REWARDS:__
+101 for killing the monster
-5 for missing
-Episode ends after killing the monster or on timeout.
+The episode ends after killing the monster or on timeout.
Further configuration:
* living reward = -1,
@@ -32,11 +35,11 @@ The purpose of this scenario is to teach the agent to navigate towards
his fundamental goal (the vest) and make sure he survives at the
same time.
-Map is a corridor with shooting monsters on both sides (6 monsters
+The map is a corridor with shooting monsters on both sides (6 monsters
in total). A green vest is placed at the opposite end of the corridor.
-Reward is proportional (negative or positive) to change of the
-distance between the player and the vest. If player ignores monsters
-on the sides and runs straight for the vest he will be killed somewhere
+The reward is proportional (negative or positive) to the change in the
+distance between the player and the vest. If the player ignores monsters
+on the sides and runs straight for the vest, he will be killed somewhere
along the way. To ensure this behavior doom_skill = 5 (config) is
needed.
@@ -58,10 +61,10 @@ monsters is GOOD and when monsters kill you is BAD. In addition,
wasting ammunition is not very good either. Agent is rewarded only
for killing monsters so he has to figure out the rest for himself.
-Map is a large circle. Player is spawned in the exact center.
+The map is a large circle. A player is spawned in the exact center.
5 melee-only, monsters are spawned along the wall. Monsters are
-killed after a single shot. After dying each monster is respawned
-after some time. Episode ends when the player dies (it's inevitable
+killed after a single shot. After dying, each monster is respawned
+after some time. The episode ends when the player dies (it's inevitable
because of limited ammo).
__REWARDS:__
@@ -72,16 +75,16 @@ Further configuration:
* death penalty = 1
## DEFEND THE LINE
-The purpose of this scenario is to teach the agent that killing the
+The purpose of this scenario is to teach an agent that killing the
monsters is GOOD and when monsters kill you is BAD. In addition,
-wasting ammunition is not very good either. Agent is rewarded only
-for killing monsters so he has to figure out the rest for himself.
+wasting ammunition is not very good either. The agent is rewarded only
+for killing monsters, so it has to figure out the rest for itself.
-Map is a rectangle. Player is spawned along the longer wall, in the
+The map is a rectangle. A player is spawned along the longer wall in the
center. 3 melee-only and 3 shooting monsters are spawned along the
opposite wall. Monsters are killed after a single shot, at first.
-After dying each monster is respawned after some time and can endure
-more damage. Episode ends when the player dies (it's inevitable
+After dying, each monster is respawned after some time and can endure
+more damage. The episode ends when the player dies (it's inevitable
because of limited ammo).
__REWARDS:__
@@ -93,34 +96,34 @@ Further configuration:
## HEALTH GATHERING
The purpose of this scenario is to teach the agent how to survive
-without knowing what makes him survive. Agent know only that life
-is precious and death is bad so he must learn what prolongs his
+without knowing what makes him survive. An agent knows only that life
+is precious, and death is bad, so he must learn what prolongs his
existence and that his health is connected with it.
-Map is a rectangle with green, acidic floor which hurts the player
-periodically. Initially there are some medkits spread uniformly
+The map is a rectangle with a green, acidic floor, which hurts the player
+periodically. Initially, there are some medkits spread uniformly
over the map. A new medkit falls from the skies every now and then.
-Medkits heal some portions of player's health - to survive agent
-needs to pick them up. Episode finishes after player's death or
+Medkits heal some portions of the player's health - to survive agent
+needs to pick them up. The episode finishes after the player's death or
on timeout.
Further configuration:
* living_reward = 1
* 3 available buttons: turn left, turn right, move forward
-* 1 available game variable: HEALTH
+* 1 available game variable: HEALTH
* death penalty = 100
## MY WAY HOME
The purpose of this scenario is to teach the agent how to navigate
-in a labirynth-like surroundings and reach his ultimate goal
+in a labyrinth-like surrounding and reach his ultimate goal
(and learn what it actually is).
-Map is a series of rooms with interconnection and 1 corridor
+The map is a series of rooms with interconnection and 1 corridor
with a dead end. Each room has a different color. There is a
green vest in one of the rooms (the same room every time).
-Player is spawned in randomly chosen room facing a random
-direction. Episode ends when vest is reached or on timeout/
+The player is spawned in a randomly chosen room facing a random
+direction. The episode ends when the vest is reached or on timeout/
__REWARDS:__
+1 for reaching the vest
@@ -131,16 +134,16 @@ Further configuration:
* timeout = 2100
## PREDICT POSITION
-The purpose of the scenario is teach agent to synchronize
+The purpose of the scenario is to teach an agent to synchronize
missile weapon shot (involving a significant delay between
shooting and hitting) with target movements. Agent should be
-able to shoot so that missile and monster meet each other.
+able to shoot so that the missile and the monster meet each other.
-The map is a rectangle room. Player is spawned along the longer
-wall, in the center. A monster is spawned randomly somewhere
+The map is a rectangular room. A player is spawned along the longer
+wall in the center. A monster is spawned randomly somewhere
along the opposite wall and walks between left and right corners
-along the wall. Player is equipped with a rocket launcher and
-a single rocket. Episode ends when missile hits a wall/the monster
+along the wall. The player is equipped with a rocket launcher and
+a single rocket. The episode ends when the missile hits a wall/the monster
or on timeout.
__REWARDS:__
@@ -152,18 +155,18 @@ Further configuration:
* timeout = 300
## TAKE COVER
-The purpose of this scenario is to teach agent to link incoming
-missles with his estimated lifespan. Agent should learn that
-being hit means health decrease and this in turn will lead to
-death which is undesirable. In effect agent should avoid
-missles.
+The purpose of this scenario is to teach an agent to link incoming
+missiles with his estimated lifespan. An agent should learn that
+being hit means health decrease, and this in turn will lead to
+death which is undesirable. In effect, the agent should avoid
+missiles.
-Map is a rectangle. Player is spawned along the longer wall,
+The map is a rectangle. A player is spawned along the longer wall,
in the center. A couple of shooting monsters are spawned
randomly somewhere along the opposite wall and try to kill
the player with fireballs. The player can only (config) move
-left/right. More monsters appear with time. Episode ends when
-player dies.
+left/right. More monsters appear with time. The episode ends when
+the player dies.
__REWARDS:__
+1 for each tic of life