Skip to the content.

Team Metal Rams' Game: Soul Catcher

#Game Code

import sys
import pygame


FPS = 60
SCREEN_WIDTH = 512
SCREEN_HEIGHT = 512

BTN_PADDING = 10    # How much padding are we going to put around a button?
BTN_MARGIN = 10     # How much space do we want around button text?


#Colors
WHITE = [255, 255, 255]
ANTI_WHITE = [236, 239, 241]
LIGHT_GREY = [207, 216, 219]

#Mid-Shades
LIGHT_S_GREY = [120, 144, 156]

#Dark Colors
CHARCOAL = [55, 71, 79]

pygame.init()

pygame.mixer.music.load('dead_silence_theme.mp3')
pygame.mixer.music.play(-1) 

GHOST_png = pygame.image.load('GHOST.png')
GHOST_png = pygame.transform.scale(GHOST_png, (100,100))

GRIMM_png = pygame.image.load('GRIMM.png')
GRIMM_png = pygame.transform.scale(GRIMM_png, (100,100))

MSG_png = pygame.image.load('MSG (2).png')
GHOST_x = 10
GHOST_y = 10
SPEED = 5

BACKGROUND_png = pygame.image.load('BACKGROUND.png')


screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
clock = pygame.time.Clock()
settings_font = pygame.font.SysFont('impact', 64)   # Here's our button font
print("Loaded the font!")
screen_mode = 'INTRO'   # Modes: intro, menu


NEW_ICON_png = pygame.image.load('NEW_ICON.png')
NEW_ICON_png = pygame.transform.scale(NEW_ICON_png, (256, 256))
NEW_ICON_rect = NEW_ICON_png.get_rect()
NEW_ICON_rect.x = (SCREEN_WIDTH / 2) - (NEW_ICON_rect.width / 2)
NEW_ICON_rect.y = (SCREEN_HEIGHT / 2) - NEW_ICON_rect.height

SCROLLER_png = pygame.image.load('ICONS/SCROLLER.png')
SCROLLER_png = pygame.transform.scale(SCROLLER_png, (64, 64))

TOMATO_png = pygame.image.load('TOMATO.png')
TOMATO_png = pygame.transform.scale(TOMATO_png, (32, 32))

LETTUCE_png = pygame.image.load('LETTUCE.png')
LETTUCE_png = pygame.transform.scale(LETTUCE_png, (32, 32))


play_text = settings_font.render("Start" , True, LIGHT_S_GREY)
play_rect = play_text.get_rect()
play_rect.x = (SCREEN_WIDTH / 2) - (play_rect.width / 2)
play_rect.y = (SCREEN_HEIGHT / 2) - play_rect.height + 100

scrolls = [
    {"img":SCROLLER_png, "goto": "GAME", "collected": False, "x": 300, "y": 400,"screen_mode": "GAME","msg": " Welcome player, Here's a little welcome gift to get you started; 3 Hearts, 2 Fireballs, Starter Scroll. Be wise about your choices from here on out. Good Luck on your journey! - F"},
    {"img":SCROLLER_png,"goto": "CRYPT", "collected": False, "x": 230, "y": 200, "screen_mode": "GAME","msg": " Congratulations! you have found your first scroll, there will be many more through out the game. Hopefully you will find them all. Good luck player on your journey!"},  
    {"img":GRIMM_png, "goto":"INTRO", "collected": False,"x": 0, "y": 0, "screen_mode": "CRYPT","msg": "..."},
    {"img":SCROLLER_png, "goto": "CRYPT", "collected" : False, "x": 25, "y": 400,"screen_mode": "CRYPT", "msg": "Beware of Grimm...-F"},
    {"img":TOMATO_png, "goto": "INTRO", "collected": False, "x": 362, "y":362, "screen_mode": "CRYPT", "msg": "Ouch!"}
    ]

setting_btn_color = ANTI_WHITE
setting_btn_hover_color = LIGHT_GREY

#TITLE SCREEN
title_screen_bg_color = LIGHT_GREY


setting_btn_txt_surface = settings_font.render('Settings', True, LIGHT_S_GREY)

setting_btn_bg_rect = setting_btn_txt_surface.get_rect()
setting_btn_bg_rect.width += 2 * BTN_MARGIN  # Add some margins to the button
setting_btn_bg_rect.height += 2 * BTN_MARGIN # Add margin to the button

setting_btn_bg_rect.x = NEW_ICON_rect.midbottom[0] - (setting_btn_bg_rect.width / 2)
setting_btn_bg_rect.y = NEW_ICON_rect.midbottom[1] + BTN_PADDING + BTN_MARGIN


#SETTING COMP
setting_screen_bg_color = CHARCOAL

setting_screen_buttons = ['Mute', 'Quit', 'Back to Home'] # Available buttons
cur_setting_btn_id = 0                    
btn_color = LIGHT_GREY

#SETTING BTN
setting_btn_txt_surface = settings_font.render('Settings', True, LIGHT_S_GREY)

# Setup Setting menu button background
setting_btn_bg_rect = setting_btn_txt_surface.get_rect()
setting_btn_bg_rect.width = setting_btn_bg_rect.width + (2*BTN_MARGIN)
setting_btn_bg_rect.height = setting_btn_bg_rect.height + (2*BTN_MARGIN)
setting_btn_bg_rect.x = (SCREEN_WIDTH /2) - (setting_btn_bg_rect.width / 2)
setting_btn_bg_rect.y = 0 #title_rect.bottom

# Setup txt rect
setting_btn_txt_rect = setting_btn_txt_surface.get_rect()
setting_btn_txt_rect.x = setting_btn_bg_rect.x + BTN_MARGIN
setting_btn_txt_rect.y = setting_btn_bg_rect.y + BTN_MARGIN



while True:

    
    if screen_mode == 'INTRO':
        for scroll in scrolls:
            scroll["collected"] = False
            if scroll["img"] == GRIMM_png:
                scroll["x"] = 0
                scroll["y"] = 0
        GHOST_x = (SCREEN_WIDTH / 2) - 100
        GHOST_y = SCREEN_HEIGHT - 100
        # ==== TITLE SCREEN MODE ====
        screen.fill(title_screen_bg_color)
        screen.blit(NEW_ICON_png, NEW_ICON_rect)
        pygame.draw.rect(screen, ANTI_WHITE, play_rect) 
        screen.blit(play_text, play_rect)
          
    
    elif screen_mode == 'Settings':
        # === MENU SCREEN MODE ===
        screen.fill(setting_screen_bg_color)
        if setting_screen_buttons[cur_setting_btn_id] == 'Mute':
            pygame.draw.rect(screen, setting_btn_hover_color, setting_btn_bg_rect)
            pygame.draw.rect(screen, CHARCOAL, setting_btn_bg_rect, 5)
 

        screen.blit(setting_btn_txt_surface)

    elif screen_mode == "GAME":
        screen.fill(WHITE)
        BLACK = [0, 0, 0] 
        screen.fill(BLACK)
        screen.blit(BACKGROUND_png, (0, 0))
        
    elif screen_mode == "CRYPT":
        screen.fill(LIGHT_S_GREY)
        for scroll in scrolls :
            if scroll["img"] == GRIMM_png:
                scroll["x"] = (GHOST_x + scroll["x"] * 99) / 100
                scroll["y"] = (GHOST_y + scroll["y"] * 99) / 100
    
    
    else:
        print("unknown.")



    if screen_mode == "CRYPT" or screen_mode == "GAME":
        pressed_keys = pygame.key.get_pressed()
        if pressed_keys[pygame.K_RIGHT] and not pressed_keys[pygame.K_LEFT]:
            GHOST_x = (GHOST_x + SPEED) % SCREEN_WIDTH
        elif pressed_keys[pygame.K_LEFT] and not pressed_keys[pygame.K_RIGHT]:
            GHOST_x = (GHOST_x - SPEED) % SCREEN_WIDTH
      
        if pressed_keys[pygame.K_UP] and not pressed_keys[pygame.K_DOWN]:
            GHOST_y = (GHOST_y - SPEED) % SCREEN_HEIGHT
        elif pressed_keys[pygame.K_DOWN] and not pressed_keys[pygame.K_UP]:
            GHOST_y = (GHOST_y + SPEED) % SCREEN_HEIGHT
        
        screen.blit(GHOST_png, [GHOST_x, GHOST_y])
        
    ghost_rect = GHOST_png.get_rect()
    ghost_rect.x = GHOST_x
    ghost_rect.y = GHOST_y
    for scroll in scrolls:
        scroll_rect = scroll["img"].get_rect()
        scroll_rect.x = scroll["x"]
        scroll_rect.y = scroll["y"]
        if scroll["screen_mode"] == screen_mode and not scroll["collected"]:
            screen.blit(scroll["img"], [scroll["x"], scroll["y"]])
            if ghost_rect.colliderect(scroll_rect):
                scroll["collected"]= True
                print("=" * 20)
                print(scroll["msg"]) 
                print("=" * 20)
                screen_mode = scroll["goto"]
                
            for other in scrolls:
                other_rect = other["img"].get_rect()
                other_rect.x = other["x"]
                other_rect.y = other["y"]
                if other["img"] == scroll["img"]:
                    continue
                elif other["img"] == TOMATO_png and other_rect.colliderect(scroll_rect):
                    scroll["collected"] = True
                    print("OUCH! It burns!")
                    print("You coming too?")
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN and screen_mode == "INTRO":
            print("test") 
            mouse_pos = pygame.mouse.get_pos() 
            if play_rect.collidepoint(mouse_pos):
                screen_mode = 'GAME'
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
               pass
            elif event.key == pygame.K_UP:
               GHOST_y -= + SPEED
            elif event.key == pygame.K_LEFT:
               GHOST_x -= + SPEED
            elif event.key == pygame.K_DOWN:
               GHOST_y -= - SPEED
            elif event.key == pygame.K_RIGHT:
               GHOST_x -= - SPEED
              
        # ===== TITLE MODE EVENTS =====
        
          

    clock.tick(FPS)
    pygame.display.update()









|>> download student-games/metal-rams/game.py