Compare commits

..

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

106 changed files with 178 additions and 3455 deletions

BIN
.DS_Store vendored 100644

Binary file not shown.

3
.gitignore vendored
View File

@ -2,8 +2,5 @@
.godot/
/android/
# macOS metadata
.DS_Store
# Claude Code
.claude/worktrees/

View File

@ -1,46 +0,0 @@
# Hexwarden
> **Brew. Cast. Survive.**
A top-down survival roguelike where you play as a witch holding her ground against endless waves of slimes. Collect magical fruits, brew powerful potions, and unleash devastating spells — for as long as you can.
Built with **Godot 4.6** as part of a university game engineering course at Hochschule Mannheim.
🎮 **[Play on itch.io](https://mik141.itch.io/hexwarden)**
---
## Gameplay
Enemies swarm in from all sides. Your only weapons are the spells you brew.
- Move with **WASD**
- Slimes drop **fruits** when killed — run over them to collect
- Fill all **3 cauldron slots** to trigger a brew and unleash a spell
- The fruit combination determines the spell
- Earn XP from kills → **level up** → choose one of multiple Perks
- Survive as long as possible
---
## Team
**Jaro Winkelhausen** — Game Development
**Arthur David** — Game Development
**Meik Schürmann** — Game Design, UI & Menu System
---
## About the Project
Hexwarden was built for the *Game Engineering* course (Prof. Dr. Kai Eckert, Hochschule Mannheim, SS 2026). None of us had significant game development experience when we started — this is a learning project made with a lot of trial, error, and genuine enthusiasm for the genre.
Inspired by [Vampire Survivors](https://store.steampowered.com/app/1794680/Vampire_Survivors/).
We're still actively developing it — expect bugs, rough edges, and future updates.
---
## License
This project was created for educational purposes. Assets from third-party packs are used under their respective licenses — see individual asset folders for details.

BIN
assets/.DS_Store vendored 100644

Binary file not shown.

BIN
assets/Swordsman_lvl1/.DS_Store vendored 100644

Binary file not shown.

BIN
assets/Swordsman_lvl2/.DS_Store vendored 100644

Binary file not shown.

View File

@ -1,14 +0,0 @@
Pixel Art License
Copyright © OceansCurse 2026 — All rights reserved.
You are free to:
- Use these assets in any personal or commercial project (including games, apps, merchandise, etc.).
- Modify, adapt, and create derivative works from these assets.
You are not permitted to:
- Redistribute, resell, or re-upload these assets (or substantial portions/modified versions) as standalone files, asset packs, or listings on itch.io, other marketplaces, or elsewhere.
- Present or claim these assets (original or modified) as your own original creation in a way that removes my authorship.
Attribution is not required, but always appreciated (e.g., "Assets by OceansCurse on itch.io").
These terms do not affect your rights under fair use or other applicable law.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://blotgjvb5lg5n"
path="res://.godot/imported/books_blue_gem.png-6b9e1efe847341054172f4dc841820d4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_blue_gem.png"
dest_files=["res://.godot/imported/books_blue_gem.png-6b9e1efe847341054172f4dc841820d4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b1dpo1suawep6"
path="res://.godot/imported/books_crimson_gem.png-e8e082c355c0dfd58d6abd9b647c9d64.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_crimson_gem.png"
dest_files=["res://.godot/imported/books_crimson_gem.png-e8e082c355c0dfd58d6abd9b647c9d64.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 472 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b0p1bbqie3r44"
path="res://.godot/imported/books_cross.png-35551b7d8d063fdb0725cd59a672b335.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_cross.png"
dest_files=["res://.godot/imported/books_cross.png-35551b7d8d063fdb0725cd59a672b335.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 621 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://jghgdp2kyjo7"
path="res://.godot/imported/books_eye.png-0b5ed65a09665cddbdbac80092f229ee.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_eye.png"
dest_files=["res://.godot/imported/books_eye.png-0b5ed65a09665cddbdbac80092f229ee.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://colq7wi3ti117"
path="res://.godot/imported/books_green_gem.png-1a6532ce505dc88ac93cf48f05352ebe.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_green_gem.png"
dest_files=["res://.godot/imported/books_green_gem.png-1a6532ce505dc88ac93cf48f05352ebe.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 583 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cq4qf7to1wg0m"
path="res://.godot/imported/books_health_potion.png-f8c3182e75c659e8cd07cbcee2ba8296.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_health_potion.png"
dest_files=["res://.godot/imported/books_health_potion.png-f8c3182e75c659e8cd07cbcee2ba8296.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://lo5ocyv4wo3e"
path="res://.godot/imported/books_jewel.png-81cbdb01e058151fa333b7a570f883b8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_jewel.png"
dest_files=["res://.godot/imported/books_jewel.png-81cbdb01e058151fa333b7a570f883b8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1pr5rqdnpnw5"
path="res://.godot/imported/books_mana_potion.png-e9b0c98b6782a5538a4f682f9d61384f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_mana_potion.png"
dest_files=["res://.godot/imported/books_mana_potion.png-e9b0c98b6782a5538a4f682f9d61384f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dlygc6jakfapg"
path="res://.godot/imported/books_pentagram.png-3e29e3d9c342d860aa7f6d22635f65db.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_pentagram.png"
dest_files=["res://.godot/imported/books_pentagram.png-3e29e3d9c342d860aa7f6d22635f65db.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cogqoxfqsnvv1"
path="res://.godot/imported/books_poison.png-3e8beaf0e04a26a46016fddeb0daf0f8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_poison.png"
dest_files=["res://.godot/imported/books_poison.png-3e8beaf0e04a26a46016fddeb0daf0f8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ryhfe1a3haxf"
path="res://.godot/imported/books_purple_gem.png-a017fe601493fdc75182a2e7b6cf68cb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_purple_gem.png"
dest_files=["res://.godot/imported/books_purple_gem.png-a017fe601493fdc75182a2e7b6cf68cb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bnlacakjmdnp1"
path="res://.godot/imported/books_set_2_preview.png-e47aaf46da7c1d64191f8dfb0958de3a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_set_2_preview.png"
dest_files=["res://.godot/imported/books_set_2_preview.png-e47aaf46da7c1d64191f8dfb0958de3a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dm3wtcchfipcf"
path="res://.godot/imported/books_upside_down_cross.png-f374141fa42ba8d66998f6c556ae5908.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/books_set_2/books_upside_down_cross.png"
dest_files=["res://.godot/imported/books_upside_down_cross.png-f374141fa42ba8d66998f6c556ae5908.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://b27862pnesv4a"
path="res://.godot/imported/47313572-experimental-8-bit-sound-270302.mp3-c4341312242ec2d6d5bacb1c4c433fda.mp3str"
[deps]
source_file="res://assets/music&sfx/sfx/47313572-experimental-8-bit-sound-270302.mp3"
dest_files=["res://.godot/imported/47313572-experimental-8-bit-sound-270302.mp3-c4341312242ec2d6d5bacb1c4c433fda.mp3str"]
[params]
loop=false
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://3ubacx6k21aq"
path="res://.godot/imported/card_shuffle.wav-2df5de9a976f5727aeeddc7f5f41163e.sample"
[deps]
source_file="res://assets/music&sfx/sfx/card_shuffle.wav"
dest_files=["res://.godot/imported/card_shuffle.wav-2df5de9a976f5727aeeddc7f5f41163e.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://o81j4w2j1p16"
path="res://.godot/imported/data_pion-sfx9-fwoosh-324525.mp3-aae109eab17a5ca7e7981c978d3c52e3.mp3str"
[deps]
source_file="res://assets/music&sfx/sfx/data_pion-sfx9-fwoosh-324525.mp3"
dest_files=["res://.godot/imported/data_pion-sfx9-fwoosh-324525.mp3-aae109eab17a5ca7e7981c978d3c52e3.mp3str"]
[params]
loop=false
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://buxdyhc4ih63f"
path="res://.godot/imported/fire.wav-a8c495294a82be1272b8f8a56ccb40f5.sample"
[deps]
source_file="res://assets/music&sfx/sfx/fire.wav"
dest_files=["res://.godot/imported/fire.wav-a8c495294a82be1272b8f8a56ccb40f5.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bh8o5pk2cco1a"
path="res://.godot/imported/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3-0a5ea69aced7938e6b9174c8f11f81d9.mp3str"
[deps]
source_file="res://assets/music&sfx/sfx/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3"
dest_files=["res://.godot/imported/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3-0a5ea69aced7938e6b9174c8f11f81d9.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bjyttcuhiidrq"
path="res://.godot/imported/lesiakower-level-up-enhancement-8-bit-retro-sound-effect-153002.mp3-a2556229ce18ac544b49cfbc2bd40be8.mp3str"
[deps]
source_file="res://assets/music&sfx/sfx/lesiakower-level-up-enhancement-8-bit-retro-sound-effect-153002.mp3"
dest_files=["res://.godot/imported/lesiakower-level-up-enhancement-8-bit-retro-sound-effect-153002.mp3-a2556229ce18ac544b49cfbc2bd40be8.mp3str"]
[params]
loop=false
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 B

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://pot4k8a6lxd0"
path="res://.godot/imported/knvie.png-6e2c57d6850f97653fad709f2c5186b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/weapons/knvie.png"
dest_files=["res://.godot/imported/knvie.png-6e2c57d6850f97653fad709f2c5186b5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,26 +0,0 @@
[
{
"time_start": 0,
"time_end": 60,
"entries": [
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 0, "count_at_end": 15, "min_interval": 0.5 }
]
},
{
"time_start": 60,
"time_end": 180,
"entries": [
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 15, "count_at_end": 40, "min_interval": 0.3 },
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 0, "count_at_end": 10, "min_interval": 0.8 }
]
},
{
"time_start": 180,
"time_end": -1,
"entries": [
{ "enemy": "res://scenes/slime.tscn", "count_at_start": 40, "count_at_end": 100, "min_interval": 0.2 },
{ "enemy": "res://scenes/blue_slime.tscn", "count_at_start": 10, "count_at_end": 60, "min_interval": 0.5 },
{ "enemy": "res://scenes/fire_slime.tscn", "count_at_start": 0, "count_at_end": 40, "min_interval": 0.6 }
]
}
]

View File

@ -69,53 +69,3 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
[preset.1]
name="Web"
platform="Web"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../Hexwarden/index.html"
patches=PackedStringArray()
patch_delta_encoding=false
patch_delta_compression_level_zstd=19
patch_delta_min_reduction=0.1
patch_delta_include_filters="*"
patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.1.options]
custom_template/debug=""
custom_template/release=""
variant/extensions_support=false
variant/thread_support=false
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
html/custom_html_shell=""
html/head_include=""
html/canvas_resize_policy=2
html/focus_canvas_on_start=true
html/experimental_virtual_keyboard=false
progressive_web_app/enabled=false
progressive_web_app/ensure_cross_origin_isolation_headers=true
progressive_web_app/offline_page=""
progressive_web_app/display=1
progressive_web_app/orientation=0
progressive_web_app/icon_144x144=""
progressive_web_app/icon_180x180=""
progressive_web_app/icon_512x512=""
progressive_web_app/background_color=Color(0, 0, 0, 1)
threads/emscripten_pool_size=8
threads/godot_pool_size=4

View File

@ -22,7 +22,6 @@ buses/default_bus_layout="uid://5oswo22yvmtg"
[autoload]
MusicManager="*uid://dmu7041wi1upt"
SpellLibrary="*res://scripts/SpellLibrary.gd"
[display]

View File

@ -1,105 +0,0 @@
[gd_scene format=3 uid="uid://bbhpa50ef6702"]
[ext_resource type="Script" uid="uid://dw5y2tp34fxys" path="res://scripts/perk_card.gd" id="1_t8gqh"]
[ext_resource type="Texture2D" uid="uid://duo145bmwho8d" path="res://assets/UI assets pack 2/UI books & more.png" id="2_nlhlf"]
[ext_resource type="FontFile" uid="uid://cq0jx2aapggkg" path="res://assets/fonts/slkscrb.ttf" id="3_n4umd"]
[ext_resource type="FontFile" uid="uid://brooj0hba7650" path="res://assets/fonts/slkscr.ttf" id="4_40ty6"]
[ext_resource type="Texture2D" uid="uid://cdktimg5axaxj" path="res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_01.png" id="4_nlhlf"]
[sub_resource type="AtlasTexture" id="AtlasTexture_fgk3h"]
atlas = ExtResource("2_nlhlf")
region = Rect2(561, 17, 46, 62)
[sub_resource type="LabelSettings" id="LabelSettings_qag4p"]
line_spacing = 5.0
font = ExtResource("3_n4umd")
font_size = 16
outline_size = 2
outline_color = Color(0, 0, 0, 1)
[sub_resource type="AtlasTexture" id="AtlasTexture_n4umd"]
atlas = ExtResource("4_nlhlf")
region = Rect2(258, 241, 25, 14)
[sub_resource type="LabelSettings" id="LabelSettings_ni87r"]
line_spacing = 6.0
font = ExtResource("3_n4umd")
font_size = 17
outline_size = 2
outline_color = Color(0, 0, 0, 1)
[node name="PerkCard" type="Control" unique_id=1471811151]
custom_minimum_size = Vector2(240, 360)
layout_mode = 3
anchors_preset = 0
script = ExtResource("1_t8gqh")
[node name="Card" type="TextureRect" parent="." unique_id=1832247473]
texture_filter = 1
custom_minimum_size = Vector2(240, 360)
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
texture = SubResource("AtlasTexture_fgk3h")
[node name="Name" type="Label" parent="Card" unique_id=2006873472]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -65.0
offset_top = 43.0
offset_right = 65.0
offset_bottom = 100.0
grow_horizontal = 2
text = "Zweizeilige
Überschrift
"
label_settings = SubResource("LabelSettings_qag4p")
horizontal_alignment = 1
[node name="TextureRect" type="TextureRect" parent="Card/Name" unique_id=2128840891]
texture_filter = 1
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -24.5
offset_top = -10.0
offset_right = 24.5
offset_bottom = 19.0
grow_horizontal = 2
grow_vertical = 0
texture = SubResource("AtlasTexture_n4umd")
stretch_mode = 5
[node name="Description" type="RichTextLabel" parent="Card" unique_id=859816848]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -100.0
offset_top = -215.0
offset_right = 100.0
offset_bottom = -36.0
grow_horizontal = 2
grow_vertical = 0
theme_override_fonts/normal_font = ExtResource("3_n4umd")
theme_override_font_sizes/normal_font_size = 17
theme_override_constants/outline_size = 2
theme_override_colors/default_color = Color(1, 1, 1, 1)
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
bbcode_enabled = true
scroll_active = false
text = ""
[node name="Button" type="Button" parent="." unique_id=1274377333]
layout_mode = 0
offset_right = 240.0
offset_bottom = 360.0
[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]

View File

@ -589,7 +589,7 @@ animations = [{
}],
"loop": false,
"name": &"hurt_down",
"speed": 20.0
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
@ -609,7 +609,7 @@ animations = [{
}],
"loop": false,
"name": &"hurt_left",
"speed": 20.0
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
@ -629,7 +629,7 @@ animations = [{
}],
"loop": false,
"name": &"hurt_right",
"speed": 20.0
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
@ -649,7 +649,7 @@ animations = [{
}],
"loop": false,
"name": &"hurt_up",
"speed": 20.0
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,

View File

@ -1,68 +0,0 @@
[gd_scene format=3 uid="uid://bhcew4ksnx081"]
[ext_resource type="Script" uid="uid://dt85lj7ts5i87" path="res://scripts/credits.gd" id="1_0ctdu"]
[ext_resource type="Texture2D" uid="uid://2ddggeetjj1t" path="res://assets/images/screenshot_game.png" id="1_2ckv8"]
[ext_resource type="FontFile" uid="uid://8v71dcws4q6o" path="res://assets/fonts/slkscre.ttf" id="2_0ctdu"]
[node name="Credits" type="CanvasLayer" unique_id=45816245]
script = ExtResource("1_0ctdu")
[node name="BackgroundSprite" type="TextureRect" parent="." unique_id=356379919]
z_index = -2
offset_left = 4.0
offset_top = 2.0
offset_right = 1277.0
offset_bottom = 718.0
texture = ExtResource("1_2ckv8")
expand_mode = 2
[node name="BackgroundRect" type="ColorRect" parent="." unique_id=2118797143]
z_index = -1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0.47058824)
[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=391956149]
z_index = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -308.5
offset_top = -106.0
offset_right = 308.5
offset_bottom = 106.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/separation = 50
alignment = 1
[node name="TitleLabel" type="Label" parent="VBoxContainer" unique_id=155909881]
layout_mode = 2
theme_override_fonts/font = ExtResource("2_0ctdu")
theme_override_font_sizes/font_size = 64
text = "Credits"
horizontal_alignment = 1
[node name="CreditsLabel" type="Label" parent="VBoxContainer" unique_id=267626570]
layout_mode = 2
theme_override_fonts/font = ExtResource("2_0ctdu")
theme_override_font_sizes/font_size = 20
text = "Assets — Swordsman, Slimes, Tiles craftpix.net
Asset — Witch AntumDeluge
Asset — Various Effects bdragon1727
Music — Main Menu (8 Bit Dungeon) Kaden_Cook
Music — In-Game (Ashveil) Pixelmaniax"
[node name="BackButton" type="Button" parent="VBoxContainer" unique_id=561894849]
layout_mode = 2
theme_override_fonts/font = ExtResource("2_0ctdu")
theme_override_font_sizes/font_size = 32
text = "Back"
[connection signal="pressed" from="VBoxContainer/BackButton" to="." method="_on_back_button_pressed"]

View File

@ -1,752 +0,0 @@
[gd_scene format=3 uid="uid://cpe6aiuqiox0u"]
[ext_resource type="Script" uid="uid://dklt42vjjcks7" path="res://scripts/fire_slime.gd" id="1_88j2t"]
[ext_resource type="Texture2D" uid="uid://b1tyfy8ooudkc" path="res://assets/Slime3/With_shadow/Slime3_Death_with_shadow.png" id="2_ahfdi"]
[ext_resource type="Texture2D" uid="uid://bbm1sv6hmc2j" path="res://assets/Slime3/With_shadow/Slime3_Hurt_with_shadow.png" id="3_kq38e"]
[ext_resource type="Texture2D" uid="uid://bt07131sttb6e" path="res://assets/Slime3/With_shadow/Slime3_Walk_with_shadow.png" id="4_ret1g"]
[sub_resource type="AtlasTexture" id="AtlasTexture_u74be"]
atlas = ExtResource("2_ahfdi")
region = Rect2(0, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_hky14"]
atlas = ExtResource("2_ahfdi")
region = Rect2(64, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_1hmrm"]
atlas = ExtResource("2_ahfdi")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_icdnf"]
atlas = ExtResource("2_ahfdi")
region = Rect2(192, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_jpau6"]
atlas = ExtResource("2_ahfdi")
region = Rect2(256, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_pla0y"]
atlas = ExtResource("2_ahfdi")
region = Rect2(320, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_5ug5i"]
atlas = ExtResource("2_ahfdi")
region = Rect2(384, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_p0q1e"]
atlas = ExtResource("2_ahfdi")
region = Rect2(448, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_8gdmr"]
atlas = ExtResource("2_ahfdi")
region = Rect2(512, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_4gxlk"]
atlas = ExtResource("2_ahfdi")
region = Rect2(576, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_w642b"]
atlas = ExtResource("2_ahfdi")
region = Rect2(256, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_6tf61"]
atlas = ExtResource("2_ahfdi")
region = Rect2(0, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_354yo"]
atlas = ExtResource("2_ahfdi")
region = Rect2(64, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_wrhhh"]
atlas = ExtResource("2_ahfdi")
region = Rect2(128, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_5l6b7"]
atlas = ExtResource("2_ahfdi")
region = Rect2(192, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_ml8lr"]
atlas = ExtResource("2_ahfdi")
region = Rect2(256, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_flrsr"]
atlas = ExtResource("2_ahfdi")
region = Rect2(320, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_qr4cj"]
atlas = ExtResource("2_ahfdi")
region = Rect2(384, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_o5jey"]
atlas = ExtResource("2_ahfdi")
region = Rect2(448, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_1fjmf"]
atlas = ExtResource("2_ahfdi")
region = Rect2(512, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_3dxre"]
atlas = ExtResource("2_ahfdi")
region = Rect2(576, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_6mupu"]
atlas = ExtResource("2_ahfdi")
region = Rect2(0, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_cpqhb"]
atlas = ExtResource("2_ahfdi")
region = Rect2(64, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_vpjp1"]
atlas = ExtResource("2_ahfdi")
region = Rect2(128, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_pyvbc"]
atlas = ExtResource("2_ahfdi")
region = Rect2(192, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_t8xj5"]
atlas = ExtResource("2_ahfdi")
region = Rect2(256, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_uq6gh"]
atlas = ExtResource("2_ahfdi")
region = Rect2(320, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_q6wog"]
atlas = ExtResource("2_ahfdi")
region = Rect2(384, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_jcate"]
atlas = ExtResource("2_ahfdi")
region = Rect2(448, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_hl62h"]
atlas = ExtResource("2_ahfdi")
region = Rect2(512, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_60nri"]
atlas = ExtResource("2_ahfdi")
region = Rect2(576, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_60moo"]
atlas = ExtResource("2_ahfdi")
region = Rect2(0, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_pguj2"]
atlas = ExtResource("2_ahfdi")
region = Rect2(64, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_ybskn"]
atlas = ExtResource("2_ahfdi")
region = Rect2(128, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_el31c"]
atlas = ExtResource("2_ahfdi")
region = Rect2(192, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_7hu85"]
atlas = ExtResource("2_ahfdi")
region = Rect2(256, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_fuihh"]
atlas = ExtResource("2_ahfdi")
region = Rect2(320, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_mtyhi"]
atlas = ExtResource("2_ahfdi")
region = Rect2(384, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_sjkfo"]
atlas = ExtResource("2_ahfdi")
region = Rect2(448, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_htj0k"]
atlas = ExtResource("2_ahfdi")
region = Rect2(512, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_6hck2"]
atlas = ExtResource("2_ahfdi")
region = Rect2(576, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_0ksjp"]
atlas = ExtResource("3_kq38e")
region = Rect2(0, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_i4a22"]
atlas = ExtResource("3_kq38e")
region = Rect2(64, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_o8li6"]
atlas = ExtResource("3_kq38e")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_g0evx"]
atlas = ExtResource("3_kq38e")
region = Rect2(192, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_rdhnu"]
atlas = ExtResource("3_kq38e")
region = Rect2(256, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_84ews"]
atlas = ExtResource("3_kq38e")
region = Rect2(0, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_1xfj1"]
atlas = ExtResource("3_kq38e")
region = Rect2(64, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_trrl8"]
atlas = ExtResource("3_kq38e")
region = Rect2(128, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_lr5qx"]
atlas = ExtResource("3_kq38e")
region = Rect2(192, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_6ma40"]
atlas = ExtResource("3_kq38e")
region = Rect2(256, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_kwtft"]
atlas = ExtResource("3_kq38e")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_enu58"]
atlas = ExtResource("3_kq38e")
region = Rect2(0, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_7kdux"]
atlas = ExtResource("3_kq38e")
region = Rect2(64, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_bqnxo"]
atlas = ExtResource("3_kq38e")
region = Rect2(128, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_enu87"]
atlas = ExtResource("3_kq38e")
region = Rect2(192, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_2h6h5"]
atlas = ExtResource("3_kq38e")
region = Rect2(256, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_8fjfh"]
atlas = ExtResource("3_kq38e")
region = Rect2(0, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_vh8hy"]
atlas = ExtResource("3_kq38e")
region = Rect2(64, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_2rs53"]
atlas = ExtResource("3_kq38e")
region = Rect2(128, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_6qhe6"]
atlas = ExtResource("3_kq38e")
region = Rect2(192, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_5ch0i"]
atlas = ExtResource("3_kq38e")
region = Rect2(256, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_ugw68"]
atlas = ExtResource("4_ret1g")
region = Rect2(0, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_osbva"]
atlas = ExtResource("4_ret1g")
region = Rect2(64, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_e2rds"]
atlas = ExtResource("4_ret1g")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_8jpri"]
atlas = ExtResource("4_ret1g")
region = Rect2(192, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_p46gn"]
atlas = ExtResource("4_ret1g")
region = Rect2(256, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_tmsf0"]
atlas = ExtResource("4_ret1g")
region = Rect2(320, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_8jftq"]
atlas = ExtResource("4_ret1g")
region = Rect2(384, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_5xakg"]
atlas = ExtResource("4_ret1g")
region = Rect2(448, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_wjesj"]
atlas = ExtResource("4_ret1g")
region = Rect2(0, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_xicij"]
atlas = ExtResource("4_ret1g")
region = Rect2(64, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_wt4kn"]
atlas = ExtResource("4_ret1g")
region = Rect2(128, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_dfaft"]
atlas = ExtResource("4_ret1g")
region = Rect2(192, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_01vj4"]
atlas = ExtResource("4_ret1g")
region = Rect2(256, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_fevc3"]
atlas = ExtResource("4_ret1g")
region = Rect2(320, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_o8mkr"]
atlas = ExtResource("4_ret1g")
region = Rect2(384, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_khlie"]
atlas = ExtResource("4_ret1g")
region = Rect2(448, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_rt0q0"]
atlas = ExtResource("4_ret1g")
region = Rect2(0, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_b1gjj"]
atlas = ExtResource("4_ret1g")
region = Rect2(64, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_bt6g4"]
atlas = ExtResource("4_ret1g")
region = Rect2(128, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_jsjsv"]
atlas = ExtResource("4_ret1g")
region = Rect2(192, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_0l68k"]
atlas = ExtResource("4_ret1g")
region = Rect2(256, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_iimw2"]
atlas = ExtResource("4_ret1g")
region = Rect2(320, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_jlqmn"]
atlas = ExtResource("4_ret1g")
region = Rect2(384, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_gctn2"]
atlas = ExtResource("4_ret1g")
region = Rect2(448, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_x6bpc"]
atlas = ExtResource("4_ret1g")
region = Rect2(0, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_23if8"]
atlas = ExtResource("4_ret1g")
region = Rect2(64, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_1wf5b"]
atlas = ExtResource("4_ret1g")
region = Rect2(128, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_263iu"]
atlas = ExtResource("4_ret1g")
region = Rect2(192, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_gk0vp"]
atlas = ExtResource("4_ret1g")
region = Rect2(256, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_n30n6"]
atlas = ExtResource("4_ret1g")
region = Rect2(320, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_an4xw"]
atlas = ExtResource("4_ret1g")
region = Rect2(384, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_ohh0e"]
atlas = ExtResource("4_ret1g")
region = Rect2(448, 64, 64, 64)
[sub_resource type="SpriteFrames" id="SpriteFrames_05veu"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_u74be")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_hky14")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1hmrm")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_icdnf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jpau6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pla0y")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5ug5i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_p0q1e")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8gdmr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4gxlk")
}],
"loop": true,
"name": &"death_down",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_w642b")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6tf61")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_354yo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wrhhh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5l6b7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ml8lr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_flrsr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qr4cj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_o5jey")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1fjmf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3dxre")
}],
"loop": true,
"name": &"death_left",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_6mupu")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_cpqhb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vpjp1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pyvbc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_t8xj5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_uq6gh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_q6wog")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jcate")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_hl62h")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_60nri")
}],
"loop": true,
"name": &"death_right",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_60moo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pguj2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ybskn")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_el31c")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7hu85")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fuihh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mtyhi")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sjkfo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_htj0k")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6hck2")
}],
"loop": true,
"name": &"death_up",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_0ksjp")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_i4a22")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_o8li6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_g0evx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_rdhnu")
}],
"loop": false,
"name": &"hurt_down",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_84ews")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1xfj1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_trrl8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lr5qx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6ma40")
}],
"loop": true,
"name": &"hurt_left",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_kwtft")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_enu58")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7kdux")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bqnxo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_enu87")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2h6h5")
}],
"loop": true,
"name": &"hurt_right",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_8fjfh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vh8hy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2rs53")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6qhe6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5ch0i")
}],
"loop": true,
"name": &"hurt_up",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_ugw68")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_osbva")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_e2rds")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8jpri")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_p46gn")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tmsf0")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8jftq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5xakg")
}],
"loop": true,
"name": &"walk_down",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_wjesj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xicij")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wt4kn")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_dfaft")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_01vj4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fevc3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_o8mkr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_khlie")
}],
"loop": true,
"name": &"walk_left",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_rt0q0")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_b1gjj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bt6g4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jsjsv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0l68k")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_iimw2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jlqmn")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gctn2")
}],
"loop": true,
"name": &"walk_right",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_x6bpc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_23if8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1wf5b")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_263iu")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gk0vp")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_n30n6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_an4xw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ohh0e")
}],
"loop": true,
"name": &"walk_up",
"speed": 10.0
}]
[sub_resource type="CircleShape2D" id="CircleShape2D_1djsx"]
radius = 7.071068
[sub_resource type="CircleShape2D" id="CircleShape2D_odbmi"]
radius = 8.062258
[node name="FireSlime" type="CharacterBody2D" unique_id=1827403107]
script = ExtResource("1_88j2t")
metadata/_custom_type_script = "uid://c0uv02nt5ocvg"
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1151813585]
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_05veu")
animation = &"hurt_up"
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=2114857632]
position = Vector2(0, 1)
shape = SubResource("CircleShape2D_1djsx")
[node name="Area2D" type="Area2D" parent="." unique_id=1305327123]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D" unique_id=762851125]
position = Vector2(0, 1)
shape = SubResource("CircleShape2D_odbmi")

View File

@ -39,7 +39,7 @@ animations = [{
}],
"loop": true,
"name": &"default",
"speed": 35.0
"speed": 10.0
}]
[node name="Fireball" type="Area2D" unique_id=2100779306]

View File

@ -1,14 +1,11 @@
extends Node2D
@onready var _timer_label: Label = $CanvasLayer/TimerLabel
@onready var _spawn_control = $SpawnControl
var _debug_menu_script = preload("res://scripts/debug_menu.gd")
# Called when the node enters the scene tree for the first time.
func _ready():
MusicManager.play(preload("res://assets/music&sfx/music/ashveil-355633.mp3"))
add_child(_debug_menu_script.new())
func _process(_delta: float) -> void:
var t = int(_spawn_control.elapsed_time)
_timer_label.text = "%02d:%02d" % [t / 60, t % 60]
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -4,21 +4,36 @@
[ext_resource type="Script" uid="uid://cphrdy0xexx30" path="res://scenes/game.gd" id="1_vtaks"]
[ext_resource type="PackedScene" uid="uid://7vohdw0xop0g" path="res://scenes/worldborder.tscn" id="2_dinhu"]
[ext_resource type="Script" uid="uid://coplu13jpw4xq" path="res://scripts/camera_2d.gd" id="3_kvpfn"]
[ext_resource type="Script" uid="uid://b4jrogrq54c8f" path="res://scripts/SpawnEntry.gd" id="6_ir15t"]
[ext_resource type="Script" uid="uid://dovkm6w8af08x" path="res://scripts/spawn_control.gd" id="6_p57ef"]
[ext_resource type="PackedScene" uid="uid://ccotbw7gepsge" path="res://scenes/slime.tscn" id="7_ca42v"]
[ext_resource type="Texture2D" uid="uid://c4i3fnr6gpjp" path="res://assets/tileset/Tiled_files/details.png" id="7_gee14"]
[ext_resource type="PackedScene" uid="uid://b4v0ntaukg2je" path="res://scenes/witch.tscn" id="7_u5sy4"]
[ext_resource type="Texture2D" uid="uid://0xu8ohipv2mj" path="res://assets/tileset/Tiled_files/Objects.png" id="8_0tnpc"]
[ext_resource type="PackedScene" uid="uid://cj83ht5o2l8c1" path="res://scenes/blue_slime.tscn" id="8_rysoc"]
[ext_resource type="PackedScene" uid="uid://cgu7w2jd42f3a" path="res://scenes/tile_map_layer(background).tscn" id="8_vtaks"]
[ext_resource type="PackedScene" uid="uid://bgpsc6dvsn7ak" path="res://scenes/tile_map_layer(objects).tscn" id="9_kvpfn"]
[ext_resource type="PackedScene" uid="uid://co8t1fr3b3kub" path="res://scenes/tile_map_layer(overlay).tscn" id="10_dinhu"]
[ext_resource type="Script" uid="uid://ckv6prbe1o7s1" path="res://scripts/drop_manager.gd" id="10_vtaks"]
[ext_resource type="Script" uid="uid://pmmc7tivuuo4" path="res://scripts/perk_effects.gd" id="16_ca42v"]
[ext_resource type="Script" uid="uid://dm1sntwjrv3vl" path="res://scripts/level_up_manager.gd" id="16_rysoc"]
[ext_resource type="Texture2D" uid="uid://dp8o40ssuh8ip" path="res://assets/Tiny RPG Mana Soul GUI v1.0/20250421barB-Sheet.png" id="16_ssvqc"]
[ext_resource type="Script" uid="uid://duauc778wc3hd" path="res://scripts/pause_menu.gd" id="18_264po"]
[ext_resource type="FontFile" uid="uid://8v71dcws4q6o" path="res://assets/fonts/slkscre.ttf" id="19_1kice"]
[ext_resource type="Script" uid="uid://586y330mhx8" path="res://scripts/options_menu_ingame.gd" id="20_1kice"]
[sub_resource type="Resource" id="Resource_ssvqc"]
script = ExtResource("6_ir15t")
weight = 1.0
enemy = ExtResource("7_ca42v")
metadata/_custom_type_script = "uid://b4jrogrq54c8f"
[sub_resource type="Resource" id="Resource_264po"]
script = ExtResource("6_ir15t")
min_time = 10.0
weight = 0.5
enemy = ExtResource("8_rysoc")
metadata/_custom_type_script = "uid://b4jrogrq54c8f"
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_vtaks"]
texture = ExtResource("7_gee14")
1:1/0 = 0
@ -2368,6 +2383,11 @@ anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("6_p57ef")
spawn_entries = Array[ExtResource("6_ir15t")]([SubResource("Resource_ssvqc"), SubResource("Resource_264po")])
[node name="SpawnTimer" type="Timer" parent="." unique_id=1852920556]
wait_time = 0.2
autostart = true
[node name="Witch" parent="." unique_id=1188927311 instance=ExtResource("7_u5sy4")]
position = Vector2(304, 164)
@ -2389,88 +2409,24 @@ script = ExtResource("10_vtaks")
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1323249211]
[node name="ProgressBar" type="ProgressBar" parent="CanvasLayer" unique_id=825658619]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -303.5
offset_right = 303.5
offset_right = 607.0
offset_bottom = 27.0
grow_horizontal = 2
max_value = 5.0
step = 1.0
show_percentage = false
[node name="NinePatchRect" type="NinePatchRect" parent="CanvasLayer/ProgressBar" unique_id=1364517669]
texture_filter = 1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -6.5
offset_top = -1.0
offset_right = 5.5
offset_bottom = 2.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("16_ssvqc")
draw_center = false
region_rect = Rect2(0, 0, 95, 15)
patch_margin_left = 7
patch_margin_top = 5
patch_margin_right = 8
patch_margin_bottom = 6
[node name="TimerLabel" type="Label" parent="CanvasLayer" unique_id=1111111111]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -60.0
offset_top = 31.0
offset_right = 60.0
offset_bottom = 55.0
grow_horizontal = 2
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
theme_override_constants/shadow_offset_x = 1
theme_override_constants/shadow_offset_y = 1
theme_override_fonts/font = ExtResource("19_1kice")
theme_override_font_sizes/font_size = 20
text = "00:00"
horizontal_alignment = 1
[node name="LevelUpManager" type="Control" parent="CanvasLayer" unique_id=292400493]
process_mode = 3
layout_mode = 3
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
grow_horizontal = 2
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("16_rysoc")
[node name="ColorRect" type="ColorRect" parent="CanvasLayer/LevelUpManager" unique_id=1319513730]
layout_mode = 1
offset_left = -656.0
offset_top = -9.0
offset_right = 642.0
offset_bottom = 728.0
color = Color(0, 0, 0, 0.0627451)
[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/LevelUpManager" unique_id=957625333]
custom_minimum_size = Vector2(1000, 400)
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = 350.0
offset_right = 20.0
offset_bottom = 390.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/separation = 50
alignment = 1
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="PerkEffects" type="Node2D" parent="." unique_id=2027136639]
script = ExtResource("16_ca42v")
@ -2619,6 +2575,7 @@ theme_override_fonts/font = ExtResource("19_1kice")
theme_override_font_sizes/font_size = 32
text = "Back"
[connection signal="timeout" from="SpawnTimer" to="SpawnControl" method="_on_spawn_timer_timeout"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/ContinueButton" to="PauseMenu" method="_on_continue_button_pressed"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/OptionsButton" to="PauseMenu" method="_on_options_button_pressed"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/QuitButton" to="PauseMenu" method="_on_quit_button_pressed"]

View File

@ -1,66 +0,0 @@
[gd_scene format=3 uid="uid://dg8vanuerts1t"]
[ext_resource type="Script" uid="uid://c176y1113cvdw" path="res://scripts/level_up_particles.gd" id="1_lvlup"]
[sub_resource type="Gradient" id="Gradient_purple"]
colors = PackedColorArray(0.75, 0.2, 1, 1, 0.4, 0.05, 0.8, 0.35)
[sub_resource type="GradientTexture1D" id="GradTex_purple"]
gradient = SubResource("Gradient_purple")
[sub_resource type="ParticleProcessMaterial" id="Mat_purple"]
emission_shape = 3
emission_box_extents = Vector3(3, 5, 0)
direction = Vector3(0, -1, 0)
spread = 8.0
initial_velocity_min = 25.0
initial_velocity_max = 40.0
gravity = Vector3(0, 12, 0)
scale_min = 1.5
scale_max = 3.0
color_ramp = SubResource("GradTex_purple")
[sub_resource type="Gradient" id="Gradient_yellow"]
colors = PackedColorArray(1, 0.9, 0.1, 1, 0.9, 0.5, 0, 0.35)
[sub_resource type="GradientTexture1D" id="GradTex_yellow"]
gradient = SubResource("Gradient_yellow")
[sub_resource type="ParticleProcessMaterial" id="Mat_yellow"]
emission_shape = 3
emission_box_extents = Vector3(3, 5, 0)
direction = Vector3(0, -1, 0)
spread = 8.0
initial_velocity_min = 25.0
initial_velocity_max = 40.0
gravity = Vector3(0, 12, 0)
scale_min = 1.5
scale_max = 3.0
color_ramp = SubResource("GradTex_yellow")
[node name="LevelUpParticles" type="Node2D" unique_id=260593337]
script = ExtResource("1_lvlup")
[node name="Burst1" type="GPUParticles2D" parent="." unique_id=1316703941]
emitting = false
amount = 14
lifetime = 0.65
one_shot = true
explosiveness = 0.9
process_material = SubResource("Mat_purple")
[node name="Burst2" type="GPUParticles2D" parent="." unique_id=684638951]
emitting = false
amount = 14
lifetime = 0.65
one_shot = true
explosiveness = 0.9
process_material = SubResource("Mat_yellow")
[node name="Burst3" type="GPUParticles2D" parent="." unique_id=373983562]
emitting = false
amount = 14
lifetime = 0.65
one_shot = true
explosiveness = 0.9
process_material = SubResource("Mat_purple")

View File

@ -45,8 +45,7 @@ alignment = 1
layout_mode = 2
theme_override_fonts/font = ExtResource("4_3vvtq")
theme_override_font_sizes/font_size = 64
text = "Hexwarden"
horizontal_alignment = 1
text = "Working Title"
[node name="PlayButton" type="Button" parent="VBoxContainer" unique_id=1536378372]
custom_minimum_size = Vector2(200, 45)
@ -62,12 +61,6 @@ theme_override_fonts/font = ExtResource("4_3vvtq")
theme_override_font_sizes/font_size = 32
text = "Options"
[node name="CreditsButton" type="Button" parent="VBoxContainer" unique_id=98861855]
layout_mode = 2
theme_override_fonts/font = ExtResource("4_3vvtq")
theme_override_font_sizes/font_size = 32
text = "Credits"
[node name="QuitButton" type="Button" parent="VBoxContainer" unique_id=1704957427]
custom_minimum_size = Vector2(200, 45)
layout_mode = 2
@ -77,5 +70,4 @@ text = "Quit"
[connection signal="pressed" from="VBoxContainer/PlayButton" to="." method="_on_play_button_pressed"]
[connection signal="pressed" from="VBoxContainer/OptionsButton" to="." method="_on_options_button_pressed"]
[connection signal="pressed" from="VBoxContainer/CreditsButton" to="." method="_on_credits_button_pressed"]
[connection signal="pressed" from="VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"]

View File

@ -399,7 +399,7 @@ animations = [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_qk6i7")
}],
"loop": false,
"loop": true,
"name": &"attack_down",
"speed": 10.0
}, {
@ -422,7 +422,7 @@ animations = [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_jx8is")
}],
"loop": false,
"loop": true,
"name": &"attack_left",
"speed": 10.0
}, {
@ -445,7 +445,7 @@ animations = [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_cbf1i")
}],
"loop": false,
"loop": true,
"name": &"attack_right",
"speed": 10.0
}, {
@ -468,7 +468,7 @@ animations = [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_qmsq4")
}],
"loop": false,
"loop": true,
"name": &"attack_up",
"speed": 10.0
}, {
@ -775,9 +775,6 @@ animations = [{
"speed": 10.0
}]
[sub_resource type="CircleShape2D" id="CircleShape2D_tuyoq"]
radius = 30.0
[node name="Player" type="CharacterBody2D" unique_id=804585690]
collision_mask = 129
motion_mode = 1
@ -789,16 +786,4 @@ shape = SubResource("CapsuleShape2D_u8vuu")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1616479252]
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_giy8y")
animation = &"run_down"
[node name="MeleeArea" type="Area2D" parent="." unique_id=24997730]
[node name="CollisionShape2D" type="CollisionShape2D" parent="MeleeArea" unique_id=2002113716]
shape = SubResource("CircleShape2D_tuyoq")
[node name="AttackSpeed" type="Timer" parent="." unique_id=2072925004]
wait_time = 0.506
autostart = true
[connection signal="body_entered" from="MeleeArea" to="." method="_on_melee_area_body_entered"]
[connection signal="timeout" from="AttackSpeed" to="." method="_on_attack_speed_timeout"]
animation = &"attack_up"

View File

@ -7,7 +7,6 @@
[ext_resource type="Texture2D" uid="uid://cxddvfs2wfwcl" path="res://assets/Slime1/Without_shadow/Slime1_Idle_without_shadow.png" id="3_rrqju"]
[ext_resource type="Texture2D" uid="uid://b2bmw70co6noy" path="res://assets/Slime1/Without_shadow/Slime1_Walk_without_shadow.png" id="4_wyhst"]
[ext_resource type="Texture2D" uid="uid://bshpjl3w1n0y1" path="res://assets/Slime1/With_shadow/Slime1_Death_with_shadow.png" id="5_gstla"]
[ext_resource type="Texture2D" uid="uid://dwpyocmvqptui" path="res://assets/Slime1/With_shadow/Slime1_Hurt_with_shadow.png" id="7_v5wyi"]
[sub_resource type="Resource" id="Resource_gstla"]
script = ExtResource("2_2npkn")
@ -239,86 +238,6 @@ region = Rect2(256, 0, 64, 64)
atlas = ExtResource("3_rrqju")
region = Rect2(320, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_p5vph"]
atlas = ExtResource("7_v5wyi")
region = Rect2(0, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_4vxow"]
atlas = ExtResource("7_v5wyi")
region = Rect2(64, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_ymo5x"]
atlas = ExtResource("7_v5wyi")
region = Rect2(128, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_v338d"]
atlas = ExtResource("7_v5wyi")
region = Rect2(192, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_vn1yr"]
atlas = ExtResource("7_v5wyi")
region = Rect2(256, 0, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_il7ig"]
atlas = ExtResource("7_v5wyi")
region = Rect2(0, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_5baf8"]
atlas = ExtResource("7_v5wyi")
region = Rect2(64, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_mmuop"]
atlas = ExtResource("7_v5wyi")
region = Rect2(128, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_7fqim"]
atlas = ExtResource("7_v5wyi")
region = Rect2(192, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_0ivba"]
atlas = ExtResource("7_v5wyi")
region = Rect2(256, 128, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_0f1a3"]
atlas = ExtResource("7_v5wyi")
region = Rect2(0, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_3qxe4"]
atlas = ExtResource("7_v5wyi")
region = Rect2(64, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_8tsuk"]
atlas = ExtResource("7_v5wyi")
region = Rect2(128, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_uxjht"]
atlas = ExtResource("7_v5wyi")
region = Rect2(192, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_72t0a"]
atlas = ExtResource("7_v5wyi")
region = Rect2(256, 192, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_e0x1h"]
atlas = ExtResource("7_v5wyi")
region = Rect2(0, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_eodiq"]
atlas = ExtResource("7_v5wyi")
region = Rect2(64, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_d4gio"]
atlas = ExtResource("7_v5wyi")
region = Rect2(128, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_q2l3s"]
atlas = ExtResource("7_v5wyi")
region = Rect2(192, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_3l0w5"]
atlas = ExtResource("7_v5wyi")
region = Rect2(256, 64, 64, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_fur4c"]
atlas = ExtResource("4_wyhst")
region = Rect2(0, 0, 64, 64)
@ -649,86 +568,6 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_p5vph")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4vxow")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ymo5x")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_v338d")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vn1yr")
}],
"loop": true,
"name": &"hurt_down",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_il7ig")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5baf8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mmuop")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7fqim")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0ivba")
}],
"loop": true,
"name": &"hurt_left",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_0f1a3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3qxe4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8tsuk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_uxjht")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_72t0a")
}],
"loop": true,
"name": &"hurt_right",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_e0x1h")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_eodiq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_d4gio")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_q2l3s")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3l0w5")
}],
"loop": true,
"name": &"hurt_up",
"speed": 20.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_fur4c")
}, {
"duration": 1.0,
@ -857,7 +696,7 @@ drop_table = Array[ExtResource("2_2npkn")]([SubResource("Resource_gstla")])
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=752118449]
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_cbi0b")
animation = &"hurt_up"
animation = &"walk_right"
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=769710804]
position = Vector2(0, 1)

View File

@ -1,35 +0,0 @@
[gd_scene format=3 uid="uid://s5m6whnjl3cv"]
[ext_resource type="Script" uid="uid://c6w6hhayguqoj" path="res://scripts/spellbook.gd" id="1_f8wgx"]
[ext_resource type="Texture2D" uid="uid://dlygc6jakfapg" path="res://assets/books_set_2/books_pentagram.png" id="2_g1ouv"]
[sub_resource type="AtlasTexture" id="AtlasTexture_md3wj"]
atlas = ExtResource("2_g1ouv")
region = Rect2(0, 0, 32, 32)
[sub_resource type="SpriteFrames" id="SpriteFrames_qgan7"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_md3wj")
}],
"loop": true,
"name": &"default",
"speed": 10.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_i8red"]
size = Vector2(22.5, 26.5)
[node name="Spellbook" type="Area2D" unique_id=1926827672]
script = ExtResource("1_f8wgx")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1402601698]
texture_filter = 1
scale = Vector2(0.5, 0.5)
sprite_frames = SubResource("SpriteFrames_qgan7")
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=609912720]
position = Vector2(-0.625, -0.625)
scale = Vector2(0.5, 0.5)
shape = SubResource("RectangleShape2D_i8red")

View File

@ -1,33 +0,0 @@
[gd_scene format=3 uid="uid://oegpflgwf17e"]
[ext_resource type="Script" uid="uid://dpj26ryawjq02" path="res://scripts/throwing_knive.gd" id="2_knive"]
[ext_resource type="Texture2D" uid="uid://pot4k8a6lxd0" path="res://assets/weapons/knvie.png" id="2_tyd64"]
[sub_resource type="AtlasTexture" id="AtlasTexture_frs86"]
atlas = ExtResource("2_tyd64")
region = Rect2(0, 0, 32, 32)
[sub_resource type="SpriteFrames" id="SpriteFrames_t4gbw"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_frs86")
}],
"loop": true,
"name": &"default",
"speed": 5.0
}]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_1ss1s"]
size = Vector2(15, 7)
[node name="ThrowingKnive" type="Area2D" unique_id=882877238]
script = ExtResource("2_knive")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=164559800]
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_t4gbw")
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=886320879]
position = Vector2(0.5, -0.5)
shape = SubResource("RectangleShape2D_1ss1s")

View File

@ -1,152 +0,0 @@
[gd_scene format=3 uid="uid://byqfrmwg0mi3y"]
[ext_resource type="Script" uid="uid://cikwl1ib4puyt" path="res://scripts/tornado.gd" id="1_shahy"]
[ext_resource type="Texture2D" uid="uid://c50u48fy7jtd" path="res://assets/Free Effect Bullet Impact Explosion 32x32 V1/Purple Effect Bullet Impact Explosion 32x32.png" id="2_3gxx4"]
[sub_resource type="AtlasTexture" id="AtlasTexture_vctls"]
atlas = ExtResource("2_3gxx4")
region = Rect2(192, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_2nlrq"]
atlas = ExtResource("2_3gxx4")
region = Rect2(224, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_yxxy5"]
atlas = ExtResource("2_3gxx4")
region = Rect2(256, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_mdjqp"]
atlas = ExtResource("2_3gxx4")
region = Rect2(288, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_shahy"]
atlas = ExtResource("2_3gxx4")
region = Rect2(608, 160, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_3gxx4"]
atlas = ExtResource("2_3gxx4")
region = Rect2(576, 160, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_2nqqh"]
atlas = ExtResource("2_3gxx4")
region = Rect2(544, 160, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_g5iue"]
atlas = ExtResource("2_3gxx4")
region = Rect2(512, 160, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_c1uv1"]
atlas = ExtResource("2_3gxx4")
region = Rect2(512, 416, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_ido5e"]
atlas = ExtResource("2_3gxx4")
region = Rect2(512, 448, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_e7sy5"]
atlas = ExtResource("2_3gxx4")
region = Rect2(512, 384, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_0xwcu"]
atlas = ExtResource("2_3gxx4")
region = Rect2(544, 352, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_jd32a"]
atlas = ExtResource("2_3gxx4")
region = Rect2(576, 352, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_p68fy"]
atlas = ExtResource("2_3gxx4")
region = Rect2(608, 352, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_1h6yc"]
atlas = ExtResource("2_3gxx4")
region = Rect2(576, 384, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_3p0aw"]
atlas = ExtResource("2_3gxx4")
region = Rect2(608, 384, 32, 32)
[sub_resource type="SpriteFrames" id="SpriteFrames_2nqqh"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_vctls")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2nlrq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_yxxy5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mdjqp")
}],
"loop": true,
"name": &"default",
"speed": 10.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_shahy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3gxx4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2nqqh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_g5iue")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_c1uv1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ido5e")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_e7sy5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0xwcu")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jd32a")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_p68fy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1h6yc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3p0aw")
}],
"loop": false,
"name": &"explosion",
"speed": 10.0
}]
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_g5iue"]
radius = 25.0
height = 50.0
[sub_resource type="CircleShape2D" id="CircleShape2D_07hm3"]
radius = 54.0
[node name="Tornado" type="Area2D" unique_id=892015509]
script = ExtResource("1_shahy")
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1613801541]
texture_filter = 1
scale = Vector2(1.5, 1.5)
sprite_frames = SubResource("SpriteFrames_2nqqh")
frame_progress = 0.68617874
[node name="ExplosionCollision" type="CollisionShape2D" parent="." unique_id=1019771818]
shape = SubResource("CapsuleShape2D_g5iue")
disabled = true
[node name="TornadoArea" type="CollisionShape2D" parent="." unique_id=1356386666]
shape = SubResource("CircleShape2D_07hm3")

View File

@ -5,20 +5,14 @@ var witch
var player
var is_spawning = true
signal collected
var _collect_sfx = preload("res://assets/music&sfx/sfx/lesiakower-coin-collect-retro-8-bit-sound-effect-145251.mp3")
var _sfx_player: AudioStreamPlayer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
body_entered.connect(_on_body_entered)
witch = get_node("/root/Game/Witch")
collected.connect(witch._on_collect)
player = get_node("/root/Game/Player")
_sfx_player = AudioStreamPlayer.new()
_sfx_player.stream = _collect_sfx
_sfx_player.volume_db = -18
add_child(_sfx_player)
_animate_spawn()
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
@ -49,8 +43,6 @@ func _on_body_entered(body: Node2D) -> void:
pass
func collect():
_sfx_player.pitch_scale = randf_range(0.85, 1.15)
_sfx_player.play()
is_spawning = true
var position_drop = create_tween()
var target = witch.global_position
@ -62,5 +54,3 @@ func collect():
var scale_tween = create_tween()
collected.emit(self)
scale_tween.tween_property(self, "scale", Vector2.ZERO,0.2)
await scale_tween.finished
queue_free()

View File

@ -3,7 +3,4 @@ class_name Perk
@export var name: String
@export var description: String
@export var stats: String = ""
@export var spell: String = SpellLibrary.NONE
@export var icon: Texture2D = null
var effect: Callable

View File

@ -2,9 +2,8 @@ extends Area2D
class_name ProjectileBase
@export var size: float
@export var damage: int = 5
var speed = 200
@export var element: String
@export var element: String
var direction: Vector2
func _ready() -> void:
@ -21,7 +20,7 @@ func launch(target: Vector2):
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies"):
body.take_damage(damage)
body.hit()
queue_free()
func _remove():

View File

@ -1,6 +0,0 @@
extends Resource
class_name SpawnStage
@export var time_start: float = 0.0
@export var time_end: float = -1.0 # -1 = forever
@export var entries: Array[StageEntry]

View File

@ -1 +0,0 @@
uid://ca7n7kd1ki2is

View File

@ -1,32 +0,0 @@
extends Node
const APPLE = 0
const GRAPE = 1
const NONE = "NONE"
const SHURIKEN = "SHURIKEN"
const FIREBALL = "FIREBALL"
const FIRE_SWIRL = "FIRE_SWIRL"
const TORNADO = "TORNADO"
# Each spell's display recipe: sorted apples-first, grapes-last
var recipes: Dictionary = {
SHURIKEN: [APPLE, GRAPE, GRAPE],
FIREBALL: [APPLE, APPLE, APPLE],
FIRE_SWIRL: [APPLE, APPLE, GRAPE],
TORNADO: [GRAPE, GRAPE, GRAPE],
}
# Takes cauldron slot_states (uses texture indices: 2 = apple, 4 = grape)
# and returns which spell that combination brews.
func identify(cauldron_slots: Array) -> String:
var apples = cauldron_slots.count(2)
var grapes = cauldron_slots.count(4)
for spell_id in recipes:
var r: Array = recipes[spell_id]
if r.count(APPLE) == apples and r.count(GRAPE) == grapes:
return spell_id
return NONE
func get_recipe(spell: String) -> Array:
return recipes.get(spell, [])

View File

@ -1 +0,0 @@
uid://dpn7aoem55ptp

View File

@ -1,8 +0,0 @@
extends Resource
class_name StageEntry
@export var enemy: PackedScene
@export var count_at_start: int = 0
@export var count_at_end: int = 20
@export var min_interval: float = 0.3
@export var max_spawns: int = -1 # -1 = unlimited

View File

@ -1 +0,0 @@
uid://dc737qsmg74i

View File

@ -1,18 +1,17 @@
extends EnemyBase
func _ready() -> void:
super()
speed = 15.0
max_hp = 25
hp = max_hp
# $Area2D.body_entered.connect(_on_area_2d_body_entered)
speed = 0.1
hits_remaining = 2
$Area2D.body_entered.connect(_on_area_2d_body_entered)
func _process(delta: float) -> void:
super._process(delta)
if is_dying or is_hurt:
return
_chase_witch()
#func _on_area_2d_body_entered(body: Node2D) -> void:
#if body == player:
#take_damage(player.damage)
func _on_area_2d_body_entered(body: Node2D) -> void:
if body == player:
hit()

View File

@ -12,12 +12,10 @@ var slot_states = [0, 0, 0]
var progres_index = 0
var is_brewing
var brew_explosion = true
@onready var witch = get_parent()
var explosion_scene = preload("res://scenes/explosion.tscn")
var _ignite_sfx = preload("res://assets/music&sfx/sfx/data_pion-sfx9-fwoosh-324525.mp3")
var _ignite_player: AudioStreamPlayer
var _slot_shake_tweens: Array = []
@onready var witch = get_parent()
var explosion_scene = preload("res://scenes/explosion.tscn")# Called when the node enters the scene tree for the first time.
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
print(witch)
base.atlas = preload("res://assets/Cauldron's Brew/Equiptment.png")
@ -33,10 +31,7 @@ func _ready() -> void:
slots = [$Empty1, $Empty2, $Empty3]
colors = [base, yellow, red, orange, purple]
enrich_burning_colors()
_ignite_player = AudioStreamPlayer.new()
_ignite_player.stream = _ignite_sfx
_ignite_player.volume_db = -15
add_child(_ignite_player)
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
@ -49,21 +44,13 @@ func change_texture(slot_index: int, color_index: int):
pass
func reset_texture():
for t in _slot_shake_tweens:
if t:
t.kill()
_slot_shake_tweens.clear()
for i in slots.size():
slots[i].texture = colors[0]
slots[i].rotation = 0.0
slot_states = [0, 0, 0]
for slot in slots:
slot.texture = colors[0]
slot_states = [0,0,0]
func ignite_cauldrons():
for i in slots.size():
slots[i].texture = burning_colors[slot_states[i]]
_ignite_player.pitch_scale = randf_range(0.8, 1.2)
_ignite_player.play()
_slot_shake_tweens.append(_make_slot_shake(slots[i]))
await get_tree().create_timer(0.4).timeout
if brew_explosion:
var boom = explosion_scene.instantiate()
@ -83,40 +70,29 @@ func enrich_burning_colors():
func progres_bar(fruit):
if is_brewing:
return
if fruit is Apple:
change_texture(progres_index, 2)
if fruit is Apple:
change_texture(progres_index,2)
if fruit is Grape:
change_texture(progres_index, 4)
_pop_slot(progres_index)
progres_index += 1
if progres_index == 3:
brew(slot_states)
progres_index = 0
pass
func _pop_slot(slot_index: int) -> void:
var slot = slots[slot_index]
slot.pivot_offset = slot.size / 2
slot.scale = Vector2(1.35, 1.35)
var t = create_tween()
t.tween_property(slot, "scale", Vector2(1.0, 1.0), 0.18).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
func _make_slot_shake(slot: TextureRect) -> Tween:
slot.pivot_offset = slot.size / 2
var t = create_tween().set_loops()
t.tween_property(slot, "rotation", 0.015, 0.05)
t.tween_property(slot, "rotation", -0.015, 0.05)
t.tween_property(slot, "rotation", 0.0, 0.05)
return t
func brew(fruits):
is_brewing = true
var unique = get_unique_fruits()
await ignite_cauldrons()
match SpellLibrary.identify(fruits):
SpellLibrary.SHURIKEN: witch.shoot_shuriken()
SpellLibrary.FIREBALL: witch.shoot_fireballs()
SpellLibrary.FIRE_SWIRL: witch.shoot_fire_swirl()
SpellLibrary.TORNADO: witch.shoot_tornado()
if fruits == [2, 2, 4]:
witch.shoot_fire_swirl()
elif unique.has(2) and unique.size() == 1:
witch.shoot_fireballs()
elif unique.has(4) and unique.size() == 1:
witch.shoot_shuriken()
elif unique.has(2) and unique.has(4) and unique.size() == 2:
witch.shoot_fireballs()
witch.shoot_shuriken()
reset_texture()
is_brewing = false

View File

@ -1,15 +0,0 @@
extends CanvasLayer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _on_back_button_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/mainmenu.tscn")

View File

@ -1 +0,0 @@
uid://dt85lj7ts5i87

View File

@ -1,118 +0,0 @@
extends CanvasLayer
@onready var _spawn_control = get_node("/root/Game/SpawnControl")
@onready var _witch = get_node("/root/Game/Witch")
@onready var _drop_manager = get_node("/root/Game/DropManager")
var _spell_dispatch: Dictionary
var _lvl_disable_btn: Button
func _ready() -> void:
layer = 10
_spell_dispatch = {
SpellLibrary.FIREBALL: _witch.shoot_fireballs,
SpellLibrary.SHURIKEN: _witch.shoot_shuriken,
SpellLibrary.FIRE_SWIRL: _witch.shoot_fire_swirl,
SpellLibrary.TORNADO: _witch.shoot_tornado,
}
_build_ui()
hide()
func _exit_tree() -> void:
Engine.time_scale = 1.0
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventKey and event.pressed and not event.echo:
if event.keycode == KEY_D and event.ctrl_pressed:
visible = not visible
get_viewport().set_input_as_handled()
func _build_ui() -> void:
var panel := PanelContainer.new()
var style := StyleBoxFlat.new()
style.bg_color = Color(0.0, 0.0, 0.0, 0.75)
panel.add_theme_stylebox_override("panel", style)
panel.anchor_left = 1.0
panel.anchor_right = 1.0
panel.anchor_top = 0.0
panel.anchor_bottom = 1.0
panel.offset_left = -220
panel.offset_right = 0
add_child(panel)
var scroll := ScrollContainer.new()
scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
panel.add_child(scroll)
var vbox := VBoxContainer.new()
vbox.custom_minimum_size = Vector2(210, 0)
vbox.add_theme_constant_override("separation", 4)
scroll.add_child(vbox)
_add_section(vbox, "ENEMIES")
_add_button(vbox, "Kill All", _kill_all_enemies)
_add_section(vbox, "TIME SCALE")
var hbox_scale := HBoxContainer.new()
vbox.add_child(hbox_scale)
for s in [1, 2, 5, 10]:
var btn := Button.new()
btn.text = "%dx" % s
btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL
btn.pressed.connect(_set_time_scale.bind(float(s)))
hbox_scale.add_child(btn)
_add_section(vbox, "SKIP TIME")
var hbox_time := HBoxContainer.new()
vbox.add_child(hbox_time)
for secs in [30, 60]:
var btn := Button.new()
btn.text = "+%ds" % secs
btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL
btn.pressed.connect(_skip_time.bind(float(secs)))
hbox_time.add_child(btn)
_add_section(vbox, "SPELLS")
for spell_id in SpellLibrary.recipes.keys():
if _spell_dispatch.has(spell_id):
_add_button(vbox, spell_id.capitalize(), _spell_dispatch[spell_id])
_add_section(vbox, "LEVEL")
_add_button(vbox, "Level Up", _force_level_up)
_lvl_disable_btn = Button.new()
_lvl_disable_btn.text = "Disable Level Up: OFF"
_lvl_disable_btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_lvl_disable_btn.pressed.connect(_toggle_level_up_disabled)
vbox.add_child(_lvl_disable_btn)
func _add_section(parent: VBoxContainer, title: String) -> void:
var label := Label.new()
label.text = title
label.add_theme_color_override("font_color", Color.YELLOW)
label.add_theme_font_size_override("font_size", 11)
parent.add_child(label)
func _add_button(parent: VBoxContainer, label: String, callback: Callable) -> void:
var btn := Button.new()
btn.text = label
btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL
btn.pressed.connect(callback)
parent.add_child(btn)
func _kill_all_enemies() -> void:
for enemy in get_tree().get_nodes_in_group("enemies"):
if is_instance_valid(enemy):
enemy.die()
func _set_time_scale(scale: float) -> void:
Engine.time_scale = scale
func _skip_time(secs: float) -> void:
_spawn_control.elapsed_time += secs
func _force_level_up() -> void:
_drop_manager.force_level_up()
func _toggle_level_up_disabled() -> void:
_drop_manager.level_up_disabled = not _drop_manager.level_up_disabled
_lvl_disable_btn.text = "Disable Level Up: " + ("ON" if _drop_manager.level_up_disabled else "OFF")

View File

@ -1 +0,0 @@
uid://0r76ifdlnlv

View File

@ -3,13 +3,9 @@ extends Node2D
@onready var player = get_node("/root/Game/Player")
@onready var bar = get_node("/root/Game/CanvasLayer/ProgressBar")
signal leveled_up
@export var fruit_drop_threshold: int = 7
@export var fruit_drop_ceiling: int = 15
var level_up_disabled: bool = false # FOR DEBUG MENU
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
assert(fruit_drop_threshold <= fruit_drop_ceiling)
bar.max_value = player.max_xp
pass # Replace with function body.
@ -23,7 +19,7 @@ func on_enemy_died(enemy):
var enemy_xp = enemy.xp
player.current_xp += enemy.xp
bar.value = player.current_xp
if player.current_xp >= player.max_xp and not level_up_disabled:
if player.current_xp >= player.max_xp:
leveled_up.emit()
player.max_xp = player.max_xp * 1.3
bar.max_value = player.max_xp
@ -36,24 +32,8 @@ func on_enemy_died(enemy):
func drop_item(enemy):
if not is_instance_valid(enemy):
return
var fruit_count = get_children().filter(func(c): return c is DropsBase).size()
for entry in enemy.drop_table:
var effective_chance = entry.chance
if fruit_count >= fruit_drop_ceiling:
continue
elif fruit_count > fruit_drop_threshold:
var chance_scale = 1.0 - float(fruit_count - fruit_drop_threshold) / float(fruit_drop_ceiling - fruit_drop_threshold)
effective_chance *= chance_scale
if randf() < effective_chance:
if randf() < entry.chance:
var drop = entry.drop.instantiate()
drop.global_position = enemy.global_position
add_child(drop)
# FOR DEBUG MENU
func force_level_up() -> void:
leveled_up.emit()
player.max_xp = player.max_xp * 1.3
bar.max_value = player.max_xp
player.current_xp = 0
bar.value = 0
player.level += 1

View File

@ -4,14 +4,9 @@ extends CharacterBody2D
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@export var drop_table: Array[DropTable]
@export var damage: int = 2
@export var max_hp: int = 10
var is_dying = false
var is_hurt = false
var hp: int
var _touching_witch: bool = false
var hits_remaining = 1
var speed
var witch
var player
@ -26,17 +21,6 @@ func _ready() -> void:
witch = get_node("/root/Game/Witch")
player = get_node("/root/Game/Player")
animated_sprite_2d.sprite_frames = animated_sprite_2d.sprite_frames.duplicate()
hp = max_hp
$Area2D.body_entered.connect(_on_base_body_entered)
$Area2D.body_exited.connect(_on_base_body_exited)
func _on_base_body_entered(body: Node2D) -> void:
if body == witch:
_touching_witch = true
func _on_base_body_exited(body: Node2D) -> void:
if body == witch:
_touching_witch = false
func die():
is_dying = true
@ -48,55 +32,46 @@ func die():
death_anim = "death_up" if last_direction.y < 0 else "death_down"
animated_sprite_2d.sprite_frames.set_animation_loop(death_anim, false)
animated_sprite_2d.play(death_anim)
_play_hit_sound()
var player = AudioStreamPlayer.new()
add_child(player)
player.stream = death_sound
player.bus = "SFX"
player.play()
died.emit(self)
await animated_sprite_2d.animation_finished
queue_free()
func _play_hit_sound() -> void:
var ap = AudioStreamPlayer.new()
add_child(ap)
ap.stream = death_sound
ap.bus = "SFX"
ap.pitch_scale = randf_range(0.7, 1.3)
ap.play()
func take_damage(amount: int) -> void:
func hit() -> void:
if is_dying or is_hurt:
return
hp -= amount
if hp <= 0:
hits_remaining -= 1
if hits_remaining <= 0:
die()
else:
_play_hurt()
func hit() -> void:
take_damage(1)
func _play_hurt() -> void:
is_hurt = true
var hurt_anim: String
if abs(last_direction.x) >= abs(last_direction.y):
hurt_anim = "hurt_left" if last_direction.x < 0 else "hurt_right"
else:
hurt_anim = "hurt_up" if last_direction.y < 0 else "hurt_down"
if not animated_sprite_2d.sprite_frames.has_animation(hurt_anim):
return
is_hurt = true
_play_hit_sound()
animated_sprite_2d.sprite_frames.set_animation_loop(hurt_anim, false)
animated_sprite_2d.play(hurt_anim)
await get_tree().create_timer(0.25, true).timeout
await animated_sprite_2d.animation_finished
is_hurt = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if _touching_witch and not is_dying:
witch.take_damage(damage)
pass
func _chase_witch() -> void:
var direction = Vector2(witch.global_position - global_position).normalized()
var direction = Vector2(witch.global_position - global_position)
if direction != Vector2.ZERO:
last_direction = direction
velocity = direction * speed
velocity = direction * speed
if direction == Vector2.ZERO:
animated_sprite_2d.play("idle")

View File

@ -1,12 +1,11 @@
extends Area2D
@export var damage: int = 15
# Called when the node enters the scene tree for the first time.
func _ready():
await get_tree().physics_frame
for body in get_overlapping_bodies():
if body.is_in_group("enemies"):
body.take_damage(damage)
body.hit()
await $AnimatedSprite2D.animation_finished
queue_free()

View File

@ -1,19 +0,0 @@
extends EnemyBase
func _ready() -> void:
super()
speed = 15.0
max_hp = 50
hp = max_hp
$Area2D.body_entered.connect(_on_area_2d_body_entered)
func _process(delta: float) -> void:
super._process(delta)
if is_dying or is_hurt:
return
_chase_witch()
func _on_area_2d_body_entered(body: Node2D) -> void:
#if body == player:
# take_damage(player.damage)
pass

View File

@ -1 +0,0 @@
uid://dklt42vjjcks7

View File

@ -15,10 +15,9 @@ const DIRS := [
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies"):
body.take_damage(damage)
body.hit()
func _ready() -> void:
damage = 6
if _is_spread_child:
super()
return

View File

@ -2,19 +2,14 @@ extends ProjectileBase
var fireball_aoe = false
var explosion_scene = preload("res://scenes/explosion.tscn")
@onready var perk_effects = get_node("/root/Game/PerkEffects")
func _ready() -> void:
super()
damage = 8
@onready var perk_effects = get_node("/root/Game/PerkEffects")# Called when the node enters the scene tree for the first time.
func _on_body_entered(body: Node2D) -> void:
fireball_aoe = perk_effects.fireball_aoe_enabled
if body.is_in_group("enemies"):
body.take_damage(damage)
body.hit()
if fireball_aoe:
var boom = explosion_scene.instantiate()
boom.global_position = global_position
get_parent().call_deferred("add_child", boom)
get_parent().add_child(boom)
queue_free()

View File

@ -2,66 +2,33 @@ extends Control
@onready var perk_effects = get_node("/root/Game/PerkEffects")
var level_sound = preload("res://assets/music&sfx/sfx/lesiakower-level-up-enhancement-8-bit-retro-sound-effect-153002.mp3")
var select_sound = preload("res://assets/music&sfx/sfx/47313572-experimental-8-bit-sound-270302.mp3")
var card_shuffle_sound = preload("res://assets/music&sfx/sfx/card_shuffle.wav")
var perks
var player = AudioStreamPlayer.new()
var select_player = AudioStreamPlayer.new()
var shuffle_player = AudioStreamPlayer.new()
@onready var perkCard = preload("res://scenes/PerkCard.tscn")
var _particles_scene = preload("res://scenes/level_up_particles.tscn")
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
perks = perk_effects.available_perks
get_node("/root/Game/DropManager").leveled_up.connect(show_perks)
add_child(player)
add_child(select_player)
add_child(shuffle_player)
player.volume_db = -10
select_player.volume_db = -10
shuffle_player.volume_db = -10
select_player.stream = select_sound
shuffle_player.stream = card_shuffle_sound
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func show_perks():
player.stream = level_sound
player.play()
if perks.is_empty():
return
var tween = create_tween()
tween.tween_property($ColorRect, "color:a", 0.6, 0.3)
get_tree().paused = true
var shuffled = perks.duplicate()
shuffled.shuffle()
var chosen = shuffled.slice(0, 3)
await get_tree().create_timer(0.4).timeout
for x in chosen:
var card = perkCard.instantiate()
$HBoxContainer.add_child(card)
card.setup(x, func(): select_perk(x), func(): select_player.play())
shuffle_player.play()
await get_tree().create_timer(0.25).timeout
var button = Button.new()
button.text = x.name + "\n" + x.description
button.pressed.connect(func(): select_perk(x))
$HBoxContainer.add_child(button)
func select_perk(perk):
perk.effect.call()
get_tree().paused = false
_spawn_level_up_particles(get_node("/root/Game/Witch").global_position)
_spawn_level_up_particles(get_node("/root/Game/Player").global_position)
perks.erase(perk)
for child in $HBoxContainer.get_children(): child.queue_free()
var tween = create_tween()
tween.tween_property($ColorRect, "color:a", 0.0, 0.3)
await tween.finished
func _spawn_level_up_particles(pos: Vector2) -> void:
var p = _particles_scene.instantiate()
p.global_position = pos
p.z_index = 10
get_node("/root/Game").add_child(p)
get_tree().create_timer(1.2).timeout.connect(p.queue_free)

View File

@ -1,8 +0,0 @@
extends Node2D
func _ready() -> void:
$Burst1.emitting = true
await get_tree().create_timer(0.1).timeout
$Burst2.emitting = true
await get_tree().create_timer(0.1).timeout
$Burst3.emitting = true

View File

@ -1 +0,0 @@
uid://c176y1113cvdw

View File

@ -8,9 +8,6 @@ func _on_play_button_pressed() -> void:
func _on_options_button_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/options.tscn")
func _on_credits_button_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/credits.tscn")
func _on_quit_button_pressed() -> void:
get_tree().quit()

View File

@ -1,155 +0,0 @@
extends Control
@export var icon: Texture2D
var on_select: Callable
var play_sound: Callable
var _recipe_panel: Control = null
var _panel_tween: Tween = null
const _PANEL_REST_Y = 18
const _FRUIT_ATLAS = preload("res://assets/16x16 Pixelart Food Icons/Pixel_Foods(ARTLİNE).png")
const _FONT_BOLD = preload("res://assets/fonts/slkscrb.ttf")
func setup(perk: Perk, select: Callable, sound: Callable):
$Button.button_down.connect(_on_button_down)
$Button.modulate.a = 0
$Card/Name.text = perk.name
var content = perk.description
if perk.stats != "":
content += "\n\n" + perk.stats
$Card/Description.text = "[center]" + content + "[/center]"
if perk.icon != null:
$Card/Name/TextureRect.texture = perk.icon
_build_recipe_panel(perk)
animate_in()
$Button.mouse_entered.connect(_on_hover_enter)
$Button.mouse_exited.connect(_on_hover_exit)
on_select = select
play_sound = sound
func _build_recipe_panel(perk: Perk) -> void:
var is_brewed = perk.spell != SpellLibrary.NONE
var panel_w := 240
var panel_h := 74 if is_brewed else 38
_recipe_panel = Control.new()
_recipe_panel.position = Vector2(0, _PANEL_REST_Y)
_recipe_panel.size = Vector2(panel_w, panel_h)
_recipe_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE
var border := ColorRect.new()
border.mouse_filter = Control.MOUSE_FILTER_IGNORE
border.color = Color(0.55, 0.4, 0.1, 1.0)
border.size = Vector2(panel_w, panel_h)
_recipe_panel.add_child(border)
var bg := ColorRect.new()
bg.mouse_filter = Control.MOUSE_FILTER_IGNORE
bg.color = Color(0.08, 0.04, 0.14, 0.96)
bg.position = Vector2(2, 2)
bg.size = Vector2(panel_w - 4, panel_h - 4)
_recipe_panel.add_child(bg)
var header := Label.new()
header.mouse_filter = Control.MOUSE_FILTER_IGNORE
header.add_theme_font_override("font", _FONT_BOLD)
header.add_theme_font_size_override("font_size", 13)
header.add_theme_color_override("font_color", Color(0.85, 0.72, 0.45, 1.0))
header.add_theme_constant_override("outline_size", 2)
header.add_theme_color_override("font_outline_color", Color(0, 0, 0, 1))
header.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
header.size = Vector2(panel_w, 22)
if is_brewed:
header.text = "BREW RECIPE"
header.position = Vector2(0, 6)
_recipe_panel.add_child(header)
var hbox := HBoxContainer.new()
hbox.mouse_filter = Control.MOUSE_FILTER_IGNORE
hbox.add_theme_constant_override("separation", 4)
hbox.alignment = BoxContainer.ALIGNMENT_CENTER
hbox.size = Vector2(panel_w, 36)
hbox.position = Vector2(0, 32)
var recipe := SpellLibrary.get_recipe(perk.spell)
for i in recipe.size():
if i > 0:
var plus := Label.new()
plus.mouse_filter = Control.MOUSE_FILTER_IGNORE
plus.text = "+"
plus.add_theme_font_override("font", _FONT_BOLD)
plus.add_theme_font_size_override("font_size", 14)
plus.add_theme_color_override("font_color", Color(1, 1, 1, 0.6))
plus.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
hbox.add_child(plus)
var fruit := TextureRect.new()
fruit.mouse_filter = Control.MOUSE_FILTER_IGNORE
var atlas := AtlasTexture.new()
atlas.atlas = _FRUIT_ATLAS
atlas.region = Rect2(1, 2, 16, 15) if recipe[i] == SpellLibrary.APPLE else Rect2(55, 19, 15, 16)
fruit.texture = atlas
fruit.custom_minimum_size = Vector2(32, 32)
fruit.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
fruit.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
hbox.add_child(fruit)
_recipe_panel.add_child(hbox)
else:
header.text = "AUTO / PASSIVE"
header.position = Vector2(0, panel_h / 2 - 11)
_recipe_panel.add_child(header)
add_child(_recipe_panel)
move_child(_recipe_panel, 0)
func _on_hover_enter():
if _panel_tween:
_panel_tween.kill()
_panel_tween = create_tween().set_parallel()
_panel_tween.tween_property(self, "scale", Vector2(0.93, 0.93), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
_panel_tween.tween_property(_recipe_panel, "position:y", -float(_recipe_panel.size.y), 0.22).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CUBIC)
func _on_hover_exit():
if _panel_tween:
_panel_tween.kill()
_panel_tween = create_tween().set_parallel()
_panel_tween.tween_property(self, "scale", Vector2(1.0, 1.0), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
_panel_tween.tween_property(_recipe_panel, "position:y", float(_PANEL_REST_Y), 0.15).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_QUAD)
func _on_button_down() -> void:
if _recipe_panel:
_recipe_panel.visible = false
play_sound.call()
await animate_out()
on_select.call()
func animate_in():
await get_tree().process_frame
pivot_offset = size / 2
var icon_node = $Card/Name/TextureRect
icon_node.pivot_offset = icon_node.size / 2
var pulse = create_tween().set_loops()
pulse.tween_property(icon_node, "scale", Vector2(1.12, 1.12), 0.9).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE)
pulse.tween_property(icon_node, "scale", Vector2(1.0, 1.0), 0.9).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE)
var start_y = global_position.y + 500
var end_y = global_position.y
global_position.y = start_y
var tween = create_tween()
tween.tween_property(self, "global_position:y", end_y, 0.3).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
func animate_out():
var start_y = global_position.y
var end_y = global_position.y - 500
global_position.y = start_y
var tween = create_tween()
tween.tween_property(self, "global_position:y", end_y, 0.3).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_QUAD)
await tween.finished

View File

@ -1 +0,0 @@
uid://dw5y2tp34fxys

View File

@ -3,292 +3,42 @@ extends Node2D
@onready var witch = get_node("/root/Game/Witch")
@onready var player = get_node("/root/Game/Player")
var fireball = preload("res://scenes/fireball.tscn")
var throwing_knife = preload("res://scenes/throwing_knive.tscn")
var cauldron
var available_perks: Array[Perk] = []
var fireball_aoe_enabled = false
var throwing_knife_enabled = false
var throwing_knife_cooldown: float = 2.0
var throwing_knife_count: int = 1
var _knife_timer: float = 0.0
var spellbook_scene = preload("res://scenes/spellbook.tscn")
var spellbook_count: int = 0
var spellbook_damage: int = 12
var spellbook_speed: float = 1.5
const SPELLBOOK_RADIUS: float = 60.0
var _spellbook_angle: float = 0.0
var _spellbooks: Array = []
var _icon_knife = preload("res://assets/weapons/knvie.png")
var _icon_book = preload("res://assets/books_set_2/books_pentagram.png")
var _icon_brew = preload("res://assets/books_set_2/books_health_potion.png")
var _icon_shuriken: AtlasTexture
var _icon_fireball: AtlasTexture
var _icon_player: AtlasTexture
func _stat(label: String, from: String, to: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#888888]" + from + "[/color] → [color=#77dd77]" + to + "[/color]"
func _stat_new(label: String, val: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#77dd77]" + val + "[/color]"
func _stat_toggle(label: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#888888]OFF[/color] → [color=#77dd77]ON[/color]"
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
cauldron = witch.get_node("CauldronBar")
_icon_shuriken = AtlasTexture.new()
_icon_shuriken.atlas = preload("res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_02.png")
_icon_shuriken.region = Rect2(496, 32, 16, 16)
_icon_fireball = AtlasTexture.new()
_icon_fireball.atlas = preload("res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_00.png")
_icon_fireball.region = Rect2(576, 1, 16, 16)
_icon_player = AtlasTexture.new()
_icon_player.atlas = preload("res://assets/Swordsman_lvl1/Without_shadow/Swordsman_lvl1_Idle_without_shadow.png")
_icon_player.region = Rect2(0, 0, 64, 64)
var dsh = Perk.new()
dsh.name = "Double Shuriken"
dsh.description = "Fire two shurikens at once"
dsh.stats = _stat("Shurikens", "1", "2")
dsh.spell = SpellLibrary.SHURIKEN
dsh.icon = _icon_shuriken
dsh.name = "Doppelter Shuriken"
dsh.description = "Wirft zwei Shurikens statt einem"
dsh.effect = double_shuriken
available_perks.append(dsh)
var faoe = Perk.new()
faoe.name = "AOE Fireball"
faoe.description = "Fireballs explode on impact"
faoe.stats = _stat_toggle("AOE")
faoe.spell = SpellLibrary.FIREBALL
faoe.icon = _icon_fireball
faoe.name = "AOE-Fireball"
faoe.description = "Feuerbälle erzeugen eine Explosion bei Berührung"
faoe.effect = fireball_aoe
available_perks.append(faoe)
var bexp = Perk.new()
bexp.name = "Brew Explosion"
bexp.description = "Trigger an explosion on brew"
bexp.stats = _stat_toggle("Explosion")
bexp.spell = SpellLibrary.NONE
bexp.icon = _icon_brew
bexp.name = "Brewing-Explosion"
bexp.description = "Die Hexe erzeugt eine Explosion am Ende des Brauens"
bexp.effect = brew_explosion
available_perks.append(bexp)
pass # Replace with function body.
var tk = Perk.new()
tk.name = "Throwing Knife"
tk.description = "Auto-throw at nearby enemies"
tk.stats = _stat_new("Cooldown", "%.1fs" % throwing_knife_cooldown)
tk.spell = SpellLibrary.NONE
tk.icon = _icon_knife
tk.effect = enable_throwing_knife
available_perks.append(tk)
var sb = Perk.new()
sb.name = "Spellbook"
sb.description = "An orbiting book hits enemies"
sb.stats = "[color=#aaaaaa]Damage Count[/color]\n[color=#77dd77]" + str(spellbook_damage) + " 1[/color]"
sb.spell = SpellLibrary.NONE
sb.icon = _icon_book
sb.effect = unlock_spellbook
available_perks.append(sb)
var sf = Perk.new()
sf.name = "Swift Feet"
sf.description = "Move faster"
sf.stats = _stat("Speed", str(player.speed), str(player.speed + 10))
sf.spell = SpellLibrary.NONE
sf.icon = _icon_player
sf.effect = swift_feet
available_perks.append(sf)
var bh = Perk.new()
bh.name = "Battle Hardened"
bh.description = "Hit harder"
bh.stats = _stat("Strength", str(player.strength), str(player.strength + 2))
bh.spell = SpellLibrary.NONE
bh.icon = _icon_player
bh.effect = battle_hardened
available_perks.append(bh)
var ss = Perk.new()
ss.name = "Swift Strike"
ss.description = "Attack more often"
ss.stats = _stat("Attack CD", "%.2fs" % player.get_node("AttackSpeed").wait_time, "%.2fs" % maxf(0.2, player.get_node("AttackSpeed").wait_time - 0.1))
ss.spell = SpellLibrary.NONE
ss.icon = _icon_player
ss.effect = swift_strike
available_perks.append(ss)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if throwing_knife_enabled:
_knife_timer += delta
if _knife_timer >= throwing_knife_cooldown:
_knife_timer = 0.0
_shoot_throwing_knife()
if spellbook_count > 0:
_spellbook_angle += spellbook_speed * delta
for i in range(_spellbooks.size()):
var offset = (TAU / _spellbooks.size()) * i
_spellbooks[i].global_position = witch.global_position + Vector2(cos(_spellbook_angle + offset), sin(_spellbook_angle + offset)) * SPELLBOOK_RADIUS
pass
func double_shuriken():
witch.shuriken_count = 2
func fireball_aoe():
fireball_aoe_enabled = true
func brew_explosion():
cauldron.brew_explosion = true
func enable_throwing_knife():
throwing_knife_enabled = true
var upg = Perk.new()
upg.name = "Knife Cooldown"
upg.description = "Throw knives more often"
upg.stats = _stat("Cooldown", "%.1fs" % throwing_knife_cooldown, "%.1fs" % maxf(1.0, throwing_knife_cooldown - 0.2))
upg.icon = _icon_knife
upg.effect = knife_cooldown_upgrade
available_perks.append(upg)
var ek = Perk.new()
ek.name = "Extra Knife"
ek.description = "Throw one more knife"
ek.stats = _stat("Knives", str(throwing_knife_count), str(throwing_knife_count + 1))
ek.icon = _icon_knife
ek.effect = extra_knife
available_perks.append(ek)
func extra_knife():
throwing_knife_count = min(throwing_knife_count + 1, 3)
if throwing_knife_count < 3:
var ek = Perk.new()
ek.name = "Extra Knife"
ek.description = "Throw one more knife"
ek.stats = _stat("Knives", str(throwing_knife_count), str(throwing_knife_count + 1))
ek.icon = _icon_knife
ek.effect = extra_knife
available_perks.append(ek)
func knife_cooldown_upgrade():
throwing_knife_cooldown = maxf(1.0, throwing_knife_cooldown - 0.2)
if throwing_knife_cooldown > 1.0:
var upg = Perk.new()
upg.name = "Knife Cooldown"
upg.description = "Throw knives more often"
upg.stats = _stat("Cooldown", "%.1fs" % throwing_knife_cooldown, "%.1fs" % maxf(1.0, throwing_knife_cooldown - 0.2))
upg.icon = _icon_knife
upg.effect = knife_cooldown_upgrade
available_perks.append(upg)
func _shoot_throwing_knife() -> void:
for i in range(throwing_knife_count):
var knife = throwing_knife.instantiate()
knife.global_position = witch.global_position
witch.get_parent().add_child(knife)
func unlock_spellbook() -> void:
spellbook_count = 1
_rebuild_spellbooks()
var eb = Perk.new()
eb.name = "Extra Book"
eb.description = "Add one more orbiting book"
eb.stats = _stat("Books", str(spellbook_count), str(spellbook_count + 1))
eb.icon = _icon_book
eb.effect = extra_book
available_perks.append(eb)
var fo = Perk.new()
fo.name = "Faster Orbit"
fo.description = "Books orbit faster"
fo.stats = _stat("Speed", "%.1f" % spellbook_speed, "%.1f" % (spellbook_speed + 0.5))
fo.icon = _icon_book
fo.effect = faster_orbit
available_perks.append(fo)
var bd = Perk.new()
bd.name = "Book Damage"
bd.description = "Books hit harder"
bd.stats = _stat("Damage", str(spellbook_damage), str(spellbook_damage + 4))
bd.icon = _icon_book
bd.effect = book_damage
available_perks.append(bd)
func extra_book() -> void:
spellbook_count = min(spellbook_count + 1, 5)
_rebuild_spellbooks()
if spellbook_count < 5:
var eb = Perk.new()
eb.name = "Extra Book"
eb.description = "Add one more orbiting book"
eb.stats = _stat("Books", str(spellbook_count), str(spellbook_count + 1))
eb.icon = _icon_book
eb.effect = extra_book
available_perks.append(eb)
func faster_orbit() -> void:
spellbook_speed += 0.5
var fo = Perk.new()
fo.name = "Faster Orbit"
fo.description = "Books orbit faster"
fo.stats = _stat("Speed", "%.1f" % spellbook_speed, "%.1f" % (spellbook_speed + 0.5))
fo.icon = _icon_book
fo.effect = faster_orbit
available_perks.append(fo)
func book_damage() -> void:
spellbook_damage += 4
for book in _spellbooks:
book.damage = spellbook_damage
var bd = Perk.new()
bd.name = "Book Damage"
bd.description = "Books hit harder"
bd.stats = _stat("Damage", str(spellbook_damage), str(spellbook_damage + 4))
bd.icon = _icon_book
bd.effect = book_damage
available_perks.append(bd)
func _rebuild_spellbooks() -> void:
for book in _spellbooks:
book.queue_free()
_spellbooks.clear()
for i in range(spellbook_count):
var book = spellbook_scene.instantiate()
book.damage = spellbook_damage
witch.get_parent().add_child(book)
_spellbooks.append(book)
func swift_feet() -> void:
player.speed += 10
var sf = Perk.new()
sf.name = "Swift Feet"
sf.description = "Move faster"
sf.stats = _stat("Speed", str(player.speed), str(player.speed + 10))
sf.spell = SpellLibrary.NONE
sf.icon = _icon_player
sf.effect = swift_feet
available_perks.append(sf)
func battle_hardened() -> void:
player.strength += 2
var bh = Perk.new()
bh.name = "Battle Hardened"
bh.description = "Hit harder"
bh.stats = _stat("Strength", str(player.strength), str(player.strength + 2))
bh.spell = SpellLibrary.NONE
bh.icon = _icon_player
bh.effect = battle_hardened
available_perks.append(bh)
func swift_strike() -> void:
var timer = player.get_node("AttackSpeed")
timer.wait_time = maxf(0.2, timer.wait_time - 0.1)
if timer.wait_time > 0.2:
var ss = Perk.new()
ss.name = "Swift Strike"
ss.description = "Attack more often"
ss.stats = _stat("Attack CD", "%.2fs" % timer.wait_time, "%.2fs" % maxf(0.2, timer.wait_time - 0.1))
ss.spell = SpellLibrary.NONE
ss.icon = _icon_player
ss.effect = swift_strike
available_perks.append(ss)

View File

@ -1,83 +1,26 @@
extends CharacterBody2D
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
var current_xp = 0
var max_xp = 5
var max_xp =5
var level = 1
var speed = 60
var strength = 3
var attacks = false
var speed = 200 # speed in pixels/sec
func _physics_process(delta):
var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = direction * speed
move_and_slide()
if attacks == true:
return
if direction == Vector2.ZERO:
animated_sprite_2d.speed_scale = 1.0
animated_sprite_2d.play("idle")
elif abs(direction.x) >= abs(direction.y):
animated_sprite_2d.speed_scale = speed / 60.0
if direction.x < 0:
animated_sprite_2d.play("walk_left")
else:
animated_sprite_2d.play("walk_right")
else:
animated_sprite_2d.speed_scale = speed / 60.0
if direction.y < 0:
animated_sprite_2d.play("walk_up")
else:
animated_sprite_2d.play("walk_down")
func attack():
if attacks:
return
for body in $MeleeArea.get_overlapping_bodies():
if body.is_in_group("enemies"):
attacks = true
var dir = global_position.direction_to(body.global_position)
if dir == Vector2.ZERO:
animated_sprite_2d.play("idle")
elif abs(dir.x) >= abs(dir.y):
if dir.x < 0:
animated_sprite_2d.play("attack_left")
else:
animated_sprite_2d.play("attack_right")
else:
if dir.y < 0:
animated_sprite_2d.play("attack_up")
else:
animated_sprite_2d.play("attack_down")
animated_sprite_2d.speed_scale = 0.5 / $AttackSpeed.wait_time * 1.4
var wait_time = $AttackSpeed.wait_time
await get_tree().create_timer(wait_time / 2).timeout
body.take_damage(strength)
var knockback_dir = global_position.direction_to(body.global_position)
var enemy_tween = create_tween()
enemy_tween.tween_property(body, "global_position", body.global_position + knockback_dir * 20, 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
var player_tween = create_tween()
player_tween.tween_property(self, "global_position", global_position - knockback_dir * 10, 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
await animated_sprite_2d.animation_finished
animated_sprite_2d.speed_scale = 1
attacks = false
break
func _on_attack_speed_timeout() -> void:
if $MeleeArea.get_overlapping_bodies().any(func(b): return b.is_in_group("enemies")):
attack()
else:
$AttackSpeed.call_deferred("stop")
pass # Replace with function body.
func _on_melee_area_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies"):
if $AttackSpeed.is_stopped():
attack()
$AttackSpeed.start()
move_and_slide()

View File

@ -6,7 +6,6 @@ var enemies_hit = 0
func _ready() -> void:
speed = 500
super()
damage = 5
var first = get_nearest_enemy(global_position)
if first == null:
queue_free()
@ -16,7 +15,7 @@ func _ready() -> void:
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies") and not body.is_hurt and not body.is_dying:
enemies_hit += 1
body.take_damage(damage)
body.hit()
if enemies_hit == 20:
queue_free()
else:

View File

@ -1,19 +1,22 @@
extends EnemyBase
# Called when the node enters the scene tree for the first time.
# Called every frame. 'delta' is the elapsed time since the previous frame.+
func _ready() -> void:
super()
speed = 15.0
max_hp = 10
hp = max_hp
speed = 0.1
func _process(delta: float) -> void:
super._process(delta)
if is_dying or is_hurt:
if is_dying:
return
_chase_witch()
pass
func _on_area_2d_body_entered(body: Node2D) -> void:
if is_dying:
return
# if body == player:
# take_damage(player.damage)
if body == player:
die()
pass # Replace with function body.

View File

@ -1,117 +1,72 @@
extends Control
var up_left: Vector2
var down_right: Vector2
var up_right: Vector2
var down_left: Vector2
var elapsed_time: float = 0.0
const STAGES_JSON = "res://data/spawn_stages.json"
var stages: Array[SpawnStage] = []
# _state keys: Vector2i(stage_idx, entry_idx)
# values: { "timer": float, "alive": int }
var _state: Dictionary = {}
var up_left
var down_right
var up_right
var down_left
var viewport_rect
var elapsed_time = 0.0
@export var spawn_entries: Array[SpawnEntry]
func _ready() -> void:
var camera: Camera2D = get_parent().get_node("Camera2D")
var viewport_size = get_viewport_rect().size
var world_size = viewport_size / camera.zoom
var world_origin = camera.global_position
var world_origin = camera.global_position # anchor_mode = 0 → top-left corner
up_left = world_origin
down_right = world_origin + world_size
up_right = Vector2(down_right.x, up_left.y)
down_left = Vector2(up_left.x, down_right.y)
_load_stages(STAGES_JSON)
for si in stages.size():
for ei in stages[si].entries.size():
_state[Vector2i(si, ei)] = { "timer": 0.0, "alive": 0, "spawned_total": 0 }
func _load_stages(path: String) -> void:
var file = FileAccess.open(path, FileAccess.READ)
if file == null:
push_error("spawn_control: cannot open " + path)
return
var data = JSON.parse_string(file.get_as_text())
if not data is Array:
push_error("spawn_control: invalid JSON in " + path)
return
for sd in data:
var stage = SpawnStage.new()
stage.time_start = float(sd["time_start"])
stage.time_end = float(sd["time_end"])
for ed in sd["entries"]:
var entry = StageEntry.new()
entry.enemy = load(ed["enemy"])
entry.count_at_start = int(ed["count_at_start"])
entry.count_at_end = int(ed["count_at_end"])
entry.min_interval = float(ed["min_interval"])
entry.max_spawns = int(ed.get("max_spawns", -1))
stage.entries.append(entry)
stages.append(stage)
func get_spawn_position() -> Vector2:
var side = randi() % 4
var spawn_x: float
var spawn_y: float
var spawn_x
var spawn_y
if side == 0:
# oben
spawn_x = randf_range(up_left.x, up_right.x)
spawn_y = up_left.y
elif side == 1:
# rechts
spawn_x = up_right.x
spawn_y = randf_range(up_right.y, down_right.y)
elif side == 2:
#unten
spawn_x = randf_range(up_left.x, up_right.x)
spawn_y = down_left.y
else:
elif side == 3:
#links
spawn_x = up_left.x
spawn_y = randf_range(up_right.y, down_right.y)
return Vector2(spawn_x, spawn_y)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
elapsed_time += delta
pass
for si in stages.size():
var stage: SpawnStage = stages[si]
if elapsed_time < stage.time_start:
continue
if stage.time_end != -1.0 and elapsed_time > stage.time_end:
continue
var t: float
if stage.time_end == -1.0:
t = 1.0
else:
t = clamp(
(elapsed_time - stage.time_start) / (stage.time_end - stage.time_start),
0.0, 1.0
)
for ei in stage.entries.size():
var entry: StageEntry = stage.entries[ei]
var state: Dictionary = _state[Vector2i(si, ei)]
if entry.max_spawns != -1 and state["spawned_total"] >= entry.max_spawns:
continue
var target: int = roundi(lerpf(float(entry.count_at_start), float(entry.count_at_end), t))
var deficit: int = target - state["alive"]
if deficit <= 0:
continue
state["timer"] -= delta
if state["timer"] <= 0.0:
state["timer"] = max(entry.min_interval, 1.0 / float(deficit))
_spawn_one(entry, state)
func _spawn_one(entry: StageEntry, state: Dictionary) -> void:
var enemy = entry.enemy.instantiate()
func spawn_enemy() -> void:
var sum_weight = 0.0
var available = []
for entry in spawn_entries:
if entry.min_time <= elapsed_time:
available.append(entry)
sum_weight += entry.weight
var roll = randf() * sum_weight
var winner = null
for entry in available:
roll -= entry.weight
if roll <= 0:
winner = entry
break
if winner == null:
return
var enemy = winner.enemy.instantiate()
enemy.global_position = get_spawn_position()
state["alive"] += 1
state["spawned_total"] += 1
enemy.tree_exited.connect(func(): state["alive"] -= 1)
add_child(enemy)
func _on_spawn_timer_timeout() -> void:
spawn_enemy()
pass # Replace with function body.

View File

@ -1,18 +0,0 @@
extends Area2D
var damage: int = 12
var _hit_cooldowns: Dictionary = {}
func _ready() -> void:
body_entered.connect(_on_body_entered)
func _process(delta: float) -> void:
for enemy in _hit_cooldowns.keys():
_hit_cooldowns[enemy] -= delta
if _hit_cooldowns[enemy] <= 0.0:
_hit_cooldowns.erase(enemy)
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("enemies") and not _hit_cooldowns.has(body):
body.take_damage(damage)
_hit_cooldowns[body] = 0.8

Some files were not shown because too many files have changed in this diff Show More