diff --git a/art/image files/dooor.kra b/art/image files/dooor.kra new file mode 100644 index 0000000..dea49d1 Binary files /dev/null and b/art/image files/dooor.kra differ diff --git a/art/image files/door.kra b/art/image files/door.kra new file mode 100644 index 0000000..82c52ce Binary files /dev/null and b/art/image files/door.kra differ diff --git a/art/image files/startscreen.kra b/art/image files/startscreen.kra new file mode 100644 index 0000000..a709c3e Binary files /dev/null and b/art/image files/startscreen.kra differ diff --git a/art/images/background/door_boss.png b/art/images/background/door_boss.png new file mode 100644 index 0000000..75c5a37 Binary files /dev/null and b/art/images/background/door_boss.png differ diff --git a/art/images/background/door_normal.png b/art/images/background/door_normal.png new file mode 100644 index 0000000..89ab1b8 Binary files /dev/null and b/art/images/background/door_normal.png differ diff --git a/art/images/background/startscreen.png b/art/images/background/startscreen.png new file mode 100644 index 0000000..64f279a Binary files /dev/null and b/art/images/background/startscreen.png differ diff --git a/art/images/icon.png b/art/images/icon.png new file mode 100644 index 0000000..5c58017 Binary files /dev/null and b/art/images/icon.png differ diff --git a/classes.py b/classes.py index 1198995..8a9ce87 100644 --- a/classes.py +++ b/classes.py @@ -1,4 +1,5 @@ import pygame +import random pygame.font.init() fonts = { @@ -205,9 +206,9 @@ class Scene(GameObjects): obj.update()""" def draw(self, screen): - if isinstance(self.objects, list): + """if isinstance(self.objects, list): for obj in self.objects[0] + self.objects[1] + self.objects[2] + self.objects[3]: - obj.draw(screen) + obj.draw(screen)""" self.level[self.current_level].draw(screen) def getObjects(self): @@ -220,6 +221,7 @@ class Stage(GameObjects): self.stage = stage self.rooms = rooms self.current = 0 + self.sortRooms(WIDTH) def update(self, objects): for room in self.rooms: @@ -241,12 +243,41 @@ class Stage(GameObjects): for room in self.rooms: if room.id == self.current: return room.getObjects() + + def sortRooms(self, WIDTH): + rooms = self.rooms + for i, room in enumerate(rooms): + if room.type != 'boss': + i += 1 + rand = random.randint(0, 25) + if rand < 7.5: + if rooms[i].id <= room.id: i += 1 + room.exits.append([rooms[i].id, rooms[i].type]) + elif rand < 20: + if rooms[i].id <= room.id: i += 1 + room.exits.append([rooms[i].id, rooms[i].type]) + if rand % 2 == 0: i += 1 + if not i >= len(self.rooms) - 2: + room.exits.append([rooms[i + 1].id, rooms[i + 1].type]) + else: + if rooms[i].id <= room.id: i += 1 + room.exits.append([rooms[i].id, rooms[i].type]) + if rand % 2 == 0: i += 1 + if not i >= len(self.rooms) - 2: + room.exits.append([rooms[i + 1].id, rooms[i + 1].type]) + if not i >= len(self.rooms) - 3: + room.exits.append([rooms[i + 2].id, rooms[i + 2].type]) + + for room in self.rooms: + print(str(room.id) + str(room.exits)) + room.createDoors(WIDTH) class Room(GameObjects): - def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, exits:list, id:int) -> None: + def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, id:int) -> None: super().__init__(name, _type, bg, objects, WIDTH, HEIGHT) - self.exits = exits + self.exits = [] self.id = id + self.doors = [] if self.type == 'normal' or self.type == 'boss': self.locked = True else: @@ -261,6 +292,17 @@ class Room(GameObjects): walls.append(Obstacle('wall_b', 'wall', None, True, 32, HEIGHT + 28, True, WIDTH=WIDTH, HEIGHT=4)) return walls + def createDoors(self, WIDTH): + if len(self.exits) == 1: + self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.75)), 4, self.exits[0][0])) + elif len(self.exits) == 2: + self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.45)), self.exits[0][0])) + self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.5), round(WIDTH * 0.9)), self.exits[1][0])) + else: + self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.3)), self.exits[0][0])) + self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.33), round(WIDTH * 0.6)), self.exits[1][0])) + self.doors.append(Door(f'door{self.id}', self.exits[2][1], random.randint(round(WIDTH * 0.63), round(WIDTH * 0.95)), self.exits[2][0])) + def update(self, objects): if objects is not None: self.objects = objects @@ -269,10 +311,12 @@ class Room(GameObjects): return def draw(self, screen): - screen.blit(self.background, (32, 32)) + """screen.blit(self.background, (32, 32)) if isinstance(self.objects, list): for obj in self.objects[3] + self.objects[0] + self.objects[1] + self.objects[2]: - obj.draw(screen) + obj.draw(screen)""" + for door in self.doors: + door.draw(screen) def getObjects(self): return self.objects @@ -292,12 +336,10 @@ class Obstacle(GameObjects): def draw(self, screen): if not self.hidden: screen.blit(self.background, self.rect) - else: - pygame.draw.rect(screen, '#e7f8e0', self.rect, 2) class Door(GameObjects): - def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, x: int, y: int, islocked=True) -> None: - super().__init__(name, _type, bg, objects, WIDTH, HEIGHT) + def __init__(self, name: str, _type: str, x: int, target:int, y: int=8, objects: list=None, WIDTH=None, HEIGHT=None, islocked=True) -> None: + super().__init__(name, _type, f'art/images/background/door_{_type}.png', objects, WIDTH, HEIGHT) self.rect = pygame.Rect((x, y), self.background.get_size()) self.locked = islocked diff --git a/main.py b/main.py index dda1f6e..f110c19 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,9 @@ def setUp(config): screen = pygame.display.set_mode(config["res"]) clock = pygame.time.Clock() pygame.display.set_caption('Between The Pages') - return screen, clock, True, True, "start.png", [] + with open('art/images/icon.png', 'r') as i: + pygame.display.set_icon(pygame.image.load(i)) + return screen, clock, True, True, "startscreen.png", [] def readConfig(): with open('config.json', 'r') as c: @@ -33,9 +35,10 @@ def genRooms(WIDTH, HEIGHT, type:str, objects:list): 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, 0)], [objects[0], objects[1], objects[2], objects[3], objects[4] + [room_objects[random.randint(0, 0)] for i in range(0, random.randint(0, 1))]], WIDTH - 64, HEIGHT - 64, [True, True, True, True], j) + Room(type, 'normal', 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) for j in range(random.randint(5, 10)) ] + 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, '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) return rooms @@ -100,6 +103,7 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): objects[0][0].book.addspell('windslash') scene.update(False, objects) + scene.draw(screen) else: objects[0][0].book.hidden = not freeze @@ -118,7 +122,7 @@ def village(screen, clock, running, background, isblack, WIDTH, HEIGHT): Obstacle('house', 'Interactable', 'art/images/background/house.png', False, 500, 150, WIDTH=180, HEIGHT=160)] npcs = [NPC('oldlady', 100, 'people/oldlady.png', 0, 200, 200)] 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) + room = Room('village', 'village', 'art/images/background/village.png', objects, WIDTH - 64, HEIGHT - 64, 0) freeze = True #Gameplay is freezed in certain situations main[0].health.health = 20 @@ -187,7 +191,7 @@ def house(screen, clock, running, background, isblack, WIDTH, HEIGHT): others = [] npcs = [NPC('elder', 100, 'people/reddy.png', 0, 200, 200)] objects = [main, mobs, npcs, weapons, others] - room = Room('house', 'house', 'art/images/background/insideHouse.png', objects, WIDTH - 64, HEIGHT - 64, [True, True, True, True], 0) + room = Room('house', 'house', 'art/images/background/insideHouse.png', objects, WIDTH - 64, HEIGHT - 64, 0) freeze = False #Gameplay is freezed in certain situations while running: @@ -286,7 +290,7 @@ def options(screen, clock, running, background, isblack, WIDTH, HEIGHT): def menu(screen, clock, running, background, isblack, WIDTH, HEIGHT): objects = [] - objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", village, attributes=[screen, clock, running, background, isblack, WIDTH, HEIGHT])) + objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", play, attributes=[screen, clock, running, background, isblack, WIDTH, HEIGHT])) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu)) objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame)) while running: