Add Butter the better, Agent Orange and lightning from the Sky
This commit is contained in:
parent
764fe3421f
commit
6a9b702c77
|
@ -40,6 +40,7 @@ class Hero:
|
|||
angle (float): angle of the direction the hero pointing (in radians)
|
||||
color (tuple of pygame.Color): colors of the hero on different HPs
|
||||
R (int): circumradius of the regular triangle representing the hero
|
||||
next_heal (int): the tick that the hero gains back healing ability
|
||||
next_strike (int): the tick that the hero can do the next attack
|
||||
slashing (bool): flag indicates if the hero is doing close-range attack
|
||||
firing (bool): flag indicates if the hero is doing long-range attack
|
||||
|
@ -55,7 +56,7 @@ class Hero:
|
|||
self.angle, self.color = pi / 4, TANGO['Aluminium']
|
||||
self.R = (w * h / sin(pi*2/3) / 624) ** 0.5
|
||||
|
||||
self.next_strike = 0
|
||||
self.next_heal = self.next_strike = 0
|
||||
self.slashing = self.firing = self.dead = False
|
||||
self.spin_speed = fps / HERO_HP
|
||||
self.spin_queue = self.wound = 0.0
|
||||
|
@ -65,8 +66,9 @@ class Hero:
|
|||
old_speed, time = self.spin_speed, pygame.time.get_ticks()
|
||||
self.spin_speed = fps / (HERO_HP-self.wound**0.5)
|
||||
self.spin_queue *= self.spin_speed / old_speed
|
||||
if not self.dead: self.wound -= HEAL_SPEED / self.spin_speed / HERO_HP
|
||||
if self.wound < 0: self.wound = 0.0
|
||||
if not self.dead and time > self.next_heal:
|
||||
self.wound -= HEAL_SPEED / self.spin_speed / HERO_HP
|
||||
if self.wound < 0: self.wound = 0.0
|
||||
|
||||
if self.slashing and time >= self.next_strike:
|
||||
self.next_strike = time + ATTACK_SPEED
|
||||
|
@ -200,12 +202,14 @@ class Enemy:
|
|||
return False
|
||||
|
||||
def slash(self):
|
||||
"""Handle the enemy's close-range attack."""
|
||||
if not self.spin_queue: return
|
||||
x, y = self.pos()
|
||||
d = self.maze.slashd - self.maze.length(x, y)
|
||||
if d >= 0:
|
||||
self.maze.hit(d / self.maze.hero.R / self.spin_speed, self.color)
|
||||
"""Return the enemy's close-range damage."""
|
||||
if self.spin_queue:
|
||||
d = self.maze.slashd - self.maze.length(*self.pos())
|
||||
wound = d / self.maze.hero.R / self.spin_speed
|
||||
if wound >= 0:
|
||||
self.maze.hit(wound, self.color)
|
||||
return wound
|
||||
return 0.0
|
||||
|
||||
def draw(self):
|
||||
"""Draw the enemy."""
|
||||
|
@ -236,8 +240,8 @@ class Enemy:
|
|||
"""Handle the enemy's death."""
|
||||
if self.awake:
|
||||
self.maze.map[self.x][self.y] = EMPTY
|
||||
if self.maze.enemy_weights[self.color] > INIT_WEIGHT:
|
||||
self.maze.enemy_weights[self.color] -= 1
|
||||
if self.maze.enemy_weights[self.color] > MINW + 1.5:
|
||||
self.maze.enemy_weights[self.color] -= 1.5
|
||||
else:
|
||||
self.maze.map[self.x][self.y] = WALL
|
||||
|
||||
|
@ -312,14 +316,8 @@ class ScarletRed(Enemy):
|
|||
|
||||
def slash(self):
|
||||
"""Handle the Scarlet Red's close-range attack."""
|
||||
if not self.spin_queue: return
|
||||
x, y = self.pos()
|
||||
d = self.maze.slashd - self.maze.length(x, y)
|
||||
wound = d / self.maze.hero.R / self.spin_speed
|
||||
if wound >= 0:
|
||||
self.maze.hit(wound, self.color)
|
||||
self.wound -= wound
|
||||
if self.wound < 0: self.wound = 0.0
|
||||
self.wound -= Enemy.slash(self)
|
||||
if self.wound < 0: self.wound = 0.0
|
||||
|
||||
|
||||
def new_enemy(maze, x, y):
|
||||
|
|
|
@ -45,8 +45,6 @@ BULLET_SPEED = 15 # grid/s
|
|||
ATTACK_SPEED = 333 # ms/strike
|
||||
FIRANGE = 6 # grids
|
||||
BULLET_LIFETIME = 1000.0 * FIRANGE / (BULLET_SPEED-HERO_SPEED) # ms
|
||||
FIRE_DAM = 1# / SQRT2 # HP
|
||||
|
||||
EMPTY, WALL, HERO, ENEMY = range(4)
|
||||
ADJACENT_GRIDS = (1, 0), (0, 1), (-1, 0), (0, -1)
|
||||
CROSS = ADJACENT_GRIDS + ((0, 0),)
|
||||
|
@ -64,7 +62,7 @@ TANGO = {'Butter': ((252, 233, 79), (237, 212, 0), (196, 160, 0)),
|
|||
(136, 138, 133), (85, 87, 83), (46, 52, 54))}
|
||||
ENEMIES = ['Butter', 'Orange', 'Chocolate', 'Chameleon',
|
||||
'SkyBlue', 'Plum', 'ScarletRed']
|
||||
INIT_WEIGHT = 11.25
|
||||
MINW, MAXW = 24, 36
|
||||
ENEMY_HP = 3
|
||||
HERO_HP = 6
|
||||
BG_COLOR = TANGO['Aluminium'][-1]
|
||||
|
|
|
@ -21,7 +21,7 @@ __doc__ = 'brutalmaze module for the maze class'
|
|||
|
||||
from collections import deque
|
||||
from math import pi, atan2, log
|
||||
from random import choice, getrandbits
|
||||
from random import choice, getrandbits, uniform
|
||||
|
||||
import pygame
|
||||
from pygame import RESIZABLE
|
||||
|
@ -72,6 +72,7 @@ class Maze:
|
|||
enemy_weights (dict): probabilities of enemies to be created
|
||||
enemies (list of Enemy): alive enemies
|
||||
hero (Hero): the hero
|
||||
next_move (int): the tick that the hero gets mobilized
|
||||
slashd (float): minimum distance for slashes to be effective
|
||||
"""
|
||||
def __init__(self, size, fps):
|
||||
|
@ -91,11 +92,11 @@ class Maze:
|
|||
self.vx = self.vy = 0.0
|
||||
self.rotatex = self.rotatey = 0
|
||||
self.bullets, self.enemies = [], []
|
||||
self.enemy_weights = {color: INIT_WEIGHT for color in ENEMIES}
|
||||
self.enemy_weights = {color: MINW for color in ENEMIES}
|
||||
self.add_enemy()
|
||||
self.hero = Hero(self.surface, fps)
|
||||
self.map[MIDDLE][MIDDLE] = HERO
|
||||
self.slashd = self.hero.R + self.distance/SQRT2
|
||||
self.next_move, self.slashd = 0, self.hero.R + self.distance/SQRT2
|
||||
|
||||
def add_enemy(self):
|
||||
"""Add enough enemies."""
|
||||
|
@ -180,8 +181,19 @@ class Maze:
|
|||
|
||||
def hit(self, wound, color):
|
||||
"""Handle the hero when he loses HP."""
|
||||
self.hero.wound += wound
|
||||
self.enemy_weights[color] += wound
|
||||
fx = (uniform(0, sum(self.enemy_weights.values()))
|
||||
< self.enemy_weights[color])
|
||||
time = pygame.time.get_ticks()
|
||||
if color == 'Butter' and fx:
|
||||
self.hero.wound += 1.0
|
||||
elif color == 'Orange' and fx:
|
||||
self.hero.next_heal = max(self.hero.next_heal, time) + wound*1000
|
||||
elif color == 'SkyBlue' and fx:
|
||||
self.next_move = max(self.next_move, time) + wound*1000
|
||||
else:
|
||||
self.hero.wound += wound
|
||||
if self.enemy_weights[color] + wound < MAXW:
|
||||
self.enemy_weights[color] += wound
|
||||
|
||||
def slash(self):
|
||||
"""Handle close-range attacks."""
|
||||
|
@ -279,9 +291,10 @@ class Maze:
|
|||
|
||||
def move(self, x, y, fps):
|
||||
"""Command the hero to move faster in the given direction."""
|
||||
stunned = pygame.time.get_ticks() < self.next_move
|
||||
velocity = self.distance * HERO_SPEED / fps
|
||||
accel = velocity * HERO_SPEED / fps
|
||||
if not x:
|
||||
if stunned or not x:
|
||||
self.vx -= sign(self.vx) * accel
|
||||
if abs(self.vx) < accel * 2: self.vx = 0.0
|
||||
elif x * self.vx < 0:
|
||||
|
@ -289,7 +302,7 @@ class Maze:
|
|||
else:
|
||||
self.vx += x * accel
|
||||
if abs(self.vx) > velocity: self.vx = x * velocity
|
||||
if not y:
|
||||
if stunned or not y:
|
||||
self.vy -= sign(self.vy) * accel
|
||||
if abs(self.vy) < accel * 2: self.vy = 0.0
|
||||
elif y * self.vy < 0:
|
||||
|
|
Loading…
Reference in New Issue