Compare commits

...

89 commits

Author SHA1 Message Date
1fd852e31e Merge pull request 'Development' (#1) from InfoProjekt/game:Development into main
Reviewed-on: #1
2024-03-07 08:13:31 +00:00
f21d980352 Merge pull request 'doubled image size' (#65) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#65
2024-03-07 06:51:08 +00:00
SpagettiFisch
1b6ccb17b0 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game 2024-03-07 07:49:49 +01:00
SpagettiFisch
6034a8382f changed image size
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-07 07:49:16 +01:00
SpagettiFisch
746982641a Merge https://git.spafi.eu/InfoProjekt/game 2024-03-07 07:46:26 +01:00
b3c7d87926 Merge pull request 'Added Label class' (#64) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#64
2024-03-07 06:45:57 +00:00
41f8b76b90 added Label class
Label class in classes, added text to book, changed wind spell a bit but dunno if really good
2024-03-06 17:40:02 +00:00
96c0a691b7 empty image cuz im stupid 2024-03-06 17:36:57 +00:00
25f04f994f added Label class
added Label class in classes and added text to book, changed wind attack a bit but idk if good
2024-03-06 17:35:27 +00:00
e2ec301fce Merge pull request 'Development' (#6) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#6
2024-03-06 15:44:25 +00:00
55b50531f9 Merge pull request 'wind slash spell' (#63) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#63
2024-03-06 14:29:34 +00:00
SpagettiFisch
c9a98fb94c added new icons for spell selection inside the book
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-06 14:27:06 +01:00
SpagettiFisch
501e84181f added a new missile
new to character: wind slash attack
added projectile lifetime (in frames, maybe change to 5*fps later)

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-06 14:26:32 +01:00
0564d778a1 Merge pull request 'updated the button class -> can now take any arguments for the onClick Function' (#62) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#62
2024-03-06 11:12:00 +00:00
SpagettiFisch
953edca694 updated the button class -> can now take any arguments for the onClick Function
changed all buttons according to this

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-06 12:10:59 +01:00
96b15fd425 Merge pull request 'manual merge of lyzzys updates into Development' (#60) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#60
2024-03-06 06:45:56 +00:00
SpagettiFisch
ef3a617e4d Merge branch 'main' of https://git.spafi.eu/Spafi/game; branch 'main' of https://git.spafi.eu/Lyzzy/game 2024-03-06 07:42:45 +01:00
4cfb4b92f0 Dateien nach "/" hochladen 2024-03-05 15:48:06 +00:00
44793f22a5 Merge pull request 'Collisions fixed' (#58) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#58
2024-03-04 16:18:33 +00:00
SpagettiFisch
3ad2ad6478 optimized collision with npcs and mobs
added wall collision
enabled hitboxes for object and wall highlighting

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-04 17:15:19 +01:00
SpagettiFisch
0cd9444222 Merge branch 'Development' of https://git.spafi.eu/InfoProjekt/game
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-03 13:36:15 +01:00
SpagettiFisch
d86f8c360b fixed bug which stopped movement if colliding with projectiles
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-03-03 13:31:01 +01:00
6fce7e0fd2 Merge pull request 'Development' (#57) from Development into main
Reviewed-on: InfoProjekt/game#57
2024-03-03 12:28:45 +00:00
cb9a7e6ff5 Merge pull request 'mobs can die, main can attack, book object added to main, npc object added' (#56) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#56
2024-03-03 12:21:58 +00:00
b29a279fb1 Gegner Schaden, Buch, Main Angriff, NPC
Dem Gegner kann jetzt durch Main Angriff Schaden zugefügt werden und er kann sterben
Das Buch kann durch Drücken von e geöffnet werden, das Spiel hält an
Der Main kann (nachdem mit NPC geredet) Feuerbälle mit f schießen (Schussrichtung adden!!)
Ein NPC wurde hinzugefügt, der steht. Main redet automatisch mit ihm wenn main reinläuft. Durch Leertaste wird Unterhaltung beendet.
2024-03-01 21:56:14 +00:00
f6827b5f05 revert 8b2dab980b
revert Schaden Gegner, Buch, Angriff
2024-03-01 21:50:39 +00:00
5625db18c7 Buch and Feuer added
changable
2024-03-01 21:47:51 +00:00
8b2dab980b Schaden Gegner, Buch, Angriff 2024-03-01 21:46:15 +00:00
2ef0948274 Merge pull request 'Development' (#5) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#5
2024-03-01 11:25:20 +00:00
6ed85baed0 Merge pull request 'added some missing spaces lol' (#55) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#55
2024-02-29 13:38:47 +00:00
SpagettiFisch
218eb2ea7e added some missing spaces lol
added character collisions (not great yet tho)
some simple background elements added and testet WIP
2024-02-29 14:25:23 +01:00
9c36772aa7 Merge pull request 'Development' (#4) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#4
2024-02-29 08:09:19 +00:00
886059527b Merge pull request 'main' (#54) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#54
2024-02-26 11:29:29 +00:00
SpagettiFisch
c741c8199a Merge branch 'main' of https://git.spafi.eu/Spafi/game 2024-02-26 12:25:34 +01:00
7725bea20c art/sprite files /oldmanwalk.png gelöscht
deleted a kinda corrupted file

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-02-26 11:25:28 +00:00
15e2715207 art/sprite files /oldmanattack.png gelöscht
deleted kinda corrupted file

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-02-26 11:25:15 +00:00
SpagettiFisch
a9e99da219 fixed arrow oriantation
randomised skeletton move speed
changed Iframes to 250 ms
2024-02-26 12:21:45 +01:00
162542f198 Merge pull request 'Development' (#3) from InfoProjekt/game:Development into main
Reviewed-on: Spafi/game#3
2024-02-26 07:50:43 +00:00
SpagettiFisch
2e36e11fa7 Merge branch 'InfoProjekt-Development1' 2024-02-26 08:47:47 +01:00
SpagettiFisch
15d39949b4 pull from main repository 2024-02-26 08:23:50 +01:00
85464d1637 Merge pull request 'Leben und Sterben hinzugefügt' (#53) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#53
2024-02-26 07:05:23 +00:00
69cc080ea9 Label und Oldman added 2024-02-25 10:14:07 +00:00
d731f4f63d Dateien nach "/" hochladen 2024-02-25 10:11:37 +00:00
2d3161482f Dateien nach "art/images" hochladen 2024-02-25 00:35:57 +00:00
f9ede25093 Dateien nach "art/images" hochladen 2024-02-25 00:35:29 +00:00
e80ce5ad0d Dateien nach "/" hochladen 2024-02-25 00:26:31 +00:00
SpagettiFisch
1856b2b08a Merge branch 'InfoProjekt-Development' 2024-02-23 10:46:14 +01:00
SpagettiFisch
4a88bb98d5 removed one empty line 2024-02-23 10:45:54 +01:00
b31a12b43b Merge pull request 'Skeleton, Pfeile und Movement' (#52) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#52
Comments werden eh überbewertet ngl
2024-02-22 21:13:15 +00:00
ef9e7a6ef1 Merge pull request 'Dateien nach "/" hochladen' (#3) from lyzzy-patch-1 into main
Reviewed-on: Lyzzy/game#3
2024-02-22 20:35:41 +00:00
4b12f09ebd Dateien nach "/" hochladen 2024-02-22 20:34:45 +00:00
SpagettiFisch
ed6c91fa8f test for gameobjects (level, rooms and scenes) created
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-22 10:59:02 +01:00
66afe87660 Merge pull request 'Development' (#2) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#2
2024-02-21 15:16:32 +00:00
1663a85955 Merge pull request 'Development' (#37) from jaffa/game:Development into Development
Reviewed-on: InfoProjekt/game#37
2024-02-20 10:32:56 +00:00
c5cc9e6acc Merge pull request 'Development' (#1) from InfoProjekt/game:Development into main
Reviewed-on: Lyzzy/game#1
2024-02-17 13:23:41 +00:00
b55b145346 oldmanattack 2024-02-17 09:35:43 +00:00
13daa19bbb Delete art/sprite files /a 2024-02-17 09:33:57 +00:00
5db6b8dac1 oldmanwalk 2024-02-17 09:33:38 +00:00
fc3a9afd2d Add art/sprite files /a 2024-02-17 09:32:59 +00:00
b921da8a9a Merge pull request 'First movement and game object managing/handling' (#36) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#36
2024-02-16 17:09:44 +00:00
SpagettiFisch
8f78002015 resorted the Scene class into a subclass of GameObjects
added the class Room to GameObjects
added a very simple start screen
WIP: disabled option button until option function is implemented

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-16 18:05:03 +01:00
SpagettiFisch
4e1674d6f3 added new classes to READ.ME
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-16 18:03:05 +01:00
SpagettiFisch
2e66145dcc first movement (wasd) with character integrated
started a new class for scenes

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-16 17:34:37 +01:00
44973edb66 Merge pull request 'edited file structure' (#35) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#35
2024-02-15 09:16:17 +00:00
SpagettiFisch
ea6d64b087 edited file structure
Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-15 09:50:02 +01:00
a9f5335edc Merge pull request 'main' (#34) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#34
2024-02-14 08:02:18 +00:00
SpagettiFisch
9d63d09357 added a read.me 2024-02-14 09:00:30 +01:00
SpagettiFisch
5123b19cb0 added a lot of new fonts
assigned all of them a easier and more understandable key phrase or key word
added the key word dictionary in classes.py

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-14 08:49:47 +01:00
SpagettiFisch
f8e491f2a5 added a medieval like font
added the textbox for the buttons (not just any blank color)
added function for exiting the game
2024-02-13 12:32:23 +01:00
aea443cdb4 Merge pull request 'main' (#32) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#32
2024-02-13 10:30:16 +00:00
SpagettiFisch
51a287ba66 startscreen added
also some buttons added to be completed
button class initalized

Signed-off-by: SpagettiFisch <63868515+SpagettiFisch@users.noreply.github.com>
2024-02-13 10:21:42 +01:00
418ae5ee7b Merge pull request 'Development' (#1) from InfoProjekt/game:Development into main
Reviewed-on: Spafi/game#1
2024-02-13 07:35:47 +00:00
SpagettiFisch
124719c0f9 first config file
first 60 fps purple screen created, size depends on config
2024-02-12 13:36:26 +01:00
33a7fdd683 Merge pull request 'storyline.txt aktualisiert' (#30) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#30
2024-02-11 12:59:22 +00:00
1eb858bc30 storyline.txt aktualisiert 2024-02-05 21:46:16 +00:00
69c55f5dd2 Tileset nach "/art" hochgeladen
Erstes Tileset mit mehreren Ansätzen erstellt. Burgwand, Ziegelsteinwände, verschiedene Erd- und Grasvarianten.

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-31 17:26:25 +00:00
27327ac7da Mauertexturen nach "/art" hochladen
Den Rest davon noch mit hochladen

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-31 07:05:18 +00:00
7e066fbb10 Mauertexturen nach "/art" hochladen
Die ersten Texturen für Mauern hochladen.

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-31 07:04:24 +00:00
d555c3930c Dateien nach "/" hochladen
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-18 10:00:14 +00:00
a11182d9f6 Merge pull request 'storyline.txt aktualisiert' (#27) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#27
2024-01-18 09:51:20 +00:00
76e3f0c2b8 storyline.txt aktualisiert
Signed-off-by: Lyzzy <lyzzbackup@gmail.com>
2024-01-18 09:50:31 +00:00
634fffde4b Merge pull request 'main' (#26) from Lyzzy/game:main into Development
Reviewed-on: InfoProjekt/game#26
2024-01-18 09:40:01 +00:00
08193cda28 storyline aktualisiert 2024-01-18 09:38:25 +00:00
125b0dc0a7 storyline aktualisiert
Signed-off-by: Lyzzy <lyzzbackup@gmail.com>
2024-01-18 08:51:13 +00:00
6bca46bb56 storyline hinzugefügt 2024-01-18 08:42:49 +00:00
eb1d2629c2 Merge pull request 'ideas.txt aktualisiert' (#24) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#24
2024-01-12 11:28:14 +00:00
04c2997fe7 ideas.txt aktualisiert
Gegner und NPCs hinzugefügt
"Waffen", bzw. ANgriffsarten hinzugefügt

Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-12 11:27:02 +00:00
c99d3412f3 Merge pull request 'Legende für Anmerkungen hinzugefügt' (#21) from Spafi/game:main into Development
Reviewed-on: InfoProjekt/game#21
2024-01-10 13:46:27 +00:00
1d112ca5b5 Legende für Anmerkungen hinzugefügt
Signed-off-by: Spafi <spafi@noreply.git.spafi.eu>
2024-01-10 13:43:00 +00:00
99 changed files with 1084 additions and 0 deletions

BIN
.idea/InfoProjekt.xlsx generated Normal file

Binary file not shown.

44
.idea/ideas.txt generated Normal file
View file

@ -0,0 +1,44 @@
Anmerkungen in Klammern
? - unsicher
name? - Name noch unklar, bzw. steht zur Diskussion
! - festgelegt / Einigung
Game:
Rogue-like Game mit Story
Pixel
viele Gegner:
Skelette Schwert
Zombies Knüppel
Ratten -
Kröten(?) -
Gläubige(?) Bogen / Schwert
Story:
Theme
mittelalterlich(?)
fairy-tale-like(?)
medieval(!)
Homeless guy in Berlin (oder so) im Winter in einer Stadtbibliothek, weil warm und Shelter.
er hasst eigentlich Bücher, aber aus Langeweile durchstöbert er die Bibo
findet cool aussehendes antikes/magisches Buch, nimmt es aus dem Regal, blättert es auf und wird ohnmächtig
-> Erwacht als magische Person in magischer Welt wieder
Buch dient als Skillbaum (verschiedene Kapitel)
Kampfmagier (name?)
Heilender Magier -> Priester(name?)
Elementmagier(?)
Hexenkraft / Hexenwerke / Hexenmagie / Flüche (?)
Kampf
Faust
Zauberstab - range und strength von Skills und Level(?) abhängig
NPCS
Priester / Mönch (eher Mönch)
Henker
armer Bauer
"Hexe"
Ziel(e)
-> Zurückkommen
-> Happy werden (?)

51
.idea/storyline.txt generated Normal file
View file

@ -0,0 +1,51 @@
Szene 1 - Startszene:
Screen - Berlin, 1983, Winter
Draußen in Stadt mit Häusern, kalt und schneeig,
"*Brrr* I'm freezing. I guess I have to warm up myself in the library."
-> bis in der library am Feuer oder so weiterhin frieren
irgendwo info wasd to move around
wenn am Feuer:
"Now I'm feeling better. The winter days are so boring. Maybe I find a way to intertain myself in here?"
Wenn iwie am richtigen Buch, was iwie hervorsticht
"I really hate reading books, but this one looks interesting. Maybe I should have a look inside."
anklicken?
Animation er nimmt Buch (und klappt auf?)
Wow * blackscreen Ende Szene 1
-----------------------------------------
Szene 2 - Aufwachen in einer neuen Welt:
Zerfallene Bibo, selber Ort parallel Universe
"Huh where am I? What happened??"
geht aus Haus raus, wird von Monstern angegriffen,
wenn 1 Hit kommt ältere Dame, tötet/verjagt Monster und Gespräch.
Faselt irgendwie hä warum du nicht dich verteidigen oh du cooles Buch du auserwählter oder so.
Sagt soll zum Dorf gehen wegen Baum und gibt ihm noch irgendwas, muss aber selbst woanders hin.
und Achtung vor Monstern!
------------------------------------------
auf Weg dann neue Welle Monster, lernt sich iwie zu verteidigen(Buch)
------------------------------------------
Im Dorf beim Dorfältesten melden,
Hallo du uns helfen musst wegen Böse bitte bitte, wir dir auch mit Unterkunft und Essen und so helfen.
Innerer Konflikt weil ihm in altem Leben auch nicht von Allgemeinheit geholfen, und er siehts nicht ein...
------------------------------------------
erst durch erneuter Begegnung mit alter Dame wegen nem Happening einsicht...
------------------------------------------
dann Kämpfi gegen böse um zum Boss zu kommen und boss kämpfi...
------------------------------------------
am Ende er als Held gefeiert
und irgendwie Auswahl, ob da bleiben oder Weg zurück suchen aber im alten Leben was ändern

53
READ.ME Normal file
View file

@ -0,0 +1,53 @@
Brief Explanation of all files and classes and pygame
Button CLass:
Button(position_x, position_y, width, height, font key phrase/word (see dictionary), the function which should be executed, and if the function should be executed while holding the button or only once per press)
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'
}
Pygame window: (0, 0) is in the top left corner, the height and width are stored in HEIGHT and WIDTH
GameObjects for rooms, scenes and maybe MorialCitadel
Scene:
type - normal, dungeon, cutscene
objects - contain rooms, npcs, mobs, the character etc.
Room:
type - normal, shop, special (?), boss
objects - npcs, mobs, the character etc.
exits - position of exits --> [top:bool, right:bool, down:bool, left:bool]; 1 to 4 exits per room
locked - bool if the room is unlocked; locked upon first entering unless all mobs are dead

BIN
art/image files/exit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 B

BIN
art/image files/field.kra Normal file

Binary file not shown.

BIN
art/image files/field.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

BIN
art/image files/mauer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

BIN
art/image files/options.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

BIN
art/image files/set1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
art/images/arrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

BIN
art/images/blau1.kra Normal file

Binary file not shown.

BIN
art/images/blau1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/blau2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/blau3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/book.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
art/images/dirt1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
art/images/dirt2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

BIN
art/images/empty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

BIN
art/images/fireball.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

BIN
art/images/fullheart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

BIN
art/images/grass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
art/images/halfheart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

BIN
art/images/label.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

BIN
art/images/noheart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

BIN
art/images/oldman.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

BIN
art/images/reddy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

BIN
art/images/river1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
art/images/rot1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/rot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/rot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
art/images/start.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
art/images/textbox.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

BIN
art/images/viertelheart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

BIN
art/images/windslash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

284
classes.py Normal file
View file

@ -0,0 +1,284 @@
import pygame
pygame.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 Button():
def __init__(self, x, y, width, height, image, font, font_size, buttonText='', onclickFunction=None, onePress=False, attributes=None):
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.x = x
self.y = y
self.width = width
self.height = height
self.attributes = attributes
self.onclickFunction = onclickFunction
self.onePress = onePress
self.alreadyPressed = False
with open(f'art/images/{image}', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (width, height))
self.buttonRect = pygame.Rect(self.x, self.y, self.width, self.height)
self.buttonSurf = self.font.render(buttonText, True, '#baab80')
def update(self, screen):
mousePos = pygame.mouse.get_pos()
if self.buttonRect.collidepoint(mousePos):
if pygame.mouse.get_pressed(num_buttons=3)[0]:
if self.onePress:
self.onclickFunction()
elif not self.alreadyPressed:
if self.attributes:
self.onclickFunction(*self.attributes)
self.alreadyPressed = True
else:
self.onclickFunction()
self.alreadyPressed = True
else:
self.alreadyPressed = False
self.box.blit(self.buttonSurf, [
self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2,
self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2
])
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:
self.x = x
self.y = y
self.width = width
self.height = height
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.hidden = False
with open(f'art/images/{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
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
])
screen.blit(self.box, self.labelRect)
class DropDown():
def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options):
self.rect = pygame.Rect(x, y, width, height)
self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
self.main = main
self.options = options
self.draw_menu = False
self.menu_active = False
self.active_option = -1
with open('art/images/textbox.png', 'r') as tb:
self.box = pygame.image.load(tb)
self.box = pygame.transform.scale(self.box, (width, height))
def draw(self, screen):
#pygame.draw.rect(screen, self.color_menu[self.menu_active], self.rect, 0)
surface = self.font.render(self.main, 1, (0, 0, 0))
self.box.blit(surface, [
self.rect.width/2 - surface.get_rect().width/2,
self.rect.height/2 - surface.get_rect().height/2
])
screen.blit(self.box, surface.get_rect(center = self.rect.center))
if self.draw_menu:
for i, text in enumerate(self.options):
rect = self.rect.copy()
rect.y += (i+1) * self.rect.height
rect.x = self.rect.x
#pygame.draw.rect(screen, self.color_option[1 if i == self.active_option else 0], rect, 0)
#msg = self.font.render(text, 1, (0, 0, 0))
#screen.blit(msg, msg.get_rect(center = rect.center))
surface = self.font.render(text, 1, (0, 0, 0))
self.box.blit(surface, [
rect.width/2 - surface.get_rect().width/2,
rect.height/2 - surface.get_rect().height/2
])
screen.blit(self.box, rect)
def update(self, event_list):
mpos = pygame.mouse.get_pos()
self.menu_active = self.rect.collidepoint(mpos)
self.active_option = -1
for i in range(len(self.options)):
rect = self.rect.copy()
rect.y += (i+1) * self.rect.height
if rect.collidepoint(mpos):
self.active_option = i
break
if not self.menu_active and self.active_option == -1:
self.draw_menu = False
#self.draw_menu = True
#return -1
if pygame.mouse.get_pressed(num_buttons=3)[0]:
if self.menu_active:
self.draw_menu = not self.draw_menu
elif self.draw_menu and self.active_option >= 0:
self.draw_menu = False
return self.active_option
return -1
class GameObjects():
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT) -> None:
self.name = name
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])
self.objects = objects
def update(self, objects):
return
def draw(self, screen):
return
class Scene(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list | None, WIDTH, HEIGHT, level:list) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.level = level
self.current_level = 0
def update(self, change:bool, objects):
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):
for obj in self.objects[0] + self.objects[1] + self.objects[2]:
obj.update()
def draw(self, screen):
if isinstance(self.objects, list):
for obj in self.objects[0] + self.objects[1] + self.objects[2] + self.objects[3]:
obj.draw(screen)
self.level[self.current_level].draw(screen)
def getObjects(self):
return self.level[self.current_level].getObjects()
class Stage(GameObjects):
def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, stage:str, rooms:list) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.stage = stage
self.rooms = rooms
self.current = 0
def update(self, objects):
for room in self.rooms:
if room.id == self.current:
room.update(objects)
self.background = room.background
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
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:
room.draw(screen)
def getObjects(self):
for room in self.rooms:
if room.id == self.current:
return room.getObjects()
class Room(GameObjects):
def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, exits:list, id:int) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.exits = exits
self.id = id
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)]
def genWalls(self, WIDTH, HEIGHT):
walls = []
walls.append(Obstacle('wall_l', 'wall', None, True, 32, 32, True, WIDTH=4, HEIGHT=HEIGHT))
walls.append(Obstacle('wall_r', 'wall', None, True, WIDTH + 28, 32, True, WIDTH=4, HEIGHT=HEIGHT))
walls.append(Obstacle('wall_t', 'wall', None, True, 32, 32, True, WIDTH=WIDTH, HEIGHT=4))
walls.append(Obstacle('wall_b', 'wall', None, True, 32, HEIGHT + 28, True, WIDTH=WIDTH, HEIGHT=4))
return walls
def update(self, objects):
self.objects = objects
if not self.objects[1]:
self.locked = False
return
def draw(self, screen):
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)
def getObjects(self):
return self.objects
class Obstacle(GameObjects):
def __init__(self, name: str, _type: str, bg, collision: bool, x: int, y: int, hidden: bool=False, objects: list = None, WIDTH=None, HEIGHT=None) -> None:
super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
self.collision = collision
self.hidden = hidden
self.width = WIDTH
self.height = HEIGHT
if self.background is not None:
self.rect = pygame.Rect((x, y), self.background.get_size())
else:
self.rect = pygame.Rect(x, y, WIDTH, HEIGHT)
def draw(self, screen):
if not self.hidden:
screen.blit(self.background, self.rect)
else:
pygame.draw.rect(screen, '#e0a77f', self.rect, 2)

7
config.json Normal file
View file

@ -0,0 +1,7 @@
{
"screen":
{
"res":[1280, 720],
"fullscreen": false
}
}

BIN
fonts/3D-Pixel.ttf Normal file

Binary file not shown.

BIN
fonts/8bitlim.ttf Normal file

Binary file not shown.

BIN
fonts/8bitlimo.ttf Normal file

Binary file not shown.

BIN
fonts/8bitlimr.ttf Normal file

Binary file not shown.

BIN
fonts/8blimro.ttf Normal file

Binary file not shown.

BIN
fonts/ARCADECLASSIC.TTF Normal file

Binary file not shown.

BIN
fonts/Beyond Wonderland.ttf Normal file

Binary file not shown.

BIN
fonts/Digitag.ttf Normal file

Binary file not shown.

BIN
fonts/DisposableDroidBB.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
fonts/Endalian Script.ttf Normal file

Binary file not shown.

BIN
fonts/FREAKSOFNATURE.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
fonts/Halo3.ttf Normal file

Binary file not shown.

BIN
fonts/INVASION2000.TTF Normal file

Binary file not shown.

BIN
fonts/Karma Future.otf Normal file

Binary file not shown.

BIN
fonts/Karma Suture.otf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
fonts/Merchant Copy.ttf Normal file

Binary file not shown.

Binary file not shown.

BIN
fonts/MoriaCitadel.TTF Normal file

Binary file not shown.

Binary file not shown.

BIN
fonts/Seattle Avenue.ttf Normal file

Binary file not shown.

BIN
fonts/SeattleAvenue.otf Normal file

Binary file not shown.

BIN
fonts/astron boy italic.otf Normal file

Binary file not shown.

BIN
fonts/astron boy video.otf Normal file

Binary file not shown.

BIN
fonts/astron boy wonder.otf Normal file

Binary file not shown.

BIN
fonts/astron boy.otf Normal file

Binary file not shown.

BIN
fonts/dpcomic.ttf Normal file

Binary file not shown.

BIN
fonts/ka1.ttf Normal file

Binary file not shown.

BIN
fonts/kirbyss.ttf Normal file

Binary file not shown.

BIN
fonts/manaspc.ttf Normal file

Binary file not shown.

BIN
fonts/medieval.ttf Normal file

Binary file not shown.

BIN
fonts/nasalization-rg.otf Normal file

Binary file not shown.

BIN
fonts/neuropol.otf Normal file

Binary file not shown.

BIN
fonts/papercut.ttf Normal file

Binary file not shown.

BIN
fonts/pcsenior.ttf Normal file

Binary file not shown.

BIN
fonts/pdark.ttf Normal file

Binary file not shown.

BIN
fonts/yoster.ttf Normal file

Binary file not shown.

258
main.py Normal file
View file

@ -0,0 +1,258 @@
import pygame
import sys
import json
import time
import random
from classes import *
from viecher import *
fps = 60
def setUp(config):
pygame.init()
if config["fullscreen"]:
screen = pygame.display.set_mode(config["res"], pygame.FULLSCREEN)
else:
screen = pygame.display.set_mode(config["res"])
clock = pygame.time.Clock()
return screen, clock, True, True, "start.png", []
def readConfig():
with open('config.json', 'r') as c:
json_data = c.read()
return json.loads(json_data)
def quitGame():
#save progress somehow, if needed
pygame.quit()
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))
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),
]
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))]
others = []
npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
objects = [main, mobs, npcs, others]
level = []
rooms = genRooms(WIDTH, HEIGHT, 'grass', objects)
level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms))
scene = Scene('test', 'normal', None, None, WIDTH, HEIGHT, level)
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:
scene.update(False, objects)
objects = scene.getObjects()
screen.blit(scene.background, (32, 32))
for thing in objects[3]:
thing.update(objects)
thing.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)
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)
objects[0][0].book.addspell('windslash')
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 60
def options(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
# List that is displayed while selecting the window resolution level
resolution = [("1920x1080", "1920x1080"),
("1920x1200", "1920x1200"),
("1280x720", "1280x720"),
("2560x1440", "2560x1440"),
("3840x2160", "3840x2160")]
# This function displays the currently selected options
def printSettings():
print("\n\n")
# getting the data using "get_input_data" method of the Menu class
settingsData = settings.get_input_data()
for key in settingsData.keys():
print(f"{key}\t:\t{settingsData[key]}")
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# RENDER YOUR GAME HERE
with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
for obj in objects:
obj.process(screen)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def menu(screen, clock, running, background, isblack, WIDTH, HEIGHT):
objects = []
objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Play", 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:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
quitGame()
# RENDER YOUR GAME HERE
with open(f'art/images/{background}', 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with an image to clear the screen
screen.blit(bg, (0, 0))
for obj in objects:
obj.update(screen)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def test(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)]
mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))]
others = []
npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
objects = [main, mobs, npcs, others]
level = []
rooms = genRooms(WIDTH, HEIGHT, 'grass', objects)
level.append(Stage('blau', 'normal', None, [], WIDTH, HEIGHT, 'blue', rooms))
freeze = False #Gameplay is freezed in certain situations
#level.append(Stage('rot', 'normal', None, [], WIDTH, HEIGHT, 'red', [
# Room('red1', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 0),
# Room('red2', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 1),
# Room('red3', 'normal', 'art/images/grass.png', [], WIDTH, HEIGHT, [True, True, True, False], 2),
# ]))
scene = Scene('test', 'normal', None, None, WIDTH, HEIGHT, level)
# RENDER YOUR GAME HERE
while True:
screen.fill('#000000')
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
running = False
quitGame()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze
if not freeze:
objects = scene.getObjects()
for thing in objects[0]:
thing.book.hidden = not freeze
if not thing.update(pygame.key.get_pressed(), objects):
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
thing.draw(screen)
for mob in objects[1]:
mob.update(objects)
mob.draw(screen)
for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
for thing in objects[3]:
thing.update(objects)
thing.draw(screen)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60
def main():
config = readConfig()
screen, clock, running, isblack, background, objects = setUp(config["screen"])
WIDTH, HEIGHT = screen.get_size()
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'textbox.png', 'medieval', 48, "Play", play))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'textbox.png', 'medieval', 48, "Options", uwu))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'textbox.png', 'medieval', 48, "Exit game", quitGame))
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
test(screen, clock, running, background, isblack, WIDTH, HEIGHT)
"""while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
if not isblack:
with open(background, 'r') as i:
bg = pygame.image.load(i)
bg = pygame.transform.scale(bg, (WIDTH, HEIGHT))
# fill the screen with a color to wipe away anything from last frame
screen.blit(bg, (0, 0))
# RENDER YOUR GAME HERE
else:
for obj in objects:
obj.process(screen, clock, running, background, isblack, WIDTH, HEIGHT)
# flip() the display to put your work on screen
pygame.display.flip()
clock.tick(60) # limits FPS to 60"""
pygame.quit()
if __name__ == '__main__':
main()

BIN
test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 KiB

BIN
test1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
test2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

387
viecher.py Normal file
View file

@ -0,0 +1,387 @@
import pygame as pg
from classes import *
from main import *
vec = pg.math.Vector2
fps = 60
pg.font.init()
fonts = {
'medieval': 'medieval.ttf',
'minecraft': 'Minecraft Evenings.otf',
'3dpixel': '3D-Pixel.ttf',
'8bit': '8bitlim.ttf',
'8bito': '8blimro.ttf',
'arcade': 'ARCADECLASSIC.ttf',
'modern_game': 'astron boy video.otf',
'modern': 'astron boy.otf',
'wonder': 'Beyond Wonderland.ttf',
'curved': 'Digitag.ttf',
'simple': 'DisposableDroidBB.ttf',
'rounded': 'dpcomic.ttf',
'playfull': 'Endalian Script.ttf',
'blocky': 'FREAKSOFNATURE.ttf',
'catchy': 'Future TimeSplitters.otf',
'simple_wide': 'Halo3.ttf',
'simple_fat': 'INVASION2000.ttf',
'very_gamy': 'ka1.ttf',
'simple_round': 'Karma Suture.otf',
'mono': 'manaspc.ttf',
'damaged': 'Merchant Copy.ttf',
'big_natural': 'MorialCitadel.TTF',
'spacy': 'nasalization-rg.otf',
'sci-fi': 'neuropol.otf',
'hollow_big_edge': 'papercut.ttf',
'space_shuttle': 'pdark.ttf',
'thin': 'PixelFJVerdana12pt.ttf',
'random': 'Seattle Avenue.ttf',
'pixel': 'yoster.ttf'
}
class Objects():
def __init__(self, name, ms, sprite, x, y) -> None:
self.name = name
self.speed = ms
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.image.load(i))
self.x = x
self.y = y
self.hidden = False
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
pg.draw.rect(screen, '#ff0000', self.rect, 2)
class NPC(Objects):
def __init__(self, name, ms, sprite, convo_act, x, y) -> None:
super().__init__(name, ms, sprite, x, y)
self.talking = False
self.hidden = False
self.conversation = Convo('Hello, you can shoot fireballs with f now.', convo_act, 'person')
def talk(self, objects):
self.talking = True
objects[0][0].talking = True
self.conversation.hidden = False
def draw(self, screen):
super().draw(screen)
if self.talking:
self.conversation.draw(screen)
def update(self, keys, objects):
if self.talking:
self.conversation.update(keys, objects)
class Convo(Label):
def __init__(self, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
super().__init__(x, y, width, height, text, font, font_size)
def update(self, keys, objects):
if keys[pg.K_SPACE]:
objects[0][0].book.addspell('fireball')
self.talking = False
objects[0][0].talking = False
self.hidden = True
class Fighter(Objects):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
super().__init__(name, ms, sprite, x, y)
self.health = health
self.damage = damage
self.level = level
self.attack_speed = asp
self.attack_range = atr
self.lastHurt = pg.time.get_ticks()
self.lastAttack = pg.time.get_ticks()
self.hurtCooldown = 0
class MainCharacter(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
self.book = Book(0, 0, [], None, None)
self.talking = False
self.level = Level(1000, 38, 150, 40, f'will to live: {level}%', 'simple', 20)
self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50, hurtCooldown=self.hurtCooldown)
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
self.health.draw(screen)
self.level.draw(screen)
self.book.draw(screen)
pg.draw.rect(screen, '#ff00ee', self.rect, 2)
def hurt(self, damage, objects):
if not self.talking:
self.health.hurt(damage)
def walk(self, keys, objects):
moveto = vec(0, 0)
if keys[pg.K_w] or keys[pg.K_UP]:
moveto += vec(0, -1)
if keys[pg.K_a] or keys[pg.K_LEFT]:
moveto += vec(-1, 0)
if keys[pg.K_s] or keys[pg.K_DOWN]:
moveto += vec(0, 1)
if keys[pg.K_d] or keys[pg.K_RIGHT]:
moveto += vec(1, 0)
if not moveto == vec(0, 0):
moveto.scale_to_length(self.speed)
self.x += moveto[0] / fps
self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, objects[1] + objects[2] + objects[3])
if touches is not None and not isinstance(touches, Weapons):
if isinstance(touches, Obstacle):
if not touches.collision:
return
if touches.type == 'wall':
if touches.name == 'wall_l':
self.x += (2 + (self.x - touches.rect.x))
elif touches.name == 'wall_r':
self.x -= (2 + self.rect.width - (touches.rect.x - self.x))
if touches.name == 'wall_t':
self.y += (2 + (self.y - touches.rect.y))
elif touches.name == 'wall_b':
self.y -= (2 + self.rect.height - (touches.rect.y - self.y))
return
if self.x <= touches.rect.x: self.x -= (self.rect.width - (touches.rect.x - self.x))
elif self.x > touches.rect.x: self.x += (self.rect.width - (self.x - touches.rect.x))
#if self.y <= touches.y: pass
#elif self.y > touches.y: pass
self.x -= moveto[0] * 2 / fps
self.y -= moveto[1] * 2 / fps
if isinstance(touches, NPC):
touches.talk(objects)
"""
if self.x <= 32:
self.x = 33
elif self.x >= objects[3][0].width - 32:
self.x = objects[3][0].width - 32 - self.rect.width + 1
if self.y <= 32:
self.y = 33
elif self.y >= objects[3][0].height - 32:
self.y = objects[3][0].height - 32 - self.rect.height + 1
"""
def attack(self, obj, mouse):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
moveto = mouse- vec(self.x, self.y)
if self.book.current_sp == 'fireball':
weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5)
elif self.book.current_sp == 'windslash':
weapon = Windslash('ws1', 100, self.x, self.y, moveto, 5)
else:
return
obj[3].append(weapon)
self.lastAttack = pg.time.get_ticks()
def update(self, keys, mouse, objects):
if not self.talking:
self.walk(keys, objects)
if keys[pg.K_f]:
self.attack(objects, vec(mouse))
if self.health.health <= 0:
return False
else:
return True
class Hearts():
def __init__(self, health, sprite, x, y, hurtCooldown) -> None:
self.x = x
self.y = y
self.health = health
self.lastHurt = pg.time.get_ticks()
self.hurtCooldown = hurtCooldown
self.hidden = False
self.sprite=[]
for parts in sprite:
with open(f'art/images/{parts}') as i:
self.sprite.append(pg.image.load(i))
self.rect = []
for each in self.sprite:
self.rect.append(pg.Rect(self.x, self.y, each.get_width(), each.get_height()))
def hurt(self,damage):
if self.lastHurt + self.hurtCooldown < pg.time.get_ticks():
self.health -= damage
self.lastHurt = pg.time.get_ticks()
self.update()
def draw(self, screen):
if self.hidden:
return
for i in range(0, 5):
self.rect[i].x, self.rect[i].y = self.x + i * 20, self.y
screen.blit(self.sprite[i], self.rect[i])
def update(self):
sprite = []
for i in range(0, 5):
if self.health >= 4 + 4 * i:
sprite.append('fullheart.png')
elif self.health == 3 + 4 * i:
sprite.append('dreiviertelheart.png')
elif self.health >= 2 + 4 * i:
sprite.append('halfheart.png')
elif self.health >= 1 + 4 * i:
sprite.append('viertelheart.png')
elif self.health <= 4 * i:
sprite.append('noheart.png')
self.sprite = []
for parts in sprite:
with open(f'art/images/{parts}') as i:
self.sprite.append(pg.image.load(i))
class Level(Label):
def __init__(self, x, y, width, height, text, font, font_size) -> None:
super().__init__(x, y, width, height, text, font, font_size)
class Book():
def __init__(self, x, y, spells, current_spell, current_shield) -> None:
with open(f'art/images/book.png') as i:
self.sprite = pg.image.load(i)
self.sprite = pg.transform.scale(self.sprite, (1280, 720))
self.x = x
self.y = y
self.hidden = True
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
self.sp_list = spells
self.current_sp = current_spell
self.labels = [Label(100, 100, 500, 50, "Dear User, ", font_color='#000000', sprite='empty.png'),
Label(100, 150, 500, 50, "this book will help you to survive.", font_color='#000000', sprite='empty.png'),
Label(100, 200, 500, 50, "Click on a picture to choose your spell.", font_color='#000000', sprite='empty.png'),
Label(100, 250, 500, 50, "Talk to fairies to unlock new spells!", font_color='#000000', sprite='empty.png')]
self.buttons=[]
self.buttons_height = 400
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
for label in self.labels:
label.draw(screen)
for button in self.buttons:
button.update(screen)
def addspell(self, spell):
if spell not in self.sp_list:
self.sp_list.append(spell)
self.current_sp = spell
self.buttons.append(Button(200, self.buttons_height, 58, 50, f'{spell}_icon.png', 'medieval', 23, attributes=[spell], onclickFunction=self.update_spell))
self.buttons_height += 100
def update_spell(self, spell):
self.current_sp = spell
def update(self):
pass
class Mobs(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
self.drops = drops * (self.level / 2)
class Skeleton(Mobs):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops=0) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops)
def chase(self, obj):
x = obj[0][0].x
y = obj[0][0].y
moveto = vec(x, y) - vec(self.x, self.y)
if not (moveto).length() <= self.attack_range:
moveto.scale_to_length(self.speed)
self.x += moveto[0] / fps
self.y += moveto[1] / fps
else:
self.attack(moveto, obj)
def attack(self, moveto, obj):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage))
self.lastAttack = pg.time.get_ticks()
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
self.hidden = True
objects[1].remove(self)
def update(self, obj):
self.chase(obj)
class Weapons(Objects):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None:
super().__init__(name, ms, sprite, x, y)
self.moveto = moveto
self.damage = damage
self.life_ticks= life_ticks
self.spawn_tick = pg.time.get_ticks()
pos = vec(1,0)
angle = pos.angle_to(moveto)
with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.scale2x(pg.transform.rotate(pg.image.load(i), -angle))
def die(self, objects, kills):
touches = pg.sprite.spritecollideany(self, objects[0] + objects[1])
if touches is not None and isinstance(touches, kills):
touches.hurt(self.damage, objects)
self.hidden = True
objects[3].remove(self)
def move(self, objects):
self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps
if pg.time.get_ticks() - self.spawn_tick > self.life_ticks:
self.hidden = True
objects[3].remove(self)
class Spells(Weapons):
def __init__(self, name, ms, sprite, x, y, moveto, damage, life_ticks) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
class Fireball(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'fireball.png', life_ticks=5000) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
self.die(objects, Mobs)
class Windslash(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'windslash.png', life_ticks=500) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
self.die(objects, Mobs)
def move(self, objects):
super().move(objects)
self.moveto = self.moveto.rotate(5)
class Arrow(Weapons):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'arrow.png', life_ticks=5000) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage, life_ticks)
def update(self, objects):
self.move(objects)
self.die(objects, MainCharacter)