PinmikPanik/gamedata/objects/ingame/manager.py

137 lines
5.5 KiB
Python

from gamedata.objects.base import BaseObject
from gamedata.objects.ingame.spawner import Spawner
from gamedata.objects.ingame.tiles import Tiles
from gamedata.objects.ingame.clouds import Clouds
from gamedata.objects.ingame.skies import Skies
from gamedata.objects.ingame.demo import Demo
class Manager(BaseObject):
def __init__(self,game):
super().__init__(0,0,game)
self.score = 0
self.lives = 5
self.basetime = 10
self.steptime = 2
self.speedmargin = 7
self.speedstep = 2.2
self.spawntimer = game.lib.Timer(self.basetime) # Time elapsing each lemming spawn
self.deathtimer = game.lib.Timer(1) # Time between each life loss
self.started = False
self.invincible = False
self.endtimer = game.lib.Timer(1) # Black fade if game's over
self.endrect = game.pygame.Surface((game.DISPLAY_WIDTH,game.DISPLAY_HEIGHT))
self.endrect.fill([0]*3)
# Sky gradients
self.game.gameloop.summon(Skies(game))
# Dash sfx for the pinmiks
self.sfx = game.sound_lib["sfx/dash.wav"]
self.can_sfx = True
self.sfxtimer = game.lib.Timer(0.4)
# Clouds in the background
self.clouds = Clouds(game,game.DISPLAY_WIDTH,speed=30,cameraratio=0.8)
self.cloudsdark = Clouds(game,game.DISPLAY_WIDTH,speed=10,cameraratio=0.4,spritename="cloudsdark.png")
self.game.gameloop.summon(self.cloudsdark)
self.game.gameloop.summon(self.clouds)
# Summon the tiles
self.tiles = Tiles(288,0,game)
game.gameloop.summon(self.tiles)
# Demo
self.demo = None
self.demotimer = game.lib.Timer(4)
# Unlocks
self.skins = game.lib.getunlocks(self.game.globals["highscore"])
# Spawn the first batch
self.game.gameloop.summon(Spawner(self.game,self.tiles,skins=self.skins))
self.game.gameloop.summon(Spawner(self.game,self.tiles,skins=self.skins))
self.game.gameloop.summon(Spawner(self.game,self.tiles,skins=self.skins))
def dash(self):
# Called by pinmiks when dashing
if self.can_sfx:
self.sfx.play()
self.can_sfx = False
def step(self):
if not self.can_sfx:
if self.sfxtimer.tick(self.game.dt):
self.can_sfx = True
lemmings = self.game.gameloop.findname("Lemming")
nblemmings = len(lemmings) + len(self.game.gameloop.findname("Spawner"))
# Updating score and checking if there's only monsters
nbmonsters = 0
if not self.game.globals["pause"]:
for lemming in lemmings:
if lemming.skin == "monster":
nbmonsters+=1
if not lemming.selected:
self.score+=lemming.scoreratio*self.game.dt
# Pausing the game
if self.game.inputs["keys"]["escape"]["timer"]==1:
self.game.globals["pause"] = not self.game.globals["pause"]
# Spawning more lemmings
if (self.lives>0 and nblemmings>0 and (nbmonsters!=nblemmings)):
if not self.game.globals["pause"]:
if self.spawntimer.tick(self.game.dt):
self.game.gameloop.summon(Spawner(self.game,self.tiles,speedmargin=int(self.speedmargin+0.5),skins=self.skins))
self.speedmargin+=self.speedstep
self.spawntimer = self.game.lib.Timer(self.basetime+nblemmings*self.steptime)
else:
# Game over
if self.endtimer.tick(self.game.dt):
self.game.globals["score"] = int(self.score)
self.game.scene = self.game.scenes.gameover
self.game.globals["pause"] = False
if self.invincible:
if self.deathtimer.tick(self.game.dt):
self.invincible = False
if not self.demo:
if self.demotimer.tick(self.game.dt):
self.demo = self.game.gameloop.summon(Demo(self.game))
def death(self):
if not self.invincible:
self.lives-=1
self.invincible = True
else:
self.deathtimer.tick(self.deathtimer.getmax()/3)
def draw(self):
pass
def afterdraw(self):
# Draw vignette
self.game.realwindow.blit(self.game.sprite_lib["vignette.png"],[0,0])
# Draw score and lives with outline
txtsurfacescore = self.game.fontfile.render("Score : "+str(int(self.score)),False,[150,255,150])
txtsurfacescoreblack = self.game.fontfile.render("Score : "+str(int(self.score)),False,[0]*3)
txtsurfacelives = self.game.fontfile.render("Lives : "+str(int(self.lives)),False,[255,150,150])
txtsurfacelivesblack = self.game.fontfile.render("Lives : "+str(int(self.lives)),False,[0]*3)
border = 2
for x in range(-border,border+1):
for y in range(-border,border+1):
self.game.realwindow.blit(txtsurfacescoreblack,[20+x,20+y])
self.game.realwindow.blit(txtsurfacescore,[20,20])
for x in range(-border,border+1):
for y in range(-border,border+1):
self.game.realwindow.blit(txtsurfacelivesblack,[20+x,20*2+y+txtsurfacescore.get_height()])
self.game.realwindow.blit(txtsurfacelives,[20,20*2+txtsurfacescore.get_height()])
self.endrect.set_alpha((1-self.endtimer.getratio())*255)
if self.game.globals["pause"]:
self.endrect.set_alpha(100)
if self.endtimer.getloops()>=1:
self.endrect.set_alpha(255)
self.game.realwindow.blit(self.endrect,[0,0])