Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

89 changed files with 929 additions and 1562 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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 B

View file

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B

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

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: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

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: 68 B

After

Width:  |  Height:  |  Size: 68 B

View file

Before

Width:  |  Height:  |  Size: 495 B

After

Width:  |  Height:  |  Size: 495 B

View file

Before

Width:  |  Height:  |  Size: 581 B

After

Width:  |  Height:  |  Size: 581 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 KiB

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: 380 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 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: 497 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

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: 326 B

View file

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

View file

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

View file

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 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

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 197 B

View file

Before

Width:  |  Height:  |  Size: 505 B

After

Width:  |  Height:  |  Size: 505 B

View file

Before

Width:  |  Height:  |  Size: 588 B

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

1407
classes.py

File diff suppressed because it is too large Load diff

696
main.py
View file

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

387
viecher.py Normal file
View file

@ -0,0 +1,387 @@
import pygame as pg
from classes import *
from main import *
vec = pg.math.Vector2
fps = 60
pg.font.init()
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.speed = ms
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.image.load(i))
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())
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
pg.draw.rect(screen, '#ff0000', self.rect, 2)
class NPC(Objects):
def __init__(self, name, ms, sprite, convo_act, x, y) -> None:
super().__init__(name, ms, sprite, x, y)
self.talking = False
self.hidden = False
self.conversation = Convo('Hello, you can shoot fireballs with f now.', convo_act, 'person')
def talk(self, objects):
self.talking = True
objects[0][0].talking = True
self.conversation.hidden = False
def draw(self, screen):
super().draw(screen)
if self.talking:
self.conversation.draw(screen)
def update(self, keys, objects):
if self.talking:
self.conversation.update(keys, objects)
class Convo(Label):
def __init__(self, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
super().__init__(x, y, width, height, text, font, font_size)
def update(self, keys, objects):
if keys[pg.K_SPACE]:
objects[0][0].book.addspell('fireball')
self.talking = False
objects[0][0].talking = False
self.hidden = True
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.damage = damage
self.level = level
self.attack_speed = asp
self.attack_range = atr
self.lastHurt = pg.time.get_ticks()
self.lastAttack = pg.time.get_ticks()
self.hurtCooldown = 0
class MainCharacter(Fighter):
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)
self.book = Book(0, 0, [], None, None)
self.talking = False
self.level = Level(1000, 38, 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)
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
self.health.draw(screen)
self.level.draw(screen)
self.book.draw(screen)
pg.draw.rect(screen, '#ff00ee', self.rect, 2)
def hurt(self, damage, objects):
if not self.talking:
self.health.hurt(damage)
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[1] + objects[2] + objects[3])
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))
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))
#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 isinstance(touches, NPC):
touches.talk(objects)
"""
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, 5)
else:
return
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 keys[pg.K_f]:
self.attack(objects, vec(mouse))
if self.health.health <= 0:
return False
else:
return True
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/{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/{parts}') as i:
self.sprite.append(pg.image.load(i))
class Level(Label):
def __init__(self, x, y, width, height, text, font, font_size) -> None:
super().__init__(x, y, width, height, text, font, font_size)
class Book():
def __init__(self, x, y, spells, current_spell, current_shield) -> None:
with open(f'art/images/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 = True
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.labels = [Label(100, 100, 500, 50, "Dear User, ", font_color='#000000', sprite='empty.png'),
Label(100, 150, 500, 50, "this book will help you to survive.", font_color='#000000', sprite='empty.png'),
Label(100, 200, 500, 50, "Click on a picture to choose your spell.", font_color='#000000', sprite='empty.png'),
Label(100, 250, 500, 50, "Talk to fairies to unlock new spells!", font_color='#000000', sprite='empty.png')]
self.buttons=[]
self.buttons_height = 400
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
for label in self.labels:
label.draw(screen)
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(200, self.buttons_height, 58, 50, f'{spell}_icon.png', 'medieval', 23, attributes=[spell], onclickFunction=self.update_spell))
self.buttons_height += 100
def update_spell(self, spell):
self.current_sp = spell
def update(self):
pass
class Mobs(Fighter):
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)
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):
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
else:
self.attack(moveto, obj)
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()
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
self.hidden = True
objects[1].remove(self)
def update(self, obj):
self.chase(obj)
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)
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.transform.rotate(pg.image.load(i), -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
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 = '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 = 'windslash.png', life_ticks=500) -> 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 = '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)