45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
|
|
"""McRogueFace - Basic Enemy AI (basic)
|
||
|
|
|
||
|
|
Documentation: https://mcrogueface.github.io/cookbook/combat_enemy_ai
|
||
|
|
Repository: https://github.com/jmccardle/McRogueFace/blob/master/docs/cookbook/combat/combat_enemy_ai_basic.py
|
||
|
|
|
||
|
|
This code is extracted from the McRogueFace documentation and can be
|
||
|
|
run directly with: ./mcrogueface path/to/this/file.py
|
||
|
|
"""
|
||
|
|
|
||
|
|
import random
|
||
|
|
|
||
|
|
def wander(enemy, grid):
|
||
|
|
"""Move randomly to an adjacent walkable tile."""
|
||
|
|
ex, ey = int(enemy.x), int(enemy.y)
|
||
|
|
|
||
|
|
# Get valid adjacent tiles
|
||
|
|
directions = [(0, -1), (0, 1), (-1, 0), (1, 0)]
|
||
|
|
random.shuffle(directions)
|
||
|
|
|
||
|
|
for dx, dy in directions:
|
||
|
|
new_x, new_y = ex + dx, ey + dy
|
||
|
|
|
||
|
|
if is_walkable(grid, new_x, new_y) and not is_occupied(new_x, new_y):
|
||
|
|
enemy.x = new_x
|
||
|
|
enemy.y = new_y
|
||
|
|
return
|
||
|
|
|
||
|
|
# No valid moves - stay in place
|
||
|
|
|
||
|
|
def is_walkable(grid, x, y):
|
||
|
|
"""Check if a tile can be walked on."""
|
||
|
|
grid_w, grid_h = grid.grid_size
|
||
|
|
if x < 0 or x >= grid_w or y < 0 or y >= grid_h:
|
||
|
|
return False
|
||
|
|
return grid.at(x, y).walkable
|
||
|
|
|
||
|
|
def is_occupied(x, y, entities=None):
|
||
|
|
"""Check if a tile is occupied by another entity."""
|
||
|
|
if entities is None:
|
||
|
|
return False
|
||
|
|
|
||
|
|
for entity in entities:
|
||
|
|
if int(entity.x) == x and int(entity.y) == y:
|
||
|
|
return True
|
||
|
|
return False
|