rpg-szi/agent2.py

287 lines
9.9 KiB
Python
Raw Normal View History

from mesa import Agent
2021-03-29 14:46:05 +02:00
import random
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
def dice(number):
2021-04-12 23:42:09 +02:00
return random.randint(1, number)
2021-03-29 14:46:05 +02:00
class Wall(Agent):
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
def step(self):
pass
2021-04-12 23:42:09 +02:00
class Box(Agent):
def __init__(self, unique_id, model):
2021-03-29 14:46:05 +02:00
super().__init__(unique_id, model)
2021-04-12 23:42:09 +02:00
self.gold = 3 * dice(6)
self.isBox = True
self.isCreature = False
def step(self):
pass
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
class Weapon():
2021-04-12 23:42:09 +02:00
def __init__(self, name, type, damage):
2021-03-29 14:46:05 +02:00
self.name = name
self.type = type
2021-03-29 14:46:05 +02:00
self.damage = damage
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
class Armor():
2021-04-12 23:42:09 +02:00
def __init__(self, name, defence, mp):
2021-03-29 14:46:05 +02:00
self.name = name
self.defence = defence
self.mag_protection = mp
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
class Creature(Agent):
def __init__(self, unique_id, model, n, s, a, w, maxhp, hp, weap, arm, g):
super().__init__(unique_id, model)
self.name = n
self.strength = s
self.agility = a
self.wisdom = w
self.maxHealth = maxhp
self.health = hp
self.gold = g
self.weapon1 = weap
self.armor = arm
self.isBox = False
2021-04-12 23:42:09 +02:00
self.isCreature = True
2021-04-12 23:42:09 +02:00
def meleeAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.strength + dice(6)
defenseValue = opponent.strength + opponent.armor.defence
damage = attackValue - defenseValue
if damage > 0:
opponent.health = opponent.health - (damage + self.weapon1.damage)
2021-04-12 23:42:09 +02:00
def rangeAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.agility + dice(6)
defenseValue = opponent.agility
damage = attackValue - defenseValue
if (damage > 0) and (damage + self.weapon1.damage - opponent.armor.defence > 0):
opponent.health = opponent.health - (damage + self.weapon1.damage - opponent.armor.defence)
2021-04-12 23:42:09 +02:00
def magicAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.wisdom + dice(6)
defenseValue = opponent.wisdom
damage = attackValue - defenseValue
if (damage > 0) and (damage + self.weapon1.damage - opponent.armor.mag_protection > 0):
opponent.health = opponent.health - (damage + self.weapon1.damage - opponent.armor.mag_protection)
2021-04-12 23:42:09 +02:00
def defaultAttack(self, opponent):
if self.weapon1.type == "Meele":
2021-03-29 14:46:05 +02:00
self.meleeAttack(opponent)
elif self.weapon1.type == "Range":
2021-03-29 14:46:05 +02:00
self.rangeAttack(opponent)
else:
self.magicAttack(opponent)
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
class Player(Creature):
def __init__(self, unique_id, model, n, s, a, w, maxhp, hp, weap, arm, g, w2, w3):
super().__init__(unique_id, model, n, s, a, w, maxhp, hp, weap, arm, g)
2021-03-29 14:46:05 +02:00
self.name = n
self.strength = s
self.agility = a
self.wisdom = w
self.maxHealth = maxhp
self.health = hp
self.gold = g
self.weapon1 = weap
self.weapon2 = w2
self.weapon3 = w3
self.armor = arm
self.isBox = False
self.isCreature = False
2021-04-12 23:42:09 +02:00
self.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]
self.direction = 0
def rotate(self, clockwise=True):
if clockwise:
self.direction = (self.direction + 1) % 4
else:
self.direction = (self.direction + 3) % 4
2021-03-29 14:46:05 +02:00
2021-04-12 23:42:09 +02:00
def moveFwd(self):
possible_steps = self.model.grid.get_neighborhood(
self.pos,
moore=False,
include_center=False)
new_position = (self.pos[0] + self.directions[self.direction][0],
self.pos[1] + self.directions[self.direction][1])
2021-04-12 23:42:09 +02:00
if new_position in possible_steps:
self.model.grid.move_agent(self, new_position)
def move(self): # OLD
2021-03-29 14:46:05 +02:00
possible_steps = self.model.grid.get_neighborhood(
self.pos,
moore=True,
include_center=False)
new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
2021-04-12 23:42:09 +02:00
def meleeAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.strength + dice(6)
defenseValue = opponent.strength + opponent.armor.defence
damage = attackValue - defenseValue
if damage > 0:
opponent.health = opponent.health - (damage + self.weapon1.damage)
2021-04-12 23:42:09 +02:00
def rangeAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.agility + dice(6)
defenseValue = opponent.agility
damage = attackValue - defenseValue
if (damage > 0) and (damage + self.weapon2.damage - opponent.armor.defence > 0):
opponent.health = opponent.health - (damage + self.weapon2.damage - opponent.armor.defence)
2021-04-12 23:42:09 +02:00
def magicAttack(self, opponent):
2021-03-29 14:46:05 +02:00
attackValue = self.wisdom + dice(6)
defenseValue = opponent.wisdom
damage = attackValue - defenseValue
if (damage > 0) and (damage + self.weapon3.damage - opponent.armor.mag_protection > 0):
opponent.health = opponent.health - (damage + self.weapon3.damage - opponent.armor.mag_protection)
2021-04-12 23:42:09 +02:00
2021-03-29 14:46:05 +02:00
def fightOrFlight(self, opponent):
combat = True
while combat:
choice = dice(4)
print("dice rolled:", choice)
2021-03-29 14:46:05 +02:00
if choice == 1:
running_speed = self.agility + dice(6)
opponent_speed = opponent.agility + dice(6)
if running_speed > opponent_speed:
combat = False
print("Player ran away")
2021-03-29 14:46:05 +02:00
self.step()
else:
opponent.defaultAttack(self)
if self.health <= 0:
combat = False
print("Player died :/")
2021-03-29 14:46:05 +02:00
elif choice == 2:
self.meleeAttack(opponent)
if opponent.health > 0:
opponent.defaultAttack(self)
if self.health <= 0:
combat = False
print("Player died :/")
2021-03-29 14:46:05 +02:00
else:
combat = False
self.gold = self.gold + opponent.gold
opponent.gold = 0
opponent.model.grid.remove_agent(opponent)
print("Fight won")
2021-03-29 14:46:05 +02:00
elif choice == 3:
self.rangeAttack(opponent)
if opponent.health > 0:
opponent.defaultAttack(self)
if self.health <= 0:
combat = False
print("Player died :/")
2021-03-29 14:46:05 +02:00
else:
combat = False
self.gold = self.gold + opponent.gold
opponent.gold = 0
opponent.model.grid.remove_agent(opponent)
print("Fight won")
2021-03-29 14:46:05 +02:00
else:
self.magicAttack(opponent)
2021-03-29 14:46:05 +02:00
if opponent.health > 0:
opponent.defaultAttack(self)
if self.health <= 0:
combat = False
print("Player died :/")
2021-03-29 14:46:05 +02:00
else:
combat = False
self.gold = self.gold + opponent.gold
opponent.gold = 0
opponent.model.grid.remove_agent(opponent)
print("Fight won")
2021-04-12 23:42:09 +02:00
def openChest(self, chest):
2021-03-29 14:46:05 +02:00
self.gold = self.gold + chest.gold
print("Chest opened. Gold inside:", chest.gold)
2021-03-29 14:46:05 +02:00
chest.gold = 0
# if isinstance(chest.loot,Armor):
# buffer = self.armor
# self.armor = chest.loot
# chest.loot = buffer
# if isinstance(chest.loot,Weapon):
# if chest.loot.type == "Melee":
# buffer = self.weapon1
# self.weapon1 = chest.loot
# chest.loot = buffer
# elif chest.loot.type == "Range":
# buffer = self.weapon2
# self.weapon2 = chest.loot
# chest.loot = buffer
# elif chest.loot.type == "Magic":
# buffer = self.weapon3
# self.weapon3 = chest.loot
# chest.loot = buffer
2021-04-12 23:42:09 +02:00
def findShortestPathToTarget(self):
visited = []
precedessors = {}
queue = [self.pos]
found_target = False
while queue:
cur_pos = queue.pop(0)
#check for target
cell_contents = self.model.grid.get_cell_list_contents([cur_pos])
if cell_contents and any([isinstance(thing, Box) for thing in cell_contents]):
found_target = cur_pos
break
#enqueue safe unvisited neighbours
neighbours = self.model.grid.get_neighborhood(
cur_pos,
moore=False,
include_center=False)
for cell in neighbours:
#if cell hasn't been visited and the contents don't include creatures
if cell not in visited and not any([isinstance(thing, Creature) for thing in self.model.grid.get_cell_list_contents([cell])]):
queue.append(cell)
precedessors[cell] = cur_pos
visited.append(cur_pos)
if found_target:
path = [found_target]
while True:
if path[0] == self.pos:
break
precedessor = precedessors[path[0]]
path.insert(0, precedessor)
return path
return False
2021-03-29 14:46:05 +02:00
def step(self):
if self.health > 0:
2021-04-12 23:42:09 +02:00
self.moveFwd()
self.rotate(False)
print(self.findShortestPathToTarget())
2021-03-29 14:46:05 +02:00
cellmates = self.model.grid.get_cell_list_contents([self.pos])
if len(cellmates) > 1:
2021-04-12 23:42:09 +02:00
if isinstance(cellmates[0], Box):
self.openChest(cellmates[0])
2021-03-29 14:46:05 +02:00
else:
opponent = cellmates[0]
print("Fighting")
self.fightOrFlight(opponent)
2021-04-12 23:42:09 +02:00
print("HP: " + str(self.health) + " / " + str(self.maxHealth))
print("Gold: " + str(self.gold))
2021-03-29 14:46:05 +02:00
else:
2021-04-12 23:42:09 +02:00
print("HP: 0 / " + str(self.maxHealth))