Compare commits

..

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

45 changed files with 1270 additions and 1561 deletions

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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 MiB

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: 488 KiB

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

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

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

Binary file not shown.

Before

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

1431
classes.py

File diff suppressed because it is too large Load diff

845
main.py
View file

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

555
viecher.py Normal file
View file

@ -0,0 +1,555 @@
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)