Asciifarm/asciifarm/server/player.py

144 lines
4.2 KiB
Python

from .components.inventory import Inventory
from .components.inputcontroller import InputController
from .components.move import Move
from .components.fighter import Fighter
from .components.healing import Healing
from .components.alignment import Alignment
from .components.target import Target
from . import faction
from . import entity
class Player:
def __init__(self, name, world):
self.name = name
self.world = world
self.roomname = None
self.entity = None
self.data = {}
# todo: ensure that items have correct roomData when inventory changes room
self.inventory = Inventory(10)
self.health = None
self.maxHealth = 100
self.resetView = True
def leaveRoom(self):
if self.entity:
self.health = self.getHealth()[0]
self.entity.remove()
self.entity = None
def joinRoom(self, roomname, place=None):
room = self.world.getRoom(roomname)
if not room:
raise Exception("Invalid Room")
if self.entity:
self.leaveRoom()
pos = place or room.getEntrance()
self.entity = entity.Entity(
sprite = "player",
solid = False,
height = 2,
name = '~' + self.name,
components={
"inventory": self.inventory,
"move": Move(slowness=2),
"controller": InputController(),
"fighter": Fighter(self.maxHealth, 5, slowness=2, health=self.health or self.maxHealth),
"alignment": Alignment(faction.GOOD),
"heal": Healing(interval=30),
"target": Target()
})
self.entity.construct(room.getRoomData())
self.entity.addListener(self.onPlayerAction)
room.addObj(pos, self.entity)
self.roomname = roomname
self.place = pos
self.resetView = True
def getRoom(self):
return self.roomname
def onPlayerAction(self, o, action, *data):
if action == "changeroom":
room, pos = data
self.joinRoom(room, pos)
if action == "attack":
obj, damage = data
print("{} attacks {} for {} damage".format(self.name, obj.getName(), damage))
if action == "kill":
obj = data[0]
print("{} kills {}".format(self.name, obj.getName()))
if action == "damage":
obj, damage = data
print("{} got {} damage from {}".format(self.name, damage, obj.getName()))
if action == "heal":
obj, health = data
if obj:
print("{} got {} health from {}".format(self.name, health, obj.getName()))
if action == "die":
obj = data[0]
print("{} got killed by {}".format(self.name, obj.getName()))
self.entity = None
self.roomname = None
self.place = None
def control(self, action):
if not self.entity or not (isinstance(action, list) or isinstance(action, tuple)) or len(action) < 1:
return
controller = self.entity.getComponent("controller")
controller.addAction(action)
def getHealth(self):
if self.entity:
return self.entity.getComponent("fighter").getHealth()
else:
return None
def getInventory(self):
if self.entity:
return self.inventory.getItems()
else:
return []
def getInteractions(self):
if not self.entity:
return []
controller = self.entity.getComponent("controller")
return controller.getInteractions()
def getGroundObjs(self):
if not self.entity:
return []
objs = set(self.entity.getGround().getObjs())
objs.discard(self.entity)
return objs
def getPos(self):
if not self.entity:
return None
return self.entity.getGround().getPos()
def shouldResetView(self):
return self.resetView
def viewResetDone(self):
self.resetView = False