def sprite(self, player): isvisible = False tileoffset = [-1 if axis == 1 else 0 for axis in self.direction] for tile in [(0,0), (0,1), (1,0), (1,1)]: tile = coords.modsum(tile, tileoffset, self.cellmap.size) if coords.sum(self.position, tile) in player.visibletiles: isvisible = True break if isvisible: return self._pokedsprite(images.DragonRed[self.direction], layer=20, offset=coords.mul(tileoffset, images.TILESIZE)) else: return None
def move(self, cellmap): def randommove(): """Move in random direction""" move = [0, random.randint(-1,1)] random.shuffle(move) return move poschange = randommove() self.direction = poschange[0] if abs(poschange[0]) else self.direction newpos = coords.modsum(self.position, poschange, self.cellmap.size) if cellmap[newpos]['sogginess'] < 50 or cellmap[newpos]['solid']: return False self.position = newpos return True
def update(self, world): def chaseplayer(playerpos): """Decide whether to chase the player""" playerdist = coords.mindist(self.position, playerpos, self.cellmap.size) if (sum(ax**2 for ax in playerdist) > self.detectionrange**2): # Can't see/smell/hear (?) player return False if random.random() > self.speed: # Bored? return False return True def randommove(): """Move in random direction""" move = [0, random.randint(-1,1)] random.shuffle(move) return move washunting = self.hunting self.hunting = None for player in world.players: if chaseplayer(player.position): self.hunting = player if self.hunting: # Move in direction of player, or randomly if no path found. poschange = self.directiontoplayer(self.hunting.position) or randommove() if washunting: self._suggestmessage("You are being chased by a bear", 1) else: self._suggestmessage("A bear starts chasing you", 2) else: # Move randomly. poschange = randommove() if washunting: self._suggestmessage("The bear has lost interest in you", 1) self.direction = poschange[0] if abs(poschange[0]) else self.direction newpos = coords.modsum(self.position, poschange, self.cellmap.size) if not self.cellmap[newpos]['solid']: self.position = newpos for player in world.players: if self.position == player.position: player.scattercoins(4, random.randint(4,8)) self._suggestmessage("The bear rips a hole in your bag!", 6)
def move(self, x, y): """Move if possible, update collectable levels accordingly""" if abs(x) + abs(y) != 1: return False self.direction = (x, y) if ((self.cellmap[coords.sum(self.position, (x, y))]['solid'] or self.cellmap[coords.sum(self.position, (x, y))]['sogginess'] == 100) and not GEPlayer.FREEPLAYER): return False self.position = coords.modsum(self.position, self.direction, self.cellmap.size) collectable = self.cellmap[self.position]['collectableitem'] if collectable != 0: self.score[collectable] += collectables.value[collectable] self._suggestmessage("You pick up " + collectables.name[collectable], 4) self.cellmap[self.position]['collectableitem'] = 0 if not GEPlayer.FREEPLAYER: self.score[collectables.CHOCOLATE] -= self.terraincost() if self.layingfuse and self.cellmap[self.position]['sogginess'] < GEPlayer.MAXFUSESOG: self.cellmap.placefuse(self.position) return True
def update(self, world): """Fly toward the player if nearby, or continue in same direction""" def flameplayer(): fronttiles = [coords.sum(self.position, coords.mul(self.direction, i)) for i in range(1,4)] for tile in fronttiles: if tile in [player.position for player in world.players]: self._suggestmessage("The dragon breaths a jet of fire towards you", 5) for tile in fronttiles: self.cellmap.ignite(tile, forceignite=True) break washunting = self.hunting self.hunting = None for player in world.players: playerpos = player.position if not self.cellmap[playerpos]['covered'] and random.random() < Dragon.speed: offset = coords.tileoffset(self.position, playerpos, self.cellmap.size) if offset[0]**2 + offset[1]**2 <= Dragon.detectionrange**2: self.hunting = player if self.hunting: newdirection = list(self.direction) if abs(offset[0]) > abs(offset[1]): newdirection[0] = cmp(offset[0], 0) elif abs(offset[1]) > abs(offset[0]): newdirection[1] = cmp(offset[1], 0) elif cmp(offset[0], 0) != cmp(newdirection[0], 0): newdirection[0] = -self.direction[0] elif cmp(offset[1], 0) != cmp(newdirection[1], 0): newdirection[1] = -self.direction[1] self.direction = tuple(newdirection) if washunting: self._suggestmessage("You are being hunted down by a dragon", 2) else: self._suggestmessage("A dragon begins to chase you", 3) else: if washunting: self._suggestmessage("The dragon starts to fly away", 1) self.position = coords.modsum(self.position, self.direction, self.cellmap.size) flameplayer()
def mapcoord(pfcoord): """Get map coordinate from pathfinder one""" return coords.modsum(startpos, pfcoord, (-pfmapsize,)*2, cellmap.size)