about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore109
-rw-r--r--brutalmaze/characters.py32
-rw-r--r--brutalmaze/game.py18
-rw-r--r--brutalmaze/maze.py20
-rw-r--r--brutalmaze/misc.py4
-rw-r--r--brutalmaze/weapons.py6
-rwxr-xr-xclient-examples/hit-and-run.py8
-rw-r--r--docs/source/_templates/recplayer.html1
-rw-r--r--docs/source/conf.py4
-rw-r--r--tox.ini21
10 files changed, 172 insertions, 51 deletions
diff --git a/.gitignore b/.gitignore
index b537ddb..894a44c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,104 @@
-brutalmaze.egg-info
-build
-dist
-__pycache__
-*.pyc
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
diff --git a/brutalmaze/characters.py b/brutalmaze/characters.py
index 7e9312e..7fa8c93 100644
--- a/brutalmaze/characters.py
+++ b/brutalmaze/characters.py
@@ -19,15 +19,15 @@
 __doc__ = 'Brutal Maze module for hero and enemy classes'
 
 from collections import deque
-from math import atan2, gcd, sin, pi
+from math import atan2, gcd, pi, sin
 from random import choice, randrange, shuffle
 from sys import modules
 
-from .constants import (
-    TANGO, HERO_HP, SFX_HEART, HEAL_SPEED, MIN_BEAT, ATTACK_SPEED, ENEMY,
-    ENEMY_SPEED, ENEMY_HP, SFX_SPAWN, SFX_SLASH_HERO, MIDDLE, WALL, FIRANGE,
-    AROUND_HERO, ADJACENTS, EMPTY, SQRT2, ENEMIES)
-from .misc import sign, randsign, regpoly, fill_aapolygon, play
+from .constants import (ADJACENTS, AROUND_HERO, ATTACK_SPEED, EMPTY,
+                        ENEMIES, ENEMY, ENEMY_HP, ENEMY_SPEED, FIRANGE,
+                        HEAL_SPEED, HERO_HP, MIDDLE, MIN_BEAT, SFX_HEART,
+                        SFX_SLASH_HERO, SFX_SPAWN, SQRT2, TANGO, WALL)
+from .misc import fill_aapolygon, play, randsign, regpoly, sign
 from .weapons import Bullet
 
 
@@ -273,7 +273,7 @@ class Enemy:
         if self.spin_queue and wound: self.maze.hit_hero(wound, self.color)
         return wound
 
-    def get_angle(self, reversed=False):
+    def get_angle(self):
         """Return the angle of the vector whose initial point is
         the center of the screen and terminal point is the center of
         the enemy.
@@ -347,12 +347,12 @@ class Chameleon(Enemy):
         visible (float): time until the Chameleon is visible (in ms)
     """
     def __init__(self, maze, x, y):
-        Enemy.__init__(self, maze, x, y, 'Chameleon')
+        super().__init__(maze, x, y, 'Chameleon')
         self.visible = 0.0
 
     def wake(self):
         """Wake the Chameleon up if it can see the hero."""
-        if Enemy.wake(self) is True:
+        if super().wake() is True:
             self.visible = 1000 / ENEMY_SPEED
 
     def isunnoticeable(self, x=None, y=None):
@@ -361,25 +361,25 @@ class Chameleon(Enemy):
         Only search within column x and row y if these coordinates
         are provided.
         """
-        return (Enemy.isunnoticeable(self, x, y)
+        return (super().isunnoticeable(x, y)
                 or self.visible <= 0 and not self.spin_queue
                 and self.maze.next_move <= 0)
 
     def update(self):
         """Update the Chameleon."""
-        Enemy.update(self)
+        super().update()
         if self.awake: self.visible -= 1000 / self.maze.fps
 
     def hit(self, wound):
         """Handle the Chameleon when it's attacked."""
         self.visible = 1000.0 / ENEMY_SPEED
-        Enemy.hit(self, wound)
+        super().hit(wound)
 
 
 class Plum(Enemy):
     """Object representing an enemy of Plum."""
     def __init__(self, maze, x, y):
-        Enemy.__init__(self, maze, x, y, 'Plum')
+        super().__init__(maze, x, y, 'Plum')
 
     def clone(self, other):
         """Turn the other enemy into a clone of this Plum and return
@@ -396,18 +396,18 @@ class Plum(Enemy):
 class ScarletRed(Enemy):
     """Object representing an enemy of Scarlet Red."""
     def __init__(self, maze, x, y):
-        Enemy.__init__(self, maze, x, y, 'ScarletRed')
+        super().__init__(maze, x, y, 'ScarletRed')
 
     def fire(self):
         """Scarlet Red doesn't shoot."""
         return False
 
     def move(self):
-        return Enemy.move(self, ENEMY_SPEED * SQRT2)
+        return super().move(self, ENEMY_SPEED * SQRT2)
 
     def slash(self):
         """Handle the Scarlet Red's close-range attack."""
-        self.wound -= Enemy.slash(self)
+        self.wound -= super().slash()
         if self.wound < 0: self.wound = 0.0
 
 
diff --git a/brutalmaze/game.py b/brutalmaze/game.py
index ecf23d6..8b11228 100644
--- a/brutalmaze/game.py
+++ b/brutalmaze/game.py
@@ -16,28 +16,28 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with Brutal Maze.  If not, see <https://www.gnu.org/licenses/>.
 
-__version__ = '0.9.3'
+__version__ = '0.9.4'
 
 import re
 from argparse import ArgumentParser, FileType, RawTextHelpFormatter
 from configparser import ConfigParser
 from contextlib import redirect_stdout
 from io import StringIO
-from math import atan2, radians, pi
+from math import atan2, pi, radians
 from os.path import join as pathjoin, pathsep
-from socket import socket, SOL_SOCKET, SO_REUSEADDR
+from socket import SO_REUSEADDR, SOL_SOCKET, socket
 from sys import stdout
 from threading import Thread
 
 with redirect_stdout(StringIO()): import pygame
+from appdirs import AppDirs
+from palace import Context, Device, free, use_context
 from pygame import KEYDOWN, MOUSEBUTTONUP, QUIT, VIDEORESIZE
 from pygame.time import Clock, get_ticks
-from palace import free, use_context, Device, Context
-from appdirs import AppDirs
 
-from .constants import SETTINGS, ICON, SFX, SFX_NOISE, HERO_SPEED, MIDDLE
+from .constants import HERO_SPEED, ICON, MIDDLE, SETTINGS, SFX, SFX_NOISE
 from .maze import Maze
-from .misc import sign, deg, join, play
+from .misc import deg, join, play, sign
 
 
 class ConfigReader:
@@ -277,8 +277,8 @@ class Game:
                 connection.send(data)
                 try:
                     buf = connection.recv(7)
-                except:     # client is closed or timed out
-                    break
+                except:     # noqa
+                    break   # client is closed or timed out
                 if not buf: break
                 try:
                     move, angle, attack = map(int, buf.decode().split())
diff --git a/brutalmaze/maze.py b/brutalmaze/maze.py
index 8be20fe..73bccf5 100644
--- a/brutalmaze/maze.py
+++ b/brutalmaze/maze.py
@@ -18,23 +18,23 @@
 
 __doc__ = 'Brutal Maze module for the maze class'
 
-from collections import defaultdict, deque
 import json
-from math import pi, log
+from collections import defaultdict, deque
+from math import log, pi
 from os import path
 from random import choice, sample
 
 import pygame
 
 from .characters import Hero, new_enemy
-from .constants import (
-    EMPTY, WALL, HERO, ENEMY, ROAD_WIDTH, WALL_WIDTH, CELL_WIDTH, CELL_NODES,
-    MAZE_SIZE, MIDDLE, INIT_SCORE, ENEMIES, SQRT2, SFX_SPAWN, SFX_MISSED,
-    SFX_SLASH_ENEMY, SFX_LOSE, ADJACENTS, TANGO_VALUES, BG_COLOR, FG_COLOR,
-    COLORS, HERO_HP, ENEMY_HP, ATTACK_SPEED, MAX_WOUND, HERO_SPEED,
-    BULLET_LIFETIME, JSON_SEPARATORS)
-from .misc import (
-    sign, deg, around, regpoly, fill_aapolygon, play, json_rec)
+from .constants import (ADJACENTS, ATTACK_SPEED, BG_COLOR,
+                        BULLET_LIFETIME, CELL_NODES, CELL_WIDTH, COLORS,
+                        EMPTY, ENEMIES, ENEMY, ENEMY_HP, FG_COLOR, HERO,
+                        HERO_HP, HERO_SPEED, INIT_SCORE, JSON_SEPARATORS,
+                        MAX_WOUND, MAZE_SIZE, MIDDLE, ROAD_WIDTH,
+                        SFX_LOSE, SFX_MISSED, SFX_SLASH_ENEMY, SFX_SPAWN,
+                        SQRT2, TANGO_VALUES, WALL, WALL_WIDTH)
+from .misc import around, deg, fill_aapolygon, json_rec, play, regpoly, sign
 from .weapons import LockOn
 
 
diff --git a/brutalmaze/misc.py b/brutalmaze/misc.py
index 60d89c9..db1be00 100644
--- a/brutalmaze/misc.py
+++ b/brutalmaze/misc.py
@@ -20,13 +20,13 @@ __doc__ = 'Brutal Maze module for miscellaneous functions'
 
 from datetime import datetime
 from itertools import chain
-from math import degrees, cos, sin, pi
+from math import cos, degrees, pi, sin
 from os import path
 from random import shuffle
 
 import pygame
-from pygame.gfxdraw import filled_polygon, aapolygon
 from palace import Buffer, Source
+from pygame.gfxdraw import aapolygon, filled_polygon
 
 from .constants import ADJACENTS, CORNERS, MIDDLE
 
diff --git a/brutalmaze/weapons.py b/brutalmaze/weapons.py
index b66ad80..e42f127 100644
--- a/brutalmaze/weapons.py
+++ b/brutalmaze/weapons.py
@@ -20,9 +20,9 @@ __doc__ = 'Brutal Maze module for weapon classes'
 
 from math import cos, sin
 
-from .constants import (BULLET_LIFETIME, SFX_SHOT_ENEMY, SFX_SHOT_HERO,
-                        BULLET_SPEED, ENEMY_HP, TANGO, BG_COLOR)
-from .misc import regpoly, fill_aapolygon
+from .constants import (BG_COLOR, BULLET_LIFETIME, BULLET_SPEED,
+                        ENEMY_HP, SFX_SHOT_ENEMY, SFX_SHOT_HERO, TANGO)
+from .misc import fill_aapolygon, regpoly
 
 
 class Bullet:
diff --git a/client-examples/hit-and-run.py b/client-examples/hit-and-run.py
index 7959315..09dc7fa 100755
--- a/client-examples/hit-and-run.py
+++ b/client-examples/hit-and-run.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 from contextlib import closing, suppress
-from math import inf, atan2, degrees
+from math import atan2, degrees, inf
 from random import randrange, shuffle
 from socket import socket
 
@@ -9,9 +9,9 @@ AROUND = [5, 2, 1, 0, 3, 6, 7, 8]
 
 def get_moves(y, x):
     """Return tuple of encoded moves."""
-    return ((y - 1, x - 1), (y - 1, x), (y - 1, x + 1),
-            (y,     x - 1), (y,     x), (y,     x + 1),
-            (y + 1, x - 1), (y + 1, x), (y + 1, x + 1))
+    return ((y - 1, x - 1), (y - 1, x), (y - 1, x + 1),     # noqa
+            (y,     x - 1), (y,     x), (y,     x + 1),     # noqa
+            (y + 1, x - 1), (y + 1, x), (y + 1, x + 1))     # noqa
 
 
 def is_wall(maze, y, x):
diff --git a/docs/source/_templates/recplayer.html b/docs/source/_templates/recplayer.html
index 59df55a..28e170e 100644
--- a/docs/source/_templates/recplayer.html
+++ b/docs/source/_templates/recplayer.html
@@ -2,6 +2,7 @@
 <html>
 <meta charset='utf-8'>
 <title>Brutal Maze record player</title>
+<link rel='icon' type='image/png' href='_static/favicon.ico'>
 <link rel='stylesheet' type='text/css' href='_static/recplayer.css'>
 <script src='_static/brutalma.js'></script>
 
diff --git a/docs/source/conf.py b/docs/source/conf.py
index c94e002..6a08aa2 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -18,11 +18,11 @@
 # -- Project information -----------------------------------------------------
 
 project = 'Brutal Maze'
-copyright = '2017-2020, Nguyễn Gia Phong'
+copyright = '2017-2020, Nguyễn Gia Phong'   # noqa
 author = 'Nguyễn Gia Phong'
 
 # The full version, including alpha/beta/rc tags
-release = '0.9.3'
+release = '0.9.4'
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..17f4d81
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,21 @@
+[tox]
+envlist = py
+minversion = 3.3
+isolated_build = True
+
+[testenv]
+deps =
+    flake8-builtins
+    isort
+commands =
+    flake8
+    isort . --check --diff
+
+[flake8]
+hang-closing = True
+ignore = E129, E226, E228, E701, E704, W503
+exclude = .git,__pycache__,.tox,__init__.py
+
+[isort]
+balanced_wrapping = True
+combine_as_imports = True