PinmikPanik/gamedata/objects/ingame/manager.py

114 lines
4.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))
# 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 step(self):
lemmings = self.game.gameloop.findname("Lemming")
nblemmings = len(lemmings) + len(self.game.gameloop.findname("Spawner"))
# Updating score
for lemming in lemmings:
self.score+=lemming.scoreratio*self.game.dt
# Spawning more lemmings
if (self.lives>0 and nblemmings>0):
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
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.endtimer.getloops()>=1:
self.endrect.set_alpha(255)
self.game.realwindow.blit(self.endrect,[0,0])