Compare commits

...
Sign in to create a new pull request.

60 commits

Author SHA1 Message Date
dca6504d5e Merge pull request 'Development' (#2) from InfoProjekt/game:Development into Development
Reviewed-on: #2
2024-03-10 23:39:30 +00:00
cc24152e7f Upload files to "art/images/people" 2024-03-10 23:37:57 +00:00
01d91e68c7 Merge pull request 'fied a bug were the game would crash during door creation' (#81) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#81
2024-03-10 22:07:53 +00:00
SpagettiFisch
3883237f91 fied a bug were the game would crash during door creation
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 23:07:38 +01:00
8dd5ad2dc6 Merge pull request 'game icon and room update' (#80) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#80
2024-03-10 22:03:06 +00:00
SpagettiFisch
7709fd52f7 Merge branch 'main' of https://git.spafi.eu/Spafi/game 2024-03-10 22:59:55 +01:00
SpagettiFisch
0f755996b6 added icon
added door sprite
addedd startscreen

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 22:59:46 +01:00
SpagettiFisch
229435f682 added room constallations
now with useless doors

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 22:58:58 +01:00
67ba9a62a1 Merge pull request 'Development' (#7) from InfoProjekt/game:Development into main
Reviewed-on: Spafi/game#7
2024-03-10 21:29:19 +00:00
73508253c4 Merge pull request 'storyline' (#79) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#79
2024-03-10 18:02:21 +00:00
f86f2e5dce added last part of tutorial 2024-03-10 18:42:40 +01:00
fc3773150a - 2024-03-10 16:19:57 +01:00
04547161a3 picture 2024-03-10 16:05:15 +01:00
93bbb0eb84 Stoorryy 2024-03-10 16:05:09 +01:00
4e976c3895 wuhu 2024-03-10 15:14:21 +01:00
e540693def story yea yea 2024-03-10 15:06:44 +01:00
248fc2a112 fix fix 2024-03-10 14:30:20 +01:00
726c5ee2a2 storyline 2024-03-10 14:23:22 +01:00
bb8ec349dd Merge branch 'main' of https://git.spafi.eu/Lyzzy/game 2024-03-10 13:04:29 +01:00
4d40e44e2d starting to add some storyline, added Rat 2024-03-10 12:58:59 +01:00
2a2d7b2765 Merge pull request 'Development' (#11) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#11
2024-03-10 11:51:09 +00:00
4a47efe94d Merge pull request 'changed NPC talk key to f and resolved merge conflicts' (#77) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#77
2024-03-10 11:46:45 +00:00
SpagettiFisch
4ccc2dde11 Merge branch 'main' of https://git.spafi.eu/Spafi/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 12:42:41 +01:00
SpagettiFisch
67a0937c4b changed NPC talking key to f
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 12:42:09 +01:00
01c3aeae4a Merge pull request 'Development' (#10) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#10
2024-03-10 09:32:18 +00:00
3232096d66 Merge pull request 'changed stuff' (#76) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#76
2024-03-10 08:27:07 +00:00
e8d81dfb11 Merge pull request 'InfoProjekt-Development3' (#6) from InfoProjekt-Development3 into main
Reviewed-on: Spafi/game#6
2024-03-10 08:26:52 +00:00
SpagettiFisch
0032f8b2e1 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game into InfoProjekt-Development3
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 09:23:59 +01:00
SpagettiFisch
b1b7b21aa2 changed stuff
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-10 09:17:22 +01:00
523b34615b Merge pull request 'Changed Book and fixed NPC convo' (#75) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#75
2024-03-10 08:16:42 +00:00
3fe22ff6ac updated convo, still weird tho 2024-03-09 21:27:54 +01:00
9147971be8 added house 2024-03-09 20:14:40 +01:00
52d3ec6e8d fixed that herberts attributes stay the same 2024-03-09 16:26:53 +01:00
c17b65d2f3 added village somehow 2024-03-09 15:54:19 +01:00
67f1e081fa added village 2024-03-09 14:00:00 +01:00
2970e5cecd fixed Convo 2024-03-09 12:03:59 +01:00
614654692f changed Book and Convo, renamed Speech 2024-03-09 11:11:28 +01:00
1f38a04004 Merge pull request 'Development' (#9) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#9
2024-03-09 09:06:05 +00:00
d85c6ec22c Merge pull request 'fixed wall colision' (#74) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#74
2024-03-08 07:36:57 +00:00
SpagettiFisch
bd5ff8b3fe fixed wall colision
added object collision for mobs

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-08 08:36:13 +01:00
091726b8ca Merge pull request 'attack now with left mouse click' (#73) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#73
2024-03-07 20:05:46 +00:00
SpagettiFisch
31a9742a9c attack now with left mouse click
emter conversaton now with f
no change to leave conversation

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 20:50:09 +01:00
4d228bf6e0 test2 2024-03-07 16:44:38 +01:00
956c25769c test 2024-03-07 16:41:11 +01:00
569b3394a0 Merge pull request 'Development' (#8) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#8
2024-03-07 15:35:48 +00:00
9396218a11 Merge pull request 'main' (#72) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#72
2024-03-07 14:27:03 +00:00
321dac7cca wrong location
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-07 14:26:57 +00:00
abfa24ced8 wrong location
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-07 14:26:52 +00:00
11c7a9037b wrong location
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-07 14:26:45 +00:00
9c36e8d570 wrong location
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-03-07 14:26:36 +00:00
SpagettiFisch
a68bba70bb image files changed
new mob sprites
relocated all image files
disabled collision between player and npcs and mobs

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 14:57:18 +01:00
SpagettiFisch
b7fb7e1f1e Merge branch 'main' of https://git.spafi.eu/Lyzzy/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 13:56:24 +01:00
SpagettiFisch
5010609378 relocated image files
changed room generation

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 13:55:01 +01:00
73165bd33e speech and fireplace 2024-03-07 12:52:41 +00:00
b368fe4665 zombie speech and fireplace 2024-03-07 12:52:17 +00:00
af5204857b some fixes
forgot what i did
2024-03-07 09:43:33 +00:00
1d03d60ac2 Merge pull request 'new river sprite file added' (#67) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#67
2024-03-07 08:51:52 +00:00
SpagettiFisch
c3c44bbc71 new river sprite file added
new idea lol

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 09:50:10 +01:00
a41ee41fba Merge pull request 'main' (#66) from jaffa/game:main into Development
Reviewed-on: InfoProjekt/game#66
2024-03-07 08:24:16 +00:00
7369d2d1a8 Upload files to "art/sprite files " 2024-03-07 08:18:00 +00:00
61 changed files with 500 additions and 111 deletions

1
.idea/ideas.txt generated
View file

@ -38,6 +38,7 @@ Story:
Henker
armer Bauer
"Hexe"
Patrice, fragt nach Lightning Anschluss -> Lightning Spell freigeschaltet
Ziel(e)
-> Zurückkommen

View file

BIN
art/image files/dooor.kra Normal file

Binary file not shown.

BIN
art/image files/door.kra Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

View file

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 68 B

After

Width:  |  Height:  |  Size: 68 B

View file

Before

Width:  |  Height:  |  Size: 581 B

After

Width:  |  Height:  |  Size: 581 B

View file

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 635 B

View file

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

BIN
art/images/box/thinks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

BIN
art/images/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

View file

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View file

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

View file

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

View file

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

View file

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 438 B

View file

Before

Width:  |  Height:  |  Size: 441 B

After

Width:  |  Height:  |  Size: 441 B

View file

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 B

View file

Before

Width:  |  Height:  |  Size: 674 B

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 197 B

View file

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 654 B

View file

Before

Width:  |  Height:  |  Size: 505 B

After

Width:  |  Height:  |  Size: 505 B

View file

Before

Width:  |  Height:  |  Size: 588 B

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 B

View file

Before

Width:  |  Height:  |  Size: 495 B

After

Width:  |  Height:  |  Size: 495 B

View file

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

BIN
art/sprite files /rat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,4 +1,5 @@
import pygame
import random
pygame.font.init()
fonts = {
@ -45,7 +46,7 @@ class Button():
self.onePress = onePress
self.alreadyPressed = False
with open(f'art/images/{image}', 'r') as tb:
with open(f'art/images/box/{image}', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (width, height))
@ -57,7 +58,7 @@ class Button():
def update(self, screen):
mousePos = pygame.mouse.get_pos()
if self.buttonRect.collidepoint(mousePos):
if pygame.mouse.get_pressed(num_buttons=3)[0]:
if pygame.mouse.get_pressed(3)[0]:
if self.onePress:
self.onclickFunction()
elif not self.alreadyPressed:
@ -76,22 +77,29 @@ class Button():
screen.blit(self.box, self.buttonRect)
class Label():
def __init__(self, x, y, width, height, text, font='simple', font_size=20, font_color = '#1E90FF', sprite = 'label.png') -> None:
def __init__(self, x, y, width, height, text, font='simple', font_size=20, font_color = '#1e90ff', sprite = 'label.png') -> None:
self.x = x
self.y = y
self.width = width
self.height = height
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.font_color = font_color
self.text = text
self.hidden = False
with open(f'art/images/{sprite}', 'r') as tb:
self.sprite = sprite
with open(f'art/images/box/{sprite}', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (width, height))
self.labelRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.labelSurf = self.font.render(text, True, font_color)
def draw(self, screen):
if self.hidden:
return
with open(f'art/images/box/{self.sprite}', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (self.width,self.height))
self.labelRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.labelSurf = self.font.render(self.text, True, self.font_color)
self.box.blit(self.labelSurf, [
self.labelRect.width / 2 - self.labelSurf.get_rect().width / 2,
self.labelRect.height / 2 - self.labelSurf.get_rect().height / 2
@ -110,7 +118,7 @@ class DropDown():
self.menu_active = False
self.active_option = -1
with open('art/images/textbox.png', 'r') as tb:
with open('art/images/box/textbox.png', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (width, height))
@ -168,8 +176,12 @@ class GameObjects():
self.type = _type
self.background = bg
if bg != None:
with open(bg, 'r') as bg:
self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT])
if WIDTH != None and HEIGHT != None:
with open(bg, 'r') as bg:
self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT])
else:
with open(bg, 'r') as bg:
self.background = pygame.transform.scale2x(pygame.image.load(bg))
self.objects = objects
def update(self, objects):
@ -178,24 +190,25 @@ class GameObjects():
return
class Scene(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list | None, WIDTH, HEIGHT, level:list) -> None:
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, level:list) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.level = level
self.current_level = 0
self.update()
def update(self, change:bool, objects):
def update(self, change:bool=False, objects=None):
if change:
self.current_level += 1
self.level[self.current_level].update(objects)
self.background = self.level[self.current_level].background
if isinstance(self.objects, list):
"""if isinstance(self.objects, list):
for obj in self.objects[0] + self.objects[1] + self.objects[2]:
obj.update()
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):
@ -208,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:
@ -219,7 +233,7 @@ class Stage(GameObjects):
self.current += 1
if self.current >= len(self.rooms):
return 1
def draw(self, screen):
for room in self.rooms:
if room.id == self.current:
@ -229,18 +243,47 @@ 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:
self.locked = False
[self.objects[3].append(wall) for wall in self.genWalls(WIDTH, HEIGHT)]
[self.objects[4].append(wall) for wall in self.genWalls(WIDTH, HEIGHT)]
def genWalls(self, WIDTH, HEIGHT):
walls = []
walls.append(Obstacle('wall_l', 'wall', None, True, 32, 32, True, WIDTH=4, HEIGHT=HEIGHT))
@ -249,17 +292,32 @@ 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 not self.type == 'boss':
if len(self.exits) == 1:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.75)), 4, self.exits[0][0]))
elif len(self.exits) == 2:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.45)), self.exits[0][0]))
self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.5), round(WIDTH * 0.9)), self.exits[1][0]))
else:
self.doors.append(Door(f'door{self.id}', self.exits[0][1], random.randint(64, round(WIDTH * 0.3)), self.exits[0][0]))
self.doors.append(Door(f'door{self.id}', self.exits[1][1], random.randint(round(WIDTH * 0.33), round(WIDTH * 0.6)), self.exits[1][0]))
self.doors.append(Door(f'door{self.id}', self.exits[2][1], random.randint(round(WIDTH * 0.63), round(WIDTH * 0.95)), self.exits[2][0]))
def update(self, objects):
self.objects = objects
if objects is not None:
self.objects = objects
if not self.objects[1]:
self.locked = False
return
def draw(self, screen):
screen.blit(self.background, (32, 32))
"""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
@ -279,6 +337,15 @@ class Obstacle(GameObjects):
def draw(self, screen):
if not self.hidden:
screen.blit(self.background, self.rect)
else:
pygame.draw.rect(screen, '#e0a77f', self.rect, 2)
class Door(GameObjects):
def __init__(self, name: str, _type: str, x: int, target:int, y: int=8, objects: list=None, WIDTH=None, HEIGHT=None, islocked=True) -> None:
super().__init__(name, _type, f'art/images/background/door_{_type}.png', objects, WIDTH, HEIGHT)
self.rect = pygame.Rect((x, y), self.background.get_size())
self.locked = islocked
def draw(self, screen):
screen.blit(self.background, self.rect)
def update(self, islocked=True):
self.locked = islocked

197
main.py
View file

@ -14,7 +14,10 @@ def setUp(config):
else:
screen = pygame.display.set_mode(config["res"])
clock = pygame.time.Clock()
return screen, clock, True, True, "start.png", []
pygame.display.set_caption('Between The Pages')
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:
@ -27,22 +30,26 @@ def quitGame():
quit()
def genRooms(WIDTH, HEIGHT, type:str, objects:list):
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/river1.png', True, 32, 32, WIDTH=WIDTH - 64, HEIGHT=HEIGHT - 64))
room_objects = []
#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)))
room_backgrounds = [f'art/images/background/{type}{i}.png' for i in range(1)]
rooms = [
Room(type, 'normal', f'art/images/{type}.png', [objects[0], objects[1], objects[2], [room_objects[random.randint(0, len(room_objects) - 1)] for i in range(0, 5)]], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 0),
Room(type, 'normal', f'art/images/{type}.png', [objects[0], objects[1], objects[2], [room_objects[random.randint(0, len(room_objects) - 1)] for i in range(0, 5)]], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 1),
Room(type, 'normal', f'art/images/{type}.png', [objects[0], objects[1], objects[2], [room_objects[random.randint(0, len(room_objects) - 1)] for i in range(0, 5)]], WIDTH - 64, HEIGHT - 64, [True, True, True, False], 2),
]
Room(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
def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)]
mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))]
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))]
weapons = []
others = []
npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
objects = [main, mobs, npcs, others]
npcs = []
objects = [main, mobs, npcs, weapons, others]
level = []
rooms = genRooms(WIDTH, HEIGHT, 'grass', objects)
level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms))
@ -66,18 +73,25 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
screen.blit(bg, (0, 0))
"""
if not freeze:
scene.update(False, objects)
objects = scene.getObjects()
screen.blit(scene.background, (32, 32))
for thing in objects[3]:
thing.update(objects)
for thing in objects[4]:
thing.draw(screen)
for weapon in objects[3]:
weapon.update(objects)
weapon.draw(screen)
for thing in objects[0]:
thing.book.hidden = not freeze
if not thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects):
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
thing.draw(screen)
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects)
if result == 'village':
village(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'play':
play(screen, clock, running, background, isblack, WIDTH, HEIGHT)
else:
thing.draw(screen)
for mob in objects[1]:
mob.update(objects)
@ -88,8 +102,9 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
npc.draw(screen)
objects[0][0].book.addspell('windslash')
scene.update(False, objects)
scene.draw(screen)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
@ -99,6 +114,143 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
clock.tick(fps) # limits FPS to 60
def village(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [herbert]
mobs = []
weapons = []
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)]
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, 0)
freeze = True #Gameplay is freezed in certain situations
main[0].health.health = 20
while running:
screen.fill('#000000')
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
quitGame()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze
# RENDER YOUR GAME HERE
"""with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
"""
if not freeze:
objects = room.getObjects()
screen.blit(room.background, (32, 32))
for thing in objects[4]:
thing.draw(screen)
for weapon in objects[3]:
weapon.update(objects)
weapon.draw(screen)
for thing in objects[0]:
thing.book.hidden = not freeze
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects)
if result == 'village':
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'play':
play(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'house':
house(screen, clock, running, background, isblack, WIDTH, HEIGHT)
else:
thing.draw(screen)
for mob in objects[1]:
mob.update(objects)
mob.draw(screen)
for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
room.update(objects)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(fps) # limits FPS to
def house(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [herbert]
mobs = []
weapons = []
others = []
npcs = [NPC('elder', 100, 'people/reddy.png', 0, 200, 200)]
objects = [main, mobs, npcs, weapons, others]
room = Room('house', 'house', 'art/images/background/insideHouse.png', objects, WIDTH - 64, HEIGHT - 64, 0)
freeze = False #Gameplay is freezed in certain situations
while running:
screen.fill('#000000')
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
quitGame()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze
# RENDER YOUR GAME HERE
"""with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
"""
if not freeze:
objects = room.getObjects()
screen.blit(room.background, (32, 32))
for thing in objects[4]:
thing.draw(screen)
# for weapon in objects[3]:
# weapon.update(objects)
# weapon.draw(screen)
for thing in objects[0]:
thing.book.hidden = not freeze
result = thing.update(pygame.key.get_pressed(), pygame.mouse.get_pos(), objects)
if result == 'village':
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'play':
play(screen, clock, running, background, isblack, WIDTH, HEIGHT)
elif result == 'wall':
village(screen, clock, running, background, isblack, WIDTH, HEIGHT)
else:
thing.draw(screen)
for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
objects[0][0].book.addspell('windslash')
room.update(objects)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(fps) # limits FPS to
def options(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
# List that is displayed while selecting the window resolution level
@ -138,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", play, attributes=[screen, clock, running, background, isblack, WIDTH, HEIGHT]))
objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", village, attributes=[screen, clock, running, background, isblack, WIDTH, HEIGHT]))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
while running:
@ -147,7 +299,7 @@ def menu(screen, clock, running, background, isblack, WIDTH, HEIGHT):
running = False
quitGame()
# RENDER YOUR GAME HERE
with open(f'art/images/{background}', 'r') as i:
with open(f'art/images/background/{background}', 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
@ -255,4 +407,5 @@ def main():
pygame.quit()
if __name__ == '__main__':
herbert = MainCharacter('Herbert', 100, 'people/oldman.png', 500, 500, 20, 5, 1, 1, 50)
main()

View file

@ -1,6 +1,7 @@
import pygame as pg
from classes import *
from main import *
import random
vec = pg.math.Vector2
fps = 60
@ -44,7 +45,7 @@ class Objects():
self.name = name
self.speed = ms
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.image.load(i))
self.sprite = pg.transform.scale2x(pg.image.load(i))
self.x = x
self.y = y
self.hidden = False
@ -55,19 +56,19 @@ class Objects():
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
pg.draw.rect(screen, '#ff0000', self.rect, 2)
pg.draw.rect(screen, '#ef0120', self.rect, 2)
class NPC(Objects):
def __init__(self, name, ms, sprite, convo_act, x, y) -> None:
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('Hello, you can shoot fireballs with f now.', convo_act, 'person')
self.conversation = Convo(self, convo_scene)
self.lastUpdate = pg.time.get_ticks()
def talk(self, objects):
self.talking = True
objects[0][0].talking = True
self.conversation.hidden = False
def draw(self, screen):
super().draw(screen)
@ -75,21 +76,65 @@ class NPC(Objects):
self.conversation.draw(screen)
def update(self, keys, objects):
if self.talking:
self.conversation.update(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, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
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_SPACE]:
objects[0][0].book.addspell('fireball')
self.talking = False
objects[0][0].talking = False
self.hidden = True
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):
@ -106,13 +151,16 @@ class Fighter(Objects):
class MainCharacter(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
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, f'will to live: {level}%', 'simple', 20)
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
@ -121,12 +169,30 @@ class MainCharacter(Fighter):
self.health.draw(screen)
self.level.draw(screen)
self.book.draw(screen)
pg.draw.rect(screen, '#ff00ee', self.rect, 2)
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]:
@ -142,10 +208,11 @@ class MainCharacter(Fighter):
self.x += moveto[0] / fps
self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, objects[1] + objects[2] + objects[3])
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':
@ -157,15 +224,16 @@ class MainCharacter(Fighter):
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))
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 isinstance(touches, NPC):
touches.talk(objects)
#self.x -= moveto[0] * 2 / fps
#self.y -= moveto[1] * 2 / fps
"""
if self.x <= 32:
self.x = 33
@ -179,25 +247,26 @@ class MainCharacter(Fighter):
def attack(self, obj, mouse):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
moveto = mouse- vec(self.x, self.y)
moveto = mouse - vec(self.x, self.y)
if self.book.current_sp == 'fireball':
weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5)
elif self.book.current_sp == 'windslash':
weapon = Windslash('ws1', 100, self.x, self.y, moveto, 5)
weapon = Windslash('ws1', 100, self.x, self.y, moveto, 10)
else:
return
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 keys[pg.K_f]:
if pg.mouse.get_pressed()[0]:
self.attack(objects, vec(mouse))
self.thinks.update(objects, self)
if self.health.health <= 0:
return False
return 'village'
else:
return True
return self.obstacle_interaction(objects)
class Hearts():
def __init__(self, health, sprite, x, y, hurtCooldown) -> None:
@ -209,7 +278,7 @@ class Hearts():
self.hidden = False
self.sprite=[]
for parts in sprite:
with open(f'art/images/{parts}') as i:
with open(f'art/images/main_attributes/{parts}') as i:
self.sprite.append(pg.image.load(i))
self.rect = []
for each in self.sprite:
@ -243,39 +312,85 @@ class Hearts():
sprite.append('noheart.png')
self.sprite = []
for parts in sprite:
with open(f'art/images/{parts}') as i:
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, text, font, font_size) -> None:
super().__init__(x, y, width, height, text, font, font_size)
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/book.png') as i:
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 = True
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.labels = [Label(100, 100, 500, 50, "Dear User, ", font_color='#000000', sprite='empty.png'),
Label(100, 150, 500, 50, "this book will help you to survive.", font_color='#000000', sprite='empty.png'),
Label(100, 200, 500, 50, "Click on a picture to choose your spell.", font_color='#000000', sprite='empty.png'),
Label(100, 250, 500, 50, "Talk to fairies to unlock new spells!", font_color='#000000', sprite='empty.png')]
self.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_height = 400
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)
for label in self.labels:
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)
@ -283,22 +398,19 @@ class Book():
if spell not in self.sp_list:
self.sp_list.append(spell)
self.current_sp = spell
self.buttons.append(Button(200, self.buttons_height, 58, 50, f'{spell}_icon.png', 'medieval', 23, attributes=[spell], onclickFunction=self.update_spell))
self.buttons_height += 100
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)
class Skeleton(Mobs):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops=0) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def chase(self, obj):
x = obj[0][0].x
@ -308,23 +420,68 @@ class Skeleton(Mobs):
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()
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
self.hidden = True
objects[1].remove(self)
def update(self, obj):
self.chase(obj)
class 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:
@ -335,15 +492,16 @@ class Weapons(Objects):
self.spawn_tick = pg.time.get_ticks()
pos = vec(1,0)
angle = pos.angle_to(moveto)
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.transform.rotate(pg.image.load(i), -angle))
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
objects[3].remove(self)
if self in objects[3]:
objects[3].remove(self)
def move(self, objects):
self.moveto.scale_to_length(self.speed)
@ -358,7 +516,7 @@ class Spells(Weapons):
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
class Fireball(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'fireball.png', life_ticks=5000) -> None:
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):
@ -366,7 +524,7 @@ class Fireball(Spells):
self.die(objects, Mobs)
class Windslash(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'windslash.png', life_ticks=500) -> None:
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):
@ -379,9 +537,19 @@ class Windslash(Spells):
class Arrow(Weapons):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'arrow.png', life_ticks=5000) -> None:
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)