from gamedata.objects.base import BaseObject import random,math class Lemming(BaseObject): def __init__(self,x,y,game,speedmargin=5,skin="base"): super().__init__(x,y,game,w=70,h=70) self.direction = random.randint(0,360) self.holdrect = self.rect.copy() self.holdradius = 80 self.holdrect = self.holdrect.inflate(self.holdradius,self.holdradius) self.basespeed = max(20,40+random.randint(-speedmargin,speedmargin)) # Speed that he normally walks by self.holdtimer = game.lib.Timer(2.5) # Max seconds of holding self.normalspeed = self.basespeed # Speed "objective" self.speed = 0 # Current speed, leaning towards objective speed self.cooldown = False self.cooldowntimer = game.lib.Timer(0.5) self.sfx = game.getSpriteDir("sfx/pinmik/",ext=".wav",assetdir="sound_lib") self.sfxtimer = game.lib.Timer(15+random.random()*10) self.deathsfx = random.choice(game.getSpriteDir("sfx/death/",ext=".wav",assetdir="sound_lib")) self.handlepause = True self.scoreratio = 0.3 if skin=="gold": self.basespeed*=1.2 self.scoreratio*=3 if skin=="platinum": self.basespeed*=1.4 self.scoreratio*=5 if skin=="monster": self.scoreratio*=6 self.skin = skin self.maxhealth = 2 # Pinmiks can be attacked by the monsters self.health = self.maxhealth self.regen = 1 self.selected = False # If beeing redirected self.anglemargin = 25 # Used for movement self.restx = 0 self.resty = 0 self.dusttimer = game.lib.Timer(0.7) # Sprites self.orientations = ["Right","Left","Left","Right"] self.sprites = {} for i in self.orientations: self.sprites[i] = game.getSpriteDir("lemmings/"+skin+"/"+i+"/") self.spriteindex = 0 self.animspeed = 0.2 self.tiles = game.gameloop.findname("Tiles")[0] self.manager = game.gameloop.findname("Manager")[0] def step(self): # Depth updating based on position self.depth = 1+self.rect[1]/100 # Cooldown to be relaunched if self.cooldown: if self.cooldowntimer.tick(self.game.dt): self.cooldown = False # Lean towards the normal speed if self.selected: self.normalspeed = 0 else: self.normalspeed = self.basespeed self.speed += (self.normalspeed-self.speed)*self.game.dt*3 # Getting x and y velocity diffx = math.cos(math.radians(self.direction))*self.speed diffy = math.sin(math.radians(self.direction))*self.speed self.move(diffx*self.game.dt,diffy*self.game.dt) self.health = min(self.maxhealth,self.health+self.regen*self.game.dt) # Regen live # Attacking other pinmiks if self.skin=="monster": for pinmik in self.game.gameloop.findname("Lemming"): if pinmik.skin!="monster": if self.rect.collidepoint(pinmik.rect.center): pinmik.health-=self.game.dt*3.5 if self.holdrect.collidepoint(pinmik.rect.center): pinmik.health-=self.game.dt*2 # Lean towards middle angle_to_mid = math.degrees(math.atan2(self.game.DISPLAY_HEIGHT/2-self.rect.center[1],self.game.DISPLAY_WIDTH/2-self.rect.center[0])) if abs(angle_to_mid-self.direction-360) self.basespeed*1.5: if self.dusttimer.tick(self.game.dt*(self.speed/self.basespeed)**2): sprites = self.game.getSpriteDir("particles/dust/") self.game.addParticle(sprites,self.rect.center[0],self.rect.center[1]) # Mouse selection mouse=self.game.inputs["mouse"] if self.selected: # Releasing it if mouse["click"]==0 or not self.holdrect.collidepoint(mouse["campos"]): self.launch() self.cooldown = True else: if self.holdtimer.tick(self.game.dt): self.selected = False self.holdtimer.reset() self.normalspeed = self.basespeed if self.game.inputs["mouse"]["click"]==1 and not self.cooldown: if self.rect.collidepoint(mouse["campos"]): self.selected = True # Animation self.spriteindex+=self.game.dt*self.animspeed*self.speed # Check if still on ground gridx = int((self.rect.center[0]-self.tiles.rect[0])/self.tiles.cellsize) gridy = int((self.rect.center[1]-self.tiles.rect[1])/self.tiles.cellsize) dead = True if 0<=gridy5: # Avoiding shaking to much self.game.globals["scamerax"]+=1 self.game.globals["scamerax"]+=1 else: self.game.globals["scamerax"]=5 self.game.globals["scameray"]=5 self.game.gameloop.delid(self.id) # Spawn particles sprites = self.game.getSpriteDir("particles/dust/") for velx in range(-1,2): for vely in range(-1,2): self.game.addParticle(sprites,self.rect.center[0],self.rect.center[1],velx=velx/2,vely=vely/2) # Spawn little ghost sprites = self.game.getSpriteDir("particles/ghost/") self.game.addParticle(sprites,self.rect.center[0],self.rect.center[1],fps=2,vely=-1) self.deathsfx.play() self.game.sound_lib["sfx/death.wav"].play() # SFX if self.sfxtimer.tick(self.game.dt): random.choice(self.sfx).play() self.sfxtimer = self.game.lib.Timer(15+random.random()*10) def launch(self): # Launch itself in the mouse direction xdiff = self.game.inputs["mouse"]["pos"][0]-self.rect.center[0] ydiff = self.game.inputs["mouse"]["pos"][1]-self.rect.center[1] self.direction = math.degrees(math.atan2(ydiff,xdiff))+random.randint(-self.anglemargin,self.anglemargin) self.speed = self.basespeed*4 self.cachedrel = [] self.selected = False self.holdtimer.reset() self.manager.dash() def move(self,x,y): # Remember the digits, pygame rects only move with integers velx = x+self.restx vely = y+self.resty self.restx = velx-int(velx) self.resty = vely-int(vely) self.rect[0]+=int(velx) self.rect[1]+=int(vely) self.holdrect[0]+=int(velx) self.holdrect[1]+=int(vely) def draw(self): if self.skin=="monster": # Red aura self.game.lib.drawcenter(self.game,self.game.sprite_lib["lemmings/monster/aura.png"],self.rect.center[0],self.rect.center[1]) # Shaking based on life offx,offy = 0,0 if self.health