Compare commits

..

No commits in common. "dca6504d5ebdbd8f34343cafb34e776609ce2f1a" and "7369d2d1a8acc470598260a29fa4e6d8707a8b2e" have entirely different histories.

50 changed files with 335 additions and 1312 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

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: 4.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 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: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 654 B

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,351 +1,160 @@
import pygame import pygame
import random
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, font, font_size, buttonText='Button', onclickFunction=None, onePress=False):
def __init__(self, x, y, width, height, image, font, font_size, buttonText='', onclickFunction=None, onePress=False, attributes=None): 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.onclickFunction = onclickFunction
self.attributes = attributes self.onePress = onePress
self.onclickFunction = onclickFunction self.alreadyPressed = False
self.onePress = onePress
self.alreadyPressed = False with open('art/images/textbox.png', 'r') as tb:
self.box = pygame.image.load(tb)
with open(f'art/images/box/{image}', 'r') as tb: self.box = pygame.transform.scale(self.box, (width, height))
self.box = pygame.image.load(tb)
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):
mousePos = pygame.mouse.get_pos()
def update(self, screen): if self.buttonRect.collidepoint(mousePos):
mousePos = pygame.mouse.get_pos() if pygame.mouse.get_pressed(num_buttons=3)[0]:
if self.buttonRect.collidepoint(mousePos): if self.onePress:
if pygame.mouse.get_pressed(3)[0]: self.onclickFunction()
if self.onePress: elif not self.alreadyPressed:
self.onclickFunction() if 'play' in str(self.onclickFunction):
elif not self.alreadyPressed: self.onclickFunction(screen, clock, running, background, isblack, WIDTH, HEIGHT)
if self.attributes: self.alreadyPressed = True
self.onclickFunction(*self.attributes) else:
self.alreadyPressed = True self.onclickFunction()
else: self.alreadyPressed = True
self.onclickFunction() else:
self.alreadyPressed = True self.alreadyPressed = False
else: self.box.blit(self.buttonSurf, [
self.alreadyPressed = False self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2,
self.box.blit(self.buttonSurf, [ self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2
self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2, ])
self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2 screen.blit(self.box, self.buttonRect)
])
screen.blit(self.box, self.buttonRect)
class DropDown():
class Label(): def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options):
def __init__(self, x, y, width, height, text, font='simple', font_size=20, font_color = '#1e90ff', sprite = 'label.png') -> None: self.rect = pygame.Rect(x, y, width, height)
self.x = x self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.y = y self.main = main
self.width = width self.options = options
self.height = height self.draw_menu = False
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size) self.menu_active = False
self.font_color = font_color self.active_option = -1
self.text = text
self.hidden = False with open('art/images/textbox.png', 'r') as tb:
self.sprite = sprite self.box = pygame.image.load(tb)
with open(f'art/images/box/{sprite}', 'r') as tb: self.box = pygame.transform.scale(self.box, (width, height))
self.box = pygame.image.load(tb)
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)
surface = self.font.render(self.main, 1, (0, 0, 0))
def draw(self, screen): self.box.blit(surface, [
if self.hidden: self.rect.width/2 - surface.get_rect().width/2,
return self.rect.height/2 - surface.get_rect().height/2
with open(f'art/images/box/{self.sprite}', 'r') as tb: ])
self.box = pygame.image.load(tb) screen.blit(self.box, surface.get_rect(center = self.rect.center))
self.box = pygame.transform.scale(self.box, (self.width,self.height))
self.labelRect = pygame.Rect(self.x, self.y, self.width, self.height) if self.draw_menu:
self.labelSurf = self.font.render(self.text, True, self.font_color) for i, text in enumerate(self.options):
self.box.blit(self.labelSurf, [ rect = self.rect.copy()
self.labelRect.width / 2 - self.labelSurf.get_rect().width / 2, rect.y += (i+1) * self.rect.height
self.labelRect.height / 2 - self.labelSurf.get_rect().height / 2 rect.x = self.rect.x
]) #pygame.draw.rect(screen, self.color_option[1 if i == self.active_option else 0], rect, 0)
screen.blit(self.box, self.labelRect) #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))
self.box.blit(surface, [
class DropDown(): rect.width/2 - surface.get_rect().width/2,
def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options): rect.height/2 - surface.get_rect().height/2
self.rect = pygame.Rect(x, y, width, height) ])
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size) screen.blit(self.box, rect)
self.main = main
self.options = options def update(self, event_list):
self.draw_menu = False mpos = pygame.mouse.get_pos()
self.menu_active = False self.menu_active = self.rect.collidepoint(mpos)
self.active_option = -1 self.active_option = -1
for i in range(len(self.options)):
with open('art/images/box/textbox.png', 'r') as tb: rect = self.rect.copy()
self.box = pygame.image.load(tb) rect.y += (i+1) * self.rect.height
self.box = pygame.transform.scale(self.box, (width, height)) if rect.collidepoint(mpos):
self.active_option = i
def draw(self, screen): break
#pygame.draw.rect(screen, self.color_menu[self.menu_active], self.rect, 0)
surface = self.font.render(self.main, 1, (0, 0, 0)) if not self.menu_active and self.active_option == -1:
self.box.blit(surface, [ self.draw_menu = False
self.rect.width/2 - surface.get_rect().width/2, #self.draw_menu = True
self.rect.height/2 - surface.get_rect().height/2 #return -1
]) if pygame.mouse.get_pressed(num_buttons=3)[0]:
screen.blit(self.box, surface.get_rect(center = self.rect.center)) if self.menu_active:
self.draw_menu = not self.draw_menu
if self.draw_menu: elif self.draw_menu and self.active_option >= 0:
for i, text in enumerate(self.options): self.draw_menu = False
rect = self.rect.copy() return self.active_option
rect.y += (i+1) * self.rect.height return -1
rect.x = self.rect.x
#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)) class GameObjects():
#screen.blit(msg, msg.get_rect(center = rect.center)) def __init__(self, name:str, _type:str, bg, objects:list) -> None:
surface = self.font.render(text, 1, (0, 0, 0)) self.name = name
self.box.blit(surface, [ self.type = _type
rect.width/2 - surface.get_rect().width/2, self.background = bg
rect.height/2 - surface.get_rect().height/2 self.objects = objects
])
screen.blit(self.box, rect)
class Scene(GameObjects):
def update(self, event_list): def __init__(self, name:str, _type:str, bg, objects:list) -> None:
mpos = pygame.mouse.get_pos() super().__init__(name, _type, bg, objects)
self.menu_active = self.rect.collidepoint(mpos)
self.active_option = -1
for i in range(len(self.options)): class Room(GameObjects):
rect = self.rect.copy() def __init__(self, name:str, _type:str, bg, objects:list, exits:list) -> None:
rect.y += (i+1) * self.rect.height super().__init__(name, _type, bg, objects)
if rect.collidepoint(mpos): self.exits = exits
self.active_option = i if self.type == 'normal' or self.type == 'boss':
break self.locked = True
else:
if not self.menu_active and self.active_option == -1: self.locked = False
self.draw_menu = False
#self.draw_menu = True
#return -1
if pygame.mouse.get_pressed(num_buttons=3)[0]:
if self.menu_active:
self.draw_menu = not self.draw_menu
elif self.draw_menu and self.active_option >= 0:
self.draw_menu = False
return self.active_option
return -1
class GameObjects():
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT) -> None:
self.name = name
self.type = _type
self.background = bg
if bg != None:
if WIDTH != None and HEIGHT != None:
with open(bg, 'r') as bg:
self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT])
else:
with open(bg, 'r') as bg:
self.background = pygame.transform.scale2x(pygame.image.load(bg))
self.objects = objects
def update(self, objects):
return
def draw(self, screen):
return
class Scene(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, level:list) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.level = level
self.current_level = 0
self.update()
def update(self, change:bool=False, objects=None):
if change:
self.current_level += 1
self.level[self.current_level].update(objects)
self.background = self.level[self.current_level].background
"""if isinstance(self.objects, list):
for obj in self.objects[0] + self.objects[1] + self.objects[2]:
obj.update()"""
def draw(self, screen):
"""if isinstance(self.objects, list):
for obj in self.objects[0] + self.objects[1] + self.objects[2] + self.objects[3]:
obj.draw(screen)"""
self.level[self.current_level].draw(screen)
def getObjects(self):
return self.level[self.current_level].getObjects()
class Stage(GameObjects):
def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, stage:str, rooms:list) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.stage = stage
self.rooms = rooms
self.current = 0
self.sortRooms(WIDTH)
def update(self, objects):
for room in self.rooms:
if room.id == self.current:
room.update(objects)
self.background = room.background
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
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()
def sortRooms(self, WIDTH):
rooms = self.rooms
for i, room in enumerate(rooms):
if room.type != 'boss':
i += 1
rand = random.randint(0, 25)
if rand < 7.5:
if rooms[i].id <= room.id: i += 1
room.exits.append([rooms[i].id, rooms[i].type])
elif rand < 20:
if rooms[i].id <= room.id: i += 1
room.exits.append([rooms[i].id, rooms[i].type])
if rand % 2 == 0: i += 1
if not i >= len(self.rooms) - 2:
room.exits.append([rooms[i + 1].id, rooms[i + 1].type])
else:
if rooms[i].id <= room.id: i += 1
room.exits.append([rooms[i].id, rooms[i].type])
if rand % 2 == 0: i += 1
if not i >= len(self.rooms) - 2:
room.exits.append([rooms[i + 1].id, rooms[i + 1].type])
if not i >= len(self.rooms) - 3:
room.exits.append([rooms[i + 2].id, rooms[i + 2].type])
for room in self.rooms:
print(str(room.id) + str(room.exits))
room.createDoors(WIDTH)
class Room(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, id:int) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.exits = []
self.id = id
self.doors = []
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 createDoors(self, WIDTH):
if not self.type == 'boss':
if len(self.exits) == 1:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.75)), 4, self.exits[0][0]))
elif len(self.exits) == 2:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.45)), self.exits[0][0]))
self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.5), round(WIDTH * 0.9)), self.exits[1][0]))
else:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.3)), self.exits[0][0]))
self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.33), round(WIDTH * 0.6)), self.exits[1][0]))
self.doors.append(Door(f'door{self.id}', self.exits[2][1], random.randint(round(WIDTH * 0.63), round(WIDTH * 0.95)), self.exits[2][0]))
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)"""
for door in self.doors:
door.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)
class Door(GameObjects):
def __init__(self, name: str, _type: str, x: int, target:int, y: int=8, objects: list=None, WIDTH=None, HEIGHT=None, islocked=True) -> None:
super().__init__(name, _type, f'art/images/background/door_{_type}.png', 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

View file

@ -1,22 +0,0 @@
Game:
Rogue-like Game mit Story
Pixel
viele Gegner:
Skelette
Zombies
Story:
Homeless guy in Berlin (oder so) im Winter in einer Stadtbibliothek, weil warm und Shelter.
er hasst eigentlich Bücher, aber aus Langeweile durchstöbert er die Bibo
findet cool aussehendes antikes/magisches Buch, nimmt es aus dem Regal, blättert es auf und wird ohnmächtig
-> Erwacht als magische Person in magischer Welt wieder
Buch dient als Skillbaum (verschiedene Kapitel)
Kampfmagier
Heilender Magier -> Priester?
Elementmagier(?)
maybe noch irgendwas 4.
Ziel(e)
-> Zurückkommen
-> Happy werden (?)

558
main.py
View file

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

BIN
test1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

BIN
test2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

View file

@ -1,555 +1,56 @@
import pygame as pg import pygame
from classes import *
from main import *
import random
vec = pg.math.Vector2
fps = 60 fps = 60
class Character():
pg.font.init() def __init__(self, name, ms, sprite) -> None:
fonts = {
'medieval': 'medieval.ttf',
'minecraft': 'Minecraft Evenings.otf',
'3dpixel': '3D-Pixel.ttf',
'8bit': '8bitlim.ttf',
'8bito': '8blimro.ttf',
'arcade': 'ARCADECLASSIC.ttf',
'modern_game': 'astron boy video.otf',
'modern': 'astron boy.otf',
'wonder': 'Beyond Wonderland.ttf',
'curved': 'Digitag.ttf',
'simple': 'DisposableDroidBB.ttf',
'rounded': 'dpcomic.ttf',
'playfull': 'Endalian Script.ttf',
'blocky': 'FREAKSOFNATURE.ttf',
'catchy': 'Future TimeSplitters.otf',
'simple_wide': 'Halo3.ttf',
'simple_fat': 'INVASION2000.ttf',
'very_gamy': 'ka1.ttf',
'simple_round': 'Karma Suture.otf',
'mono': 'manaspc.ttf',
'damaged': 'Merchant Copy.ttf',
'big_natural': 'MorialCitadel.TTF',
'spacy': 'nasalization-rg.otf',
'sci-fi': 'neuropol.otf',
'hollow_big_edge': 'papercut.ttf',
'space_shuttle': 'pdark.ttf',
'thin': 'PixelFJVerdana12pt.ttf',
'random': 'Seattle Avenue.ttf',
'pixel': 'yoster.ttf'
}
class Objects():
def __init__(self, name, ms, sprite, x, y) -> None:
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 = pygame.image.load(i)
self.x = x self.x = 524
self.y = y self.y = 524
self.hidden = False self.hidden = False
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
self.rect = pygame.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
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)
pg.draw.rect(screen, '#ef0120', self.rect, 2)
class NPC(Objects):
def __init__(self, name, ms, sprite, convo_scene, x, y) -> None:
super().__init__(name, ms, sprite, x, y)
self.talking = False
self.hidden = False
self.conversation = Convo(self, convo_scene)
self.lastUpdate = pg.time.get_ticks()
def talk(self, objects):
self.talking = True
objects[0][0].talking = True
def draw(self, screen):
super().draw(screen)
if self.talking:
self.conversation.draw(screen)
def update(self, keys, objects):
if self.name == 'oldlady':
if self.conversation.convo_scene==0 and 'rat' in objects[0][0].killed and objects[1]==[]:
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(Label): class NPC(Character):
def __init__(self, npc, convo_scene, text='', x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None: pass
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):
self.text = self.findConversation()[2][self.convo_act]
super().draw(screen)
def findConversation(self): class Fighter(Character):
for convo in self.convos: def __init__(self, name, ms, sprite, health, damage, level, asp, atr) -> None:
if convo[0] == self.npc.name and convo[1] == self.convo_scene: super().__init__(name, ms, sprite)
return convo
return ['ERROR']
def update(self, keys, objects):
if keys[pg.K_f]:
convo = self.findConversation()
if self.convo_act+1 < len(convo[2]):
self.text = convo[2][self.convo_act]
self.convo_act += 1
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):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
super().__init__(name, ms, sprite, x, y)
self.health = health self.health = health
self.damage = damage self.damage = damage
self.level = level self.level = level
self.attack_speed = asp self.attack_speed = asp
self.attack_range = atr self.attack_range = atr
self.lastHurt = pg.time.get_ticks()
self.lastAttack = pg.time.get_ticks()
self.hurtCooldown = 0
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, health, damage, level, asp, atr, weapon=None, shield=None) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) super().__init__(name, ms, sprite, health, damage, level, asp, atr)
self.book = Book(0, 0, [], None, None) self.attack_spell = weapon
self.shield_spell = shield
self.talking = False self.talking = False
self.level = Level(1000, 38, 150, 40, level, 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.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 update(self, keys):
if self.hidden: if keys[pygame.K_w]:
return self.y -= self.speed / fps
self.rect.x, self.rect.y = self.x, self.y if keys[pygame.K_a]:
screen.blit(self.sprite, self.rect) self.x -= self.speed / fps
self.health.draw(screen) if keys[pygame.K_s]:
self.level.draw(screen) self.y += self.speed / fps
self.book.draw(screen) if keys[pygame.K_d]:
pg.draw.rect(screen, '#e900fa', self.rect, 2) self.x += self.speed / fps
if self.thinks.hidden == False:
self.thinks.draw(screen, self.x+20, self.y-100)
def hurt(self, damage, objects):
if not self.talking:
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):
moveto = vec(0, 0)
if keys[pg.K_w] or keys[pg.K_UP]:
moveto += vec(0, -1)
if keys[pg.K_a] or keys[pg.K_LEFT]:
moveto += vec(-1, 0)
if keys[pg.K_s] or keys[pg.K_DOWN]:
moveto += vec(0, 1)
if keys[pg.K_d] or keys[pg.K_RIGHT]:
moveto += vec(1, 0)
if not moveto == vec(0, 0):
moveto.scale_to_length(self.speed)
self.x += moveto[0] / fps
self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, objects[2] + objects[4])
if touches is not None and not isinstance(touches, Weapons):
if isinstance(touches, Obstacle):
if not touches.collision:
# print(touches.name)
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))
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):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
moveto = mouse - vec(self.x, self.y)
if self.book.current_sp == 'fireball':
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:
weapon = Punch('punch', 100, self.x, self.y, moveto, 1, Mobs, life_ticks=500)
obj[3].append(weapon)
self.lastAttack = pg.time.get_ticks()
def update(self, keys, mouse, objects):
if not self.talking:
self.walk(keys, objects)
if pg.mouse.get_pressed()[0]:
self.attack(objects, vec(mouse))
self.thinks.update(objects, self)
if self.health.health <= 0:
return 'village'
else:
return self.obstacle_interaction(objects)
class Hearts():
def __init__(self, health, sprite, x, y, hurtCooldown) -> None:
self.x = x
self.y = y
self.health = health
self.lastHurt = pg.time.get_ticks()
self.hurtCooldown = hurtCooldown
self.hidden = False
self.sprite=[]
for parts in sprite:
with open(f'art/images/main_attributes/{parts}') as i:
self.sprite.append(pg.image.load(i))
self.rect = []
for each in self.sprite:
self.rect.append(pg.Rect(self.x, self.y, each.get_width(), each.get_height()))
def hurt(self,damage):
if self.lastHurt + self.hurtCooldown < pg.time.get_ticks():
self.health -= damage
self.lastHurt = pg.time.get_ticks()
self.update()
def draw(self, screen):
if self.hidden:
return
for i in range(0, 5):
self.rect[i].x, self.rect[i].y = self.x + i * 20, self.y
screen.blit(self.sprite[i], self.rect[i])
def update(self):
sprite = []
for i in range(0, 5):
if self.health >= 4 + 4 * i:
sprite.append('fullheart.png')
elif self.health == 3 + 4 * i:
sprite.append('dreiviertelheart.png')
elif self.health >= 2 + 4 * i:
sprite.append('halfheart.png')
elif self.health >= 1 + 4 * i:
sprite.append('viertelheart.png')
elif self.health <= 4 * i:
sprite.append('noheart.png')
self.sprite = []
for parts in sprite:
with open(f'art/images/main_attributes/{parts}') as i:
self.sprite.append(pg.image.load(i))
class Level(Label):
def __init__(self, x, y, width, height, level, text, font='simple', font_size=20, font_color='#1e90ff', sprite='label.png') -> 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.y = y
super().draw(screen)
def update(self, objects, main):
if not self.hidden:
if self.scene == 0 and not main.freezing:
self.scene = 1
self.hidden = True
elif self.scene == 1 and main.talking:
self.scene = 2
self.hidden = True
if self.scene == 1:
touches = pg.sprite.spritecollideany(main, objects[2])
if touches is not None and isinstance(touches, NPC):
self.text = 'I should press \"f\"'
self.hidden = False
else:
self.hidden = False
self.text = 'the lady over there'
class Book():
def __init__(self, x, y, spells, current_spell, current_shield) -> None:
with open(f'art/images/main_attributes/book.png') as i:
self.sprite = pg.image.load(i)
self.sprite = pg.transform.scale(self.sprite, (1280, 720))
self.x = x
self.y = y
self.hidden = False
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
self.sp_list = spells
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):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
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):
if spell not in self.sp_list:
self.sp_list.append(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):
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, health, damage, level, asp, atr, drops) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) super().__init__(name, ms, sprite, health, damage, level, asp, atr)
self.drops = drops * (self.level / 2) self.drops = drops * (self.level / 2)
def chase(self, obj):
x = obj[0][0].x
y = obj[0][0].y
moveto = vec(x, y) - vec(self.x, self.y)
if not (moveto).length() <= self.attack_range:
moveto.scale_to_length(self.speed)
self.x += moveto[0] / 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:
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):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage))
self.lastAttack = pg.time.get_ticks()
class Zombie(Mobs):
def __init__(self, name, ms, x, y, health, damage, level, asp, atr, sprite='people/zombie.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 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):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None:
super().__init__(name, ms, sprite, x, y)
self.moveto = moveto
self.damage = damage
self.life_ticks= life_ticks
self.spawn_tick = pg.time.get_ticks()
pos = vec(1,0)
angle = pos.angle_to(moveto)
self.sprite = pg.transform.rotate(self.sprite, -angle)
def die(self, objects, kills):
touches = pg.sprite.spritecollideany(self, objects[0] + objects[1])
if touches is not None and isinstance(touches, kills):
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
objects[3].remove(self)
class Spells(Weapons):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
class Fireball(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'weapons/fireball.png', life_ticks=5000) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
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):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'weapons/arrow.png', life_ticks=5000) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
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)