jsuarez/PC.py (93 lines of code) (raw):

from pdb import set_trace as T import numpy as np from sim.lib import MultiSet from sim.modules import Inventory from sim.entity.Entity import Entity from sim.item import Food class PC(Entity): def __init__(self, cpu, pos): super().__init__(pos) self.cpu = cpu self.inv = MultiSet.MultiSet(capacity=1024) self.hitRange = 4 self.timeAlive = 0 self.maxHealth = 10 self.maxFood = 16 self.maxWater = 16 self.health = self.maxHealth self.food = self.maxFood self.water = self.maxWater self.decProb = 0.2 self.index = 1 self.lastAction = None self.equipment = Inventory.Inventory() self.inbox = [] def act(self, world, actions): if (self.food > self.maxFood//2 and self.water > self.maxWater//2 and self.health < self.maxHealth): self.health += 1 self.decrementFood() self.decrementWater() stim = world.stim(self.pos) action, args = self.decide(stim, actions) action(world, self, *(args)) self.lastAction = action return self.post() #PCs interact with the world only through stimuli #to prevent cheating def decide(self, stimuli, actions): action, args = self.cpu.interact(self, stimuli, actions) return action, args def post(self): self.inbox = [] self.timeAlive += 1 #if self.timeAlive % 10 == 0: # return self.cpu.reproduce() def receiveDrops(self, drops): for e in drops: item, num = e self.inv.add(item, num) def receiveMessage(self, sender, data): self.inbox += [(sender, data)] def eat(self, food): self.health = min(self.health+food.heal, self.maxHealth) self.inv.remove(food, 1) def equipArmor(self, item): if not self.equipment.armor.isBase: self.inv.add(self.equipment.armor) self.equipment.armor = item def equipMelee(self, item): if not self.equipment.melee.isBase: self.inv.add(self.equipment.melee) self.equipment.melee = item def equipRanged(self, item): if not self.equipment.ranged.isBase: self.inv.add(self.equipment.ranged) self.equipment.ranged = item def unequipArmor(self): if self.equipment.armor.isBase: return self.inv.add(self.equipment.armor) self.equipment.resetArmor() def unequipMelee(self): if self.equipment.melee.isBase: return self.inv.add(self.equipment.melee) self.equipment.resetMelee() def unequipRanged(self): if self.equipment.ranged.isBase: return self.inv.add(self.equipment.ranged) self.equipment.resetRanged() def decrementFood(self): if np.random.rand() < self.decProb: if self.food > 0: self.food -= 1 else: self.health -= 1 def decrementWater(self): if np.random.rand() < self.decProb: if self.water > 0: self.water -= 1 else: self.health -= 1 @property def isPC(self): return True