""" NPC exists in a room broadcasts the the same join, leave, move, talk, intro events is rendered like and avatar by the client is controlled by the server """ from flask_socketio import emit, send class NPC (): def __init__(self, io, o, gameState): print(f"Create NPC {o['id']} in room {o['room']} nickNamed {o['nickName']}") self.io = io self.gameState = gameState self.id = o['id'] self.nickName = o['nickName'] self.room = o['room'] self.avatar = o['avatar'] self.colors = o['colors'] self.x = o['x'] * 2; self.y = o['y'] * 2; self.destinationX = o['x'] self.destinationY = o['y'] if o['labelColor']: self.labelColor = o['labelColor'] else: self.labelColor = "#FFFFFF" # oops server doesn't know about colors # add to NPC list self.gameState['NPCs'][self.id] = self def sendIntroTo (self, pId): """ mimicks the emission from players """ print(f"HELLO I'm {self.nickName} in {self.room}, pId: {pId}") # If I'm not the new player send an introduction to the new player # slight issue, server doesn't compute movements so if moving it appears at the destination # a way to solve this would be to save the time of the movement and lerp it self.io.emit("onIntro", { 'id': self.id, 'nickName': self.nickName, 'colors': self.colors, 'avatar': self.avatar, 'room': self.room, 'x': self.destinationX, 'y': self.destinationY, 'destinationX': self.destinationX, 'destinationY': self.destinationY }, room=pId) def move (self, dx, dy): print(f"HELLO I'm {self.nickName} and I move to {dx} {dy} in room: {self.room}") # broadcast the movement to everybody in the room # it doesn't check if the position is valid self.io.emit("playerMoved", { 'id': self.id, 'x': self.x, 'y': self.y, 'destinationX': dx, 'destinationY': dy }, room=self.room) # update for future intros self.destinationX = self.x = dx self.destinationY = self.y = dy def talk (self, message): self.io.emit("playerTalked", { 'id': self.id, 'color': self.labelColor, 'message': message, 'x': self.x, 'y': self.y }, room=self.room) def delete (self): self.io.emit("playerLeft", { 'id': self.id, 'room': self.room, 'disconnect': true }, room=self.room) del self.gameState['NPCs'][self.id]