Compare commits

..

1 commit

Author SHA1 Message Date
ac1a7fe73a Dateien nach "/" hochladen 2024-03-04 13:30:24 +00:00
47 changed files with 554 additions and 1020 deletions

1
.idea/ideas.txt generated
View file

@ -38,7 +38,6 @@ Story:
Henker Henker
armer Bauer armer Bauer
"Hexe" "Hexe"
Patrice, fragt nach Lightning Anschluss -> Lightning Spell freigeschaltet
Ziel(e) Ziel(e)
-> Zurückkommen -> Zurückkommen

View file

View file

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 954 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

BIN
art/images/blau1.kra Normal file

Binary file not shown.

BIN
art/images/blau1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/blau2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/blau3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

BIN
art/images/dirt1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
art/images/dirt2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View file

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

View file

Before

Width:  |  Height:  |  Size: 495 B

After

Width:  |  Height:  |  Size: 495 B

View file

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

View file

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View file

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

View file

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 635 B

View file

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 438 B

View file

Before

Width:  |  Height:  |  Size: 674 B

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 B

View file

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 654 B

BIN
art/images/river1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
art/images/rot1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/rot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/rot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

View file

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

View file

Before

Width:  |  Height:  |  Size: 441 B

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 B

View file

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,308 +1,230 @@
import pygame import pygame
pygame.font.init() pygame.font.init()
fonts = { fonts = {
'medieval': 'medieval.ttf', 'medieval': 'medieval.ttf',
'minecraft': 'Minecraft Evenings.otf', 'minecraft': 'Minecraft Evenings.otf',
'3dpixel': '3D-Pixel.ttf', '3dpixel': '3D-Pixel.ttf',
'8bit': '8bitlim.ttf', '8bit': '8bitlim.ttf',
'8bito': '8blimro.ttf', '8bito': '8blimro.ttf',
'arcade': 'ARCADECLASSIC.ttf', 'arcade': 'ARCADECLASSIC.ttf',
'modern_game': 'astron boy video.otf', 'modern_game': 'astron boy video.otf',
'modern': 'astron boy.otf', 'modern': 'astron boy.otf',
'wonder': 'Beyond Wonderland.ttf', 'wonder': 'Beyond Wonderland.ttf',
'curved': 'Digitag.ttf', 'curved': 'Digitag.ttf',
'simple': 'DisposableDroidBB.ttf', 'simple': 'DisposableDroidBB.ttf',
'rounded': 'dpcomic.ttf', 'rounded': 'dpcomic.ttf',
'playfull': 'Endalian Script.ttf', 'playfull': 'Endalian Script.ttf',
'blocky': 'FREAKSOFNATURE.ttf', 'blocky': 'FREAKSOFNATURE.ttf',
'catchy': 'Future TimeSplitters.otf', 'catchy': 'Future TimeSplitters.otf',
'simple_wide': 'Halo3.ttf', 'simple_wide': 'Halo3.ttf',
'simple_fat': 'INVASION2000.ttf', 'simple_fat': 'INVASION2000.ttf',
'very_gamy': 'ka1.ttf', 'very_gamy': 'ka1.ttf',
'simple_round': 'Karma Suture.otf', 'simple_round': 'Karma Suture.otf',
'mono': 'manaspc.ttf', 'mono': 'manaspc.ttf',
'damaged': 'Merchant Copy.ttf', 'damaged': 'Merchant Copy.ttf',
'big_natural': 'MorialCitadel.TTF', 'big_natural': 'MorialCitadel.TTF',
'spacy': 'nasalization-rg.otf', 'spacy': 'nasalization-rg.otf',
'sci-fi': 'neuropol.otf', 'sci-fi': 'neuropol.otf',
'hollow_big_edge': 'papercut.ttf', 'hollow_big_edge': 'papercut.ttf',
'space_shuttle': 'pdark.ttf', 'space_shuttle': 'pdark.ttf',
'thin': 'PixelFJVerdana12pt.ttf', 'thin': 'PixelFJVerdana12pt.ttf',
'random': 'Seattle Avenue.ttf', 'random': 'Seattle Avenue.ttf',
'pixel': 'yoster.ttf' 'pixel': 'yoster.ttf'
} }
class Button(): class Button():
def __init__(self, x, y, width, height, image, font, font_size, buttonText='', onclickFunction=None, onePress=False, attributes=None): def __init__(self, x, y, width, height, font, font_size, buttonText='Button', onclickFunction=None, onePress=False):
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size) self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.x = x self.x = x
self.y = y self.y = y
self.width = width self.width = width
self.height = height self.height = height
self.attributes = attributes self.onclickFunction = onclickFunction
self.onclickFunction = onclickFunction self.onePress = onePress
self.onePress = onePress self.alreadyPressed = False
self.alreadyPressed = False
with open('art/images/textbox.png', 'r') as tb:
with open(f'art/images/box/{image}', 'r') as tb: self.box = pygame.image.load(tb)
self.box = pygame.image.load(tb) self.box = pygame.transform.scale(self.box, (width, height))
self.box = pygame.transform.scale(self.box, (width, height))
self.buttonRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.buttonRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.buttonSurf = self.font.render(buttonText, True, '#baab80')
self.buttonSurf = self.font.render(buttonText, True, '#baab80')
def process(self, screen, clock, running, background, isblack, WIDTH, HEIGHT):
def update(self, screen): mousePos = pygame.mouse.get_pos()
mousePos = pygame.mouse.get_pos() if self.buttonRect.collidepoint(mousePos):
if self.buttonRect.collidepoint(mousePos): if pygame.mouse.get_pressed(num_buttons=3)[0]:
if pygame.mouse.get_pressed(3)[0]: if self.onePress:
if self.onePress: self.onclickFunction()
self.onclickFunction() elif not self.alreadyPressed:
elif not self.alreadyPressed: if 'play' in str(self.onclickFunction):
if self.attributes: self.onclickFunction(screen, clock, running, background, isblack, WIDTH, HEIGHT)
self.onclickFunction(*self.attributes) self.alreadyPressed = True
self.alreadyPressed = True else:
else: self.onclickFunction()
self.onclickFunction() self.alreadyPressed = True
self.alreadyPressed = True else:
else: self.alreadyPressed = False
self.alreadyPressed = False self.box.blit(self.buttonSurf, [
self.box.blit(self.buttonSurf, [ self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2,
self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2, self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2
self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2 ])
]) screen.blit(self.box, self.buttonRect)
screen.blit(self.box, self.buttonRect)
class Label(): class DropDown():
def __init__(self, x, y, width, height, text, font='simple', font_size=20, font_color = '#1e90ff', sprite = 'label.png') -> None: def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options):
self.x = x self.rect = pygame.Rect(x, y, width, height)
self.y = y self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.width = width self.main = main
self.height = height self.options = options
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size) self.draw_menu = False
self.font_color = font_color self.menu_active = False
self.text = text self.active_option = -1
self.hidden = False
self.sprite = sprite with open('art/images/textbox.png', 'r') as tb:
with open(f'art/images/box/{sprite}', 'r') as tb: self.box = pygame.image.load(tb)
self.box = pygame.image.load(tb) self.box = pygame.transform.scale(self.box, (width, height))
self.box = pygame.transform.scale(self.box, (width, height))
def draw(self, screen):
#pygame.draw.rect(screen, self.color_menu[self.menu_active], self.rect, 0)
def draw(self, screen): surface = self.font.render(self.main, 1, (0, 0, 0))
if self.hidden: self.box.blit(surface, [
return self.rect.width/2 - surface.get_rect().width/2,
with open(f'art/images/box/{self.sprite}', 'r') as tb: self.rect.height/2 - surface.get_rect().height/2
self.box = pygame.image.load(tb) ])
self.box = pygame.transform.scale(self.box, (self.width,self.height)) screen.blit(self.box, surface.get_rect(center = self.rect.center))
self.labelRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.labelSurf = self.font.render(self.text, True, self.font_color) if self.draw_menu:
self.box.blit(self.labelSurf, [ for i, text in enumerate(self.options):
self.labelRect.width / 2 - self.labelSurf.get_rect().width / 2, rect = self.rect.copy()
self.labelRect.height / 2 - self.labelSurf.get_rect().height / 2 rect.y += (i+1) * self.rect.height
]) rect.x = self.rect.x
screen.blit(self.box, self.labelRect) #pygame.draw.rect(screen, self.color_option[1 if i == self.active_option else 0], rect, 0)
#msg = self.font.render(text, 1, (0, 0, 0))
#screen.blit(msg, msg.get_rect(center = rect.center))
surface = self.font.render(text, 1, (0, 0, 0))
class DropDown(): self.box.blit(surface, [
def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options): rect.width/2 - surface.get_rect().width/2,
self.rect = pygame.Rect(x, y, width, height) rect.height/2 - surface.get_rect().height/2
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size) ])
self.main = main screen.blit(self.box, rect)
self.options = options
self.draw_menu = False def update(self, event_list):
self.menu_active = False mpos = pygame.mouse.get_pos()
self.active_option = -1 self.menu_active = self.rect.collidepoint(mpos)
self.active_option = -1
with open('art/images/box/textbox.png', 'r') as tb: for i in range(len(self.options)):
self.box = pygame.image.load(tb) rect = self.rect.copy()
self.box = pygame.transform.scale(self.box, (width, height)) rect.y += (i+1) * self.rect.height
if rect.collidepoint(mpos):
def draw(self, screen): self.active_option = i
#pygame.draw.rect(screen, self.color_menu[self.menu_active], self.rect, 0) break
surface = self.font.render(self.main, 1, (0, 0, 0))
self.box.blit(surface, [ if not self.menu_active and self.active_option == -1:
self.rect.width/2 - surface.get_rect().width/2, self.draw_menu = False
self.rect.height/2 - surface.get_rect().height/2 #self.draw_menu = True
]) #return -1
screen.blit(self.box, surface.get_rect(center = self.rect.center)) if pygame.mouse.get_pressed(num_buttons=3)[0]:
if self.menu_active:
if self.draw_menu: self.draw_menu = not self.draw_menu
for i, text in enumerate(self.options): elif self.draw_menu and self.active_option >= 0:
rect = self.rect.copy() self.draw_menu = False
rect.y += (i+1) * self.rect.height return self.active_option
rect.x = self.rect.x return -1
#pygame.draw.rect(screen, self.color_option[1 if i == self.active_option else 0], rect, 0)
#msg = self.font.render(text, 1, (0, 0, 0))
#screen.blit(msg, msg.get_rect(center = rect.center)) class GameObjects():
surface = self.font.render(text, 1, (0, 0, 0)) def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT) -> None:
self.box.blit(surface, [ self.name = name
rect.width/2 - surface.get_rect().width/2, self.type = _type
rect.height/2 - surface.get_rect().height/2 self.background = bg
]) if bg != None:
screen.blit(self.box, rect) with open(bg, 'r') as bg:
self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT])
def update(self, event_list): self.objects = objects
mpos = pygame.mouse.get_pos()
self.menu_active = self.rect.collidepoint(mpos)
self.active_option = -1 class Scene(GameObjects):
for i in range(len(self.options)): def __init__(self, name:str, _type:str, bg, objects:list | None, WIDTH, HEIGHT, level:list) -> None:
rect = self.rect.copy() super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
rect.y += (i+1) * self.rect.height self.level = level
if rect.collidepoint(mpos): self.current_level = 0
self.active_option = i
break def update(self, change:bool):
if change:
if not self.menu_active and self.active_option == -1: self.current_level += 1
self.draw_menu = False self.level[self.current_level].update()
#self.draw_menu = True if isinstance(self.objects, list):
#return -1 for obj in self.objects:
if pygame.mouse.get_pressed(num_buttons=3)[0]: obj.update()
if self.menu_active:
self.draw_menu = not self.draw_menu def draw(self, screen):
elif self.draw_menu and self.active_option >= 0: if isinstance(self.objects, list):
self.draw_menu = False for obj in self.objects:
return self.active_option obj.draw(screen)
return -1 self.level[self.current_level].draw(screen)
class GameObjects(): class Stage(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT) -> None: def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, stage:str, rooms:list) -> None:
self.name = name super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.type = _type self.stage = stage
self.background = bg self.rooms = rooms
if bg != None: self.current = 0
if WIDTH != None and HEIGHT != None:
with open(bg, 'r') as bg: def update(self):
self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT]) for room in self.rooms:
else: if room.id == self.current:
with open(bg, 'r') as bg: room.update()
self.background = pygame.transform.scale2x(pygame.image.load(bg)) keys = pygame.key.get_pressed()
self.objects = objects if keys[pygame.K_RIGHT]:
self.current += 1
def update(self, objects): if self.current >= len(self.rooms):
return return 1
def draw(self, screen):
return def draw(self, screen):
for room in self.rooms:
class Scene(GameObjects): if room.id == self.current:
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, level:list) -> None: room.draw(screen)
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.level = level class Room(GameObjects):
self.current_level = 0 def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, exits:list, id:int) -> None:
self.update() super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.exits = exits
def update(self, change:bool=False, objects=None): self.id = id
if change: if self.type == 'normal' or self.type == 'boss':
self.current_level += 1 self.locked = True
self.level[self.current_level].update(objects) else:
self.background = self.level[self.current_level].background self.locked = False
"""if isinstance(self.objects, list):
for obj in self.objects[0] + self.objects[1] + self.objects[2]: self.objects.append(self.genWalls(WIDTH, HEIGHT))
obj.update()"""
def genWalls(self, WIDTH, HEIGHT):
def draw(self, screen): walls = []
if isinstance(self.objects, list): walls.append(pygame.Rect(0, 0, 4, HEIGHT))
for obj in self.objects[0] + self.objects[1] + self.objects[2] + self.objects[3]: walls.append(pygame.Rect(WIDTH - 4, 0, 4, HEIGHT))
obj.draw(screen) walls.append(pygame.Rect(0, 0, WIDTH, 4))
self.level[self.current_level].draw(screen) walls.append(pygame.Rect(0, HEIGHT - 4, WIDTH, 4))
return walls
def getObjects(self):
return self.level[self.current_level].getObjects() def update(self):
pass
class Stage(GameObjects): def draw(self, screen):
def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, stage:str, rooms:list) -> None: screen.blit(self.background, (32, 32))
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT) if isinstance(self.objects, list):
self.stage = stage for obj in self.objects[0]:
self.rooms = rooms obj.draw(screen)
self.current = 0
class Obstacle(GameObjects):
def update(self, objects): def __init__(self, name: str, _type: str, bg, collision: bool, x: int, y: int, hidden: bool=False, objects: list = None, WIDTH=None, HEIGHT=None) -> None:
for room in self.rooms: super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
if room.id == self.current: self.collision = collision
room.update(objects) self.rect = pygame.Rect((x, y), self.background.get_size())
self.background = room.background
keys = pygame.key.get_pressed() def draw(self, screen):
if keys[pygame.K_RIGHT]: screen.blit(self.background, self.rect)
self.current += 1
if self.current >= len(self.rooms):
return 1
def draw(self, screen):
for room in self.rooms:
if room.id == self.current:
room.draw(screen)
def getObjects(self):
for room in self.rooms:
if room.id == self.current:
return room.getObjects()
class Room(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, exits:list, id:int) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.exits = exits
self.id = id
if self.type == 'normal' or self.type == 'boss':
self.locked = True
else:
self.locked = False
[self.objects[4].append(wall) for wall in self.genWalls(WIDTH, HEIGHT)]
def genWalls(self, WIDTH, HEIGHT):
walls = []
walls.append(Obstacle('wall_l', 'wall', None, True, 32, 32, True, WIDTH=4, HEIGHT=HEIGHT))
walls.append(Obstacle('wall_r', 'wall', None, True, WIDTH + 28, 32, True, WIDTH=4, HEIGHT=HEIGHT))
walls.append(Obstacle('wall_t', 'wall', None, True, 32, 32, True, WIDTH=WIDTH, HEIGHT=4))
walls.append(Obstacle('wall_b', 'wall', None, True, 32, HEIGHT + 28, True, WIDTH=WIDTH, HEIGHT=4))
return walls
def update(self, objects):
if objects is not None:
self.objects = objects
if not self.objects[1]:
self.locked = False
return
def draw(self, screen):
screen.blit(self.background, (32, 32))
if isinstance(self.objects, list):
for obj in self.objects[3] + self.objects[0] + self.objects[1] + self.objects[2]:
obj.draw(screen)
def getObjects(self):
return self.objects
class Obstacle(GameObjects):
def __init__(self, name: str, _type: str, bg, collision: bool, x: int, y: int, hidden: bool=False, objects: list = None, WIDTH=None, HEIGHT=None) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.collision = collision
self.hidden = hidden
self.width = WIDTH
self.height = HEIGHT
if self.background is not None:
self.rect = pygame.Rect((x, y), self.background.get_size())
else:
self.rect = pygame.Rect(x, y, WIDTH, HEIGHT)
def draw(self, screen):
if not self.hidden:
screen.blit(self.background, self.rect)
else:
pygame.draw.rect(screen, '#e7f8e0', self.rect, 2)
class Door(GameObjects):
def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, x: int, y: int, islocked=True) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.rect = pygame.Rect((x, y), self.background.get_size())
self.locked = islocked
def draw(self, screen):
screen.blit(self.background, self.rect)
def update(self, islocked=True):
self.locked = islocked

621
main.py
View file

@ -1,407 +1,214 @@
import pygame import pygame
import sys import sys
import json import json
import time import time
import random import random
from classes import * from classes import *
from viecher import * from viecher import *
fps = 60 fps = 60
def setUp(config): def setUp(config):
pygame.init() pygame.init()
if config["fullscreen"]: if config["fullscreen"]:
screen = pygame.display.set_mode(config["res"], pygame.FULLSCREEN) screen = pygame.display.set_mode(config["res"], pygame.FULLSCREEN)
else: else:
screen = pygame.display.set_mode(config["res"]) screen = pygame.display.set_mode(config["res"])
clock = pygame.time.Clock() clock = pygame.time.Clock()
pygame.display.set_caption('Between The Pages')
return screen, clock, True, True, "start.png", [] return screen, clock, True, True, "start.png", []
def readConfig(): def readConfig():
with open('config.json', 'r') as c: with open('config.json', 'r') as c:
json_data = c.read() json_data = c.read()
return json.loads(json_data) return json.loads(json_data)
def quitGame(): def quitGame():
#save progress somehow, if needed #save progress somehow, if needed
pygame.quit() pygame.quit()
quit() quit()
def genRooms(WIDTH, HEIGHT, type:str, objects:list): def genRooms(WIDTH, HEIGHT, type:str):
room_objects = [] room_objects = [Obstacle('dirt', 'boulder', 'art/images/dirt2.png', False, 32, 32, WIDTH=WIDTH - 64, HEIGHT=HEIGHT - 64)]
#room_objects = [Obstacle('dirt', 'boulder', 'art/images/dirt2.png', False, 32, 32, WIDTH=WIDTH - 64, HEIGHT=HEIGHT - 64)] room_objects.append(Obstacle('river', 'water', 'art/images/river1.png', True, 32, 32, WIDTH=WIDTH - 64, HEIGHT=HEIGHT - 64))
room_objects.append(Obstacle('river', 'water', 'art/images/background/river.png', True, random.randint(32, round(WIDTH * 0.75)), 32, WIDTH=96, HEIGHT=round(HEIGHT * 0.66))) rooms = [
room_backgrounds = [f'art/images/background/{type}{i}.png' for i in range(1)] Room(type, 'normal', f'art/images/{type}.png', [[room_objects[i] for i in range(0, random.randint(0, len(room_objects)))]], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 0),
rooms = [ Room(type, 'normal', f'art/images/{type}.png', [], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 1),
Room(type, 'normal', room_backgrounds[random.randint(0, 0)], [objects[0], objects[1], objects[2], objects[3], objects[4] + [room_objects[random.randint(0, 0)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, [True, True, True, True], j) Room(type, 'normal', f'art/images/{type}.png', [], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 2),
for j in range(random.randint(5, 10)) ]
] return rooms
#rooms =Room(type, 'normal', room_backgrounds[random.randint(0, 4)], [objects[0], objects[1], objects[2], [room_objects[random.randint(0, len(room_objects) - 1)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, [True, True, True, True], j)
def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
return rooms main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)]
mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))]
def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): others = []
main = [herbert] npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
mobs = [Skeleton('skeleton', random.randint(40, 60), random.randint(50, WIDTH - 50), random.randint(50, HEIGHT - 50), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 5))]+[Zombie('zombie', random.randint(40, 60), random.randint(50, WIDTH-50), random.randint(50, HEIGHT-50), 5, 1, 1, 1, 25) for i in range(0,random.randint(2, 5))] objects = [main, mobs, npcs, others]
weapons = [] freeze = False #Gameplay is freezed in certain situations
others = []
npcs = [] while running:
objects = [main, mobs, npcs, weapons, others] screen.fill((0,0,0))
level = [] events = pygame.event.get()
rooms = genRooms(WIDTH, HEIGHT, 'grass', objects) for event in events:
level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms)) if event.type == pygame.QUIT:
scene = Scene('test', 'normal', None, None, WIDTH, HEIGHT, level) quitGame()
freeze = False #Gameplay is freezed in certain situations elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
while running: freeze = not freeze
screen.fill('#000000') # RENDER YOUR GAME HERE
events = pygame.event.get() """with open(background, 'r') as i:
for event in events: bg = pygame.image.load(i)
if event.type == pygame.QUIT: bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
quitGame() # fill the screen with an image to clear the screen
elif event.type == pygame.KEYDOWN: screen.blit(bg, (0, 0))
if event.key == pygame.K_e: #when book is open gameplay is freezed """
freeze = not freeze if not freeze:
# RENDER YOUR GAME HERE for thing in objects[0]:
"""with open(background, 'r') as i: thing.book.hidden = not freeze
bg = pygame.image.load(i) if not thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects):
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT)) menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
# fill the screen with an image to clear the screen thing.draw(screen)
screen.blit(bg, (0, 0))
""" for mob in objects[1]:
if not freeze: mob.update(objects)
objects = scene.getObjects() mob.draw(screen)
screen.blit(scene.background, (32, 32))
for npc in objects[2]:
for thing in objects[4]: npc.update(pygame.key.get_pressed(), objects)
thing.draw(screen) npc.draw(screen)
for weapon in objects[3]: for thing in objects[3]:
weapon.update(objects) thing.update(objects)
weapon.draw(screen) thing.draw(screen)
else:
for thing in objects[0]: objects[0][0].book.hidden = not freeze
thing.book.hidden = not freeze objects[0][0].book.draw(screen)
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects) objects[0][0].book.update()
if result == 'village': # flip() the display to put your work on screen
village(screen, clock, running, background, isblack, WIDTH, HEIGHT) pygame.display.flip()
elif result == 'play':
play(screen, clock, running, background, isblack, WIDTH, HEIGHT) clock.tick(fps) # limits FPS to 60
else:
thing.draw(screen) def options(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
for mob in objects[1]: # List that is displayed while selecting the window resolution level
mob.update(objects) resolution = [("1920x1080", "1920x1080"),
mob.draw(screen) ("1920x1200", "1920x1200"),
("1280x720", "1280x720"),
for npc in objects[2]: ("2560x1440", "2560x1440"),
npc.update(pygame.key.get_pressed(), objects) ("3840x2160", "3840x2160")]
npc.draw(screen)
# This function displays the currently selected options
objects[0][0].book.addspell('windslash')
scene.update(False, objects) def printSettings():
print("\n\n")
else: # getting the data using "get_input_data" method of the Menu class
objects[0][0].book.hidden = not freeze settingsData = settings.get_input_data()
objects[0][0].book.draw(screen)
objects[0][0].book.update() for key in settingsData.keys():
# flip() the display to put your work on screen print(f"{key}\t:\t{settingsData[key]}")
pygame.display.flip()
while running:
clock.tick(fps) # limits FPS to 60 for event in pygame.event.get():
if event.type == pygame.QUIT:
def village(screen, clock, running, background, isblack, WIDTH, HEIGHT): running = False
main = [herbert] # RENDER YOUR GAME HERE
mobs = [] with open(background, 'r') as i:
weapons = [] bg = pygame.image.load(i)
others = [Obstacle('fireplace', 'interactable', 'art/images/background/fireplace.png', False, 200, 500), bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
Obstacle('house', 'Interactable', 'art/images/background/house.png', False, 500, 150, WIDTH=180, HEIGHT=160)] # fill the screen with an image to clear the screen
npcs = [NPC('oldlady', 100, 'people/oldlady.png', 0, 200, 200)] screen.blit(bg, (0, 0))
objects = [main, mobs, npcs, weapons, others] for obj in objects:
room = Room('village', 'village', 'art/images/background/village.png', objects, WIDTH - 64, HEIGHT - 64, [True, True, True, True], 0) obj.process(screen)
freeze = True #Gameplay is freezed in certain situations
main[0].health.health = 20 # flip() the display to put your work on screen
pygame.display.flip()
while running:
screen.fill('#000000') clock.tick(60) # limits FPS to 60
events = pygame.event.get()
for event in events: def menu(screen, clock, running, background, isblack, WIDTH, HEIGHT):
if event.type == pygame.QUIT: objects = []
quitGame() objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", play))
elif event.type == pygame.KEYDOWN: #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
if event.key == pygame.K_e: #when book is open gameplay is freezed objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
freeze = not freeze while running:
# RENDER YOUR GAME HERE for event in pygame.event.get():
"""with open(background, 'r') as i: if event.type == pygame.QUIT:
bg = pygame.image.load(i) running = False
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT)) quitGame()
# fill the screen with an image to clear the screen # RENDER YOUR GAME HERE
screen.blit(bg, (0, 0)) with open(f'art/images/{background}', 'r') as i:
""" bg = pygame.image.load(i)
if not freeze: bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
objects = room.getObjects() # fill the screen with an image to clear the screen
screen.blit(room.background, (32, 32)) screen.blit(bg, (0, 0))
for obj in objects:
for thing in objects[4]: obj.update(screen, clock, running, background, isblack, WIDTH, HEIGHT)
thing.draw(screen)
# flip() the display to put your work on screen
for weapon in objects[3]: pygame.display.flip()
weapon.update(objects)
weapon.draw(screen) clock.tick(60) # limits FPS to 60
for thing in objects[0]: def test(screen, clock, running, background, isblack, WIDTH, HEIGHT):
thing.book.hidden = not freeze level = []
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects) rooms = genRooms(WIDTH, HEIGHT, 'grass')
if result == 'village': level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms))
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'play': level.append(Stage('rot', 'normal', None, [], WIDTH, HEIGHT, 'red', [
play(screen, clock, running, background, isblack, WIDTH, HEIGHT) Room('red1', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 0),
elif result == 'house': Room('red2', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 1),
house(screen, clock, running, background, isblack, WIDTH, HEIGHT) Room('red3', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 2),
else: ]))
thing.draw(screen)
scene = Scene('test', 'normal', None, None, WIDTH, HEIGHT, level)
for mob in objects[1]:
mob.update(objects) # RENDER YOUR GAME HERE
mob.draw(screen) while True:
for event in pygame.event.get():
for npc in objects[2]: if event.type == pygame.QUIT:
npc.update(pygame.key.get_pressed(), objects) running = False
npc.draw(screen) quitGame()
screen.fill('#000000')
room.update(objects) scene.update(False)
scene.draw(screen)
else: # flip() the display to put your work on screen
objects[0][0].book.hidden = not freeze pygame.display.flip()
objects[0][0].book.draw(screen)
objects[0][0].book.update() clock.tick(60) # limits FPS to 60
# flip() the display to put your work on screen
pygame.display.flip() def main():
config = readConfig()
clock.tick(fps) # limits FPS to screen, clock, running, isblack, background, objects = setUp(config["screen"])
WIDTH, HEIGHT = screen.get_size()
def house(screen, clock, running, background, isblack, WIDTH, HEIGHT): #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Play", play))
main = [herbert] #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
mobs = [] #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
weapons = [] menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
others = [] test(screen, clock, running, background, isblack, WIDTH, HEIGHT)
npcs = [NPC('elder', 100, 'people/reddy.png', 0, 200, 200)]
objects = [main, mobs, npcs, weapons, others] """while running:
room = Room('house', 'house', 'art/images/background/insideHouse.png', objects, WIDTH - 64, HEIGHT - 64, [True, True, True, True], 0) for event in pygame.event.get():
freeze = False #Gameplay is freezed in certain situations if event.type == pygame.QUIT:
running = False
while running: #menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
screen.fill('#000000') if not isblack:
events = pygame.event.get() with open(background, 'r') as i:
for event in events: bg = pygame.image.load(i)
if event.type == pygame.QUIT: bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
quitGame() # fill the screen with a color to wipe away anything from last frame
elif event.type == pygame.KEYDOWN: screen.blit(bg, (0, 0))
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze # RENDER YOUR GAME HERE
# RENDER YOUR GAME HERE
"""with open(background, 'r') as i: else:
bg = pygame.image.load(i) for obj in objects:
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT)) obj.process(screen, clock, running, background, isblack, WIDTH, HEIGHT)
# fill the screen with an image to clear the screen # flip() the display to put your work on screen
screen.blit(bg, (0, 0)) pygame.display.flip()
"""
if not freeze: clock.tick(60) # limits FPS to 60"""
objects = room.getObjects()
screen.blit(room.background, (32, 32)) pygame.quit()
for thing in objects[4]: if __name__ == '__main__':
thing.draw(screen) main()
# for weapon in objects[3]:
# weapon.update(objects)
# weapon.draw(screen)
for thing in objects[0]:
thing.book.hidden = not freeze
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects)
if result == 'village':
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'play':
play(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'wall':
village(screen, clock, running, background, isblack, WIDTH, HEIGHT)
else:
thing.draw(screen)
for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
objects[0][0].book.addspell('windslash')
room.update(objects)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(fps) # limits FPS to
def options(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
# List that is displayed while selecting the window resolution level
resolution = [("1920x1080", "1920x1080"),
("1920x1200", "1920x1200"),
("1280x720", "1280x720"),
("2560x1440", "2560x1440"),
("3840x2160", "3840x2160")]
# This function displays the currently selected options
def printSettings():
print("\n\n")
# getting the data using "get_input_data" method of the Menu class
settingsData = settings.get_input_data()
for key in settingsData.keys():
print(f"{key}\t:\t{settingsData[key]}")
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# RENDER YOUR GAME HERE
with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
for obj in objects:
obj.process(screen)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def menu(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", village, attributes=[screen, clock, running, background, isblack, WIDTH, HEIGHT]))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
quitGame()
# RENDER YOUR GAME HERE
with open(f'art/images/background/{background}', 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
for obj in objects:
obj.update(screen)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def test(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)]
mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))]
others = []
npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
objects = [main, mobs, npcs, others]
level = []
rooms = genRooms(WIDTH, HEIGHT, 'grass', objects)
level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms))
freeze = False #Gameplay is freezed in certain situations
#level.append(Stage('rot', 'normal', None, [], WIDTH, HEIGHT, 'red', [
# Room('red1', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 0),
# Room('red2', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 1),
# Room('red3', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 2),
# ]))
scene = Scene('test', 'normal', None, None, WIDTH, HEIGHT, level)
# RENDER YOUR GAME HERE
while True:
screen.fill('#000000')
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
running = False
quitGame()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze
if not freeze:
objects = scene.getObjects()
for thing in objects[0]:
thing.book.hidden = not freeze
if not thing.update(pygame.key.get_pressed(), objects):
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
thing.draw(screen)
for mob in objects[1]:
mob.update(objects)
mob.draw(screen)
for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
for thing in objects[3]:
thing.update(objects)
thing.draw(screen)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def main():
config = readConfig()
screen, clock, running, isblack, background, objects = setUp(config["screen"])
WIDTH, HEIGHT = screen.get_size()
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Play", play))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
test(screen, clock, running, background, isblack, WIDTH, HEIGHT)
"""while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
if not isblack:
with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with a color to wipe away anything from last frame
screen.blit(bg, (0, 0))
# RENDER YOUR GAME HERE
else:
for obj in objects:
obj.process(screen, clock, running, background, isblack, WIDTH, HEIGHT)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60"""
pygame.quit()
if __name__ == '__main__':
herbert = MainCharacter('Herbert', 100, 'people/oldman.png', 500, 500, 20, 5, 1, 1, 50)
main()

View file

@ -1,8 +1,4 @@
import pygame as pg import pygame as pg
from classes import *
from main import *
import random
vec = pg.math.Vector2 vec = pg.math.Vector2
fps = 60 fps = 60
@ -45,7 +41,7 @@ class Objects():
self.name = name self.name = name
self.speed = ms self.speed = ms
with open(f'art/images/{sprite}') as i: with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.image.load(i)) self.sprite = pg.image.load(i)
self.x = x self.x = x
self.y = y self.y = y
self.hidden = False self.hidden = False
@ -56,85 +52,60 @@ class Objects():
return return
self.rect.x, self.rect.y = self.x, self.y self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect) screen.blit(self.sprite, self.rect)
pg.draw.rect(screen, '#ef0120', self.rect, 2)
class NPC(Objects): class NPC(Objects):
def __init__(self, name, ms, sprite, convo_scene, x, y) -> None: def __init__(self, name, ms, sprite, convo_act, x, y) -> None:
super().__init__(name, ms, sprite, x, y)
self.talking = False self.talking = False
self.hidden = False self.hidden = True
self.conversation = Convo(self, convo_scene) super().__init__(name, ms, sprite, x, y)
self.lastUpdate = pg.time.get_ticks() self.conversation = Convo('Hello, you can shoot fireballs with f now.', convo_act, 'person')
def talk(self, objects): def talk(self, objects):
self.talking = True self.talking = True
objects[0][0].talking = True objects[0][0].talking = True
self.conversation.hidden = False
def draw(self, screen): def draw(self, screen):
super().draw(screen) super().draw(screen)
if self.talking: if self.talking == True:
self.conversation.draw(screen) self.conversation.draw(screen)
def update(self, keys, objects): def update(self, keys, objects):
if self.name == 'oldlady': if self.talking:
if self.conversation.convo_scene==0 and 'rat' in objects[0][0].killed and objects[1]==[]: self.conversation.update(keys, objects)
self.conversation.convo_scene=1
if self.lastUpdate + 200 < pg.time.get_ticks():
if self.talking:
self.conversation.update(keys, objects)
self.lastUpdate = pg.time.get_ticks()
else:
touches = pg.sprite.spritecollideany(self, objects[0])
if touches is not None and keys[pg.K_f] and isinstance(touches, MainCharacter):
self.talk(objects)
self.lastUpdate = pg.time.get_ticks()
class Convo():
def __init__(self, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
self.x = x
self.y = y
self.width = width
self.height = height
self.hidden = False
self.font = pg.font.Font(f'fonts/{fonts[font]}', font_size)
with open('art/images/label.png', 'r') as tb:
self.box = pg.image.load(tb)
self.box = pg.transform.scale(self.box, (width, height))
self.labelRect = pg.Rect(self.x, self.y, self.width, self.height)
self.labelSurf = self.font.render(text, True, '#1E90FF')
class Convo(Label):
def __init__(self, npc, convo_scene, text='', x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
super().__init__(x, y, width, height, text, font, font_size)
self.convo_act=0
self.npc = npc
self.convo_scene = convo_scene
self.convos = [
['oldlady', 0, ['There are so many rats here.', 'I wish someone would to something against that.','An experienced fighter could kill them.', 'For them it only takes a mouseclick.']],
['oldlady', 1, ['Oh, did you kill all the rats?', 'You must be the chosen one!', 'It would be nice if you would go and talk to the village elder.']],
['elder', 0, ['Who are you?', 'You want to help us?', 'We have a serious problem with monsters.', 'One day they appeared out of nowhere and started attacking.', 'When you jump into the portal over there,', 'You will be send to a place with monsters.', 'PLEASE help us!']],
['elder', 1, ['Who are you?', 'You want to help us?', 'We have a serious problem with monsters.', 'One day they appeared out of nowhere and started attacking.', 'When you jump into the portal over there,', 'You will be send to a place with monsters.', 'PLEASE help us!']]
]
def draw(self, screen): def draw(self, screen):
self.text = self.findConversation()[2][self.convo_act] if self.hidden:
super().draw(screen) return
self.box.blit(self.labelSurf, [
self.labelRect.width/2 - self.labelSurf.get_rect().width/2,
def findConversation(self): self.labelRect.height/2 - self.labelSurf.get_rect().height/2
for convo in self.convos: ])
if convo[0] == self.npc.name and convo[1] == self.convo_scene: screen.blit(self.box, self.labelRect)
return convo
return ['ERROR']
def update(self, keys, objects): def update(self, keys, objects):
if keys[pg.K_f]: if keys[pg.K_SPACE]:
convo = self.findConversation() objects[0][0].book.addspell('fireball')
if self.convo_act+1 < len(convo[2]): self.talking = False
self.text = convo[2][self.convo_act] objects[0][0].talking = False
self.convo_act += 1 self.hidden = True
else:
if convo[0] == 'oldlady':
if convo[1] == 0:
for i in range(0,5):
objects[1].append(Rat('rat', random.randint(150,250), 800, 400+i*20, 1, 1, 1, 100, 25))
elif convo[1] == 1:
objects[0][0].level.level = 5
while 'rat' in objects[0][0].killed: objects[0][0].killed.remove('rat')
if convo[0] == 'elder':
if convo[1] == 0:
objects[4].append(Obstacle('portal', 'interactable', 'art/images/background/portal.png', False, 700, 300))
self.convo_scene += 1
self.convo_act = 0
self.npc.talking = False
objects[0][0].talking = False
class Fighter(Objects): class Fighter(Objects):
@ -151,16 +122,13 @@ class Fighter(Objects):
class MainCharacter(Fighter): class MainCharacter(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, killed =[]) -> None: def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
self.book = Book(0, 0, [], None, None) self.book = Book(0, 0, [], None, None)
self.talking = False self.talking = False
self.level = Level(1000, 38, 150, 40, level, f'will to live: {level}%', 'simple', 20, ) self.level = Level(1000, 38, level, 150, 40, f'will to live: {level}%', 'simple', 20)
self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50, hurtCooldown=self.hurtCooldown) self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50, hurtCooldown=self.hurtCooldown)
self.thinks = Thinks(self.x+20, self.y-50, 150, 100, 'brr I\'m freezing')
self.freezing = True
self.killed = killed #amount of mobs that were killed
def draw(self, screen): def draw(self, screen):
if self.hidden: if self.hidden:
return return
@ -169,30 +137,11 @@ class MainCharacter(Fighter):
self.health.draw(screen) self.health.draw(screen)
self.level.draw(screen) self.level.draw(screen)
self.book.draw(screen) self.book.draw(screen)
pg.draw.rect(screen, '#e900fa', self.rect, 2)
if self.thinks.hidden == False:
self.thinks.draw(screen, self.x+20, self.y-100)
def hurt(self, damage, objects): def hurt(self, damage, objects):
if not self.talking: if not self.talking:
self.health.hurt(damage) self.health.hurt(damage)
def obstacle_interaction(self, objects):
touches = pg.sprite.spritecollideany(self, objects[4])
if touches is not None:
if touches.name == 'fireplace':
self.freezing = False
elif touches.name == 'portal' and self.level.level != 1:
return 'play'
elif touches.name == 'house' and self.level.level != 1:
self.x = 500
self.y = 400
return 'house'
elif 'wall' in touches.name:
return 'wall'
else:
return True
def walk(self, keys, objects): def walk(self, keys, objects):
moveto = vec(0, 0) moveto = vec(0, 0)
if keys[pg.K_w] or keys[pg.K_UP]: if keys[pg.K_w] or keys[pg.K_UP]:
@ -205,68 +154,33 @@ class MainCharacter(Fighter):
moveto += vec(1, 0) moveto += vec(1, 0)
if not moveto == vec(0, 0): if not moveto == vec(0, 0):
moveto.scale_to_length(self.speed) moveto.scale_to_length(self.speed)
self.x += moveto[0] / fps self.x += moveto[0] / fps
self.y += moveto[1] / fps self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, objects[2] + objects[4]) touches = pg.sprite.spritecollideany(self, objects[1] + objects[2])
if touches is not None and not isinstance(touches, Weapons): if touches is not None:
if isinstance(touches, Obstacle): self.x -= moveto[0]*1.5 / fps #change later
if not touches.collision: self.y -= moveto[1]*1.5 / fps #change later
# print(touches.name) if isinstance(touches, NPC):
return touches.talk(objects)
if touches.type == 'wall':
if touches.name == 'wall_l':
self.x += (2 + (self.x - touches.rect.x))
elif touches.name == 'wall_r':
self.x -= (2 + self.rect.width - (touches.rect.x - self.x))
if touches.name == 'wall_t':
self.y += (2 + (self.y - touches.rect.y))
elif touches.name == 'wall_b':
self.y -= (2 + self.rect.height - (touches.rect.y - self.y))
return
elif isinstance(touches, NPC):
return
if self.x <= touches.rect.x: self.x -= (self.rect.width - (touches.rect.x - self.x))
elif self.x > touches.rect.x: self.x += (self.rect.width - (self.x - touches.rect.x - touches.rect.width * 0.66))
#if self.y <= touches.y: pass
#elif self.y > touches.y: pass
#self.x -= moveto[0] * 2 / fps
#self.y -= moveto[1] * 2 / fps
"""
if self.x <= 32:
self.x = 33
elif self.x >= objects[3][0].width - 32:
self.x = objects[3][0].width - 32 - self.rect.width + 1
if self.y <= 32:
self.y = 33
elif self.y >= objects[3][0].height - 32:
self.y = objects[3][0].height - 32 - self.rect.height + 1
"""
def attack(self, obj, mouse): def attack(self, obj, moveto = vec(0,1)):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks(): if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
moveto = mouse - vec(self.x, self.y)
if self.book.current_sp == 'fireball': if self.book.current_sp == 'fireball':
weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5) weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5)
elif self.book.current_sp == 'windslash':
weapon = Windslash('ws1', 100, self.x, self.y, moveto, 10)
else: else:
weapon = Punch('punch', 100, self.x, self.y, moveto, 1, Mobs, life_ticks=500) return
obj[3].append(weapon) obj[3].append(weapon)
self.lastAttack = pg.time.get_ticks() self.lastAttack = pg.time.get_ticks()
def update(self, keys, mouse, objects): def update(self, keys, objects):
if not self.talking: if not self.talking:
self.walk(keys, objects) self.walk(keys, objects)
if pg.mouse.get_pressed()[0]: if keys[pg.K_f]:
self.attack(objects, vec(mouse)) self.attack(objects)
self.thinks.update(objects, self)
if self.health.health <= 0: if self.health.health <= 0:
return 'village' return False
else: else:
return self.obstacle_interaction(objects) return True
class Hearts(): class Hearts():
def __init__(self, health, sprite, x, y, hurtCooldown) -> None: def __init__(self, health, sprite, x, y, hurtCooldown) -> None:
@ -278,7 +192,7 @@ class Hearts():
self.hidden = False self.hidden = False
self.sprite=[] self.sprite=[]
for parts in sprite: for parts in sprite:
with open(f'art/images/main_attributes/{parts}') as i: with open(f'art/images/{parts}') as i:
self.sprite.append(pg.image.load(i)) self.sprite.append(pg.image.load(i))
self.rect = [] self.rect = []
for each in self.sprite: for each in self.sprite:
@ -312,105 +226,66 @@ class Hearts():
sprite.append('noheart.png') sprite.append('noheart.png')
self.sprite = [] self.sprite = []
for parts in sprite: for parts in sprite:
with open(f'art/images/main_attributes/{parts}') as i: with open(f'art/images/{parts}') as i:
self.sprite.append(pg.image.load(i)) self.sprite.append(pg.image.load(i))
class Level(Label): class Level():
def __init__(self, x, y, width, height, level, text, font='simple', font_size=20, font_color='#1e90ff', sprite='label.png') -> None: def __init__(self, x, y, level, width, height, text, font, font_size) -> None:
super().__init__(x, y, width, height, text, font, font_size, font_color, sprite)
self.level = level
def draw(self, screen):
self.text = f'will to live: {self.level}%'
super().draw(screen)
class Thinks(Label):
def __init__(self, x, y, width, height, text, font='simple', font_size=15, font_color='#000000', sprite='thinks.png') -> None:
super().__init__(x, y, width, height, text, font, font_size, font_color, sprite)
self.scene = 0
def draw(self, screen, x, y):
if self.hidden:
return
self.x = x self.x = x
self.y = y self.y = y
super().draw(screen) self.level = level
self.width = width
def update(self, objects, main): self.height = height
if not self.hidden: self.font = pg.font.Font(f'fonts/{fonts[font]}', font_size)
if self.scene == 0 and not main.freezing: self.hidden = False
self.scene = 1 with open('art/images/label.png', 'r') as tb:
self.hidden = True self.box = pg.image.load(tb)
elif self.scene == 1 and main.talking: self.box = pg.transform.scale(self.box, (width, height))
self.scene = 2 self.labelRect = pg.Rect(self.x, self.y, self.width, self.height)
self.hidden = True self.labelSurf = self.font.render(text, True, '#1E90FF')
if self.scene == 1:
touches = pg.sprite.spritecollideany(main, objects[2]) def draw(self, screen):
if touches is not None and isinstance(touches, NPC): self.box.blit(self.labelSurf, [
self.text = 'I should press \"f\"' self.labelRect.width / 2 - self.labelSurf.get_rect().width / 2,
self.hidden = False self.labelRect.height / 2 - self.labelSurf.get_rect().height / 2
else: ])
self.hidden = False screen.blit(self.box, self.labelRect)
self.text = 'the lady over there'
class Book(): class Book():
def __init__(self, x, y, spells, current_spell, current_shield) -> None: def __init__(self, x, y, spells, current_spell, current_shield) -> None:
with open(f'art/images/main_attributes/book.png') as i: with open(f'art/images/book.png') as i:
self.sprite = pg.image.load(i) self.sprite = pg.image.load(i)
self.sprite = pg.transform.scale(self.sprite, (1280, 720)) self.sprite = pg.transform.scale(self.sprite, (1280, 720))
self.x = x self.x = x
self.y = y self.y = y
self.hidden = False self.hidden = True
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height()) self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
self.sp_list = spells self.sp_list = spells
self.current_sp = current_spell self.current_sp = current_spell
self.text_left = ["Dear User, ", "in case you fell on the ground too hard,", "here is a quick reminder:",
"You are a homeless person. One cold day","you went to the library to warm up yourself.",
"There you got bored and found and opened me.", "This lead to you being thrown into this world.",
"But you can find a way out of here again."]
self.text_right = ["This book will help you to survive.", "You can open and close me when pressing e.",
"Click on a picture to choose your spell.",
"Talk to fairies to unlock new spells!"]
self.buttons=[]
self.buttons_y = 400
self.buttons_x = 800
def draw(self, screen): def draw(self, screen):
if self.hidden: if self.hidden:
return return
self.rect.x, self.rect.y = self.x, self.y self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect) screen.blit(self.sprite, self.rect)
text_left_y = 100
text_right_y = 100
for text in self.text_left:
label = Label(100, text_left_y, 500, 50, text, font_color='#000000', sprite='empty.png')
label.draw(screen)
text_left_y += 50
for text in self.text_right:
label = Label(680, text_right_y, 500, 50, text, font_color='#000000', sprite='empty.png')
label.draw(screen)
text_right_y += 50
for button in self.buttons:
button.update(screen)
def addspell(self, spell): def addspell(self, spell):
if spell not in self.sp_list: if spell not in self.sp_list:
self.sp_list.append(spell) self.sp_list.append(spell)
self.current_sp = spell self.current_sp = spell
self.buttons.append(Button(self.buttons_x, self.buttons_y, 58, 50, f'{spell}_icon.png', 'medieval', 23, attributes=[spell], onclickFunction=self.update_spell))
self.buttons_y += 100
def update_spell(self, spell):
self.current_sp = spell
def update(self): def update(self):
pass pass
class Mobs(Fighter): class Mobs(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None: def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
self.drops = drops * (self.level / 2) self.drops = drops * (self.level / 2)
class Skeleton(Mobs):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops=0) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def chase(self, obj): def chase(self, obj):
x = obj[0][0].x x = obj[0][0].x
@ -420,136 +295,67 @@ class Mobs(Fighter):
moveto.scale_to_length(self.speed) moveto.scale_to_length(self.speed)
self.x += moveto[0] / fps self.x += moveto[0] / fps
self.y += moveto[1] / fps self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, obj[4])
if touches is not None and not isinstance(touches, Weapons):
if isinstance(touches, Obstacle):
if not touches.collision:
return
if touches.type == 'wall':
if touches.name == 'wall_l':
self.x += (2 + (self.x - touches.rect.x))
elif touches.name == 'wall_r':
self.x -= (2 + self.rect.width - (touches.rect.x - self.x))
if touches.name == 'wall_t':
self.y += (2 + (self.y - touches.rect.y))
elif touches.name == 'wall_b':
self.y -= (2 + self.rect.height - (touches.rect.y - self.y))
if self.x <= touches.rect.x: self.x -= (self.rect.width - (touches.rect.x - self.x))
elif self.x > touches.rect.x: self.x += (self.rect.width - (self.x - touches.rect.x - touches.rect.width * 0.66))
else: else:
self.attack(moveto, obj) self.attack(moveto, obj)
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
objects[0][0].killed.append(self.name)
self.hidden = True
objects[1].remove(self)
def update(self, obj):
self.chase(obj)
class Skeleton(Mobs):
def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite = 'people/skeleton.png', drops=0) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def attack(self, moveto, obj): def attack(self, moveto, obj):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks(): if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage)) obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage))
self.lastAttack = pg.time.get_ticks() self.lastAttack = pg.time.get_ticks()
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
self.hidden = True
objects[1].remove(self)
class Zombie(Mobs): def update(self, obj):
def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/zombie.png', drops=0) -> None: self.chase(obj)
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def attack(self, moveto, obj):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[3].append(Punch('punch', 100, self.x, self.y, moveto, self.damage, MainCharacter))
self.lastAttack = pg.time.get_ticks()
class Rat(Mobs):
def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/rat.png', drops=0) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def attack(self, moveto, obj):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[3].append(Punch('punch', 100, self.x, self.y, moveto, self.damage, MainCharacter))
self.lastAttack = pg.time.get_ticks()
class Weapons(Objects): class Weapons(Objects):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None: def __init__(self, name, ms, sprite, x, y, moveto, damage) -> None:
super().__init__(name, ms, sprite, x, y) super().__init__(name, ms, sprite, x, y)
self.moveto = moveto self.moveto = moveto
self.damage = damage self.damage = damage
self.life_ticks= life_ticks
self.spawn_tick = pg.time.get_ticks()
pos = vec(1,0) pos = vec(1,0)
angle = pos.angle_to(moveto) angle = pos.angle_to(moveto)
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.rotate(self.sprite, -angle) self.sprite = pg.transform.rotate(pg.image.load(i), -angle)
def die(self, objects, kills): def die(self, objects, kills):
touches = pg.sprite.spritecollideany(self, objects[0] + objects[1]) touches = pg.sprite.spritecollideany(self, objects[0] + objects[1])
if touches is not None and isinstance(touches, kills): if touches is not None and isinstance(touches, kills):
touches.hurt(self.damage, objects) touches.hurt(self.damage, objects)
self.hidden = True
if self in objects[3]:
objects[3].remove(self)
def move(self, objects):
self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps
if pg.time.get_ticks() - self.spawn_tick > self.life_ticks:
self.hidden = True self.hidden = True
objects[3].remove(self) objects[3].remove(self)
class Spells(Weapons): class Spells(Weapons):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None: def __init__(self, name, ms, sprite, x, y, moveto, damage) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks) super().__init__(name, ms, sprite, x, y, moveto, damage)
class Fireball(Spells): class Fireball(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'weapons/fireball.png', life_ticks=5000) -> None: def __init__(self, name, ms, x, y, moveto, damage, sprite = 'fireball.png') -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks) super().__init__(name, ms, sprite, x, y, moveto, damage)
def move(self):
self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps
def update(self, objects): def update(self, objects):
self.move(objects) self.move()
self.die(objects, Mobs) self.die(objects, Mobs)
class Windslash(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'weapons/windslash.png', life_ticks=1000) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
self.die(objects, Mobs)
def move(self, objects):
super().move(objects)
self.moveto = self.moveto.rotate(5)
class Arrow(Weapons): class Arrow(Weapons):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'weapons/arrow.png', life_ticks=5000) -> None: def __init__(self, name, ms, x, y, moveto, damage, sprite = 'arrow.png') -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks) super().__init__(name, ms, sprite, x, y, moveto, damage)
def move(self):
self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps
def update(self, objects): def update(self, objects):
self.move(objects) self.move()
self.die(objects, MainCharacter) self.die(objects, MainCharacter)
class Punch(Weapons):
def __init__(self, name, ms, x, y, moveto, damage, kills, sprite = 'weapons/empty.png', life_ticks=100) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
self.kills = kills
def update(self, objects):
self.move(objects)
self.die(objects, self.kills)