arctic-masher/enemies.py

84 lines
3.2 KiB
Python
Raw Normal View History

2023-05-17 11:52:05 +00:00
import pygame
2023-05-17 12:42:21 +00:00
import uuid
2023-05-18 03:39:12 +00:00
import random
2023-05-17 11:52:05 +00:00
from globals import *
from player import *
from blocks import *
2023-05-17 11:52:05 +00:00
2023-05-18 03:39:12 +00:00
def findClosestPlayer(x, y):
closestPlayerPosition = {"difference": (1,1), "distance": 9999}
for id, player in players.items():
difference = (player.x - x, player.y - y)
distance = max(abs(difference[0]), abs(difference[1]))
if distance > closestPlayerPosition["distance"]:
continue
closestPlayerPosition = {"difference": difference, "distance": distance}
return closestPlayerPosition
2023-05-17 11:52:05 +00:00
class Enemy:
def __init__(self, id, x, y):
2023-05-17 12:42:21 +00:00
self.id = id
2023-05-18 07:35:26 +00:00
self.ENEMY = True
2023-05-17 11:52:05 +00:00
self.x = x
self.y = y
2023-05-18 07:35:26 +00:00
self.renderPos = (x,y)
2023-05-18 05:45:11 +00:00
self.AITime = random.randint(350, 600)
2023-05-17 11:52:05 +00:00
2023-05-17 12:42:21 +00:00
def die(self):
del enemies[self.id]
2023-05-17 12:42:21 +00:00
2023-05-17 11:52:05 +00:00
def pushed(self, x, y, caller, pusher):
if hasattr(pusher, "PLAYER") and hasattr(caller, "BLOCK"):
2023-05-17 12:42:21 +00:00
wallCrush = self.x + x > tileCountx - 1 or self.y + y > tileCounty - 1 or self.x + x < 0 or self.y + y < 0
if wallCrush or hasattr(gameMap[self.x + x][self.y + y], "BLOCK"):
pusher.kills += 1
2023-05-18 07:35:26 +00:00
caller.color = random.choice([grey, green])
2023-05-17 12:42:21 +00:00
self.die()
return
raise Exception("Not crushing enemy!")
def move(self, x, y):
2023-05-18 03:39:12 +00:00
try:
if self.x + x > tileCountx - 1 or self.y + y > tileCounty - 1 or self.x + x < 0 or self.y + y < 0:
raise Exception("Cannot move off edge!")
if gameMap[self.x + x][self.y + y]:
if hasattr(gameMap[self.x + x][self.y + y], "PLAYER"):
2023-05-18 03:39:12 +00:00
gameMap[self.x + x][self.y + y].die()
else:
raise Exception("Path is blocked.")
2023-05-18 04:34:16 +00:00
gameMap[self.x][self.y] = False
2023-05-18 03:39:12 +00:00
self.x += x
self.y += y
gameMap[self.x][self.y] = self
except Exception as error:
raise error
def runAI(self):
self.AITime -= 1
if self.AITime < 1:
try:
closestPlayer = findClosestPlayer(self.x, self.y)
weightsx = [-closestPlayer["difference"][0], abs(closestPlayer["difference"][1]), closestPlayer["difference"][0]]
if weightsx[0] < 0:
weightsx[0] = weightsx[2]/6
elif weightsx[2] < 0:
weightsx[2] = weightsx[0]/6
else:
weightsx[0] = weightsx[1]/8
weightsx[2] = weightsx[1]/8
weightsy = [-closestPlayer["difference"][1], abs(closestPlayer["difference"][0]), closestPlayer["difference"][1]]
if weightsy[0] < 0:
weightsy[0] = weightsy[2]/6
elif weightsy[2] < 0:
weightsy[2] = weightsy[0]/6
else:
weightsy[0] = weightsy[1]/8
weightsy[2] = weightsy[1]/8
movementx = random.choices([-1, 0, 1], weightsx)[0]
movementy = random.choices([-1, 0, 1], weightsy)[0]
self.move(movementx, movementy)
self.AITime = random.randint(150, 200)
except Exception as error:
pass