import json import pygame from classes.Sprites import Sprites from classes.Tile import Tile from entities.Coin import Coin from entities.CoinBrick import CoinBrick from entities.Goomba import Goomba from entities.Mushroom import RedMushroom from entities.Koopa import Koopa from entities.CoinBox import CoinBox from entities.RandomBox import RandomBox class Level: def __init__(self, screen, sound, dashboard): self.sprites = Sprites() self.dashboard = dashboard self.sound = sound self.screen = screen self.level = None self.levelLength = 0 self.entityList = [] self.mario_state = None def loadLevel(self, levelname): with open("game/supermario/levels/{}.json".format(levelname)) as jsonData: data = json.load(jsonData) self.loadLayers(data) self.loadObjects(data) self.loadEntities(data) self.loadMario(data) self.levelLength = data["length"] def loadMario(self, data): # if get_with_warning(data["level"], "Mario", None) is None: if "Mario" not in data["level"]: return self.mario_state = { # "position" : get_with_warning(data["level"]["Mario"], "position", (0, 0)), "position" : data["level"]["Mario"]["position"] if "position" in data["level"]["Mario"] else (0, 0), # TODO more mario states } def loadEntities(self, data): try: [self.addCoinBox(x, y) for x, y in data["level"]["entities"]["CoinBox"]] [self.addGoomba(x, y) for x, y in data["level"]["entities"]["Goomba"]] [self.addKoopa(x, y) for x, y in data["level"]["entities"]["Koopa"]] [self.addCoin(x, y) for x, y in data["level"]["entities"]["coin"]] [self.addCoinBrick(x, y) for x, y in data["level"]["entities"]["coinBrick"]] [self.addRandomBox(x, y, item) for x, y, item in data["level"]["entities"]["RandomBox"]] except: # if no entities in Level pass def loadLayers(self, data): layers = [] for x in range(*data["level"]["layers"]["sky"]["x"]): layers.append( ( [ Tile(self.sprites.spriteCollection.get("sky"), None) for y in range(*data["level"]["layers"]["sky"]["y"]) ] + [ Tile( self.sprites.spriteCollection.get("ground"), pygame.Rect(x * 32, (y - 1) * 32, 32, 32), ) for y in range(*data["level"]["layers"]["ground"]["y"]) ] ) ) self.level = list(map(list, zip(*layers))) def loadObjects(self, data): for x, y in data["level"]["objects"]["bush"]: self.addBushSprite(x, y) for x, y in data["level"]["objects"]["cloud"]: self.addCloudSprite(x, y) for x, y, z in data["level"]["objects"]["pipe"]: self.addPipeSprite(x, y, z) for x, y in data["level"]["objects"]["sky"]: self.level[y][x] = Tile(self.sprites.spriteCollection.get("sky"), None) for x, y in data["level"]["objects"]["ground"]: self.level[y][x] = Tile( self.sprites.spriteCollection.get("ground"), pygame.Rect(x * 32, y * 32, 32, 32), ) def updateEntities(self, cam): for entity in self.entityList: entity.update(cam) if entity.alive is None: self.entityList.remove(entity) def drawLevel(self, camera): try: for y in range(0, 15): for x in range(0 - int(camera.pos.x + 1), 20 - int(camera.pos.x - 1)): if self.level[y][x].sprite is not None: if self.level[y][x].sprite.redrawBackground: self.screen.blit( self.sprites.spriteCollection.get("sky").image, ((x + camera.pos.x) * 32, y * 32), ) self.level[y][x].sprite.drawSprite( x + camera.pos.x, y, self.screen ) self.updateEntities(camera) except IndexError: return def addCloudSprite(self, x, y): try: for yOff in range(0, 2): for xOff in range(0, 3): self.level[y + yOff][x + xOff] = Tile( self.sprites.spriteCollection.get("cloud{}_{}".format(yOff + 1, xOff + 1)), None, ) except IndexError: return def addPipeSprite(self, x, y, length=2): try: # add pipe head self.level[y][x] = Tile( self.sprites.spriteCollection.get("pipeL"), pygame.Rect(x * 32, y * 32, 32, 32), ) self.level[y][x + 1] = Tile( self.sprites.spriteCollection.get("pipeR"), pygame.Rect((x + 1) * 32, y * 32, 32, 32), ) # add pipe body for i in range(1, length + 20): self.level[y + i][x] = Tile( self.sprites.spriteCollection.get("pipe2L"), pygame.Rect(x * 32, (y + i) * 32, 32, 32), ) self.level[y + i][x + 1] = Tile( self.sprites.spriteCollection.get("pipe2R"), pygame.Rect((x + 1) * 32, (y + i) * 32, 32, 32), ) except IndexError: return def addBushSprite(self, x, y): try: self.level[y][x] = Tile(self.sprites.spriteCollection.get("bush_1"), None) self.level[y][x + 1] = Tile( self.sprites.spriteCollection.get("bush_2"), None ) self.level[y][x + 2] = Tile( self.sprites.spriteCollection.get("bush_3"), None ) except IndexError: return def addCoinBox(self, x, y): self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32)) self.entityList.append( CoinBox( self.screen, self.sprites.spriteCollection, x, y, self.sound, self.dashboard, ) ) def addRandomBox(self, x, y, item): self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32)) self.entityList.append( RandomBox( self.screen, self.sprites.spriteCollection, x, y, item, self.sound, self.dashboard, self ) ) def addCoin(self, x, y): self.entityList.append(Coin(self.screen, self.sprites.spriteCollection, x, y)) def addCoinBrick(self, x, y): self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32)) self.entityList.append( CoinBrick( self.screen, self.sprites.spriteCollection, x, y, self.sound, self.dashboard ) ) def addGoomba(self, x, y): print("Adding Goomba at x:{} y:{}".format(x, y)) self.entityList.append( Goomba(self.screen, self.sprites.spriteCollection, x, y, self, self.sound) ) def addKoopa(self, x, y): self.entityList.append( Koopa(self.screen, self.sprites.spriteCollection, x, y, self, self.sound) ) def addRedMushroom(self, x, y): self.entityList.append( RedMushroom(self.screen, self.sprites.spriteCollection, x, y, self, self.sound) )