Turn wall grids into enemies when they are shot
This commit is contained in:
parent
9dff378b57
commit
9a896890fa
|
@ -148,7 +148,6 @@ class Enemy:
|
|||
def __init__(self, maze, x, y, color):
|
||||
self.maze = maze
|
||||
self.x, self.y = x, y
|
||||
self.maze.map[x][y] = ENEMY
|
||||
self.angle, self.color = pi / 4, color
|
||||
|
||||
self.awake = False
|
||||
|
@ -176,7 +175,7 @@ class Enemy:
|
|||
"""Move the enemy by (x, y) (in grids)."""
|
||||
self.x += x
|
||||
self.y += y
|
||||
self.maze.map[self.x][self.y] = ENEMY
|
||||
if self.awake: self.maze.map[self.x][self.y] = ENEMY
|
||||
|
||||
def wake(self):
|
||||
"""Wake the enemy up if it can see the hero.
|
||||
|
@ -195,11 +194,13 @@ class Enemy:
|
|||
def get_distance(x, y): return abs(dy*x - dx*y) / (dy**2 + dx**2)**0.5
|
||||
for i in range(startx, stopx + 1):
|
||||
for j in range(starty, stopy + 1):
|
||||
if self.maze.map[i][j] != WALL: continue
|
||||
if self.maze.map[i][j] != WALL or i == stopx and j == stopy:
|
||||
continue
|
||||
x, y = self.maze.get_pos(i, j)
|
||||
if get_distance(x - self.maze.x, y - self.maze.y) <= mind:
|
||||
return False
|
||||
self.awake = True
|
||||
self.maze.map[self.x][self.y] = ENEMY
|
||||
play(self.maze.sfx_spawn,
|
||||
1 - self.get_distance()/self.maze.get_distance(0, 0)/2,
|
||||
self.get_angle() + pi)
|
||||
|
@ -265,13 +266,13 @@ class Enemy:
|
|||
|
||||
def get_color(self):
|
||||
"""Return current color of the enemy."""
|
||||
return TANGO[self.color][int(self.wound)] if self.awake else FG_COLOR
|
||||
return TANGO[self.color][int(self.wound)]
|
||||
|
||||
|
||||
def draw(self):
|
||||
"""Draw the enemy."""
|
||||
if self.maze.next_move > 0 and not self.awake: return
|
||||
radius = self.maze.distance/SQRT2 - self.awake*2
|
||||
if not self.awake: return
|
||||
radius = self.maze.distance / SQRT2
|
||||
square = regpoly(4, radius, self.angle, *self.get_pos())
|
||||
fill_aapolygon(self.maze.surface, square, self.get_color())
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
# 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.7.0'
|
||||
__version__ = '0.7.1'
|
||||
|
||||
import re
|
||||
from argparse import ArgumentParser, FileType, RawTextHelpFormatter
|
||||
|
@ -158,11 +158,8 @@ class Game:
|
|||
ne = nb = 0
|
||||
|
||||
for enemy in maze.enemies:
|
||||
if not enemy.awake and walls:
|
||||
walls[enemy.y-maze.rangey[0]][enemy.x-maze.rangex[0]] = WALL
|
||||
continue
|
||||
# Check Chameleons
|
||||
elif getattr(enemy, 'visible', 1) <= 0 and maze.next_move <= 0:
|
||||
if getattr(enemy, 'visible', 1) <= 0 and maze.next_move <= 0:
|
||||
continue
|
||||
lines.append('{0} {2} {3} {1:.0f}'.format(
|
||||
COLORS[enemy.get_color()], deg(enemy.angle),
|
||||
|
@ -321,8 +318,7 @@ class Game:
|
|||
maze.destx = maze.desty = MIDDLE
|
||||
maze.stepx = maze.stepy = 0
|
||||
elif autove:
|
||||
maze.destx = MIDDLE + round2((x-maze.centerx) / maze.distance)
|
||||
maze.desty = MIDDLE + round2((y-maze.centery) / maze.distance)
|
||||
maze.destx, maze.desty = maze.get_grid(x, y)
|
||||
maze.set_step(lambda x: maze.rangex[0] <= x <= maze.rangex[-1],
|
||||
lambda y: maze.rangey[0] <= y <= maze.rangey[-1])
|
||||
if maze.stepx == maze.stepy == 0:
|
||||
|
|
|
@ -27,10 +27,10 @@ import pygame
|
|||
|
||||
from .characters import Hero, new_enemy
|
||||
from .constants import (
|
||||
EMPTY, WALL, HERO, ROAD_WIDTH, MAZE_SIZE, MIDDLE, INIT_SCORE, ENEMIES,
|
||||
MINW, MAXW, SQRT2, SFX_SPAWN, SFX_SLASH_ENEMY, SFX_LOSE, ADJACENTS,
|
||||
BG_COLOR, FG_COLOR, CELL_WIDTH, LAST_ROW, HERO_HP, ENEMY_HP, ATTACK_SPEED,
|
||||
HERO_SPEED, BULLET_LIFETIME)
|
||||
EMPTY, WALL, HERO, ENEMY, ROAD_WIDTH, MAZE_SIZE, MIDDLE, INIT_SCORE,
|
||||
ENEMIES, MINW, MAXW, SQRT2, SFX_SPAWN, SFX_SLASH_ENEMY, SFX_LOSE,
|
||||
ADJACENTS, TANGO, BG_COLOR, FG_COLOR, CELL_WIDTH, LAST_ROW,
|
||||
HERO_HP, ENEMY_HP, ATTACK_SPEED, HERO_SPEED, BULLET_LIFETIME)
|
||||
from .misc import round2, sign, around, regpoly, fill_aapolygon, play
|
||||
from .weapons import Bullet
|
||||
|
||||
|
@ -77,6 +77,7 @@ class Maze:
|
|||
destx, desty (int): the grid the hero is moving to
|
||||
stepx, stepy (int): direction the maze is moving
|
||||
next_move (float): time until the hero gets mobilized (in ms)
|
||||
glitch (float): time that the maze remain flashing colors (in ms)
|
||||
next_slashfx (float): time until next slash effect of the hero (in ms)
|
||||
slashd (float): minimum distance for slashes to be effective
|
||||
sfx_slash (pygame.mixer.Sound): sound effect of slashed enemy
|
||||
|
@ -109,7 +110,7 @@ class Maze:
|
|||
self.map[MIDDLE][MIDDLE] = HERO
|
||||
self.destx = self.desty = MIDDLE
|
||||
self.stepx = self.stepy = 0
|
||||
self.next_move = self.next_slashfx = 0.0
|
||||
self.next_move = self.glitch = self.next_slashfx = 0.0
|
||||
self.slashd = self.hero.R + self.distance/SQRT2
|
||||
|
||||
self.sfx_spawn = SFX_SPAWN
|
||||
|
@ -129,20 +130,26 @@ class Maze:
|
|||
continue
|
||||
enemy = new_enemy(self, x, y)
|
||||
self.enemies.append(enemy)
|
||||
if plum is None or not plum.clone(enemy):
|
||||
walls.remove((x, y))
|
||||
else:
|
||||
self.map[x][y] = WALL
|
||||
if plum is None or not plum.clone(enemy): walls.remove((x, y))
|
||||
|
||||
def get_pos(self, x, y):
|
||||
"""Return coordinate of the center of the grid (x, y)."""
|
||||
return (self.centerx + (x - MIDDLE)*self.distance,
|
||||
self.centery + (y - MIDDLE)*self.distance)
|
||||
|
||||
def get_grid(self, x, y):
|
||||
"""Return the grid containing the point (x, y)."""
|
||||
return (MIDDLE + round2((x-self.centerx) / self.distance),
|
||||
MIDDLE + round2((y-self.centery) / self.distance))
|
||||
|
||||
def get_score(self):
|
||||
"""Return the current score."""
|
||||
return int(self.score - INIT_SCORE)
|
||||
|
||||
def get_color(self):
|
||||
"""Return color of a grid."""
|
||||
return choice(TANGO.values())[0] if self.glitch > 0 else FG_COLOR
|
||||
|
||||
def draw(self):
|
||||
"""Draw the maze."""
|
||||
self.surface.fill(BG_COLOR)
|
||||
|
@ -152,7 +159,7 @@ class Maze:
|
|||
if self.map[i][j] != WALL: continue
|
||||
x, y = self.get_pos(i, j)
|
||||
square = regpoly(4, self.distance / SQRT2, pi / 4, x, y)
|
||||
fill_aapolygon(self.surface, square, FG_COLOR)
|
||||
fill_aapolygon(self.surface, square, self.get_color())
|
||||
|
||||
for enemy in self.enemies: enemy.draw()
|
||||
if not self.hero.dead: self.hero.draw()
|
||||
|
@ -167,7 +174,9 @@ class Maze:
|
|||
x = int((self.centerx-self.x) * 2 / self.distance)
|
||||
y = int((self.centery-self.y) * 2 / self.distance)
|
||||
if x == y == 0: return
|
||||
for enemy in self.enemies: self.map[enemy.x][enemy.y] = EMPTY
|
||||
for enemy in self.enemies:
|
||||
if self.map[enemy.x][enemy.y] == ENEMY:
|
||||
self.map[enemy.x][enemy.y] = EMPTY
|
||||
|
||||
self.map[MIDDLE][MIDDLE] = EMPTY
|
||||
self.centerx -= x * self.distance
|
||||
|
@ -273,9 +282,17 @@ class Maze:
|
|||
if wound < 0:
|
||||
fallen.append(i)
|
||||
elif bullet.color == 'Aluminium':
|
||||
x = MIDDLE + round2((bullet.x-self.x) / self.distance)
|
||||
y = MIDDLE + round2((bullet.y-self.y) / self.distance)
|
||||
x, y = self.get_grid(bullet.x, bullet.y)
|
||||
if self.map[x][y] == WALL and self.next_move <= 0:
|
||||
self.glitch = wound * 1000
|
||||
enemy = new_enemy(self, x, y)
|
||||
enemy.awake = True
|
||||
self.map[x][y] = ENEMY
|
||||
play(self.sfx_spawn,
|
||||
1 - enemy.get_distance()/self.get_distance(0, 0)/2,
|
||||
enemy.get_angle() + pi)
|
||||
enemy.hit(wound)
|
||||
self.enemies.append(enemy)
|
||||
fallen.append(i)
|
||||
continue
|
||||
for j, enemy in enumerate(self.enemies):
|
||||
|
@ -327,11 +344,12 @@ class Maze:
|
|||
self.vy = self.is_valid_move(vy=self.vy)
|
||||
self.centery += self.vy
|
||||
|
||||
self.next_move -= 1000.0 / self.fps
|
||||
self.next_slashfx -= 1000.0 / self.fps
|
||||
self.next_move -= 1000.0 / fps
|
||||
self.glitch -= 1000.0 / fps
|
||||
self.next_slashfx -= 1000.0 / fps
|
||||
|
||||
self.rotate()
|
||||
if self.vx or self.vy:
|
||||
if self.vx or self.vy or self.hero.firing or self.hero.slashing:
|
||||
for enemy in self.enemies: enemy.wake()
|
||||
for bullet in self.bullets: bullet.place(self.vx, self.vy)
|
||||
|
||||
|
@ -415,6 +433,7 @@ class Maze:
|
|||
self.score = INIT_SCORE
|
||||
self.map = deque()
|
||||
for _ in range(MAZE_SIZE): self.map.extend(new_column())
|
||||
self.map[MIDDLE][MIDDLE] = HERO
|
||||
self.destx = self.desty = MIDDLE
|
||||
self.stepx = self.stepy = 0
|
||||
self.vx = self.vy = 0.0
|
||||
|
|
2
setup.py
2
setup.py
|
@ -7,7 +7,7 @@ with open('README.rst') as f:
|
|||
|
||||
setup(
|
||||
name='brutalmaze',
|
||||
version='0.7.0',
|
||||
version='0.7.1',
|
||||
description='A minimalist TPS game with fast-paced action',
|
||||
long_description=long_description,
|
||||
url='https://github.com/McSinyx/brutalmaze',
|
||||
|
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
|||
Subproject commit b4169d8f16a5f99b11f41e4823ca67065788cbac
|
||||
Subproject commit 73e7729aea1d4760d5091d8af06469a6111e3b8c
|
Loading…
Reference in New Issue