Compare commits

..

57 commits

Author SHA1 Message Date
cfc8643907 Merge pull request 'Fixed fairy and added boss health bar' (#92) from Development into main
Reviewed-on: InfoProjekt/game#92
2024-03-13 10:52:10 +00:00
dff3b582d7 Merge pull request 'Implemented Boss bar and fixed fairy' (#87) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#87
2024-03-13 09:43:47 +00:00
SpagettiFisch
690a00b718 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-13 10:38:09 +01:00
SpagettiFisch
368b033aab implemented boss health bar
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-13 10:37:44 +01:00
d01e511739 Merge pull request '0.1 Merge' (#85) from Development into main
Reviewed-on: InfoProjekt/game#85
2024-03-12 21:02:50 +00:00
57ffcf133c changed will to live (level) back to non dev
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-12 21:02:21 +00:00
45c18a7713 changed will to live (level) back to non dev
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-12 21:00:05 +00:00
e383c8afed Merge pull request 'changed to normal version again (no dev shortcuts)' (#84) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#84
2024-03-12 20:51:23 +00:00
SpagettiFisch
64a3381eb9 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-12 21:50:04 +01:00
SpagettiFisch
a72349f7df changed to normal version again (no dev shortcuts)
changed font for Think (because the f looked like a p)
uploaded bossbar images

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-12 21:45:52 +01:00
3448ec4120 Update classes.py
sound effects für reddy, zombie, skelett, oldman attack, hurt sound effect für oldman, Tür und Portal sounds
2024-03-12 17:52:27 +00:00
c81b3fa355 Upload files to "audio/soundeffects" 2024-03-12 16:48:24 +00:00
4d90ac3e38 Upload files to "audio/soundeffects" 2024-03-12 16:47:40 +00:00
dfc2ea8086 Upload files to "audio/soundeffects" 2024-03-12 16:46:44 +00:00
b124f8817c Upload files to "art/images/people" 2024-03-12 16:18:45 +00:00
d4da02ee8d Delete art/images/people/fairy.png 2024-03-12 16:18:31 +00:00
7a85a049de Delete audio/soundeffects/altefrauspeak.mp3 2024-03-12 15:57:10 +00:00
5db4df24a0 Delete audio/soundeffects/dorfaeltesterspeak.mp3 2024-03-12 15:57:04 +00:00
2f8e393c1e Delete viecher.py
nichts mehr drin
2024-03-12 15:56:39 +00:00
08edd05403 Merge pull request 'room update and boss' (#83) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#83
2024-03-12 11:52:26 +00:00
SpagettiFisch
fb3ba25b89 managed the room thing, you can now actually switch rooms
the boss is killable
you get a tbc screen after killing the boss

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-12 12:50:13 +01:00
SpagettiFisch
04e0b68cd7 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-12 07:41:12 +01:00
SpagettiFisch
d132757717 added new npc
started migrating object creation into the room classs

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-12 07:39:36 +01:00
a13042ffdd Upload files to "art/images/weapons" 2024-03-11 21:49:24 +00:00
f482a2445c Delete audio/soundeffects/fireball.mp3 2024-03-11 21:44:35 +00:00
df7aff13df Upload files to "audio/soundeffects" 2024-03-11 21:44:26 +00:00
e5adb43ec6 Delete audio/soundeffects/fireball.mp3 2024-03-11 21:44:05 +00:00
6d68ec88e0 Upload files to "audio/soundeffects" 2024-03-11 21:43:51 +00:00
f458a4e89b Delete audio/soundeffects/fireball.mp3 2024-03-11 21:43:30 +00:00
c9c87da15a Delete audio/soundeffects/door.mp3 2024-03-11 21:43:27 +00:00
37aee3dfff Upload files to "audio/soundeffects" 2024-03-11 21:43:13 +00:00
38ddb5fbd6 Delete audio/soundeffects/door.mp3 2024-03-11 21:42:38 +00:00
8198079512 Delete audio/soundeffects/fireball.mp3 2024-03-11 21:42:34 +00:00
6ee5cba861 Upload files to "audio/soundeffects" 2024-03-11 21:42:12 +00:00
89255505ec Upload files to "art/images/people" 2024-03-11 21:05:33 +00:00
a35dcfb823 Update main.py 2024-03-11 19:47:09 +00:00
d08274c2f6 Upload files to "audio/soundeffects" 2024-03-11 19:27:59 +00:00
6601e00318 Upload files to "audio/soundeffects" 2024-03-11 19:22:27 +00:00
b2ac429eaa Delete audio/soundeffects/a 2024-03-11 19:17:12 +00:00
98b8a2bcb6 Upload files to "audio/soundeffects" 2024-03-11 19:17:07 +00:00
a7dd1dbf27 Upload files to "audio/music" 2024-03-11 19:09:46 +00:00
9e9ab2156a Delete audio/music/a 2024-03-11 19:07:23 +00:00
3e655a09f3 Upload files to "audio/music" 2024-03-11 19:07:13 +00:00
585d19fb37 Delete audio/soundeffects/fireball.mp3 2024-03-11 18:58:17 +00:00
f755bef435 Upload files to "audio/soundeffects" 2024-03-11 18:58:10 +00:00
065036d430 Add audio/soundeffects/a 2024-03-11 18:56:13 +00:00
46c05a8de5 Delete audio/soundeffects 2024-03-11 18:55:56 +00:00
643e74ab58 Add audio/soundeffects 2024-03-11 18:55:35 +00:00
72f0050055 Add audio/music/a 2024-03-11 18:55:05 +00:00
0dda6fd38c Delete music /a 2024-03-11 18:50:56 +00:00
19f5027b60 Add music /a 2024-03-11 18:49:44 +00:00
SpagettiFisch
74abed824d Merge branch 'main' of https://git.spafi.eu/Spafi/game 2024-03-11 11:46:35 +01:00
073062ce0c Merge pull request 'Development' (#8) from InfoProjekt/game:Development into main
Reviewed-on: Spafi/game#8
2024-03-11 10:46:24 +00:00
SpagettiFisch
76ef4f6559 doors can now be passed through
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-11 11:44:58 +01:00
aa83465577 Upload files to "art/images/people" 2024-03-11 10:39:37 +00:00
80ec47143e Merge pull request 'Update viecher.py' (#82) from jaffa-patch-1 into Development
Reviewed-on: InfoProjekt/game#82
2024-03-11 06:56:30 +00:00
a9770aff7e Update viecher.py
added animations for old man walking, old man attacking and zombie attacking
2024-03-10 23:47:22 +00:00
39 changed files with 1561 additions and 1317 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
art/image files/door.kra~ Normal file

Binary file not shown.

BIN
art/image files/field.kra~ Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

BIN
art/images/people/fairy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

BIN
art/images/people/vivi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 B

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.

BIN
audio/soundeffects/door.mp3 Normal 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.

BIN
audio/soundeffects/wind.mp3 Normal file

Binary file not shown.

Binary file not shown.

1474
classes.py

File diff suppressed because it is too large Load diff

849
main.py
View file

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

View file

@ -1,555 +0,0 @@
import pygame as pg
from classes import *
from main import *
import random
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, '#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):
def __init__(self, npc, convo_scene, text='', x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
super().__init__(x, y, width, height, text, font, font_size)
self.convo_act=0
self.npc = npc
self.convo_scene = convo_scene
self.convos = [
['oldlady', 0, ['There are so many rats here.', 'I wish someone would to something against that.','An experienced fighter could kill them.', 'For them it only takes a mouseclick.']],
['oldlady', 1, ['Oh, did you kill all the rats?', 'You must be the chosen one!', 'It would be nice if you would go and talk to the village elder.']],
['elder', 0, ['Who are you?', 'You want to help us?', 'We have a serious problem with monsters.', 'One day they appeared out of nowhere and started attacking.', 'When you jump into the portal over there,', 'You will be send to a place with monsters.', 'PLEASE help us!']],
['elder', 1, ['Who are you?', 'You want to help us?', 'We have a serious problem with monsters.', 'One day they appeared out of nowhere and started attacking.', 'When you jump into the portal over there,', 'You will be send to a place with monsters.', 'PLEASE help us!']]
]
def draw(self, screen):
self.text = self.findConversation()[2][self.convo_act]
super().draw(screen)
def findConversation(self):
for convo in self.convos:
if convo[0] == self.npc.name and convo[1] == self.convo_scene:
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.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, killed =[]) -> 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, 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):
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, '#e900fa', self.rect, 2)
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):
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)
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)