diff --git a/game/render/art.py b/game/render/art.py new file mode 100644 index 0000000..892d1a0 --- /dev/null +++ b/game/render/art.py @@ -0,0 +1,264 @@ +import pygame + +from ..constants import tileSize +from .theme import tileFallback + +playerPalette = { + "r": (216, 40, 0), + "s": (252, 188, 140), + "h": (100, 52, 16), + "o": (32, 56, 236), + "k": (0, 0, 0), + "y": (247, 213, 29), +} + +playerPattern = [ + "................", + "....rrrrrr......", + "...rrrrrrrrr....", + "...hhhssskss....", + "..hshsssksss....", + "..hhhssssksss...", + "..hhsssssssss...", + "....sssssss.....", + "...rrrrrrrr.....", + "..rrrrrrrrrr....", + ".ssrroooorrss...", + ".ssrooooooorss..", + "...ooyooyoo.....", + "...oooooooo.....", + "...ooo..ooo.....", + "..hhh....hhh....", +] + +goombaPalette = { + "d": (60, 30, 10), + "m": (150, 75, 30), + "w": (255, 255, 255), + "k": (0, 0, 0), + "f": (20, 12, 8), +} + +goombaPattern = [ + "................", + ".....dddddd.....", + "...ddmmmmmmdd...", + "..dmmmmmmmmmmd..", + ".dmmmmmmmmmmmmd.", + ".dmmwwmmmmwwmmd.", + ".dmmwkmmmmwkmmd.", + ".dmmwwmmmmwwmmd.", + ".dmmmmmmmmmmmmd.", + ".dmmmmmmmmmmmmd.", + "..dmmmmmmmmmmd..", + "...dmmmmmmmmd...", + "....dddddddd....", + "...ff....ff.....", + "..ffff..ffff....", + "................", +] + +chaserPalette = { + "d": (40, 8, 60), + "m": (150, 40, 170), + "w": (255, 240, 120), + "k": (0, 0, 0), +} + +chaserPattern = [ + "................", + "....k......k....", + "...kmk....kmk...", + "...dmmkkkkmmd...", + "..dmmmmmmmmmmd..", + ".dmmwwmmmmwwmmd.", + ".dmmwkmmmmwkmmd.", + ".dmmmmmmmmmmmmd.", + ".dmmmkkkkkkmmmd.", + ".dmmmkwwwwkmmmd.", + "..dmmmmmmmmmmd..", + "...dmmmmmmmmd...", + "....dmmmmmmd....", + "...dd.dd.dd.d...", + "..dd..dd..dd....", + "................", +] + + +def patternSurface(pattern, palette): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + for y, line in enumerate(pattern): + for x, code in enumerate(line): + if code == ".": + continue + surf.set_at((x, y), palette[code]) + return surf + + +def flyerSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.ellipse(surf, (60, 160, 210), (4, 4, 8, 8)) + pygame.draw.ellipse(surf, (140, 220, 255), (5, 5, 6, 5)) + pygame.draw.polygon(surf, (200, 240, 255), [(0, 4), (4, 6), (4, 10)]) + pygame.draw.polygon(surf, (200, 240, 255), [(15, 4), (11, 6), (11, 10)]) + surf.set_at((6, 7), (0, 0, 0)) + surf.set_at((9, 7), (0, 0, 0)) + return surf + + +def shooterSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.rect(surf, (70, 90, 90), (3, 4, 10, 10)) + pygame.draw.rect(surf, (110, 140, 140), (4, 5, 8, 4)) + pygame.draw.rect(surf, (200, 60, 40), (6, 9, 4, 3)) + pygame.draw.rect(surf, (40, 50, 50), (2, 13, 12, 2)) + return surf + + +def coinSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.ellipse(surf, (200, 160, 20), (3, 1, 10, 14)) + pygame.draw.ellipse(surf, (247, 213, 29), (4, 2, 8, 12)) + pygame.draw.rect(surf, (255, 245, 170), (6, 4, 1, 8)) + return surf + + +def gemSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.polygon(surf, (60, 220, 200), [(8, 1), (14, 6), (8, 15), (2, 6)]) + pygame.draw.polygon(surf, (160, 255, 240), [(8, 1), (11, 6), (8, 8), (5, 6)]) + return surf + + +def keySurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.circle(surf, (240, 210, 60), (6, 6), 4) + pygame.draw.circle(surf, (60, 40, 10), (6, 6), 2) + pygame.draw.rect(surf, (240, 210, 60), (6, 8, 2, 6)) + pygame.draw.rect(surf, (240, 210, 60), (8, 12, 3, 2)) + return surf + + +def heartSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.circle(surf, (224, 48, 64), (5, 6), 3) + pygame.draw.circle(surf, (224, 48, 64), (10, 6), 3) + pygame.draw.polygon(surf, (224, 48, 64), [(2, 7), (14, 7), (8, 14)]) + pygame.draw.circle(surf, (255, 150, 160), (5, 5), 1) + return surf + + +def solidTile(color, topColor): + surf = pygame.Surface((tileSize, tileSize)) + surf.fill(color) + pygame.draw.rect(surf, topColor, (0, 0, tileSize, 3)) + pygame.draw.line(surf, (0, 0, 0), (tileSize - 1, 0), (tileSize - 1, tileSize - 1)) + return surf + + +def brickSurface(): + surf = pygame.Surface((tileSize, tileSize)) + surf.fill((181, 94, 41)) + mortar = (74, 38, 18) + pygame.draw.line(surf, mortar, (0, 0), (tileSize - 1, 0)) + pygame.draw.line(surf, mortar, (0, 8), (tileSize - 1, 8)) + pygame.draw.line(surf, mortar, (8, 1), (8, 7)) + pygame.draw.line(surf, mortar, (0, 9), (0, tileSize - 1)) + pygame.draw.line(surf, mortar, (15, 9), (15, tileSize - 1)) + return surf + + +def platformSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + pygame.draw.rect(surf, (217, 164, 65), (0, 0, tileSize, 6)) + pygame.draw.rect(surf, (247, 213, 29), (1, 0, tileSize - 2, 2)) + pygame.draw.line(surf, (150, 100, 30), (0, 6), (tileSize - 1, 6)) + return surf + + +def spikeSurface(): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + for base in (0, 5, 10): + pygame.draw.polygon(surf, (210, 214, 224), [(base, 15), (base + 3, 4), (base + 6, 15)]) + pygame.draw.polygon(surf, (150, 156, 170), [(base + 3, 15), (base + 4, 8), (base + 5, 15)]) + return surf + + +def lavaSurface(): + surf = pygame.Surface((tileSize, tileSize)) + surf.fill((200, 60, 20)) + pygame.draw.rect(surf, (255, 150, 40), (0, 0, tileSize, 4)) + for spot in ((3, 8), (9, 6), (12, 11)): + surf.set_at(spot, (255, 220, 120)) + return surf + + +def ladderSurface(top): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + rail = (150, 100, 50) + pygame.draw.rect(surf, rail, (3, 0, 2, tileSize)) + pygame.draw.rect(surf, rail, (11, 0, 2, tileSize)) + for y in (2, 7, 12): + pygame.draw.rect(surf, (190, 140, 80), (3, y, 10, 2)) + if top: + pygame.draw.rect(surf, (190, 140, 80), (1, 0, 14, 2)) + return surf + + +def slopeSurface(ascendRight): + surf = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) + if ascendRight: + points = [(0, tileSize), (tileSize, 0), (tileSize, tileSize)] + else: + points = [(0, 0), (tileSize, tileSize), (0, tileSize)] + pygame.draw.polygon(surf, (150, 74, 18), points) + pygame.draw.polygon(surf, (222, 140, 80), points, 1) + return surf + + +def pipeSurface(top, leftSide): + surf = pygame.Surface((tileSize, tileSize)) + surf.fill((0, 168, 0)) + if leftSide: + pygame.draw.rect(surf, (128, 232, 128), (2, 0, 3, tileSize)) + pygame.draw.line(surf, (0, 96, 0), (0, 0), (0, tileSize - 1)) + else: + pygame.draw.rect(surf, (72, 200, 72), (8, 0, 3, tileSize)) + pygame.draw.rect(surf, (0, 96, 0), (13, 0, 3, tileSize)) + if top: + pygame.draw.rect(surf, (0, 200, 0), (0, 0, tileSize, 6)) + pygame.draw.rect(surf, (0, 96, 0), (0, 0, tileSize, 6), 1) + return surf + + +def buildSprites(): + sprites = { + "player": patternSurface(playerPattern, playerPalette), + "goomba": patternSurface(goombaPattern, goombaPalette), + "chaser": patternSurface(chaserPattern, chaserPalette), + "flyer": flyerSurface(), + "shooter": shooterSurface(), + "coin": coinSurface(), + "gem": gemSurface(), + "key": keySurface(), + "heart": heartSurface(), + "ground": solidTile((198, 100, 29), (222, 140, 80)), + "dirt": solidTile((120, 72, 40), (150, 96, 56)), + "stone": solidTile((110, 110, 128), (150, 150, 168)), + "brick": brickSurface(), + "platform": platformSurface(), + "woodOneWay": platformSurface(), + "spike": spikeSurface(), + "lava": lavaSurface(), + "ladder": ladderSurface(False), + "ladderTop": ladderSurface(True), + "slopeRight": slopeSurface(True), + "slopeLeft": slopeSurface(False), + "pipeTL": pipeSurface(True, True), + "pipeTR": pipeSurface(True, False), + "pipeBL": pipeSurface(False, True), + "pipeBR": pipeSurface(False, False), + } + for name, color in tileFallback.items(): + sprites.setdefault(name, solidTile(color, color)) + return sprites