Compare commits

..

62 Commits

Author SHA1 Message Date
5dbf7fcf1f continued inventory saving (missing things will be created in an issue asap) 2025-12-16 22:19:41 +01:00
70eaa9514a started inventory saving 2025-12-16 21:07:35 +01:00
befb117d85 created progress saves 2025-12-16 14:18:15 +01:00
54a2ee3022 refactored reset game 2025-12-16 13:57:52 +01:00
ce3f590715 bugfix 2025-12-16 13:00:00 +01:00
39fc7d549a removed test for git 2025-12-15 21:58:53 +01:00
8902e28d31 test for git 2025-12-15 21:58:45 +01:00
f15850b022 removed test for git 2025-12-15 21:56:25 +01:00
46765031e4 test for git 2025-12-15 21:56:03 +01:00
2cda920e15 refactor main method signature and enhance config initialization 2025-12-15 21:49:19 +01:00
93467760db fix knockback application logic in damage handling 2025-12-15 18:12:18 +01:00
6be9927752 implement knockback mechanics and adjust attack detection for OrcMON 2025-12-15 18:11:57 +01:00
1343b18753 refactor invincibility handling by consolidating invincible counting logic into a separate method 2025-12-15 17:25:59 +01:00
e0986d4708 add knockback value to GreenSlime monster and update player transparency handling 2025-12-14 00:02:54 +01:00
d018ed3e6e add guarding mechanic and implement guard sprite handling 2025-12-13 23:55:47 +01:00
133afa9c06 add new sound effects for blocked and parry actions 2025-12-13 22:34:35 +01:00
c4b1d029aa remove TODO comment for fixing monster attack sprite drawing position 2025-12-13 22:26:15 +01:00
c8d7a56934 refactor Orc monster actions and improve attack image initialization (closes #8) 2025-12-13 22:25:44 +01:00
4f9d1dfcb6 add Orc monster implementation and enhance player-monster interaction 2025-12-13 20:21:28 +01:00
d092a39115 refactor entity behavior and enhance monster chasing logic 2025-12-13 19:09:05 +01:00
9263626ca2 add MiniMap functionality and integrate map state handling 2025-12-13 18:20:01 +01:00
87aba81f32 update .gitignore to include system.txt and ensure gamedata is tracked 2025-12-13 15:57:48 +01:00
4aa955246b refactor map handling and improve tile initialization logic 2025-12-13 15:40:26 +01:00
f9c511d6bb add sleeping functionality to Tent object and update player image handling 2025-12-13 14:49:03 +01:00
7f8d9d7e9b add Tent object and implement sleep functionality with lighting adjustments 2025-12-13 14:37:36 +01:00
27c36d880d update lighting logic to extend night duration and enhance gradient color customization 2025-12-13 14:16:54 +01:00
c1e355637e refactor debug display logic in Lighting.java to conditionally show day state 2025-12-13 14:06:33 +01:00
7b3a8bca0f implement day-night cycle with dynamic lighting adjustments 2025-12-13 14:06:01 +01:00
2105a0e8af add lantern object and implement light management in player and environment 2025-12-13 13:44:52 +01:00
7ee7614c6c simplify lighting rendering by removing unnecessary shape calculations 2025-12-13 13:09:15 +01:00
4b9c0006a6 add EnvironmentManager and Lighting classes for enhanced environment rendering 2025-12-13 13:03:50 +01:00
42ed4dd099 refactor Boot.java to streamline game initialization and window generation 2025-12-13 12:19:05 +01:00
97da3982d1 added stackable functionality to items and improved inventory management 2025-12-13 12:13:01 +01:00
b380e218f6 removed unnecessary imports 2025-12-13 01:00:54 +01:00
1131996d77 changed package name of a star algo 2025-12-13 00:48:09 +01:00
825b084a68 obstacles and chest loot 2025-12-13 00:44:53 +01:00
1d6f53a70e added knockback to monsters 2025-12-12 23:45:57 +01:00
2e73a012d1 slimes can now get aggro and follow you (and stop following you if you ran away) 2025-12-12 21:58:41 +01:00
c02ae0302c made hitboxed visible in debug mode (closed #2) 2025-12-12 21:47:17 +01:00
4276c24392 made path visible in debug mode 2025-12-12 21:41:04 +01:00
9484797ced fixed a pathfinding bug 2025-12-12 21:37:18 +01:00
4ab53ceab9 added path finding algorithm 2025-12-12 21:33:52 +01:00
a89838eb38 made world change events world-bound 2025-12-12 17:59:43 +01:00
580775bf30 added trading system 2025-12-12 16:44:50 +01:00
eb2c435671 made item buyable 2025-12-12 16:33:05 +01:00
484abf4f9b added transition effect to map change 2025-12-12 14:57:47 +01:00
d546d302c6 lower cased Config#SETTING to Config#Setting 2025-12-12 14:30:11 +01:00
7e8a27a671 made map switching possible 2025-12-12 13:48:42 +01:00
de42dd6bd6 events are now world-bound 2025-12-12 13:27:42 +01:00
4aabe84d59 all entity arrays are now two-dimensional (with map index so entities won't be rendered on any map anymore) 2025-12-12 13:20:14 +01:00
67309a6e28 changed tile array to three-dimensional array (i0=map; i1=col; i2=row) 2025-12-12 12:52:50 +01:00
5dd43b6f9d added game over screen 2025-12-12 12:26:32 +01:00
785a76942e optimized settings 2025-12-12 11:52:31 +01:00
099f52278c save game settings and parse them 2025-12-12 11:34:01 +01:00
d294578a74 finished options menu 2025-12-11 19:21:06 +01:00
21f4acf6b1 make the other buttons in the options menu work 2025-12-11 19:05:35 +01:00
eba67d7cf8 made music and sfx volume adjustable 2025-12-11 18:55:32 +01:00
e9fc671135 added unfinished fullscreen option 2025-12-11 18:26:50 +01:00
5192c8df87 continued options menu 2025-12-09 14:47:43 +01:00
2abdb3b5fb added start of options menu 2025-12-08 20:29:11 +01:00
7ac1207c83 added option subwindow 2025-12-08 14:23:39 +01:00
fb0273afb0 fixed bug in build.sh 2025-12-08 06:25:51 +01:00
99 changed files with 3130 additions and 593 deletions

6
.gitignore vendored
View File

@@ -33,3 +33,9 @@ bin/
### JPackage ###
JGame2D
### Local Game Settings ###
gamedata
/system.txt

BIN
MapEditor.jar Normal file

Binary file not shown.

View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: de.miaurizius.jgame2d.core.Boot

50
assets/maps/dungeon01.map Normal file
View File

@@ -0,0 +1,50 @@
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 36 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 17 32 32 32 32 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 17 17 17 17 32 32 17 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 17 17 17 17 17 17 17 32 32 32 17 17 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 32 32 32 17 17 17 17 17 17 17 32 32 32 32 32 17 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 17 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 17 17 17 17 32 32 32 32 32 32 32 32 32 17 17 17 17 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 32 32 17 17 17 32 32 17 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 17 17 17 32 17 17 17 32 32 17 32 32 32 32 17 32 32 32 32 32 32 17 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 32 32 32 32 32 32 32 32 17 32 32 32 17 32 32 17 17 17 17 17 32 32 17 17 17 32 32 17 17 17 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 17 17 32 32 32 32 32 17 32 32 32 17 32 32 17 17 17 17 17 32 17 17 32 32 32 32 32 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 17 17 32 32 32 32 32 17 32 32 32 17 32 32 17 17 17 17 17 17 17 32 32 32 32 32 32 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 17 17 32 32 32 32 32 17 32 32 32 17 32 32 32 17 17 17 17 32 32 32 32 32 32 32 32 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 17 17 32 32 32 32 32 17 32 32 32 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 32 32 32 32 32 32 32 17 32 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 32 32 32 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 32 32 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 32 17 32 32 32 32 32 17 17 17 32 32 32 32 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 17 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 17 32 32 32 32 32 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 32 32 32 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 37 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 32 32 32 17 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

50
assets/maps/dungeon02.map Normal file
View File

@@ -0,0 +1,50 @@
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 17 17 17 17 17 17 17 17 17 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 17 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 17 37 17 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

View File

@@ -0,0 +1,50 @@
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
27 18 27 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 2 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 21 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 14 14 22 30 30 30 30 30 22 14 14 14 14 14 14 22 14 14 30 14 14 22 14 11 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 25 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 26 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 27 18 5 22 10 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 15 30 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 10 6 32 1 1 1 1 1 1 4 6 32 1 1 1 1 1 1 1 4 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 30 10 6 15 31 3 3 3 3 23 10 6 15 31 3 3 3 3 3 23 10 6 15 22 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 27 18 5 30 10 6 15 11 18 18 18 18 5 10 6 15 11 18 18 18 18 18 5 10 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 10 6 15 34 9 9 9 9 17 10 6 15 34 9 9 9 9 9 17 10 6 15 14 11 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 27 5 22 10 6 8 16 16 16 16 16 16 12 6 8 16 16 16 16 16 16 16 12 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 10 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
27 18 18 5 14 10 6 32 1 1 1 1 1 1 4 6 32 1 1 1 1 1 1 1 4 6 15 22 11 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18
18 27 18 5 30 10 6 15 31 3 3 3 3 23 10 6 15 31 3 3 3 3 3 23 10 6 15 30 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 10 6 15 11 18 18 18 18 5 10 6 15 11 18 18 18 18 18 5 10 6 15 14 11 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 14 10 6 15 34 9 9 9 9 17 10 6 15 34 9 9 9 9 9 17 10 6 15 14 11 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 22 10 6 8 16 16 16 16 16 16 12 6 8 16 16 16 16 16 16 16 12 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 27 18 5 14 10 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 15 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 5 30 19 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 22 11 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
27 18 18 5 14 30 14 14 14 22 14 30 30 14 14 22 14 14 14 30 14 14 14 22 14 30 14 14 11 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 28 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 18 18 18 27 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 27 18 18 18 27 27 18 18 18 27 18 18 18 18 18 27 18 18 18 18 18 18 18 18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 27 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

50
assets/maps/hut.map Normal file
View File

@@ -0,0 +1,50 @@
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 43 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 44 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 43 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 43 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 43 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 43 43 43 43 43 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 40 40 40 10 40 40 40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

50
assets/maps/indoor01.map Normal file
View File

@@ -0,0 +1,50 @@
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 32 32 32 32 32 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 34 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 35 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 34 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 34 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 34 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 34 34 34 34 34 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 32 32 32 0 32 32 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

View File

@@ -1,12 +0,0 @@
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 2 2 2 2 0 0 0 0 0 1
1 0 0 0 0 0 2 2 2 2 0 0 0 0 0 1
1 0 0 0 0 0 2 2 2 2 0 0 0 0 0 1
1 0 0 0 0 0 2 2 2 2 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

View File

@@ -1,50 +0,0 @@
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 13 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 13 12 12 13 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12
12 12 12 12 12 13 22 20 20 20 20 20 20 20 23 12 12 12 22 20 20 20 20 20 20 20 20 23 12 12 12 22 20 20 20 20 20 20 20 20 20 20 23 12 12 12 12 12 12 12
12 12 12 12 12 12 18 41 40 40 40 40 40 41 19 20 20 20 21 41 10 10 11 10 10 10 10 19 20 20 20 21 41 10 35 33 33 33 33 33 33 36 17 12 12 13 12 12 12 12
12 12 13 12 12 12 18 41 40 39 39 39 40 41 41 41 41 41 41 41 10 14 15 15 15 16 10 41 41 41 41 41 41 41 31 26 26 26 26 26 26 30 17 12 12 12 12 12 12 12
12 12 12 12 12 12 18 41 40 39 39 39 40 41 41 41 41 41 41 41 10 17 12 12 12 18 10 41 41 41 41 41 41 41 31 26 26 26 26 26 26 30 17 12 12 12 12 12 12 12
12 12 12 13 12 12 18 41 40 39 39 39 40 41 41 41 41 41 41 41 10 17 12 12 12 18 11 41 41 41 41 41 41 41 31 26 26 26 26 26 26 30 17 12 13 12 12 12 12 12
12 12 12 12 13 12 18 41 40 39 39 39 40 41 41 41 41 41 41 41 10 19 20 20 20 21 10 41 41 41 41 41 41 41 31 26 26 26 26 26 26 30 17 12 12 12 12 12 12 12
12 12 12 12 12 12 18 41 40 40 39 40 40 41 41 41 41 41 41 41 11 10 35 33 36 10 10 10 10 10 10 10 10 10 37 28 28 29 26 27 28 38 17 13 12 12 12 12 12 12
12 12 12 12 12 12 18 41 41 41 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 41 41 31 26 30 14 15 25 12 12 12 12 12 12 12
12 12 12 12 13 12 18 41 41 41 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 41 41 31 26 30 17 12 12 12 12 13 12 12 12 12
12 12 12 12 12 12 24 15 16 41 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 41 41 31 26 30 17 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 18 41 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 10 10 10 41 41 41 41 41 41 41 41 41 31 26 30 17 12 12 12 12 12 13 12 12 12
12 12 13 12 12 12 12 22 21 41 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 35 33 34 26 30 17 12 12 13 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 10 10 41 41 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 31 26 26 26 30 17 12 12 12 12 12 12 12 12 12
12 12 12 13 12 12 12 18 10 41 41 41 41 41 41 41 41 41 41 41 41 10 31 26 30 10 41 41 41 41 41 41 41 41 41 31 26 27 28 38 17 12 13 12 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 41 41 41 10 35 33 33 33 33 33 33 33 33 34 26 32 33 33 33 33 33 33 33 33 33 33 34 26 30 10 41 17 12 12 12 12 12 12 12 12 12
12 12 12 12 12 13 12 18 10 41 41 41 11 31 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 30 10 14 25 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 13 18 10 10 41 41 10 37 28 28 28 28 28 28 28 28 29 26 27 28 28 28 28 28 28 28 28 28 28 29 26 30 10 17 12 13 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 24 16 10 41 41 10 41 41 41 41 41 41 41 41 10 31 26 30 10 41 41 41 41 41 41 41 41 41 31 26 30 10 17 12 12 12 12 13 12 12 12 12 12
12 12 12 12 12 12 12 12 18 10 41 41 10 41 41 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 31 26 30 11 17 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 13 12 22 21 10 41 41 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 31 26 30 10 17 12 12 12 13 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 10 41 41 41 41 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 31 26 30 10 17 12 12 12 12 12 12 12 12 12 12
12 12 12 13 12 12 12 18 10 41 41 41 41 41 10 41 41 41 41 41 41 41 31 26 30 41 41 10 41 41 41 41 41 41 41 31 26 30 10 17 12 13 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 41 41 41 41 41 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 10 41 41 41 41 31 26 30 10 17 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 13 18 10 10 10 10 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 10 41 41 41 41 37 28 38 10 17 12 12 12 12 13 12 12 12 12 12
12 12 12 12 12 12 12 18 10 10 11 10 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 41 10 41 14 25 12 12 13 12 12 12 12 12 12 12
12 12 12 12 12 12 12 24 16 10 10 10 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 10 10 10 17 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 13 12 12 18 10 10 10 10 11 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 10 10 10 17 12 12 12 12 12 12 12 13 12 12 12
12 12 12 12 12 12 12 12 18 11 10 10 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 10 10 11 17 12 12 13 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 18 10 10 10 10 10 10 41 41 41 41 41 41 41 31 26 30 41 41 41 41 41 41 41 41 41 41 10 10 10 17 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 13 12 12 22 21 41 41 41 41 41 41 41 41 41 41 41 41 41 37 28 38 41 41 41 41 41 41 41 41 41 41 11 10 10 19 23 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 18 41 41 41 41 41 41 41 41 41 41 41 10 10 10 10 10 10 10 10 41 41 41 41 41 41 41 10 10 10 10 10 19 23 12 12 12 13 12 12 12 12 12
12 12 12 12 12 12 13 18 41 41 41 41 41 41 41 41 41 41 10 10 10 10 10 10 10 10 10 10 41 41 10 41 41 10 10 10 10 10 10 10 17 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 41 41 41 41 41 41 41 41 41 10 11 10 10 10 10 10 11 10 10 41 41 41 41 10 10 10 10 10 11 10 10 17 12 13 12 12 12 12 12 12 12
12 12 12 12 12 12 12 18 10 41 41 41 41 10 41 41 41 41 10 10 11 10 10 10 10 10 10 10 10 41 41 41 10 10 10 10 10 41 10 10 17 12 12 12 12 12 12 12 12 12
12 12 13 12 12 12 12 18 10 41 41 41 41 41 41 41 41 41 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 41 10 10 10 10 10 17 12 12 12 12 13 12 12 12 12
12 12 12 12 12 12 12 18 10 41 41 41 41 10 41 14 15 15 16 10 10 10 10 10 11 10 10 14 15 15 16 10 10 10 10 10 10 10 11 10 17 12 12 12 12 12 12 13 12 12
12 12 12 12 12 12 12 18 41 41 41 41 41 41 14 25 12 12 24 16 10 10 10 10 10 10 14 25 12 12 18 10 10 41 10 10 41 10 10 10 17 12 12 12 12 12 12 12 12 12
12 12 12 12 13 12 12 24 15 15 15 15 15 15 25 12 12 12 12 24 15 15 15 15 15 15 25 12 13 12 24 16 10 11 10 10 10 10 14 15 25 12 13 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 24 15 15 15 15 15 15 25 12 12 12 12 12 12 12 13 12 12 12
12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12
12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12

View File

@@ -1,50 +0,0 @@
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 1 1 1 1 4 4 4 4 4 4 4 4 2 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 0 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 3 3 3 1 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 1 1 0 1 1 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 5 0 4 4 4 4 4 4 4 4 4 4 4 5 5 5 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 0 0 5 0 0 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 0 0 0 5 0 0 0 4 4 4 4 4 4 4 4 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 0 0 0 5 0 0 0 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 4 0 0 5 0 0 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 4 4 4 4 4 4 4 4 4 0 5 0 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 0 4 4 4 4 4 4 4 0 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 0 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 0 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 4 4 0 4 4 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 0 0 0 0 4 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 4 4 0 0 4 0 0 4 0 0 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

76
assets/maps/tiledata Normal file
View File

@@ -0,0 +1,76 @@
000.png
false
001.png
false
002.png
false
003.png
false
004.png
false
005.png
false
006.png
false
007.png
false
008.png
false
009.png
false
010.png
false
011.png
false
012.png
false
013.png
false
014.png
false
015.png
false
016.png
true
017.png
false
018.png
true
019.png
true
020.png
true
021.png
true
022.png
true
023.png
true
024.png
true
025.png
true
026.png
true
027.png
true
028.png
true
029.png
true
030.png
true
031.png
true
032.png
true
033.png
false
034.png
false
035.png
true
036.png
false
037.png
false

View File

@@ -0,0 +1,76 @@
035.png
true
026.png
true
019.png
true
018.png
true
000.png
false
009.png
false
037.png
false
007.png
false
034.png
false
028.png
true
008.png
false
001.png
false
036.png
false
005.png
false
021.png
true
013.png
false
023.png
true
032.png
true
029.png
true
031.png
true
033.png
true
014.png
false
025.png
true
016.png
true
003.png
false
024.png
true
030.png
true
004.png
false
010.png
false
027.png
true
012.png
false
006.png
false
015.png
false
020.png
true
017.png
false
011.png
false
022.png
true
002.png
false

50
assets/maps/worldmap.map Normal file
View File

@@ -0,0 +1,50 @@
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 28 26 26 26 26 26 26 26 29 18 28 26 26 26 26 26 26 26 26 29 18 18 18 28 26 26 26 26 26 26 26 26 26 26 29 18 18 18 18 18 18 18
18 19 18 18 18 18 18 18 24 16 32 32 32 32 32 16 25 26 27 16 1 1 1 1 1 1 1 25 26 26 26 27 16 1 12 10 10 10 10 10 10 13 23 18 18 19 18 18 18 18
18 18 18 18 18 18 18 18 24 16 32 17 17 17 32 16 16 16 16 16 1 20 21 21 21 22 1 16 16 16 16 16 16 16 8 3 3 3 3 3 3 7 23 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 24 16 32 17 36 17 32 16 16 16 16 16 1 23 18 18 18 24 1 16 16 16 16 16 16 16 8 3 3 3 3 3 3 7 23 18 18 18 18 19 18 18
18 18 18 18 18 18 18 18 24 16 32 17 17 17 32 16 16 16 16 16 1 23 18 18 18 24 1 16 16 16 16 16 16 16 8 3 3 3 3 3 3 7 23 19 18 18 18 18 18 18
18 18 19 18 18 18 18 18 24 16 32 17 17 17 32 16 16 16 16 16 1 25 26 26 26 27 1 16 16 16 16 16 16 16 8 3 3 3 3 3 3 7 23 18 18 18 18 18 18 18
18 18 18 18 18 19 18 18 24 16 32 32 17 32 32 16 16 16 16 16 1 1 12 10 13 1 1 1 1 1 1 1 1 1 14 5 5 6 3 4 5 15 23 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 24 16 16 16 1 16 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 16 16 8 3 7 20 21 31 18 18 18 19 18 18 18
18 18 18 18 18 18 18 18 30 22 16 16 1 16 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 16 16 8 3 7 23 18 18 18 18 18 18 18 18 18
18 19 18 18 18 18 18 19 18 24 16 16 1 16 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 16 16 8 3 7 23 19 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 28 27 16 16 1 16 16 16 16 16 16 16 16 16 8 3 7 1 1 1 16 16 16 16 16 16 16 16 16 8 3 7 23 18 18 19 18 18 18 18 18 18
18 18 18 18 18 18 18 28 27 16 16 16 1 16 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 12 10 11 3 7 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 1 1 16 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 8 3 3 3 7 23 18 18 18 18 18 19 18 18 18
18 18 18 18 18 19 18 24 16 16 1 16 16 16 16 16 16 16 16 16 16 1 8 3 7 1 16 16 16 16 16 16 16 16 16 8 3 4 5 15 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 16 16 1 12 10 10 10 10 10 10 10 11 3 9 10 10 10 10 13 16 16 16 12 10 11 3 7 1 16 23 18 18 19 18 18 18 18 18 18
18 18 18 19 18 18 18 24 16 16 1 16 16 1 8 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7 1 1 1 8 3 3 3 7 1 20 31 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 16 16 1 14 5 5 5 5 5 5 5 6 3 4 5 5 5 5 15 16 16 16 14 5 6 3 7 2 23 18 18 19 18 18 18 18 18 18 18
18 18 18 18 18 18 18 30 22 16 1 16 16 1 16 16 16 16 16 16 16 1 8 3 7 1 16 16 16 16 16 16 16 16 16 8 3 7 1 23 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 24 16 1 16 16 1 16 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 8 3 7 1 23 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 28 27 16 1 16 16 1 1 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 8 3 7 1 23 18 18 18 18 18 18 19 18 18 18
18 18 18 19 18 18 18 24 16 16 1 16 16 16 1 16 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 8 3 7 1 23 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 16 16 16 1 16 16 16 16 16 16 16 8 3 7 1 1 1 16 16 16 16 16 16 16 8 3 7 1 23 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 16 16 16 1 16 16 16 16 16 16 16 8 3 7 16 16 1 16 16 16 16 16 16 16 8 3 7 1 23 18 18 19 18 18 18 18 18 18 18
18 18 19 18 18 18 18 24 16 16 1 1 1 1 1 1 16 16 16 16 16 16 8 3 7 16 16 1 16 16 1 16 16 16 16 14 5 15 1 23 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 2 1 1 1 1 16 16 16 16 16 16 8 3 7 16 16 1 16 16 1 16 16 16 16 16 1 16 20 31 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 19 30 22 16 1 1 1 1 1 1 16 16 16 16 16 16 8 3 7 16 16 1 1 1 1 16 16 16 16 16 1 1 23 18 19 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 24 16 1 1 1 2 1 1 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 1 1 1 23 18 18 18 18 18 18 18 18 19 18 18
18 18 18 18 18 18 18 18 24 16 1 1 1 1 1 1 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 1 1 2 23 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 19 18 18 18 24 16 1 1 1 1 1 1 16 16 16 16 16 16 8 3 7 16 16 16 16 16 16 16 16 16 16 1 1 1 23 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 28 27 16 16 16 16 16 16 16 16 16 16 16 16 16 14 5 15 16 16 16 16 16 16 16 16 16 16 1 1 1 25 29 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 16 16 16 16 16 16 16 16 16 16 1 1 1 1 1 1 1 16 16 16 16 16 16 16 1 1 1 1 1 25 29 18 18 19 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 16 16 16 16 16 16 16 16 16 1 1 1 1 2 1 1 1 1 16 16 1 16 16 1 1 2 1 1 1 1 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 16 16 16 16 16 16 16 16 16 1 1 1 1 1 1 1 1 1 16 16 16 16 1 1 1 1 1 1 1 1 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 33 16 16 16 16 16 16 16 16 1 1 1 1 1 1 1 2 1 1 16 16 16 1 1 1 1 1 16 1 2 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 19 18 24 16 16 1 16 16 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 16 1 1 1 1 1 23 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 24 16 16 1 1 1 1 16 20 21 21 22 1 1 1 1 1 1 1 1 20 21 21 22 1 1 1 1 1 1 1 1 1 23 18 18 18 18 18 18 18 18 18
18 19 18 18 18 18 18 24 16 16 16 16 16 16 20 31 18 18 30 22 1 1 1 1 1 1 20 31 18 18 24 1 1 16 1 1 16 1 1 1 23 18 18 18 18 18 19 18 18 18
18 18 18 18 18 18 18 30 21 21 21 21 21 21 31 18 18 18 18 30 21 21 21 21 21 21 31 18 18 18 30 22 1 1 1 1 1 1 20 21 31 18 19 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 30 21 21 21 21 21 21 31 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

View File

@@ -0,0 +1,50 @@
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 9 1 1 1 1 1 1 1 18 3 9 1 1 1 1 1 1 1 1 18 3 3 3 9 1 1 1 1 1 1 1 1 1 1 18 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 17 17 17 17 23 22 1 29 23 11 11 11 11 11 11 11 22 1 1 1 29 23 11 30 28 28 28 28 28 28 15 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 34 34 34 17 23 23 23 23 23 11 33 14 14 14 36 11 23 23 23 23 23 23 23 10 24 24 24 24 24 24 7 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 34 12 34 17 23 23 23 23 23 11 16 3 3 3 25 11 23 23 23 23 23 23 23 10 24 24 24 24 24 24 7 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 34 34 34 17 23 23 23 23 23 11 16 3 3 3 25 11 23 23 23 23 23 23 23 10 24 24 24 24 24 24 7 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 34 34 34 17 23 23 23 23 23 11 22 1 1 1 29 11 23 23 23 23 23 23 23 10 24 24 24 24 24 24 7 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 17 17 11 17 17 23 23 23 23 23 11 11 30 28 15 11 11 11 11 11 11 11 11 11 11 13 13 31 24 27 13 32 16 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 23 23 11 23 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 23 23 10 24 7 33 14 19 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 26 36 23 23 11 23 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 23 23 10 24 7 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 25 23 23 11 23 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 23 23 10 24 7 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 9 29 23 23 11 23 23 23 23 23 23 23 23 23 10 24 7 11 11 11 23 23 23 23 23 23 23 23 23 10 24 7 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 9 29 23 23 23 11 23 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 30 28 35 24 7 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 11 11 23 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 10 24 24 24 7 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 23 23 23 23 23 23 23 23 11 10 24 7 11 23 23 23 23 23 23 23 23 23 10 24 27 13 32 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 11 30 28 28 28 28 28 28 28 35 24 5 28 28 28 28 15 23 23 23 30 28 35 24 7 11 23 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 11 10 24 24 24 24 24 24 24 24 24 24 24 24 24 24 7 11 11 11 10 24 24 24 7 11 33 19 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 11 21 13 13 13 13 13 13 13 31 24 27 13 13 13 13 32 23 23 23 21 13 31 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 26 36 23 11 23 23 11 23 23 23 23 23 23 23 11 10 24 7 23 23 23 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 11 23 23 11 23 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 9 29 23 11 23 23 11 11 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 23 11 23 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 23 11 23 23 23 23 23 23 23 10 24 7 11 11 11 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 23 11 23 23 23 23 23 23 23 10 24 7 23 23 11 23 23 23 23 23 23 23 10 24 7 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 11 11 11 11 23 23 23 23 21 13 32 11 16 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 23 11 23 33 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 26 36 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 23 11 11 16 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 11 11 11 16 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 11 11 11 16 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 25 23 11 11 11 11 11 11 23 23 23 23 23 23 10 24 7 23 23 23 23 23 23 23 23 23 23 11 11 11 16 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 9 29 23 23 23 23 23 23 23 23 23 23 23 23 23 21 13 32 23 23 23 23 23 23 23 23 23 23 11 11 11 22 18 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 23 23 23 23 23 23 23 23 23 23 11 11 11 11 11 11 11 23 23 23 23 23 23 23 11 11 11 11 11 22 18 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 23 23 23 23 23 23 23 23 23 11 11 11 11 11 11 11 11 11 23 23 23 23 23 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 23 23 23 23 23 23 23 23 23 11 11 11 11 11 11 11 11 11 23 23 23 23 11 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 20 23 23 23 23 23 23 23 23 11 11 11 11 11 11 11 11 11 11 23 23 23 11 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 23 23 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 11 11 11 11 23 33 14 14 36 11 11 11 11 11 11 11 11 33 14 14 36 11 11 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 25 23 23 23 23 23 23 33 3 3 3 26 36 11 11 11 11 11 11 33 19 3 3 25 11 11 11 11 11 11 11 11 11 16 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 26 14 14 14 14 14 14 19 3 3 3 3 26 14 14 14 14 14 14 19 3 3 3 26 36 11 11 11 11 11 11 33 14 19 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 26 14 14 14 14 14 14 19 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
assets/tiles/000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
assets/tiles/036.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
assets/tiles/037.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -1,7 +1,10 @@
rm -rf out/app
jpackage \
--input out/artifacts/JGame2D_jar/ \
--main-jar JGame2D.jar \
--main-class de.miaurizius.jgame2d.core.Boot \
--name JGame2D \
--type app-image \
--add-modules ALL-MODULE-PATH
--add-modules ALL-MODULE-PATH \
--dest out/app

View File

@@ -0,0 +1,17 @@
package de.miaurizius.jgame2d.aStar;
public class Node {
Node parent;
public int col, row;
int gCost, hCost, fCost;
boolean solid;
boolean open;
boolean checked;
public Node(int col, int row) {
this.col = col;
this.row = row;
}
}

View File

@@ -0,0 +1,146 @@
package de.miaurizius.jgame2d.aStar;
import de.miaurizius.jgame2d.core.GamePanel;
import java.util.ArrayList;
public class PathFinder {
GamePanel panel;
Node[][] node;
ArrayList<Node> openList = new ArrayList<>();
public ArrayList<Node> pathList = new ArrayList<>();
Node startNode, goalNode, currentNode;
boolean goalReached;
int step;
public PathFinder(GamePanel panel) {
this.panel = panel;
instantiateNodes();
}
private void instantiateNodes() {
node = new Node[panel.maxWorldCol][panel.maxWorldRow];
int col = 0;
int row = 0;
while(col < panel.maxWorldCol && row < panel.maxWorldRow) {
node[col][row] = new Node(col, row);
col++;
if(col != panel.maxWorldCol) continue;
col = 0;
row++;
}
}
private void resetNodes() {
// RESET OPEN LIST
int col = 0, row = 0;
while(col < panel.maxWorldCol && row < panel.maxWorldRow) {
node[col][row].open = false;
node[col][row].checked = false;
node[col][row].solid = false;
col++;
if(col != panel.maxWorldCol) continue;
col = 0;
row++;
}
// RESET OTHER SETTINGS
openList.clear();
pathList.clear();
goalReached = false;
step = 0;
}
public void setNodes(int startCol, int startRow, int goalCol, int goalRow) {
resetNodes();
startNode = node[startCol][startRow];
currentNode = startNode;
goalNode = node[goalCol][goalRow];
openList.add(currentNode);
int col = 0, row = 0;
while(col < panel.maxWorldCol && row < panel.maxWorldRow) {
// SOLID NODES
int tileNum = panel.tileM.mapTileNum[panel.currentMap.getIndex()][col][row];
if(panel.tileM.tile[tileNum].collision) {
node[col][row].solid = true;
}
for(int i = 0; i < panel.iTile.length; i++) {
if(panel.iTile[panel.currentMap.getIndex()][i] != null && panel.iTile[panel.currentMap.getIndex()][i].destructible) {
int itCol = panel.iTile[panel.currentMap.getIndex()][i].worldX/panel.tileSize;
int itRow = panel.iTile[panel.currentMap.getIndex()][i].worldY/panel.tileSize;
node[itCol][itRow].solid = true;
}
}
// SET COST
getCost(node[col][row]);
col++;
if(col != panel.maxWorldCol) continue;
col = 0;
row++;
}
}
private void getCost(Node node) {
// G COST
int xD = Math.abs(node.col - startNode.col);
int yD = Math.abs(node.row - startNode.row);
node.gCost = xD + yD;
// H COST
xD = Math.abs(node.col - goalNode.col);
yD = Math.abs(node.row - goalNode.row);
node.hCost = xD + yD;
// F COST
node.fCost = node.gCost + node.hCost;
}
public boolean search() {
while(!goalReached && step < 500) {
int col = currentNode.col;
int row = currentNode.row;
currentNode.checked = true;
openList.remove(currentNode);
if(row - 1 >= 0) openNode(node[col][row-1]);
if(col - 1 >= 0) openNode(node[col-1][row]);
if(row + 1 < panel.maxWorldRow) openNode(node[col][row+1]);
if(col + 1 < panel.maxWorldCol) openNode(node[col+1][row]);
int bestNodeIndex = 0;
int bestNodeFCost = 999;
for(int i = 0; i < openList.size(); i++) {
if(openList.get(i).fCost < bestNodeFCost) {
bestNodeIndex = i;
bestNodeFCost = openList.get(i).fCost;
}
else if(openList.get(i).fCost == bestNodeFCost) if(openList.get(i).gCost < openList.get(bestNodeIndex).gCost) bestNodeIndex = i;
}
if(openList.isEmpty()) break;
currentNode = openList.get(bestNodeIndex);
if(currentNode == goalNode) {
goalReached = true;
trackPath();
}
step++;
}
return goalReached;
}
private void openNode(Node node) {
if(node.open || node.checked || node.solid) return;
node.open = true;
node.parent = currentNode;
openList.add(node);
}
private void trackPath() {
Node current = goalNode;
while(current != startNode) {
pathList.add(0, current);
current = current.parent;
}
}
}

View File

@@ -1,30 +1,46 @@
package de.miaurizius.jgame2d.core;
import javax.swing.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Logger;
public class Boot {
public static final Logger logger = Logger.getLogger("JDGame2D");
public static JFrame window;
public static GamePanel gamePanel;
static void main() {
window = new JFrame();
window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
window.setResizable(false);
window.setTitle("JGame2D");
window.setUndecorated(true);
static {
try {
gamePanel = new GamePanel();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
GamePanel gamePanel = new GamePanel();
window.add(gamePanel);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
public static void main(String[] args) {
generateWindow();
gamePanel.setupGame();
gamePanel.startGameThread();
}
public static void generateWindow() {
window = new JFrame();
window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
window.setResizable(false);
window.setTitle("JGame2D");
window.add(gamePanel);
gamePanel.config.load();
if(gamePanel.fullscreen) window.setUndecorated(true);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}

View File

@@ -1,16 +1,24 @@
package de.miaurizius.jgame2d.core;
import de.miaurizius.jgame2d.aStar.PathFinder;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.core.handlers.*;
import de.miaurizius.jgame2d.data.Config;
import de.miaurizius.jgame2d.data.SaveLoad;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.Player;
import de.miaurizius.jgame2d.environment.EnvironmentManager;
import de.miaurizius.jgame2d.tile.MiniMap;
import de.miaurizius.jgame2d.tile.TileManager;
import de.miaurizius.jgame2d.tile.interactive.InteractiveTile;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.logging.Level;
@@ -27,15 +35,16 @@ public class GamePanel extends JPanel implements Runnable {
public final int screenHeight = tileSize * maxScreenRow; // 576 pixels
// FULLSCREEN SETTINGS
public boolean fullscreen;
int fScreenWidth = screenWidth;
int fScreenHeight = screenHeight;
BufferedImage tempScreen;
Graphics2D fg2;
public Graphics2D fg2;
// WORLD SETTINGS
public final int maxWorldCol = 50;
public final int maxWorldRow = 50;
public final String currentMap = "testmap2";
public int maxWorldCol = 50;
public int maxWorldRow = 50;
public Map currentMap = Map.OVERWORLD;
//FPS
final int FPS = 60;
@@ -48,16 +57,21 @@ public class GamePanel extends JPanel implements Runnable {
public AssetSetter assetSetter = new AssetSetter(this);
public UI ui = new UI(this);
public EventHandler eventH = new EventHandler(this);
public Sound se = new Sound();
Sound music = new Sound();
public Sound sfx = new Sound();
public Sound music = new Sound();
public Config config = new Config(this);
public PathFinder pFinder = new PathFinder(this);
public EnvironmentManager eManager = new EnvironmentManager(this);
public MiniMap mapMan = new MiniMap(this);
public SaveLoad saveLoad = new SaveLoad(this);
Thread gameThread;
// ENTITY AND OBJECT
public Player player = new Player(this, keyH);
public Entity[] obj = new Entity[20];
public Entity[] npc = new Entity[10];
public Entity[] monster = new Entity[20];
public InteractiveTile[] iTile = new InteractiveTile[50];
public Entity[][] obj = new Entity[Map.values().length][20];
public Entity[][] npc = new Entity[Map.values().length][10];
public Entity[][] monster = new Entity[Map.values().length][20];
public InteractiveTile[][] iTile = new InteractiveTile[Map.values().length][50];
public ArrayList<Entity> projectileList = new ArrayList<>();
public ArrayList<Entity> particleList = new ArrayList<>();
ArrayList<Entity> entityList = new ArrayList<>();
@@ -65,7 +79,7 @@ public class GamePanel extends JPanel implements Runnable {
// GAME STATE
public GameState gameState;
public GamePanel() {
public GamePanel() throws IOException {
this.setPreferredSize(new Dimension(screenWidth, screenHeight));
this.setBackground(Color.black);
this.setDoubleBuffered(true);
@@ -114,14 +128,14 @@ public class GamePanel extends JPanel implements Runnable {
switch(gameState) {
case PLAY:
player.update();
for(Entity entity : npc) if(entity != null) entity.update();
for(int i = 0; i < monster.length; i++) {
Entity m = monster[i];
for(Entity entity : npc[currentMap.getIndex()]) if(entity != null) entity.update();
for(int i = 0; i < monster[currentMap.getIndex()].length; i++) {
Entity m = monster[currentMap.getIndex()][i];
if(m != null) {
if(m.alive && !m.dying) m.update();
if(!m.alive) {
monster[i].checkDrop();
monster[i] = null;
monster[currentMap.getIndex()][i].checkDrop();
monster[currentMap.getIndex()][i] = null;
}
}
}
@@ -139,7 +153,8 @@ public class GamePanel extends JPanel implements Runnable {
else particleList.remove(i);
}
}
for(Entity entity : iTile) if(entity != null) entity.update();
for(Entity entity : iTile[currentMap.getIndex()]) if(entity != null) entity.update();
eManager.update();
break;
case PAUSE:
break;
@@ -156,21 +171,33 @@ public class GamePanel extends JPanel implements Runnable {
return;
}
if(gameState == GameState.MAP) {
mapMan.drawFullMapScreen(fg2);
return;
}
// GAME
tileM.draw(fg2);
for(Entity entity : iTile) if(entity != null) entity.draw(fg2);
for(Entity entity : iTile[currentMap.getIndex()]) if(entity != null) entity.draw(fg2);
// ENTITY RENDER SYSTEM
entityList.add(player);
for(Entity entity : npc) if(entity != null) entityList.add(entity);
for(Entity entity : obj) if(entity != null) entityList.add(entity);
for(Entity entity : monster) if(entity != null) entityList.add(entity);
for(Entity entity : npc[currentMap.getIndex()]) if(entity != null) entityList.add(entity);
for(Entity entity : obj[currentMap.getIndex()]) if(entity != null) entityList.add(entity);
for(Entity entity : monster[currentMap.getIndex()]) if(entity != null) entityList.add(entity);
for(Entity entity : projectileList) if(entity != null) entityList.add(entity);
for(Entity entity : particleList) if(entity != null) entityList.add(entity);
entityList.sort(Comparator.comparingInt(o -> o.worldY));
for(Entity entity : entityList) entity.draw(fg2);
entityList.clear();
// ENVIRONMENT
eManager.draw(fg2);
// MINI MAP
mapMan.drawMiniMap(fg2);
// UI
ui.draw(fg2);
long drawEnd = System.nanoTime();
@@ -196,7 +223,10 @@ public class GamePanel extends JPanel implements Runnable {
// MUSIC
public void playMusic(int i) {
Clip c = se.clips[i];
Clip c = music.clips[i];
music.clip = c;
music.fc = (FloatControl) c.getControl(FloatControl.Type.MASTER_GAIN);
music.checkVolume();
if(c.isRunning()) c.stop();
c.setFramePosition(0);
c.start();
@@ -206,7 +236,9 @@ public class GamePanel extends JPanel implements Runnable {
music.stop();
}
public void playSE(int i) {
Clip c = se.clips[i];
Clip c = sfx.clips[i];
sfx.fc = (FloatControl) c.getControl(FloatControl.Type.MASTER_GAIN);
sfx.checkVolume();
if(c.isRunning()) c.stop();
c.setFramePosition(0);
c.start();
@@ -218,12 +250,13 @@ public class GamePanel extends JPanel implements Runnable {
assetSetter.setNPC();
assetSetter.setMonster();
assetSetter.setITiles();
eManager.setup();
gameState = GameState.TITLE;
tempScreen = new BufferedImage(screenWidth, screenHeight, BufferedImage.TYPE_INT_RGB);
fg2 = (Graphics2D) tempScreen.getGraphics();
setFullscreen();
if(fullscreen) setFullscreen();
}
public void setFullscreen() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
@@ -233,5 +266,16 @@ public class GamePanel extends JPanel implements Runnable {
fScreenWidth = Boot.window.getWidth();
fScreenHeight = Boot.window.getHeight();
}
public void resetGame(boolean restart) {
player.setDefaultPositions();
player.restoreStatus();
assetSetter.setNPC();
assetSetter.setMonster();
if(!restart) return;
player.setDefaultValues();
assetSetter.setObject();
assetSetter.setITiles();
eManager.lighting.resetDay();
}
}

View File

@@ -2,7 +2,9 @@ package de.miaurizius.jgame2d.core;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.CoinObj;
import de.miaurizius.jgame2d.entity.item.HeartObj;
import de.miaurizius.jgame2d.environment.Lighting;
import java.awt.*;
import java.awt.image.BufferedImage;
@@ -15,13 +17,21 @@ public class UI {
GamePanel panel;
Graphics2D graphics2d;
Font font;
BufferedImage heart_full, heart_half, heart_blank;
BufferedImage heart_full, heart_half, heart_blank, coin;
ArrayList<String> messages = new ArrayList<>();
ArrayList<Integer> messageCounter = new ArrayList<>();
public Font font;
public String currentDialogue;
public Entity tradingNPC;
public int commandNum;
public int slotCol, slotRow;
public int playerSlotCol, playerSlotRow;
public int npcSlotCol, npcSlotRow;
private int transCount;
private int sleepCount;
// SUB-STATES
public TradeState tradeState = TradeState.SELECT;
public OptionState optionState;
public UI(GamePanel panel) {
this.panel = panel;
@@ -37,6 +47,8 @@ public class UI {
heart_full = heart.image;
heart_half = heart.image2;
heart_blank = heart.image3;
Entity coin = new CoinObj(panel);
this.coin = coin.down1;
}
public void draw(Graphics2D graphics2d) {
@@ -46,26 +58,20 @@ public class UI {
if(panel.gameState == null) return;
switch (panel.gameState) {
case GameState.PLAY:
drawPlayScreen();
break;
case GameState.PAUSE:
drawPauseScreen();
break;
case GameState.DIALOGUE:
drawDialogueScreen();
break;
case TITLE:
drawTitleScreen();
break;
case CHARACTER:
drawCharacterScreen();
break;
case PLAY -> drawPlayScreen();
case PAUSE -> drawPauseScreen();
case DIALOGUE -> drawDialogueScreen();
case TITLE -> drawTitleScreen();
case CHARACTER -> drawCharacterScreen();
case GAMEOVER -> drawGameOverScreen();
case TRANSITION -> drawTransitionScreen();
case TRADE -> drawTradeScreen();
case SLEEP -> drawSleepScreen();
}
}
// HUD
public void drawPlayerLife() {
private void drawPlayerLife() {
int x = panel.tileSize / 2;
int y = panel.tileSize / 2;
int i = 0;
@@ -90,7 +96,7 @@ public class UI {
x += panel.tileSize;
}
}
public void drawMessages() {
private void drawMessages() {
int messageX = panel.tileSize;
int messageY = panel.tileSize*4;
graphics2d.setFont(graphics2d.getFont().deriveFont(Font.BOLD, 32F));
@@ -111,7 +117,7 @@ public class UI {
}
}
}
public void drawCharStats() {
private void drawCharStats() {
// DRAW FRAME
final int frameX = panel.tileSize*2;
final int frameY = panel.tileSize;
@@ -158,12 +164,26 @@ public class UI {
textY += panel.tileSize;
graphics2d.drawImage(panel.player.currentShield.down1, tailX - panel.tileSize, textY-14, null);
}
public void drawInventory() {
private void drawInventory(Entity entity, boolean cursor) {
int frameX, frameY, frameWidth, frameHeight;
int slotCol, slotRow;
// DRAW FRAME
int frameX = panel.tileSize*12;
int frameY = panel.tileSize;
int frameWidth = panel.tileSize*6;
int frameHeight = panel.tileSize*5;
if(entity == panel.player) {
frameX = panel.tileSize*12;
frameY = panel.tileSize;
frameWidth = panel.tileSize*6;
frameHeight = panel.tileSize*5;
slotCol = playerSlotCol;
slotRow = playerSlotRow;
} else {
frameX = panel.tileSize*2;
frameY = panel.tileSize;
frameWidth = panel.tileSize*6;
frameHeight = panel.tileSize*5;
slotCol = npcSlotCol;
slotRow = npcSlotRow;
}
drawSubWindow(frameX, frameY, frameWidth, frameHeight);
// SLOT
@@ -173,15 +193,37 @@ public class UI {
int slotY = slotYStart;
int slotSize = panel.tileSize+3;
// DRAW PLAYER ITEMS
for(int i = 0; i < panel.player.inventory.size(); i++) {
// DRAW ITEMS
for(int i = 0; i < entity.inventory.size(); i++) {
// EQUIP CURSOR
if(panel.player.inventory.get(i) == panel.player.currentWeapon || panel.player.inventory.get(i) == panel.player.currentShield) {
if(
entity.inventory.get(i) == entity.currentWeapon ||
entity.inventory.get(i) == entity.currentShield ||
entity.inventory.get(i) == entity.currentLight
) {
graphics2d.setColor(new Color(240, 190,90));
graphics2d.fillRoundRect(slotX, slotY, panel.tileSize, panel.tileSize, 10, 10);
}
graphics2d.drawImage(panel.player.inventory.get(i).down1, slotX, slotY, null);
graphics2d.drawImage(entity.inventory.get(i).down1, slotX, slotY, null);
// AMOUNT
if(entity == panel.player && entity.inventory.get(i).amt > 1) {
graphics2d.setFont(graphics2d.getFont().deriveFont(32F));
int amtX;
int amtY;
String amtS = String.valueOf(entity.inventory.get(i).amt);
amtX = getAlignedToRightX(amtS, slotX+44);
amtY = slotY + panel.tileSize;
// SHADOW
graphics2d.setColor(new Color(60, 60, 60));
graphics2d.drawString(amtS, amtX, amtY);
// NUMBER
graphics2d.setColor(Color.white);
graphics2d.drawString(amtS, amtX-3, amtY-3);
}
slotX += slotSize;
if (i == 4 || i == 9 || i == 14) {
slotX = slotXStart;
@@ -190,17 +232,17 @@ public class UI {
}
// CURSOR
if(!cursor) return;
int curserX = slotXStart + (slotSize*slotCol);
int curserY = slotYStart + (slotSize*slotRow);
int curserHeight = panel.tileSize;
int curserWidth = panel.tileSize;
graphics2d.setColor(Color.white);
graphics2d.setStroke(new BasicStroke(3));
graphics2d.drawRoundRect(curserX, curserY, curserWidth, curserHeight, 10, 10);
// DESCRIPTION FRAME
int itemIndex = getItemIndex();
int itemIndex = getItemIndex(slotCol, slotRow);
int dFrameX = frameX;
int dFrameY = frameY + frameHeight+2;
int dFrameWidth = frameWidth;
@@ -210,9 +252,9 @@ public class UI {
int textX = dFrameX + 20;
int textY = dFrameY + panel.tileSize;
graphics2d.setFont(graphics2d.getFont().deriveFont(28F));
if(itemIndex < panel.player.inventory.size()) {
if(itemIndex < entity.inventory.size()) {
drawSubWindow(dFrameX, dFrameY, dFrameWidth, dFrameHeight);
for(String line : panel.player.inventory.get(itemIndex).description.split("\n")) {
for(String line : entity.inventory.get(itemIndex).description.split("\n")) {
graphics2d.drawString(line, textX, textY);
textY += 32;
}
@@ -220,14 +262,26 @@ public class UI {
}
// GAME STATES
public void drawPauseScreen() {
drawPlayerLife();
graphics2d.setFont(graphics2d.getFont().deriveFont(Font.PLAIN, 80));
String text = "PAUSED";
int y = panel.screenHeight / 2;
graphics2d.drawString(text, getCenteredX(text), y);
private void drawPauseScreen() {
graphics2d.setColor(Color.white);
graphics2d.setFont(graphics2d.getFont().deriveFont(32F));
// SUB WINDOW
int frameX = panel.tileSize*6;
int frameY = panel.tileSize;
int frameWidth = panel.tileSize*8;
int frameHeight = panel.tileSize*10;
drawSubWindow(frameX, frameY, frameWidth, frameHeight);
switch(optionState) {
case OVERVIEW -> optionsTop(frameX, frameY);
case SCREENNF -> optionsFSNotify(frameX, frameY);
case CONTROLS -> optionsControls(frameX, frameY);
case QUITNF -> optionsQuitNotify(frameX, frameY);
}
panel.keyH.spacePressed = false;
}
public void drawDialogueScreen() {
private void drawDialogueScreen() {
drawPlayerLife();
// WINDOW
int x = panel.tileSize*2;
@@ -245,7 +299,7 @@ public class UI {
y += 40;
}
}
public void drawTitleScreen() {
private void drawTitleScreen() {
graphics2d.setColor(new Color(0, 0, 0));
graphics2d.fillRect(0, 0, panel.screenWidth, panel.screenHeight);
@@ -283,35 +337,418 @@ public class UI {
graphics2d.drawString(text, x, y);
if(commandNum == 2) graphics2d.drawString(">", x-panel.tileSize, y);
}
public void drawCharacterScreen() {
private void drawCharacterScreen() {
drawCharStats();
drawInventory();
drawInventory(panel.player, true);
}
public void drawPlayScreen() {
private void drawPlayScreen() {
drawPlayerLife();
drawMessages();
}
private void drawGameOverScreen() {
graphics2d.setColor(new Color(0,0,0, 150));
graphics2d.fillRect(0, 0, panel.screenWidth, panel.screenHeight);
int x, y;
String text;
graphics2d.setFont(graphics2d.getFont().deriveFont(Font.BOLD, 110F));
text = "GAME OVER";
// SHADOW
graphics2d.setColor(Color.black);
x = getCenteredX(text);
y = panel.tileSize*3;
graphics2d.drawString(text, x, y);
// MAIN TEXT
graphics2d.setColor(Color.white);
graphics2d.drawString(text, x-4, y-4);
// OPTIONS
graphics2d.setFont(graphics2d.getFont().deriveFont(50F));
text = "Retry";
x = getCenteredX(text);
y += panel.tileSize*4;
graphics2d.drawString(text, x, y);
if(commandNum == 0) graphics2d.drawString(">", x-panel.tileSize, y);
text = "Return to title";
x = getCenteredX(text);
y += 55;
graphics2d.drawString(text, x, y);
if(commandNum == 1) graphics2d.drawString(">", x-panel.tileSize, y);
}
private void drawTransitionScreen() {
transCount++;
graphics2d.setColor(new Color(0,0,0, transCount *5));
graphics2d.fillRect(0, 0, panel.screenWidth, panel.screenHeight);
if(transCount != 50) return;
transCount = 0;
panel.gameState = GameState.PLAY;
panel.currentMap = panel.eventH.tempMap;
panel.player.worldX = panel.tileSize * panel.eventH.tempCol;
panel.player.worldY = panel.tileSize * panel.eventH.tempRow;
panel.eventH.prevEventX = panel.player.worldX;
panel.eventH.prevEventY = panel.player.worldY;
}
private void drawTradeScreen() {
switch(tradeState) {
case SELECT -> tradeSelect();
case BUY -> tradeBuy();
case SELL -> tradeSell();
}
panel.keyH.spacePressed = false;
}
private void drawSleepScreen() {
sleepCount++;
if(sleepCount < 120) {
panel.eManager.lighting.filterAlpha += 0.01F;
if(panel.eManager.lighting.filterAlpha >= 1F) panel.eManager.lighting.filterAlpha = 1F;
}
if(sleepCount >= 120) {
panel.eManager.lighting.filterAlpha -= 0.01F;
if(panel.eManager.lighting.filterAlpha <= 0F) {
panel.eManager.lighting.filterAlpha = 0F;
sleepCount = 0;
panel.eManager.lighting.dayCount = 0;
panel.eManager.lighting.dayState = Lighting.DayState.DAY;
panel.gameState = GameState.PLAY;
panel.player.getPlayerImage();
}
}
}
// TRADING
private void tradeSelect() {
drawDialogueScreen();
int x = panel.tileSize*15;
int y = panel.tileSize*4;
int width = panel.tileSize*3;
int height = (int)(panel.tileSize*3.5);
drawSubWindow(x, y, width, height);
// DRAW TEXTS
x += panel.tileSize;
y += panel.tileSize;
graphics2d.drawString("Buy",x , y);
if(commandNum == 0) {
graphics2d.drawString(">", x-panel.tileSize/2, y);
if(panel.keyH.spacePressed) tradeState = TradeState.BUY;
}
y += panel.tileSize;
graphics2d.drawString("Sell",x , y);
if(commandNum == 1) {
graphics2d.drawString(">", x-panel.tileSize/2, y);
if(panel.keyH.spacePressed) tradeState = TradeState.SELL;
}
y += panel.tileSize;
graphics2d.drawString("Leave",x , y);
if(commandNum == 2) {
graphics2d.drawString(">", x-panel.tileSize/2, y);
if(panel.keyH.spacePressed) {
commandNum = 0;
tradeState = TradeState.SELECT;
panel.gameState = GameState.DIALOGUE;
currentDialogue = "Come again, hehe!";
}
}
}
private void tradeBuy() {
drawInventory(panel.player, false);
drawInventory(tradingNPC, true);
// HINT WINDOW
int x = panel.tileSize*2;
int y = panel.tileSize*9;
int width = panel.tileSize*6;
int height = panel.tileSize*2;
drawSubWindow(x, y, width, height);
graphics2d.drawString("[ESC] Back", x+panel.tileSize, y+60);
// PLAYER COINS
x = panel.tileSize*12;
drawSubWindow(x, y, width, height);
graphics2d.drawString("Your Coins: " + panel.player.coins, x+panel.tileSize, y+60);
// PRICE WINDOW
int itemIndex = getItemIndex(npcSlotCol, npcSlotRow);
if(itemIndex < tradingNPC.inventory.size()) {
x = (int)(panel.tileSize*5.5);
y = (int)(panel.tileSize*5.5);
width = (int)(panel.tileSize*2.5);
height = panel.tileSize;
drawSubWindow(x, y, width, height);
graphics2d.drawImage(coin, x+10, y+8, 32, 32, null);
String price = String.valueOf(tradingNPC.inventory.get(itemIndex).price);
graphics2d.drawString(price, getAlignedToRightX(price, panel.tileSize*8-20), y+34);
// BUY
if(!panel.keyH.spacePressed) return;
if(tradingNPC.inventory.get(itemIndex).price > panel.player.coins) {
tradeState = TradeState.SELECT;
panel.gameState = GameState.DIALOGUE;
currentDialogue = "You need more coins to buy that!";
drawDialogueScreen();
return;
}
if(panel.player.canObtainItem(tradingNPC.inventory.get(itemIndex))) {
panel.player.coins -= tradingNPC.inventory.get(itemIndex).price;
return;
}
tradeState = TradeState.SELECT;
panel.gameState = GameState.DIALOGUE;
currentDialogue = "Your inventory is full!";
drawDialogueScreen();
}
}
private void tradeSell() {
drawInventory(panel.player, true);
int x, y, width, height;
// HINT WINDOW
x = panel.tileSize*2;
y = panel.tileSize*9;
width = panel.tileSize*6;
height = panel.tileSize*2;
drawSubWindow(x, y, width, height);
graphics2d.drawString("[ESC] Back", x+panel.tileSize, y+60);
// PLAYER COINS
x = panel.tileSize*12;
drawSubWindow(x, y, width, height);
graphics2d.drawString("Your Coins: " + panel.player.coins, x+panel.tileSize, y+60);
// PRICE WINDOW
int itemIndex = getItemIndex(playerSlotCol, playerSlotRow);
if(itemIndex < panel.player.inventory.size()) {
x = (int)(panel.tileSize*15.5);
y = (int)(panel.tileSize*5.5);
width = (int)(panel.tileSize*2.5);
height = panel.tileSize;
drawSubWindow(x, y, width, height);
graphics2d.drawImage(coin, x+10, y+8, 32, 32, null);
String price = String.valueOf(panel.player.inventory.get(itemIndex).price/2);
graphics2d.drawString(price, getAlignedToRightX(price, panel.tileSize*18-20), y+34);
// SELL
if(!panel.keyH.spacePressed) return;
if(panel.player.inventory.get(itemIndex) == panel.player.currentWeapon || panel.player.inventory.get(itemIndex) == panel.player.currentShield) {
commandNum = 0;
tradeState = TradeState.SELECT;
panel.gameState = GameState.DIALOGUE;
currentDialogue = "You cannot sell an equipped item!";
return;
}
if(panel.player.inventory.get(itemIndex).amt <= 1) panel.player.inventory.remove(itemIndex);
else panel.player.inventory.get(itemIndex).amt--;
panel.player.coins += Integer.parseInt(price);
}
}
// UTILITY
public void drawSubWindow(int x, int y, int width, int height) {
private void drawSubWindow(int x, int y, int width, int height) {
graphics2d.setColor(new Color(0,0,0,210));
graphics2d.fillRoundRect(x, y, width, height, 35, 35);
graphics2d.setColor(new Color(255,255,255));
graphics2d.setStroke(new BasicStroke(5));
graphics2d.drawRoundRect(x+5, y+5, width-10, height-10, 25, 25);
}
public int getCenteredX(String text) {
private int getCenteredX(String text) {
return panel.screenWidth / 2 - (int) graphics2d.getFontMetrics().getStringBounds(text, graphics2d).getWidth() / 2;
}
public int getAlignedToRightX(String text, int tailX) {
private int getAlignedToRightX(String text, int tailX) {
return tailX - (int) graphics2d.getFontMetrics().getStringBounds(text, graphics2d).getWidth();
}
public int getItemIndex() {
return slotCol + slotRow*5;
public int getItemIndex(int slotCol, int slotRow) {
return slotCol + slotRow *5;
}
public void addMessage(String text) {
messages.add(text);
messageCounter.add(0);
}
// OPTIONS UI
private void optionsTop(int frameX, int frameY) {
int textX, textY;
String title = "Options";
textX = getCenteredX(title);
textY = frameY + panel.tileSize;
graphics2d.drawString(title, textX, textY);
// FULLSCREEN ON/OFF
textX = frameX + panel.tileSize;
textY += panel.tileSize;
graphics2d.drawString("Full Screen", textX, textY);
if(commandNum == 0) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) {
optionState = OptionState.SCREENNF;
panel.fullscreen = !panel.fullscreen;
}
}
// MUSIC
textY += panel.tileSize;
graphics2d.drawString("Music", textX, textY);
if(commandNum == 1) graphics2d.drawString(">", textX-25, textY);
// SOUND EFFECTS
textY += panel.tileSize;
graphics2d.drawString("SFX", textX, textY);
if(commandNum == 2) graphics2d.drawString(">", textX-25, textY);
// CONTROL
textY += panel.tileSize;
graphics2d.drawString("Controls", textX, textY);
if(commandNum == 3) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) {
optionState = OptionState.CONTROLS;
commandNum = 0;
}
}
// END GAME
textY += panel.tileSize;
graphics2d.drawString("Title Screen", textX, textY);
if(commandNum == 4) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) {
optionState = OptionState.QUITNF;
commandNum = 0;
}
}
// BACK
textY += panel.tileSize*2;
graphics2d.drawString("Back to Game", textX, textY);
if(commandNum == 5) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) panel.gameState = GameState.PLAY;
}
//
// FUNCTIONALITY
//
// FULL SCREEN CHECKBOX
textX = frameX + (int)(panel.tileSize*4.5);
textY = frameY + panel.tileSize*2 - panel.tileSize/2;
graphics2d.setStroke(new BasicStroke(3));
graphics2d.drawRect(textX, textY, panel.tileSize/2, panel.tileSize/2);
if(panel.fullscreen) {
graphics2d.fillRect(textX, textY, panel.tileSize/2, panel.tileSize/2);
}
// MUSIC VOLUME
textY += panel.tileSize;
graphics2d.drawRect(textX, textY, 120, panel.tileSize/2); // 120/5 = 24
graphics2d.fillRect(textX, textY, 24 * panel.music.volumeScale, panel.tileSize/2);
// SFX VOLUME
textY += panel.tileSize;
graphics2d.drawRect(textX, textY, 120, panel.tileSize/2); // 120/5 = 24
graphics2d.fillRect(textX, textY, 24 * panel.sfx.volumeScale, panel.tileSize/2);
panel.config.save();
}
private void optionsControls(int frameX, int frameY) {
int textX;
int textY;
// TITLE
String text = "Controls";
textX = getCenteredX(text);
textY = frameY + panel.tileSize;
graphics2d.drawString(text, textX, textY);
textX = frameX + panel.tileSize;
textY +=panel.tileSize;
String[] options = {"Move", "Confirm/Attack", "Shoot/Cast", "Inventory", "Pause/Settings"};
for(String option : options) {
graphics2d.drawString(option, textX, textY);
textY += panel.tileSize;
}
textX = frameX + panel.tileSize*6;
textY = frameY + panel.tileSize*2;
options = new String[]{"WASD", "SPACE", "F", "C", "ESC"};
for(String option : options) {
graphics2d.drawString(option, textX, textY);
textY += panel.tileSize;
}
// BACK
textX = frameX + panel.tileSize;
textY = frameY + panel.tileSize*9;
graphics2d.drawString("Back", textX, textY);
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) optionState = OptionState.OVERVIEW;
}
private void optionsFSNotify(int frameX, int frameY) {
int textX = frameX + panel.tileSize;
int textY = frameY + panel.tileSize*3;
currentDialogue = "The change will take \neffect after restarting \nthe game";
for(String line : currentDialogue.split("\n")) {
graphics2d.drawString(line, textX, textY);
textY += 40;
}
// BACK
textY =frameY + panel.tileSize*9;
graphics2d.drawString("Back", textX, textY);
if(commandNum == 0) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) optionState = OptionState.OVERVIEW;
}
}
private void optionsQuitNotify(int frameX, int frameY) {
int textX = frameX + panel.tileSize;
int textY = frameY + panel.tileSize*3;
currentDialogue = "Quit the game and \nreturn to the title screen?";
for(String line : currentDialogue.split("\n")) {
graphics2d.drawString(line, textX, textY);
textY += 40;
}
// DISPLAY OPTIONS
String text = "Yes";
textX = getCenteredX(text);
textY += panel.tileSize*3;
graphics2d.drawString(text, textX, textY);
if(commandNum == 0) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) {
panel.gameState = GameState.TITLE;
panel.stopMusic();
}
}
text = "No";
textX = getCenteredX(text);
textY += panel.tileSize;
graphics2d.drawString(text, textX, textY);
if(commandNum == 1) {
graphics2d.drawString(">", textX-25, textY);
if(panel.keyH.spacePressed) optionState = OptionState.OVERVIEW;
panel.resetGame(true);
}
}
public enum OptionState {
OVERVIEW,
SCREENNF,
CONTROLS,
QUITNF;
}
public enum TradeState {
SELECT,
BUY,
SELL;
}
}

View File

@@ -5,6 +5,14 @@ public enum Direction {
UP,
DOWN,
LEFT,
RIGHT
RIGHT;
public Direction getOpposite() {
return switch (this) {
case UP -> DOWN;
case DOWN -> UP;
case LEFT -> RIGHT;
case RIGHT -> LEFT;
};
}
}

View File

@@ -6,10 +6,11 @@ public enum EntityType {
NPC,
MONSTER,
ITEM,
WORLD,
OBSTACLE,
PICKUP,
PROJECTILE,
WEAPON,
LIGHT,
SHIELD;
public enum WeaponType {

View File

@@ -2,10 +2,18 @@ package de.miaurizius.jgame2d.core.enums;
public enum GameState {
// SCENES
PLAY,
PAUSE,
DIALOGUE,
TITLE,
CHARACTER,
// IN-GAME
CHARACTER, //inventory
DIALOGUE,
GAMEOVER,
TRANSITION,
TRADE,
SLEEP,
MAP,
}

View File

@@ -0,0 +1,23 @@
package de.miaurizius.jgame2d.core.enums;
public enum Map {
OVERWORLD("worldmap", 0),
HUT("indoor01", 1);
private final String name;
private final int index;
Map(String name, int index) {
this.name = name;
this.index = index;
}
public String getName() {
return name;
}
public int getIndex() {
return index;
}
}

View File

@@ -1,9 +1,14 @@
package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.entity.item.*;
import de.miaurizius.jgame2d.entity.monster.OrcMON;
import de.miaurizius.jgame2d.entity.npc.MerchantNPC;
import de.miaurizius.jgame2d.entity.npc.OldManNPC;
import de.miaurizius.jgame2d.entity.monster.GreenSlimeMON;
import de.miaurizius.jgame2d.entity.obstacle.ChestObj;
import de.miaurizius.jgame2d.entity.obstacle.DoorObj;
import de.miaurizius.jgame2d.tile.interactive.DryTreeTI;
public class AssetSetter {
@@ -16,74 +21,103 @@ public class AssetSetter {
public void setObject() {
int i = 0;
panel.obj[i] = new HeartObj(panel);
panel.obj[i].worldX = panel.tileSize*25;
panel.obj[i].worldY = panel.tileSize*23;
panel.obj[Map.OVERWORLD.getIndex()][i] = new AxeObj(panel);
panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*33;
panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*21;
i++;
panel.obj[i] = new CoinObj(panel);
panel.obj[i].worldX = panel.tileSize*21;
panel.obj[i].worldY = panel.tileSize*19;
panel.obj[Map.OVERWORLD.getIndex()][i] = new DoorObj(panel);
panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*14;
panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*28;
i++;
panel.obj[i] = new AxeObj(panel);
panel.obj[i].worldX = panel.tileSize*33;
panel.obj[i].worldY = panel.tileSize*21;
panel.obj[Map.OVERWORLD.getIndex()][i] = new DoorObj(panel);
panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*12;
panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*12;
i++;
panel.obj[i] = new IronShieldObj(panel);
panel.obj[i].worldX = panel.tileSize*35;
panel.obj[i].worldY = panel.tileSize*21;
i++;
panel.obj[i] = new PotionObj(panel);
panel.obj[i].worldX = panel.tileSize*22;
panel.obj[i].worldY = panel.tileSize*27;
panel.obj[Map.OVERWORLD.getIndex()][i] = new ChestObj(panel, new KeyObj(panel));
panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*30;
panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*29;
i++;
}
public void setNPC() {
panel.npc[0] = new OldManNPC(panel);
panel.npc[0].worldX = panel.tileSize*21;
panel.npc[0].worldY = panel.tileSize*21;
panel.npc[Map.OVERWORLD.getIndex()][0] = new OldManNPC(panel);
panel.npc[Map.OVERWORLD.getIndex()][0].worldX = panel.tileSize*21;
panel.npc[Map.OVERWORLD.getIndex()][0].worldY = panel.tileSize*21;
panel.npc[Map.HUT.getIndex()][0] = new MerchantNPC(panel);
panel.npc[Map.HUT.getIndex()][0].worldX = panel.tileSize*12;
panel.npc[Map.HUT.getIndex()][0].worldY = panel.tileSize*7;
}
public void setMonster() {
int i = 0;
panel.monster[i] = new GreenSlimeMON(panel);
panel.monster[i].worldX = panel.tileSize*23;
panel.monster[i].worldY = panel.tileSize*36;
panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*23;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*36;
i++;
panel.monster[i] = new GreenSlimeMON(panel);
panel.monster[i].worldX = panel.tileSize*23;
panel.monster[i].worldY = panel.tileSize*37;
panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*23;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*37;
i++;
panel.monster[i] = new GreenSlimeMON(panel);
panel.monster[i].worldX = panel.tileSize*24;
panel.monster[i].worldY = panel.tileSize*37;
panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*24;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*37;
i++;
panel.monster[i] = new GreenSlimeMON(panel);
panel.monster[i].worldX = panel.tileSize*34;
panel.monster[i].worldY = panel.tileSize*42;
panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*34;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*42;
i++;
panel.monster[i] = new GreenSlimeMON(panel);
panel.monster[i].worldX = panel.tileSize*38;
panel.monster[i].worldY = panel.tileSize*42;
panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*38;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*42;
i++;
panel.monster[Map.OVERWORLD.getIndex()][i] = new OrcMON(panel);
panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*12;
panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*33;
}
public void setITiles() {
int i = 0;
panel.iTile[i] = new DryTreeTI(panel,27,12);i++;
panel.iTile[i] = new DryTreeTI(panel,28,12);i++;
panel.iTile[i] = new DryTreeTI(panel,29,12);i++;
panel.iTile[i] = new DryTreeTI(panel,30,12);i++;
panel.iTile[i] = new DryTreeTI(panel,31,12);i++;
panel.iTile[i] = new DryTreeTI(panel,32,12);i++;
panel.iTile[i] = new DryTreeTI(panel,33,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,28,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,29,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,30,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,31,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,32,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,33,12);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,30,21);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,25,27);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,26,27);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,27);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,28);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,29);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,30);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,31);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,28,31);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,29,31);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,30,31);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,18,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,17,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,16,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,15,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,14,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,13,40);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,13,41);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,12,41);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,11,41);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,10,41);i++;
panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,10,40);i++;
}
}

View File

@@ -1,6 +1,7 @@
package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.entity.Entity;
public class CollisionHandler {
@@ -25,29 +26,33 @@ public class CollisionHandler {
int tileNum1, tileNum2;
switch(entity.direction) {
// TEMP DIRECTION FOR KNOCKBACK
Direction direction = entity.direction;
if(entity.knockback) direction = entity.knockbackDirection;
switch(direction) {
case UP:
entityTopRow = (entityTopWorldY - entity.speed)/panel.tileSize;
tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityTopRow];
tileNum1 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityLeftCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityRightCol][entityTopRow];
if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true;
break;
case DOWN:
entityBottomRow = (entityBottomWorldY + entity.speed)/panel.tileSize;
tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityBottomRow];
tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityBottomRow];
tileNum1 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityLeftCol][entityBottomRow];
tileNum2 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityRightCol][entityBottomRow];
if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true;
break;
case LEFT:
entityLeftCol = (entityLeftWorldX - entity.speed)/panel.tileSize;
tileNum1 = panel.tileM.mapTileNum[entityLeftCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[entityLeftCol][entityBottomRow];
tileNum1 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityLeftCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityLeftCol][entityBottomRow];
if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true;
break;
case RIGHT:
entityRightCol = (entityRightWorldX + entity.speed)/panel.tileSize;
tileNum1 = panel.tileM.mapTileNum[entityRightCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[entityRightCol][entityBottomRow];
tileNum1 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityRightCol][entityTopRow];
tileNum2 = panel.tileM.mapTileNum[panel.currentMap.getIndex()][entityRightCol][entityBottomRow];
if(panel.tileM.tile[tileNum1].collision || panel.tileM.tile[tileNum2].collision) entity.collisionOn = true;
break;
}
@@ -56,7 +61,7 @@ public class CollisionHandler {
int index = 999;
int c = -1;
for(Entity obj : panel.obj) {
for(Entity obj : panel.obj[panel.currentMap.getIndex()]) {
c++;
if (obj != null) {

View File

@@ -1,36 +1,49 @@
package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.Boot;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.core.enums.Map;
import de.miaurizius.jgame2d.entity.Entity;
import java.awt.*;
import java.util.logging.Level;
public class EventHandler {
GamePanel panel;
EventRect[][] eventRect;
int prevEventX, prevEventY;
EventRect[][][] eventRect;
public int prevEventX, prevEventY;
boolean canTouchEvent = true;
// TMP VARS FOR TRANSITION
public int tempCol, tempRow;
public Map tempMap;
public EventHandler(GamePanel panel) {
this.panel = panel;
eventRect = new EventRect[panel.maxWorldCol][panel.maxWorldRow];
eventRect = new EventRect[Map.values().length][panel.maxWorldCol][panel.maxWorldRow];
int map = 0;
int col = 0;
int row = 0;
while(col < panel.maxWorldCol && row < panel.maxWorldRow) {
eventRect[col][row] = new EventRect();
eventRect[col][row].x = 23;
eventRect[col][row].y = 23;
eventRect[col][row].width = 2;
eventRect[col][row].height = 2;
eventRect[col][row].eventRectDefaultX = eventRect[col][row].x;
eventRect[col][row].eventRectDefaultY = eventRect[col][row].y;
while(map < Map.values().length && col < panel.maxWorldCol && row < panel.maxWorldRow) {
eventRect[map][col][row] = new EventRect();
eventRect[map][col][row].x = 23;
eventRect[map][col][row].y = 23;
eventRect[map][col][row].width = 2;
eventRect[map][col][row].height = 2;
eventRect[map][col][row].eventRectDefaultX = eventRect[map][col][row].x;
eventRect[map][col][row].eventRectDefaultY = eventRect[map][col][row].y;
col++;
if(col == panel.maxWorldCol) {
col = 0;
row++;
if(row == panel.maxWorldRow) {
row = 0;
map++;
}
}
}
}
@@ -43,23 +56,31 @@ public class EventHandler {
if(distance > panel.tileSize) canTouchEvent = true;
if(!canTouchEvent) return;
if(hit(27,16, Direction.RIGHT)) damagePit(GameState.DIALOGUE);
if(hit(23,12, null)) healingPool(GameState.DIALOGUE);
// PIT/POOL TESTS
if(hit(Map.OVERWORLD, 27,16, Direction.RIGHT)) damagePit();
else if(hit(Map.OVERWORLD, 23,12, null)) healingPool();
// HUT
else if(hit(Map.OVERWORLD, 10, 39, null)) changeMap(Map.HUT, 12, 13);
else if(hit(Map.HUT, 12, 13, null)) changeMap(Map.OVERWORLD, 10, 39);
// ADVANCED SPEAKING
else if(hit(Map.HUT, 12, 9, Direction.UP)) speak(panel.npc[Map.HUT.getIndex()][0]);
}
/**
* @param reqDirection Set to null if no direction is required
*/
public boolean hit(int eventCol, int eventRow, Direction reqDirection) {
private boolean hit(Map map, int eventCol, int eventRow, Direction reqDirection) {
boolean hit = false;
panel.player.solidArea.x = panel.player.worldX + panel.player.solidArea.x;
panel.player.solidArea.y = panel.player.worldY + panel.player.solidArea.y;
eventRect[eventCol][eventRow].x = eventCol*panel.tileSize + eventRect[eventCol][eventRow].x;
eventRect[eventCol][eventRow].y = eventRow*panel.tileSize + eventRect[eventCol][eventRow].y;
eventRect[map.getIndex()][eventCol][eventRow].x = eventCol*panel.tileSize + eventRect[map.getIndex()][eventCol][eventRow].x;
eventRect[map.getIndex()][eventCol][eventRow].y = eventRow*panel.tileSize + eventRect[map.getIndex()][eventCol][eventRow].y;
if(
panel.player.solidArea.intersects(eventRect[eventCol][eventRow]) &&
panel.player.solidArea.intersects(eventRect[map.getIndex()][eventCol][eventRow]) &&
(reqDirection == null || panel.player.direction == reqDirection) &&
!eventRect[eventCol][eventRow].eventDone
!eventRect[map.getIndex()][eventCol][eventRow].eventDone
) {
hit = true;
prevEventX = panel.player.worldX;
@@ -67,28 +88,47 @@ public class EventHandler {
}
panel.player.solidArea.x = panel.player.solidAreaDefaultX;
panel.player.solidArea.y = panel.player.solidAreaDefaultY;
eventRect[eventCol][eventRow].x = eventRect[eventCol][eventRow].eventRectDefaultX;
eventRect[eventCol][eventRow].y = eventRect[eventCol][eventRow].eventRectDefaultY;
eventRect[map.getIndex()][eventCol][eventRow].x = eventRect[map.getIndex()][eventCol][eventRow].eventRectDefaultX;
eventRect[map.getIndex()][eventCol][eventRow].y = eventRect[map.getIndex()][eventCol][eventRow].eventRectDefaultY;
if(panel.currentMap != map) hit = false;
return hit;
}
public void damagePit(GameState gameState) {
panel.gameState = gameState;
private void damagePit() {
panel.gameState = GameState.DIALOGUE;
panel.playSE(6);
panel.ui.currentDialogue = "You have fallen into a pit!";
panel.player.life -= 1;
canTouchEvent = false;
}
public void healingPool(GameState gameState) {
private void healingPool() {
if(!panel.keyH.spacePressed) return;
panel.gameState = gameState;
panel.gameState = GameState.DIALOGUE;
panel.player.attackCancel = true;
panel.playSE(2);
panel.ui.currentDialogue = "You drank the holy water.\nYour life has been recovered!\nBut all monsters respawned... \nGood luck!";
panel.player.life = panel.player.maxLife;
panel.ui.currentDialogue = "You saved your progress!";
//panel.player.life = panel.player.maxLife;
canTouchEvent = false;
panel.assetSetter.setMonster();
try {
panel.saveLoad.save();
} catch (Exception e) {
Boot.logger.log(Level.SEVERE, "Saving game failed!", e);
}
}
private void changeMap(Map map, int col, int row) {
panel.gameState = GameState.TRANSITION;
tempMap = map;
tempCol = col;
tempRow = row;
canTouchEvent = false;
panel.playSE(13);
}
private void speak(Entity entity) {
if(!panel.keyH.spacePressed) return;
panel.gameState = GameState.DIALOGUE;
panel.player.attackCancel = true;
entity.speak();
}
static private class EventRect extends Rectangle {

View File

@@ -1,14 +1,18 @@
package de.miaurizius.jgame2d.core.handlers;
import de.miaurizius.jgame2d.core.Boot;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.UI;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.core.enums.Map;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
public class KeyHandler implements KeyListener {
public boolean upPressed, downPressed, leftPressed, rightPressed, spacePressed, shotKeyPressed;
public boolean upPressed, downPressed, leftPressed, rightPressed, spacePressed, shotKeyPressed, CTLKeyPressed;
public GamePanel panel;
public boolean debug;
@@ -17,7 +21,7 @@ public class KeyHandler implements KeyListener {
}
// STATE SPECIFIC KEYBIND CONFIGURATION
public void handleTitle(int code) {
private void handleTitle(int code) {
switch (code) {
case KeyEvent.VK_UP -> {
if(panel.ui.commandNum != 0) panel.ui.commandNum--;
@@ -25,14 +29,22 @@ public class KeyHandler implements KeyListener {
case KeyEvent.VK_DOWN -> {
if(panel.ui.commandNum != 2) panel.ui.commandNum++;
}
case KeyEvent.VK_ENTER -> {
case KeyEvent.VK_ENTER, KeyEvent.VK_SPACE -> {
switch (panel.ui.commandNum) {
case 0:
panel.gameState = GameState.PLAY;
panel.playMusic(0);
break;
case 1:
// add later
System.out.printf("Loading config...%n");
try {
panel.config.load();
panel.saveLoad.load();
panel.gameState = GameState.PLAY;
panel.playMusic(0);
} catch (Exception e) {
Boot.logger.log(Level.SEVERE, "Failed to load config", e);
}
break;
case 2:
System.exit(0);
@@ -41,68 +53,211 @@ public class KeyHandler implements KeyListener {
}
}
}
public void handlePlay(int code) {
private void handlePlay(int code) {
switch (code) {
// CONTROLS
case KeyEvent.VK_W, KeyEvent.VK_UP -> upPressed = true;
case KeyEvent.VK_S, KeyEvent.VK_DOWN -> downPressed = true;
case KeyEvent.VK_A, KeyEvent.VK_LEFT -> leftPressed = true;
case KeyEvent.VK_D, KeyEvent.VK_RIGHT -> rightPressed = true;
case KeyEvent.VK_CONTROL -> CTLKeyPressed = true;
case KeyEvent.VK_SPACE -> spacePressed = true;
//case KeyEvent.VK_F -> shotKeyPressed = true;
// MINI MAP TOGGLE
case KeyEvent.VK_X -> panel.mapMan.miniMapOn = !panel.mapMan.miniMapOn;
// DEBUG OPTIONS
case KeyEvent.VK_T -> debug = !debug;
case KeyEvent.VK_R -> panel.tileM.loadMap(panel.currentMap);
case KeyEvent.VK_R -> {for(Map m : Map.values()) panel.tileM.loadMap(m);}
// GAME STATES
case KeyEvent.VK_ESCAPE -> panel.gameState = GameState.PAUSE;
case KeyEvent.VK_ESCAPE -> {
panel.gameState = GameState.PAUSE;
panel.ui.optionState = UI.OptionState.OVERVIEW;
panel.ui.commandNum = 0;
}
case KeyEvent.VK_C -> panel.gameState = GameState.CHARACTER;
case KeyEvent.VK_M -> panel.gameState = GameState.MAP;
}
}
public void handlePause(int code) {
private void handlePause(int code) {
if(code == KeyEvent.VK_SPACE) spacePressed = true;
int maxCommandNum = 0;
switch (panel.ui.optionState) {
case OVERVIEW -> maxCommandNum = 5;
case QUITNF -> maxCommandNum = 1;
}
switch(code) {
case KeyEvent.VK_UP:
if(panel.ui.commandNum <= 0) break;
panel.ui.commandNum--;
panel.playSE(9);
break;
case KeyEvent.VK_DOWN:
if(panel.ui.commandNum >= maxCommandNum) break;
panel.ui.commandNum++;
panel.playSE(9);
break;
case KeyEvent.VK_LEFT:
if(panel.ui.optionState == UI.OptionState.OVERVIEW)
if(panel.ui.commandNum == 1 && panel.music.volumeScale > 0) {
panel.music.volumeScale--;
panel.music.checkVolume();
panel.playSE(9);
} else if(panel.ui.commandNum == 2 && panel.sfx.volumeScale > 0) {
panel.sfx.volumeScale--;
panel.playSE(9);
}
break;
case KeyEvent.VK_RIGHT:
if(panel.ui.optionState == UI.OptionState.OVERVIEW) {
if(panel.ui.commandNum == 1 && panel.music.volumeScale < 5) {
panel.music.volumeScale++;
panel.music.checkVolume();
panel.playSE(9);
} else if(panel.ui.commandNum == 2 && panel.sfx.volumeScale < 5) {
panel.sfx.volumeScale++;
panel.playSE(9);
}
}
break;
}
// EXIT STATE
if(code == KeyEvent.VK_ESCAPE) panel.gameState = GameState.PLAY;
if(code == KeyEvent.VK_ESCAPE)
if(panel.ui.optionState == UI.OptionState.OVERVIEW) panel.gameState = GameState.PLAY; else panel.ui.optionState = UI.OptionState.OVERVIEW;
}
public void handleDialogue(int code) {
private void handleDialogue(int code) {
// EXIT STATE
if (code == KeyEvent.VK_SPACE) {
panel.gameState = GameState.PLAY;
}
}
public void handleCharacter(int code) throws InterruptedException {
private void handleCharacter(int code) {
switch (code) {
case KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT -> playerInventory(code);
case KeyEvent.VK_SPACE -> panel.player.selectItem();
// EXIT STATE
case KeyEvent.VK_C, KeyEvent.VK_ESCAPE -> panel.gameState = GameState.PLAY;
}
}
private void handleGameOver(int code) {
switch(code) {
case KeyEvent.VK_UP:
if(panel.ui.slotRow == 0) break;
if(panel.se.clips[9].isRunning()) break;
panel.ui.slotRow--;
if (panel.ui.commandNum <= 0) break;
panel.ui.commandNum--;
panel.playSE(9);
break;
case KeyEvent.VK_DOWN:
if(panel.ui.slotRow == 3) break;
if(panel.se.clips[9].isRunning()) break;
panel.ui.slotRow++;
if (panel.ui.commandNum >= 1) break;
panel.ui.commandNum++;
panel.playSE(9);
break;
case KeyEvent.VK_SPACE:
if(panel.ui.commandNum == 0) {
panel.gameState = GameState.PLAY;
panel.playMusic(0);
panel.resetGame(false);
}
if(panel.ui.commandNum == 1) {
panel.gameState = GameState.TITLE;
panel.ui.commandNum = 0;
panel.resetGame(true);
panel.stopMusic();
}
}
}
private void handleTrade(int code) {
if(code == KeyEvent.VK_SPACE) spacePressed = true;
if(panel.ui.tradeState == UI.TradeState.SELECT) {
switch (code) {
case KeyEvent.VK_UP:
if (panel.ui.commandNum <= 0) break;
panel.ui.commandNum--;
panel.playSE(9);
break;
case KeyEvent.VK_DOWN:
if (panel.ui.commandNum >= 2) break;
panel.ui.commandNum++;
panel.playSE(9);
break;
}
}
if(panel.ui.tradeState == UI.TradeState.BUY) {
npcInventory(code);
if(code == KeyEvent.VK_ESCAPE) panel.ui.tradeState = UI.TradeState.SELECT;
}
if(panel.ui.tradeState == UI.TradeState.SELL) {
playerInventory(code);
if(code == KeyEvent.VK_ESCAPE) panel.ui.tradeState = UI.TradeState.SELECT;
}
}
private void handleMap(int code) {
switch (code) {
// EXIT STATE
case KeyEvent.VK_M, KeyEvent.VK_ESCAPE -> panel.gameState = GameState.PLAY;
}
}
// UTILITY
private void playerInventory(int code) {
switch (code) {
case KeyEvent.VK_UP:
if(panel.ui.playerSlotRow == 0) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.playerSlotRow--;
panel.playSE(9);
break;
case KeyEvent.VK_DOWN:
if(panel.ui.playerSlotRow == 3) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.playerSlotRow++;
panel.playSE(9);
break;
case KeyEvent.VK_LEFT:
if(panel.ui.slotCol == 0) break;
if(panel.se.clips[9].isRunning()) break;
panel.ui.slotCol--;
if(panel.ui.playerSlotCol == 0) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.playerSlotCol--;
panel.playSE(9);
break;
case KeyEvent.VK_RIGHT:
if(panel.ui.slotCol == 4) break;
if(panel.se.clips[9].isRunning()) break;
panel.ui.slotCol++;
if(panel.ui.playerSlotCol == 4) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.playerSlotCol++;
panel.playSE(9);
break;
case KeyEvent.VK_SPACE:
panel.player.selectItem();
}
}
private void npcInventory(int code) {
switch (code) {
case KeyEvent.VK_UP:
if(panel.ui.npcSlotRow == 0) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.npcSlotRow--;
panel.playSE(9);
break;
// EXIT STATE
case KeyEvent.VK_C, KeyEvent.VK_ESCAPE:
panel.gameState = GameState.PLAY;
case KeyEvent.VK_DOWN:
if(panel.ui.npcSlotRow == 3) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.npcSlotRow++;
panel.playSE(9);
break;
case KeyEvent.VK_LEFT:
if(panel.ui.npcSlotCol == 0) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.npcSlotCol--;
panel.playSE(9);
break;
case KeyEvent.VK_RIGHT:
if(panel.ui.npcSlotCol == 4) break;
if(panel.sfx.clips[9].isRunning()) break;
panel.ui.npcSlotCol++;
panel.playSE(9);
break;
}
}
@@ -114,25 +269,14 @@ public class KeyHandler implements KeyListener {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch(panel.gameState) {
case PLAY:
handlePlay(code);
break;
case DIALOGUE:
handleDialogue(code);
break;
case TITLE:
handleTitle(code);
break;
case PAUSE:
handlePause(code);
break;
case CHARACTER:
try {
handleCharacter(code);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
break;
case PLAY -> handlePlay(code);
case DIALOGUE -> handleDialogue(code);
case TITLE -> handleTitle(code);
case PAUSE -> handlePause(code);
case CHARACTER -> handleCharacter(code);
case GAMEOVER -> handleGameOver(code);
case TRADE -> handleTrade(code);
case MAP -> handleMap(code);
}
}
@Override
@@ -143,6 +287,7 @@ public class KeyHandler implements KeyListener {
case KeyEvent.VK_S, KeyEvent.VK_DOWN -> downPressed = false;
case KeyEvent.VK_A, KeyEvent.VK_LEFT -> leftPressed = false;
case KeyEvent.VK_D, KeyEvent.VK_RIGHT -> rightPressed = false;
case KeyEvent.VK_CONTROL -> CTLKeyPressed = false;
case KeyEvent.VK_F -> shotKeyPressed = false;
}
}

View File

@@ -5,15 +5,19 @@ import de.miaurizius.jgame2d.core.Boot;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import java.io.File;
import java.net.URL;
import java.util.logging.Level;
public class Sound {
Clip clip;
public Clip clip;
URL[] soundURL = new URL[30];
public Clip[] clips = new Clip[30];
public FloatControl fc;
public int volumeScale = 3;
float volume;
public Sound() {
load(0, "assets/sounds/BlueBoyAdventure.wav");
@@ -28,6 +32,11 @@ public class Sound {
load(9, "assets/sounds/cursor.wav");
load(10, "assets/sounds/burning.wav");
load(11, "assets/sounds/cuttree.wav");
load(12, "assets/sounds/gameover.wav");
load(13, "assets/sounds/stairs.wav");
load(14, "assets/sounds/sleep.wav");
load(15, "assets/sounds/blocked.wav");
load(16, "assets/sounds/parry.wav");
}
@Deprecated
@@ -41,6 +50,7 @@ public class Sound {
}
}
// MANAGER
private void load(int index, String path) {
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(new File(path));
@@ -50,9 +60,19 @@ public class Sound {
Boot.logger.log(Level.SEVERE, "Could not load Sound File: " + soundURL[index], e);
}
}
public void stop() {
clip.stop();
}
public void checkVolume() {
switch(volumeScale) {
case 0 -> volume = -80f;
case 1 -> volume = -20f;
case 2 -> volume = -12f;
case 3 -> volume = -5f;
case 4 -> volume = 1f;
case 5 -> volume = 6f;
}
fc.setValue(volume);
}
}

View File

@@ -0,0 +1,88 @@
package de.miaurizius.jgame2d.data;
import de.miaurizius.jgame2d.core.GamePanel;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Config {
private final GamePanel panel;
private final HashMap<String, String> settings = new HashMap<>();
public Config(GamePanel panel) throws IOException {
this.panel = panel;
for (Setting option : Setting.values()) settings.put(option.name, null);
new File("gamedata").mkdirs();
new File("gamedata/save").mkdirs();
new File("gamedata/config").createNewFile();
}
// GENERAL
public final void save() {
try {
insertToHash();
BufferedWriter writer = new BufferedWriter(new FileWriter("gamedata/config"));
settings.forEach((invoke, value) -> {
try {
writer.write(invoke + ": " + value);
writer.newLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
});
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public final void load() {
try (BufferedReader reader = new BufferedReader(new FileReader("gamedata/config"))) {
List<String> lines = reader.lines().toList();
if (lines.isEmpty()) return;
Map<String, String> configMap = new HashMap<>();
for (String line : lines) {
String[] parts = line.split(":\\s*", 2);
if (parts.length == 2) {
configMap.put(parts[0].trim(), parts[1].trim());
}
}
for (Setting setting : Setting.values()) {
String value = configMap.get(setting.name);
if (value != null) {
switch (setting) {
case FULLSCREEN -> panel.fullscreen = Boolean.parseBoolean(value);
case MUSICVOLUME -> panel.music.volumeScale = Integer.parseInt(value);
case SFXVOLUME -> panel.sfx.volumeScale = Integer.parseInt(value);
}
}
}
insertToHash();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// HELP FUNCTIONS
private void insertToHash() {
settings.put(Setting.FULLSCREEN.name, String.valueOf(panel.fullscreen));
settings.put(Setting.MUSICVOLUME.name, String.valueOf(panel.music.volumeScale));
settings.put(Setting.SFXVOLUME.name, String.valueOf(panel.sfx.volumeScale));
}
private enum Setting {
FULLSCREEN("fullscreen"),
MUSICVOLUME("music-vol"),
SFXVOLUME("sfx-vol");
private final String name;
Setting(String name) {
this.name = name;
}
}
}

View File

@@ -0,0 +1,28 @@
package de.miaurizius.jgame2d.data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class DataStorage implements Serializable {
// PLAYER STATS
int level;
int maxLife;
int life;
int maxMana;
int strength;
int dexterity;
int attack;
int defense;
int exp;
int nextLevelExp;
int coins;
int worldX, worldY;
// PLAYER INVENTORY
List<String> itemNames = new ArrayList<>();
List<Integer> itemAmounts = new ArrayList<>();
}

View File

@@ -0,0 +1,82 @@
package de.miaurizius.jgame2d.data;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.entity.Entity;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
public class SaveLoad {
GamePanel panel;
public SaveLoad(GamePanel panel) {
this.panel = panel;
}
public Entity getObject(String itemName) {
Entity obj;
try {
obj = (Entity) Class.forName(itemName).getDeclaredConstructor().newInstance(panel);
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException |
InvocationTargetException e) {
throw new RuntimeException(e);
}
return obj;
}
public void save() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("gamedata/save/savegame.dat"));
DataStorage ds = new DataStorage();
// PLAYER STATS
ds.level = panel.player.level;
ds.maxLife = panel.player.maxLife;
ds.life = panel.player.life;
ds.maxMana = panel.player.maxMana;
ds.strength = panel.player.strength;
ds.dexterity = panel.player.dexterity;
ds.attack = panel.player.attack;
ds.defense = panel.player.defense;
ds.exp = panel.player.exp;
ds.nextLevelExp = panel.player.nextLevelExp;
ds.coins = panel.player.coins;
ds.worldX = panel.player.worldX;
ds.worldY = panel.player.worldY;
// PLAYER INVENTORY
for(int i = 0; i < panel.player.inventory.size(); i++) {
ds.itemNames.add(panel.player.inventory.get(i).getClass().getName());
ds.itemAmounts.add(panel.player.inventory.get(i).amt);
}
// WRITE
oos.writeObject(ds);
}
public void load() throws ClassNotFoundException, IOException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("gamedata/save/savegame.dat"));
DataStorage ds = (DataStorage) ois.readObject();
panel.player.level = ds.level;
panel.player.maxLife = ds.maxLife;
panel.player.life = ds.life;
panel.player.maxMana = ds.maxMana;
panel.player.strength = ds.strength;
panel.player.dexterity = ds.dexterity;
panel.player.attack = ds.attack;
panel.player.defense = ds.defense;
panel.player.exp = ds.exp;
panel.player.nextLevelExp = ds.nextLevelExp;
panel.player.coins = ds.coins;
panel.player.worldX = ds.worldX;
panel.player.worldY = ds.worldY;
for(int i = 0; i < ds.itemNames.size(); i++) {
Entity obj = getObject(ds.itemNames.get(i));
obj.amt = ds.itemAmounts.get(i);
panel.player.inventory.add(obj);
}
}
}

View File

@@ -13,6 +13,9 @@ import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
public class Entity {
@@ -20,9 +23,11 @@ public class Entity {
protected GamePanel panel;
public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2;
public BufferedImage attackUp1, attackUp2, attackDown1, attackDown2, attackLeft1, attackLeft2, attackRight1, attackRight2;
public BufferedImage guardUp, guardDown, guardLeft, guardRight;
public BufferedImage image, image2, image3;
public Rectangle solidArea = new Rectangle(0, 0, 48, 48);
public Rectangle attackArea = new Rectangle(0, 0, 0, 0);
public Entity attacker;
public int solidAreaDefaultX, solidAreaDefaultY;
public boolean collision;
protected String[] dialogue = new String[20];
@@ -34,21 +39,29 @@ public class Entity {
int dialogueIndex;
public boolean collisionOn;
public boolean invincible;
boolean attacking;
public boolean transparent;
public boolean attacking;
public boolean alive = true;
public boolean dying;
public boolean hpBarOn;
public boolean consumable;
public boolean onPath;
public boolean knockback;
public boolean guarding;
public Direction knockbackDirection;
// COUNTER
public int spriteCounter;
public int spriteCount;
public int actionLock;
public int invincibleCount;
public int shotAvailableCount;
int dyingCount;
int hpBarCounter;
int hpBarCount;
int knockbackCount;
// CHARACTER ATTRIBUTES
public EntityType type;
public int defaultSpeed;
public String name;
public int speed;
public int maxLife;
@@ -65,7 +78,10 @@ public class Entity {
public int mana;
public Entity currentWeapon;
public Entity currentShield;
public Entity currentLight;
public Projectile projectile;
public List<Entity> inventory = new ArrayList<>();
public final int maxInvSize = 20;
// ITEM ATTRIBUTES
public EntityType.WeaponType weaponType;
@@ -74,6 +90,11 @@ public class Entity {
public String description;
public int useCost;
public int value;
public int price;
public int knockbackVal;
public boolean stackable;
public int amt = 1;
public float lightRadius;
public Entity(GamePanel panel) {
this.panel = panel;
@@ -81,41 +102,55 @@ public class Entity {
// DEFAULT
public void update() {
setAction();
collisionOn = false;
panel.collisionH.checkTile(this);
panel.collisionH.checkObject(this, false);
panel.collisionH.checkEntity(this, panel.npc);
panel.collisionH.checkEntity(this, panel.monster);
panel.collisionH.checkEntity(this, panel.iTile);
boolean contactPlayer = panel.collisionH.checkPlayer(this);
if(knockback) {
checkCollision();
if(collisionOn) {
knockbackCount = 0;
knockback = false;
speed = defaultSpeed;
invincibleCounting();
return;
}
if(this.type == EntityType.MONSTER && contactPlayer) damagePlayer(attack);
if(!collisionOn) {
switch (direction) {
switch(knockbackDirection) {
case UP -> worldY -= speed;
case DOWN -> worldY += speed;
case LEFT ->worldX -= speed;
case RIGHT -> worldX += speed;
}
}
spriteCounter++;
if(spriteCounter > 12) {
if(spriteNum == 1) spriteNum = 2;
else if(spriteNum == 2) spriteNum = 1;
else spriteNum = 0;
spriteCounter = 0;
}
knockbackCount++;
if(knockbackCount != 10) {
invincibleCounting();
return;
}
// INVINCIBLE COUNTER
if(!invincible) return;
invincibleCount++;
if(invincibleCount > 40) {
invincible = false;
invincibleCount = 0;
knockback = false;
knockbackCount = 0;
speed = defaultSpeed;
} else if(attacking) attacking();
else {
setAction();
checkCollision();
if(!collisionOn) {
switch (direction) {
case UP -> worldY -= speed;
case DOWN -> worldY += speed;
case LEFT ->worldX -= speed;
case RIGHT -> worldX += speed;
}
}
spriteCount++;
if(spriteCount > 24) {
if(spriteNum == 1) spriteNum = 2;
else if(spriteNum == 2) spriteNum = 1;
else spriteNum = 0;
spriteCount = 0;
}
}
invincibleCounting();
}
public void draw(Graphics2D graphics2d) {
int screenX = worldX - panel.player.worldX + panel.player.screenX;
@@ -135,9 +170,9 @@ public class Entity {
graphics2d.setColor(new Color(255, 0, 30));
graphics2d.fillRect(screenX, screenY-5, (int) ((double) panel.tileSize/maxLife)*life, 10);
hpBarCounter++;
if(hpBarCounter > 600) { //bar disappears after 10 seconds
hpBarCounter = 0;
hpBarCount++;
if(hpBarCount > 600) { //bar disappears after 10 seconds
hpBarCount = 0;
hpBarOn = false;
}
}
@@ -145,31 +180,88 @@ public class Entity {
// DRAW ENTITY
if(invincible) {
hpBarOn = true;
hpBarCounter = 0;
changeOpacity(graphics2d, 0.4f);
hpBarCount = 0;
if(transparent) changeOpacity(graphics2d, 0.4f);
}
if(dying) dyingAnimation(graphics2d);
if(type == EntityType.PLAYER) { // only modify sprite render position for player because I dont know yet how monster attack sprite are gonna look
if(type == EntityType.PLAYER || name.equals("orc")) { // only modify sprite render position for player because I dont know yet how monster attack sprite are gonna look
if(attacking) graphics2d.drawImage(parseSpriteATK(),
(direction == Direction.LEFT) ? screenX - panel.tileSize : screenX,
(direction == Direction.UP) ? screenY - panel.tileSize : screenY, null);
else if(guarding) graphics2d.drawImage(parseSpriteGRD(), screenX, screenY, null);
else graphics2d.drawImage(parseSprite(), screenX, screenY, null);
} else graphics2d.drawImage(parseSprite(), screenX, screenY, null);
changeOpacity(graphics2d, 1f);
}
if(panel.keyH.debug) {
graphics2d.setColor(new Color(255, 0, 0, 70));
graphics2d.fillRect(worldX - panel.player.worldX + panel.player.screenX, worldY - panel.player.worldY + panel.player.screenY, panel.tileSize, panel.tileSize);
}
}
// INTERACTION
public void setAction() {}
public void damageReaction() {}
public void attacking() {
if(panel.player.attackCancel && type == EntityType.PLAYER) return;
spriteCount++;
if(spriteCount <= 5) spriteNum = 1;
if(spriteCount > 5 && spriteCount <= 25) {
spriteNum = 2;
int currentWorldX = worldX;
int currentWorldY = worldY;
int solidAreaWidth = solidArea.width;
int solidAreaHeight = solidArea.height;
switch(direction) {
case UP -> worldY -= attackArea.height;
case DOWN -> worldY += attackArea.height;
case LEFT -> worldX -= attackArea.width;
case RIGHT -> worldX += attackArea.width;
}
solidArea.width = attackArea.width;
solidArea.height = attackArea.height;
if(type == EntityType.MONSTER) if(panel.collisionH.checkPlayer(this)) damagePlayer(attack);
if(type == EntityType.PLAYER) {
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]);
panel.player.damageMonster(monsterIndex, this, attack, currentWeapon.knockbackVal);
int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]);
panel.player.interactTile(iTileIndex);
}
worldX = currentWorldX;
worldY = currentWorldY;
solidArea.width = solidAreaWidth;
solidArea.height = solidAreaHeight;
}
if(spriteCount > 25) {
spriteNum = 1;
spriteCount = 0;
attacking = false;
}
}
public void damagePlayer(int attack) {
if(panel.player.invincible) return;
panel.playSE(6);
boolean block = panel.player.guarding && panel.player.direction == this.direction.getOpposite();
int damage = attack - panel.player.defense;
panel.player.life -= Math.max(damage, 0);
if(block) {
panel.playSE(15);
damage = 0;
} else panel.playSE(6);
panel.player.life -= Math.max(damage, (block ? 0 : 1));
if(damage != 0) {
setKnockback(panel.player, this, knockbackVal);
panel.player.transparent = true;
}
panel.player.invincible = true;
}
public void speak() {
@@ -199,21 +291,69 @@ public class Entity {
alive = false;
}
}
public void use(Entity entity) {
public boolean use(Entity entity) {
return false;
} //If entity is consumable
public void checkDrop() {
}
public void checkCollision() {
collisionOn = false;
panel.collisionH.checkTile(this);
panel.collisionH.checkObject(this, false);
panel.collisionH.checkEntity(this, panel.npc[panel.currentMap.getIndex()]);
panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]);
panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]);
boolean contactPlayer = panel.collisionH.checkPlayer(this);
if(this.type == EntityType.MONSTER && contactPlayer) damagePlayer(attack);
}
public void dropItem(Entity droppedItem) {
for(int i = 0; i < panel.obj.length; i++) {
if(panel.obj[i] == null) {
panel.obj[i] = droppedItem;
panel.obj[i].worldX = worldX;
panel.obj[i].worldY = worldY;
for(int i = 0; i < panel.obj[panel.currentMap.getIndex()].length; i++) {
if(panel.obj[panel.currentMap.getIndex()][i] == null) {
panel.obj[panel.currentMap.getIndex()][i] = droppedItem;
panel.obj[panel.currentMap.getIndex()][i].worldX = worldX;
panel.obj[panel.currentMap.getIndex()][i].worldY = worldY;
break;
}
}
}
public void interact() {
}
public int getDetected(Entity user, Entity[][] target, String targetName) {
int index = 999;
int nextWorldX = user.getLeftX();
int nextWorldY = user.getTopY();
switch(user.direction) {
case UP -> nextWorldY = user.getTopY()-panel.player.speed;
case DOWN -> nextWorldY = user.getBottomY()+panel.player.speed;
case LEFT -> nextWorldX = user.getLeftX()-panel.player.speed;
case RIGHT -> nextWorldX = user.getRightX()+panel.player.speed;
}
int col = nextWorldX / panel.tileSize;
int row = nextWorldY / panel.tileSize;
for(int i = 0; i < target[panel.currentMap.getIndex()].length; i++) {
if(target[panel.currentMap.getIndex()][i] == null) continue;
if(
target[panel.currentMap.getIndex()][i].getCol() == col &&
target[panel.currentMap.getIndex()][i].getRow() == row &&
target[panel.currentMap.getIndex()][i].name.equalsIgnoreCase(targetName)
) {
index = i;
break;
}
}
return index;
}
public void setKnockback(Entity target, Entity attacker, int knockbackVal) {
this.attacker = attacker;
target.knockbackDirection = attacker.direction;
target.speed += knockbackVal;
target.knockback = true;
}
// PARTICLE SETUP
public Color getParticleColor() {
@@ -244,6 +384,42 @@ public class Entity {
panel.particleList.add(p4);
}
// GETTERS
public int getLeftX() {
return worldX + solidArea.x;
}
public int getRightX() {
return worldX + solidArea.x + solidArea.width;
}
public int getTopY() {
return worldY + solidArea.y;
}
public int getBottomY() {
return worldY + solidArea.y + solidArea.height;
}
public int getCol() {
return (worldX + solidArea.x) / panel.tileSize;
}
public int getRow() {
return (worldY + solidArea.y) / panel.tileSize;
}
public int dX(Entity target) {
return Math.abs(worldX - target.worldX);
}
public int dY(Entity target) {
return Math.abs(worldY - target.worldY);
}
public int dTile(Entity target) {
//if(Objects.equals(name, "orc")) System.out.println("dX: " + dX(target) + " dY: " + dY(target));
return (dX(target) + dY(target)) / panel.tileSize;
}
public int getGoalCol(Entity target) {
return (target.worldX+target.solidArea.x)/panel.tileSize;
}
public int getGoalRow(Entity target) {
return (target.worldY+target.solidArea.y)/panel.tileSize;
}
// SETTING THINGS UP
BufferedImage parseSprite() {
return switch (direction) {
@@ -261,6 +437,14 @@ public class Entity {
case RIGHT -> (spriteNum == 1) ? attackRight1 : attackRight2;
};
}
BufferedImage parseSpriteGRD() {
return switch (direction) {
case UP -> guardUp;
case DOWN -> guardDown;
case LEFT -> guardLeft;
case RIGHT -> guardRight;
};
}
public BufferedImage initEntitySprites(String name) {
try {
return Utility.scaleImage(ImageIO.read(new FileInputStream("assets/" + name + ".png")), panel.tileSize, panel.tileSize);
@@ -280,5 +464,159 @@ public class Entity {
public void changeOpacity(Graphics2D graphics2d, float opacity) {
graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
}
public void searchPath(int goalCol, int goalRow) {
int startCol = (worldX + solidArea.x) / panel.tileSize;
int startRow = (worldY + solidArea.y) / panel.tileSize;
panel.pFinder.setNodes(startCol, startRow, goalCol, goalRow);
if (panel.pFinder.search()) {
int nextCol = panel.pFinder.pathList.getFirst().col;
int nextRow = panel.pFinder.pathList.getFirst().row;
int enLeftX = worldX + solidArea.x;
int enTopY = worldY + solidArea.y;
int targetX = nextCol * panel.tileSize;
int targetY = nextRow * panel.tileSize;
// UP
if (nextRow < startRow) {
if (enLeftX < targetX) direction = Direction.RIGHT;
else if (enLeftX > targetX) direction = Direction.LEFT;
else direction = Direction.UP;
}
// DOWN
else if (nextRow > startRow) {
if (enLeftX < targetX) direction = Direction.RIGHT;
else if (enLeftX > targetX) direction = Direction.LEFT;
else direction = Direction.DOWN;
}
else if (nextCol < startCol) { // DOWN LEFT
if (enTopY < targetY) direction = Direction.DOWN;
else if (enTopY > targetY) direction = Direction.UP;
else direction = Direction.LEFT;
}
else if (nextCol > startCol) { // RIGHT
if (enTopY < targetY) direction = Direction.DOWN;
else if (enTopY > targetY) direction = Direction.UP;
else direction = Direction.RIGHT;
}
} else onPath = false;
}
public void followPlayer() {
int goalCol = panel.player.getCol();
int goalRow = panel.player.getRow();
int startCol = (worldX + solidArea.x) / panel.tileSize;
int startRow = (worldY + solidArea.y) / panel.tileSize;
panel.pFinder.setNodes(startCol, startRow, goalCol, goalRow);
if (panel.pFinder.search()) {
int nextCol = panel.pFinder.pathList.getFirst().col;
int nextRow = panel.pFinder.pathList.getFirst().row;
int enLeftX = worldX + solidArea.x;
int enTopY = worldY + solidArea.y;
int targetX = nextCol * panel.tileSize;
int targetY = nextRow * panel.tileSize;
// UP
if (nextRow < startRow) {
if (enLeftX < targetX) direction = Direction.RIGHT;
else if (enLeftX > targetX) direction = Direction.LEFT;
else direction = Direction.UP;
}
// DOWN
else if (nextRow > startRow) {
if (enLeftX < targetX) direction = Direction.RIGHT;
else if (enLeftX > targetX) direction = Direction.LEFT;
else direction = Direction.DOWN;
}
else if (nextCol < startCol) { // DOWN LEFT
if (enTopY < targetY) direction = Direction.DOWN;
else if (enTopY > targetY) direction = Direction.UP;
else direction = Direction.LEFT;
}
else if (nextCol > startCol) { // RIGHT
if (enTopY < targetY) direction = Direction.DOWN;
else if (enTopY > targetY) direction = Direction.UP;
else direction = Direction.RIGHT;
}
}
}
public void checkStopChasing(Entity target, int distance, int rate) {
//if(Objects.equals(name, "orc")) System.out.println("dTile: " + dTile(target) + " distance: " + distance);
if(dTile(target) > distance) onPath = false;
}
public void checkStartChasing(Entity target, int distance, int rate) {
if(dTile(target) < distance) onPath = true;
}
public void checkShooting(int rate, int shotInterval) {
if(new Random().nextInt(rate) == 0 && projectile.alive == false && shotAvailableCount == shotInterval) {
projectile.set(worldX, worldY, direction, true, this);
// CHECK VACANCY
for(int ii = 0; ii < panel.projectileList.size(); ii++) {
if(panel.projectileList.get(ii) == null) {
panel.projectileList.set(ii, projectile);
break;
}
}
shotAvailableCount = 0;
}
}
public void checkAttack(int rate, int straight, int horizontal) {
boolean targetInRange = false;
int xDist = dX(panel.player);
int yDist = dY(panel.player);
switch(direction) {
case UP -> {
if(panel.player.worldY < worldY && yDist < straight && xDist < horizontal) targetInRange = true;
}
case DOWN -> {
if(panel.player.worldY > worldY && yDist < straight && xDist < horizontal) targetInRange = true;
}
case LEFT -> {
if(panel.player.worldX < worldX && xDist < straight && yDist < horizontal) targetInRange = true;
}
case RIGHT -> {
if(panel.player.worldX > worldX && xDist < straight && yDist < horizontal) targetInRange = true;
}
}
if(targetInRange)
if (new Random().nextInt(rate) == 0) {
attacking = true;
spriteNum = 1;
spriteCount = 0;
shotAvailableCount = 0;
}
}
public void setRandomDirection() {
actionLock++;
if(actionLock == 120) { //lock action for x frames
Random rand = new Random();
int i = rand.nextInt(100)+1; //Generate number between 1 and 100
if(i <= 25) direction = Direction.UP;
if(i > 25 && i <= 50) direction = Direction.DOWN;
if(i > 50 && i <= 75) direction = Direction.LEFT;
if(i > 75) direction = Direction.RIGHT;
actionLock = 0;
}
}
public void invincibleCounting() {
if(!invincible) return;
invincibleCount++;
if(invincibleCount > 40) {
invincible = false;
invincibleCount = 0;
}
}
}

View File

@@ -5,23 +5,24 @@ import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.core.handlers.KeyHandler;
import de.miaurizius.jgame2d.entity.item.KeyObj;
import de.miaurizius.jgame2d.entity.item.ShieldWoodObj;
import de.miaurizius.jgame2d.entity.item.SwordNormalObj;
import de.miaurizius.jgame2d.entity.projectile.FireballObj;
import java.awt.*;
import java.util.ArrayList;
import java.awt.image.BufferedImage;
public class Player extends Entity {
KeyHandler keyH;
public final int screenX;
public final int screenY;
private int standCount;
// STATE
public boolean attackCancel;
public ArrayList<Entity> inventory = new ArrayList<>();
public final int maxInvSize = 20;
public boolean lightUpdated;
public Player(GamePanel panel, KeyHandler keyH) {
super(panel);
@@ -44,16 +45,60 @@ public class Player extends Entity {
setDefaultValues();
getPlayerImage();
getPlayerAttackImage();
getGuardImages();
}
// DEFAULT
public void update() {
if(life > maxLife) life = maxLife;
if(attacking) {
if(knockback) {
collisionOn = false;
panel.collisionH.checkTile(this);
panel.collisionH.checkObject(this, false);
panel.collisionH.checkEntity(this, panel.npc[panel.currentMap.getIndex()]);
// panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]);
panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]);
if(collisionOn) {
knockbackCount = 0;
knockback = false;
speed = defaultSpeed;
invincibleCounting();
return;
}
switch(knockbackDirection) {
case UP -> worldY -= speed;
case DOWN -> worldY += speed;
case LEFT -> worldX -= speed;
case RIGHT -> worldX += speed;
}
knockbackCount++;
if(knockbackCount != 10) {
invincibleCounting();
return;
}
knockback = false;
knockbackCount = 0;
speed = defaultSpeed;
invincibleCounting();
return;
} else if(attacking) {
attacking();
invincibleCounting();
return;
}
// BLOCKING
if(keyH.CTLKeyPressed) {
guarding = true;
transparent = false;
invincibleCounting();
return;
}
// MOVEMENT
if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed || keyH.spacePressed) {
if(!keyH.spacePressed) {
@@ -72,15 +117,15 @@ public class Player extends Entity {
pickObject(objIndex);
// CHECK ENTITY COLLISION
int npcIndex = panel.collisionH.checkEntity(this, panel.npc);
int npcIndex = panel.collisionH.checkEntity(this, panel.npc[panel.currentMap.getIndex()]);
interactNPC(npcIndex);
// CHECK MONSTER COLLISION
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster);
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]);
interactMonster(monsterIndex);
// CHECK INTERACTIVE TILE COLLISION
int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile);
int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]);
// CHECK EVENT
panel.eventH.checkEvent();
@@ -89,7 +134,7 @@ public class Player extends Entity {
switch (direction) {
case UP -> worldY -= speed;
case DOWN -> worldY += speed;
case LEFT ->worldX -= speed;
case LEFT -> worldX -= speed;
case RIGHT -> worldX += speed;
}
}
@@ -97,19 +142,27 @@ public class Player extends Entity {
if(keyH.spacePressed && !attackCancel) {
panel.playSE(7);
attacking = true;
spriteCounter = 0;
spriteCount = 0;
}
attackCancel = false;
panel.keyH.spacePressed = false;
guarding = false;
spriteCounter++;
if(spriteCounter > 12) {
spriteCount++;
if(spriteCount > 12) {
if(spriteNum == 1) spriteNum = 2;
else if(spriteNum == 2) spriteNum = 1;
else spriteNum = 0;
spriteCounter = 0;
spriteCount = 0;
}
} else {
standCount++;
if(standCount == 20) {
spriteNum = 1;
standCount = 0;
}
guarding = false;
}
if(panel.keyH.shotKeyPressed && !projectile.alive) {
@@ -120,113 +173,89 @@ public class Player extends Entity {
// INVINCIBLE COUNTER
if(!invincible) return;
invincibleCount++;
if(invincibleCount > 60) {
invincible = false;
invincibleCounting();
if(life <= 0) {
panel.gameState = GameState.GAMEOVER;
invincibleCount = 0;
panel.ui.commandNum = -1;
panel.stopMusic();
panel.playSE(12);
}
}
// INTERACTION
public void pickObject(int index) {
if(index == 999 || panel.obj[index] == null) return;
if(index == 999 || panel.obj[panel.currentMap.getIndex()][index] == null) return;
// PICKUP ONLY
if(panel.obj[index].type == EntityType.PICKUP) {
panel.obj[index].use(this);
// PICKUP ONLY ITEMS
if(panel.obj[panel.currentMap.getIndex()][index].type == EntityType.PICKUP) {
panel.obj[panel.currentMap.getIndex()][index].use(this);
panel.obj[panel.currentMap.getIndex()][index] = null;
return;
}
// OBSTACLES
if(panel.obj[panel.currentMap.getIndex()][index].type == EntityType.OBSTACLE) {
if(!keyH.spacePressed) return;
attackCancel = true;
panel.obj[panel.currentMap.getIndex()][index].interact();
return;
}
// INVENTORY ITEMS
else {
if(inventory.size() == maxInvSize) {
if(!canObtainItem(panel.obj[panel.currentMap.getIndex()][index])) {
panel.ui.addMessage("Your inventory is full!");
return;
}
inventory.add(panel.obj[index]);
panel.playSE(1);
panel.ui.addMessage("Picked up " + panel.obj[index].name + "!");
panel.ui.addMessage("Picked up " + panel.obj[panel.currentMap.getIndex()][index].name + "!");
}
panel.obj[index] = null;
panel.obj[panel.currentMap.getIndex()][index] = null;
}
public void interactMonster(int index) {
if(index == 999) return;
if(invincible || panel.monster[index].dying || !panel.monster[index].alive) return;
if(invincible || panel.monster[panel.currentMap.getIndex()][index].dying || !panel.monster[panel.currentMap.getIndex()][index].alive) return;
int damage = panel.monster[index].attack - defense;
int damage = panel.monster[panel.currentMap.getIndex()][index].attack - defense;
if(damage > 0) {
panel.playSE(6);
life -= damage;
invincible = true;
}
panel.playSE(6);
life -= Math.max(damage, 0);
if(damage != 0) panel.player.transparent = true;
invincible = true;
}
public void attacking() {
if(attackCancel) return;
spriteCounter++;
if(spriteCounter <= 5) spriteNum = 1;
if(spriteCounter > 5 && spriteCounter <= 25) {
spriteNum = 2;
int currentWorldX = worldX;
int currentWorldY = worldY;
int solidAreaWidth = solidArea.width;
int solidAreaHeight = solidArea.height;
switch(direction) {
case UP -> worldY -= attackArea.height;
case DOWN -> worldY += attackArea.height;
case LEFT -> worldX -= attackArea.width;
case RIGHT -> worldX += attackArea.width;
}
solidArea.width = attackArea.width;
solidArea.height = attackArea.height;
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster);
damageMonster(monsterIndex, attack);
int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile);
interactTile(iTileIndex);
worldX = currentWorldX;
worldY = currentWorldY;
solidArea.width = solidAreaWidth;
solidArea.height = solidAreaHeight;
}
if(spriteCounter > 25) {
spriteNum = 1;
spriteCounter = 0;
attacking = false;
}
}
public void damageMonster(int index, int attack) {
public void damageMonster(int index, Entity attacker, int attack, int knockbackVal) {
if(index == 999) return;
if(panel.monster[index].invincible) return;
if(panel.monster[panel.currentMap.getIndex()][index].invincible) return;
int damage = attack - panel.monster[index].defense;
int damage = attack - panel.monster[panel.currentMap.getIndex()][index].defense;
if(damage > 0) {
panel.playSE(5);
panel.monster[index].life -= damage;
panel.monster[index].invincible = true;
if(knockbackVal > 0) setKnockback(panel.monster[panel.currentMap.getIndex()][index], attacker, knockbackVal);
panel.monster[panel.currentMap.getIndex()][index].life -= damage;
panel.monster[panel.currentMap.getIndex()][index].transparent = true;
panel.monster[panel.currentMap.getIndex()][index].invincible = true;
}
panel.monster[index].damageReaction();
if(panel.monster[index].life <= 0) {
panel.monster[index].dying = true;
panel.ui.addMessage("Gained +" + panel.monster[index].exp + " XP!");
exp += panel.monster[index].exp;
panel.monster[panel.currentMap.getIndex()][index].damageReaction();
if(panel.monster[panel.currentMap.getIndex()][index].life <= 0) {
panel.monster[panel.currentMap.getIndex()][index].dying = true;
panel.ui.addMessage("Gained +" + panel.monster[panel.currentMap.getIndex()][index].exp + " XP!");
exp += panel.monster[panel.currentMap.getIndex()][index].exp;
checkLevelUp();
}
}
public void interactTile(int index) {
if(index == 999 || !panel.iTile[index].destructible || panel.iTile[index].invincible) return;
if(!panel.iTile[index].meetItemReq(this)) return;
panel.iTile[index].playSE();
panel.iTile[index].life--;
panel.iTile[index].invincible = true;
generateParticle(panel.iTile[index], panel.iTile[index]);
if(panel.iTile[index].life == 0) panel.iTile[index] = panel.iTile[index].getDestroyedForm();
if(index == 999 || !panel.iTile[panel.currentMap.getIndex()][index].destructible || panel.iTile[panel.currentMap.getIndex()][index].invincible) return;
if(!panel.iTile[panel.currentMap.getIndex()][index].meetItemReq(this)) return;
panel.iTile[panel.currentMap.getIndex()][index].playSE();
panel.iTile[panel.currentMap.getIndex()][index].life--;
panel.iTile[panel.currentMap.getIndex()][index].invincible = true;
generateParticle(panel.iTile[panel.currentMap.getIndex()][index], panel.iTile[panel.currentMap.getIndex()][index]);
if(panel.iTile[panel.currentMap.getIndex()][index].life == 0) panel.iTile[panel.currentMap.getIndex()][index] = panel.iTile[panel.currentMap.getIndex()][index].getDestroyedForm();
}
public void interactNPC(int index) {
@@ -234,14 +263,14 @@ public class Player extends Entity {
//if(!panel.keyH.spacePressed) return; //Only uncomment if text should only appear if player hits space
attackCancel = true;
panel.gameState = GameState.DIALOGUE;
panel.npc[index].speak();
panel.npc[panel.currentMap.getIndex()][index].speak();
}
public void speak() {
//This method only exists for character specific things later...
super.speak();
}
// BACKGROUND CHECKS
// BACKGROUND JOBS
public void checkLevelUp() {
if(exp < nextLevelExp) return;
level++;
@@ -257,7 +286,7 @@ public class Player extends Entity {
panel.ui.currentDialogue = "You are level " + level + " now!\nYou feel stronger!";
}
public void selectItem() {
int itemIndex = panel.ui.getItemIndex();
int itemIndex = panel.ui.getItemIndex(panel.ui.playerSlotCol, panel.ui.playerSlotRow);
if(itemIndex >= inventory.size()) return;
Entity selectedItem = inventory.get(itemIndex);
if(selectedItem.type == EntityType.WEAPON) {
@@ -269,17 +298,46 @@ public class Player extends Entity {
currentShield = selectedItem;
getDefense();
}
if(selectedItem.consumable) {
selectedItem.use(this);
inventory.remove(itemIndex);
if(selectedItem.type == EntityType.LIGHT) {
if(currentLight == selectedItem) currentLight = null; else currentLight = selectedItem;
lightUpdated = true;
}
if(selectedItem.consumable)
if(selectedItem.use(this))
if(selectedItem.amt > 1) selectedItem.amt--; else inventory.remove(selectedItem);
}
public void setDefaultPositions() {
worldX = panel.tileSize * 23;
worldY = panel.tileSize * 21;
direction = Direction.DOWN;
}
public void restoreStatus() {
life = maxLife;
invincible = false;
transparent = false;
attacking = false;
guarding = false;
knockback = false;
lightUpdated = true;
}
public void getSleepingImage(BufferedImage image) {
down1 = image;
down2 = image;
up1 = image;
up2 = image;
left1 = image;
left2 = image;
right1 = image;
right2 = image;
}
// SETTING THINGS UP
public void setDefaultValues() {
worldX = panel.tileSize * 23;
worldY = panel.tileSize * 21;
speed = 4;
defaultSpeed = 4;
speed = defaultSpeed;
direction = Direction.DOWN;
// PLAYER STATUS (1 heart = 2 lives)
@@ -290,16 +348,19 @@ public class Player extends Entity {
dexterity = 1;
exp = 0;
nextLevelExp = 5;
coins = 0;
coins = 500;
currentWeapon = new SwordNormalObj(panel);
currentShield = new ShieldWoodObj(panel);
currentLight = null;
projectile = new FireballObj(panel);
attack = getAttack();
defense = getDefense();
// INVENTORY
inventory.clear();
inventory.add(currentWeapon);
inventory.add(currentShield);
inventory.add(new KeyObj(panel));
}
public int getAttack() {
attackArea = currentWeapon.attackArea;
@@ -342,5 +403,44 @@ public class Player extends Entity {
break;
}
}
public void getGuardImages() {
guardUp = initEntitySprites("player/guarding/boy_guard_up");
guardDown = initEntitySprites("player/guarding/boy_guard_down");
guardLeft = initEntitySprites("player/guarding/boy_guard_left");
guardRight = initEntitySprites("player/guarding/boy_guard_right");
}
public int searchItemInInventory(String itemName) {
for(int i = 0; i < inventory.size(); i++) {
if(inventory.get(i).name.equals(itemName)) {
return i;
}
}
return 999;
}
public boolean canObtainItem(Entity item) {
int i = searchItemInInventory(item.name);
if(item.stackable) {
if(i != 999) {
inventory.get(i).amt++;
return true;
} else if(inventory.size() != maxInvSize) {
inventory.add(item);
return true;
}
} else if(inventory.size() != maxInvSize) {
inventory.add(item);
return true;
}
return false;
}
@Override
public void invincibleCounting() {
if(!invincible) return;
invincibleCount++;
if(invincibleCount > 60) {
invincible = false;
invincibleCount = 0;
}
}
}

View File

@@ -13,6 +13,8 @@ public class AxeObj extends Entity {
type = EntityType.WEAPON;
weaponType = EntityType.WeaponType.AXE;
down1 = initEntitySprites("/objects/axe");
price = 50;
knockbackVal = 10;
attackValue = 2;
attackArea.width = 30;

View File

@@ -18,9 +18,10 @@ public class CoinObj extends Entity {
down1 = initEntitySprites("/objects/coin_bronze");
}
public void use(Entity entity) {
public boolean use(Entity entity) {
panel.playSE(1);
panel.ui.addMessage("Coin +"+value);
panel.player.coins += value;
return true;
}
}

View File

@@ -22,10 +22,12 @@ public class HeartObj extends Entity {
image3 = initEntitySprites("objects/heart_blank");
}
public void use(Entity entity) {
@Override
public boolean use(Entity entity) {
panel.playSE(2);
panel.ui.addMessage("Life +"+value);
entity.life += value;
return true;
}
}

View File

@@ -14,6 +14,8 @@ public class IronShieldObj extends Entity {
type = EntityType.SHIELD;
down1 = initEntitySprites("objects/shield_blue");
defenseValue = 2;
price = 50;
}
}

View File

@@ -2,6 +2,7 @@ package de.miaurizius.jgame2d.entity.item;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
public class KeyObj extends Entity {
@@ -11,7 +12,25 @@ public class KeyObj extends Entity {
name = "Normal Key";
description = "[" + name + "]\nIt opens a door.";
type = EntityType.ITEM;
consumable = true;
down1 = initEntitySprites("objects/key");
price = 50;
stackable = true;
}
@Override
public boolean use(Entity entity) {
panel.gameState = GameState.DIALOGUE;
int objIndex = getDetected(entity, panel.obj, "door");
if(objIndex == 999) {
panel.ui.currentDialogue = "What are you doing?\nThere is no door nearby.";
return false;
}
panel.ui.currentDialogue = "You used a " + name + "!\nThe door is now open.";
panel.playSE(3);
panel.obj[panel.currentMap.getIndex()][objIndex] = null;
return true;
}
}

View File

@@ -0,0 +1,19 @@
package de.miaurizius.jgame2d.entity.item;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
public class LanternObj extends Entity {
public LanternObj(GamePanel panel) {
super(panel);
type = EntityType.LIGHT;
name = "Lantern";
down1 = initEntitySprites("objects/lantern");
description = "[" + name + "]\nA lantern that lights up\nthe surrounding area.";
price = 100;
lightRadius = 250;
}
}

View File

@@ -19,15 +19,19 @@ public class PotionObj extends Entity {
name = "Red Potion";
down1 = initEntitySprites("objects/potion_red");
description = "[" + name + "]\nHeals your life by " + value + ".";
price = 50;
stackable = true;
}
public void use(Entity entity) {
public boolean use(Entity entity) {
panel.gameState = GameState.DIALOGUE;
panel.ui.currentDialogue = "You drank a " + name + "!\n" +
"Your life has been recovered by " + value + ".";
entity.life += value;
if(panel.player.life > panel.player.maxLife) panel.player.life = panel.player.maxLife;
panel.playSE(2);
return true;
}
}

View File

@@ -13,6 +13,8 @@ public class ShieldWoodObj extends Entity {
type = EntityType.SHIELD;
down1 = initEntitySprites("objects/shield_wood");
defenseValue = 1;
price = 50;
}
}

View File

@@ -14,6 +14,8 @@ public class SwordNormalObj extends Entity {
type = EntityType.WEAPON;
weaponType = EntityType.WeaponType.SWORD;
down1 = initEntitySprites("objects/sword_normal");
price = 50;
knockbackVal = 2;
attackValue = 1;
attackArea.width = 36;

View File

@@ -0,0 +1,31 @@
package de.miaurizius.jgame2d.entity.item;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
public class TentObj extends Entity {
public TentObj(GamePanel panel) {
super(panel);
type = EntityType.ITEM;
consumable = true;
name = "Tent";
down1 = initEntitySprites("objects/tent");
description = "[" + name + "]\nA small tent to rest\nuntil next morning.";
price = 200;
stackable = true;
}
@Override
public boolean use(Entity entity) {
panel.gameState = GameState.SLEEP;
panel.playSE(14);
panel.player.life = panel.player.maxLife;
panel.player.mana = panel.player.maxMana;
panel.player.getSleepingImage(down1);
return true;
}
}

View File

@@ -1,7 +1,6 @@
package de.miaurizius.jgame2d.entity.monster;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.CoinObj;
@@ -17,7 +16,8 @@ public class GreenSlimeMON extends Entity {
super(panel);
type = EntityType.MONSTER;
name = "green-slime";
speed = 1;
defaultSpeed = 1;
speed = defaultSpeed;
maxLife = 4;
life = maxLife;
attack = 5;
@@ -25,6 +25,8 @@ public class GreenSlimeMON extends Entity {
exp = 2;
projectile = new RockObj(panel);
knockbackVal = 5;
solidArea.x = 3;
solidArea.y = 18;
solidArea.width = 42;
@@ -37,27 +39,18 @@ public class GreenSlimeMON extends Entity {
// INTERACTION
public void setAction() {
actionLock++;
if(actionLock == 120) { //lock action for x frames
Random rand = new Random();
int i = rand.nextInt(100)+1; //Generate number between 1 and 100
if(i <= 25) direction = Direction.UP;
if(i > 25 && i <= 50) direction = Direction.DOWN;
if(i > 50 && i <= 75) direction = Direction.LEFT;
if(i > 75) direction = Direction.RIGHT;
actionLock = 0;
if(!onPath) checkStartChasing(panel.player, 5 ,100);
checkStopChasing(panel.player, 10, 100);
if(onPath) {
followPlayer();
return;
}
// int i = new Random().nextInt(100)+1;
// if(i > 99 && !projectile.alive) {
// projectile.set(worldX, worldY, direction, true, this);
// panel.projectileList.add(projectile);
// }
setRandomDirection();
checkShooting(200, 30);
}
public void damageReaction() {
actionLock = 0;
direction = panel.player.direction;
onPath = true;
}
public void checkDrop() {
int i = new Random().nextInt(100)+1;

View File

@@ -0,0 +1,79 @@
package de.miaurizius.jgame2d.entity.monster;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.CoinObj;
import de.miaurizius.jgame2d.entity.item.HeartObj;
import de.miaurizius.jgame2d.entity.item.PotionObj;
import java.util.Random;
public class OrcMON extends Entity {
public OrcMON(GamePanel panel) {
super(panel);
type = EntityType.MONSTER;
name = "orc";
defaultSpeed = 1;
speed = defaultSpeed;
maxLife = 10;
life = maxLife;
attack = 8;
defense = 2;
exp = 10;
solidArea.x = 4;
solidArea.y = 4;
solidArea.width = 40;
solidArea.height = 44;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
attackArea.width = panel.tileSize;
attackArea.height = panel.tileSize;
getImage();
getAttackImage();
}
// INTERACTION
public void setAction() {
if(!onPath) checkStartChasing(panel.player, 10 ,100); else followPlayer();
checkStopChasing(panel.player, 15, 100);
setRandomDirection();
if(!attacking) checkAttack(50, panel.tileSize*4, panel.tileSize);
}
public void damageReaction() {
actionLock = 0;
onPath = true;
}
public void checkDrop() {
int i = new Random().nextInt(100)+1;
if(i < 50) dropItem(new CoinObj(panel));
if(i >= 50 && i < 75) dropItem(new HeartObj(panel));
if(i >= 75 && i < 100) dropItem(new PotionObj(panel));
}
// SETTING THINGS UP
public void getImage() {
up1 = initEntitySprites("monster/orc_up_1");
up2 = initEntitySprites("monster/orc_up_2");
down1 = initEntitySprites("monster/orc_down_1");
down2 = initEntitySprites("monster/orc_down_2");
left1 = initEntitySprites("monster/orc_left_1");
left2 = initEntitySprites("monster/orc_left_2");
right1 = initEntitySprites("monster/orc_right_1");
right2 = initEntitySprites("monster/orc_right_2");
}
public void getAttackImage() {
attackUp1 = initEntitySprites("monster/orc_attack_up_1", panel.tileSize, panel.tileSize * 2);
attackUp2 = initEntitySprites("monster/orc_attack_up_2", panel.tileSize, panel.tileSize * 2);
attackDown1 = initEntitySprites("monster/orc_attack_down_1", panel.tileSize, panel.tileSize * 2);
attackDown2 = initEntitySprites("monster/orc_attack_down_2", panel.tileSize, panel.tileSize * 2);
attackLeft1 = initEntitySprites("monster/orc_attack_left_1", panel.tileSize*2, panel.tileSize);
attackLeft2 = initEntitySprites("monster/orc_attack_left_2", panel.tileSize*2, panel.tileSize);
attackRight1 = initEntitySprites("monster/orc_attack_right_1", panel.tileSize*2, panel.tileSize);
attackRight2 = initEntitySprites("monster/orc_attack_right_2", panel.tileSize*2, panel.tileSize);
}
}

View File

@@ -0,0 +1,56 @@
package de.miaurizius.jgame2d.entity.npc;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Direction;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
import de.miaurizius.jgame2d.entity.item.*;
public class MerchantNPC extends Entity {
public MerchantNPC(GamePanel panel) {
super(panel);
type = EntityType.NPC;
name = "merchant-npc";
direction = Direction.DOWN;
speed = 0;
getImage();
setDialogue();
setItems();
}
@Override
public void speak() {
super.speak();
panel.gameState = GameState.TRADE;
panel.ui.tradingNPC = this;
}
// SETTING THINGS UP
private void getImage() {
up1 = initEntitySprites("npc/merchant_down_1");
up2 = initEntitySprites("npc/merchant_down_2");
down1 = initEntitySprites("npc/merchant_down_1");
down2 = initEntitySprites("npc/merchant_down_2");
left1 = initEntitySprites("npc/merchant_down_1");
left2 = initEntitySprites("npc/merchant_down_2");
right1 = initEntitySprites("npc/merchant_down_1");
right2 = initEntitySprites("npc/merchant_down_2");
}
private void setDialogue() {
dialogue[0] = "He he, so you found me. \nI have some good stuff. \nDo you want to trade?";
}
private void setItems() {
inventory.add(new PotionObj(panel));
inventory.add(new KeyObj(panel));
inventory.add(new SwordNormalObj(panel));
inventory.add(new AxeObj(panel));
inventory.add(new ShieldWoodObj(panel));
inventory.add(new IronShieldObj(panel));
inventory.add(new LanternObj(panel));
inventory.add(new TentObj(panel));
}
}

View File

@@ -5,6 +5,7 @@ import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.entity.Entity;
import java.awt.*;
import java.util.Random;
public class OldManNPC extends Entity {
@@ -18,28 +19,22 @@ public class OldManNPC extends Entity {
speed = 1;
getImage();
setDialogue();
}
public void getImage() {
up1 = initEntitySprites("npc/oldman_up_1");
up2 = initEntitySprites("npc/oldman_up_2");
down1 = initEntitySprites("npc/oldman_down_1");
down2 = initEntitySprites("npc/oldman_down_2");
left1 = initEntitySprites("npc/oldman_left_1");
left2 = initEntitySprites("npc/oldman_left_2");
right1 = initEntitySprites("npc/oldman_right_1");
right2 = initEntitySprites("npc/oldman_right_2");
}
public void setDialogue() {
dialogue[0] = "Hello, lad.";
dialogue[1] = "So you've come to this island to \nfind the treasure?";
dialogue[2] = "I used to be a great wizard but now... \nI'm a bit too old for taking an \nadventure.";
dialogue[3] = "Well, good luck on you.";
dialogue[4] = "I heard drinking the water of the \nholy lake makes you feel fine again...";
solidArea.x = 8;
solidArea.y = 16;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
solidArea.width = 30;
solidArea.height = 30;
}
public void setAction() {
// if(onPath) {
// searchPath(12, 9);
// return;
// }
actionLock++;
if(actionLock != 120) return; //lock action for x frames
Random rand = new Random();
@@ -49,5 +44,30 @@ public class OldManNPC extends Entity {
if(i > 50 && i <= 75) direction = Direction.LEFT;
if(i > 75) direction = Direction.RIGHT;
actionLock = 0;
}
@Override
public void speak() {
super.speak();
super.onPath = true;
}
// SETTING THINGS UP
private void getImage() {
up1 = initEntitySprites("npc/oldman_up_1");
up2 = initEntitySprites("npc/oldman_up_2");
down1 = initEntitySprites("npc/oldman_down_1");
down2 = initEntitySprites("npc/oldman_down_2");
left1 = initEntitySprites("npc/oldman_left_1");
left2 = initEntitySprites("npc/oldman_left_2");
right1 = initEntitySprites("npc/oldman_right_1");
right2 = initEntitySprites("npc/oldman_right_2");
}
private void setDialogue() {
dialogue[0] = "Hello, lad.";
dialogue[1] = "So you've come to this island to \nfind the treasure?";
dialogue[2] = "I used to be a great wizard but now... \nI'm a bit too old for taking an \nadventure.";
dialogue[3] = "Well, good luck on you.";
dialogue[4] = "I heard drinking the water of the \nholy lake makes you feel fine again...";
}
}

View File

@@ -0,0 +1,56 @@
package de.miaurizius.jgame2d.entity.obstacle;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
public class ChestObj extends Entity {
GamePanel panel;
Entity loot;
boolean opened;
public ChestObj(GamePanel panel, Entity loot) {
super(panel);
this.panel = panel;
this.loot = loot;
type = EntityType.OBSTACLE;
name = "chest";
image = initEntitySprites("objects/chest");
image2 = initEntitySprites("objects/chest_opened");
down1 = image;
collision = true;
solidArea.x = 4;
solidArea.y = 16;
solidArea.width = 40;
solidArea.height = 32;
solidAreaDefaultX = solidArea.x;
solidAreaDefaultY = solidArea.y;
}
@Override
public void interact() {
panel.gameState = GameState.DIALOGUE;
if(opened) {
panel.ui.currentDialogue = "It's already empty...";
return;
}
panel.playSE(3);
StringBuilder sb = new StringBuilder();
sb.append("You open the chest and find a ").append(loot.name).append("!");
if(!panel.player.canObtainItem(loot)) {
sb.append("\nBut your inventory is full...");
panel.ui.currentDialogue = sb.toString();
return;
}
sb.append("\nYou obtain the ").append(loot.name).append("!");
down1 = image2;
opened = true;
panel.ui.currentDialogue = sb.toString();
}
}

View File

@@ -1,13 +1,19 @@
package de.miaurizius.jgame2d.entity.world;
package de.miaurizius.jgame2d.entity.obstacle;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.EntityType;
import de.miaurizius.jgame2d.core.enums.GameState;
import de.miaurizius.jgame2d.entity.Entity;
public class DoorObj extends Entity {
GamePanel panel;
public DoorObj(GamePanel panel) {
super(panel);
this.panel = panel;
name = "door";
type = EntityType.OBSTACLE;
down1 = initEntitySprites("objects/door");
collision = true;
@@ -19,4 +25,10 @@ public class DoorObj extends Entity {
solidAreaDefaultY = solidArea.y;
}
@Override
public void interact() {
panel.gameState = GameState.DIALOGUE;
panel.ui.currentDialogue = "You need a key to open this.";
}
}

View File

@@ -8,6 +8,7 @@ import de.miaurizius.jgame2d.entity.Entity;
public class Projectile extends Entity {
Entity user;
//TODO: parry projectiles: https://youtu.be/8KitXuxcuqI?list=PL_QPQmz5C6WUF-pOQDsbsKbaBZqXj4qSq&t=75
public Projectile(GamePanel panel) {
super(panel);
@@ -25,10 +26,10 @@ public class Projectile extends Entity {
public void update() {
if(user.type == EntityType.PLAYER) {
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster);
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]);
if(monsterIndex != 999) {
panel.player.damageMonster(monsterIndex, attack);
generateParticle(user.projectile, panel.monster[monsterIndex]);
panel.player.damageMonster(monsterIndex, this, attack, knockbackVal);
generateParticle(user.projectile, panel.monster[panel.currentMap.getIndex()][monsterIndex]);
alive = false;
}
}
@@ -54,12 +55,12 @@ public class Projectile extends Entity {
return;
}
spriteCounter++;
if(spriteCounter > 12) {
spriteCount++;
if(spriteCount > 12) {
if(spriteNum == 1) spriteNum = 2;
else if(spriteNum == 2) spriteNum = 1;
else spriteNum = 0;
spriteCounter = 0;
spriteCount = 0;
}
}

View File

@@ -1,14 +0,0 @@
package de.miaurizius.jgame2d.entity.world;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.entity.Entity;
public class ChestObj extends Entity {
public ChestObj(GamePanel panel) {
super(panel);
name = "chest";
down1 = initEntitySprites("objects/chest");
}
}

View File

@@ -0,0 +1,28 @@
package de.miaurizius.jgame2d.environment;
import de.miaurizius.jgame2d.core.GamePanel;
import java.awt.*;
public class EnvironmentManager {
GamePanel panel;
public Lighting lighting;
public EnvironmentManager(GamePanel panel) {
this.panel = panel;
}
public void draw(Graphics2D g2) {
lighting.draw(g2);
}
// SETTING THINGS UP
public void setup() {
lighting = new Lighting(panel);
}
public void update() {
lighting.update();
}
}

View File

@@ -0,0 +1,136 @@
package de.miaurizius.jgame2d.environment;
import de.miaurizius.jgame2d.core.GamePanel;
import java.awt.*;
import java.awt.image.BufferedImage;
public class Lighting {
GamePanel panel;
BufferedImage darknessFilter;
public int dayCount;
public DayState dayState = DayState.DAY;
public float filterAlpha;
public Lighting(GamePanel panel) {
this.panel = panel;
setLightSource();
}
public void draw(Graphics2D g2) {
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, filterAlpha));
g2.drawImage(darknessFilter, 0, 0, null);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1F));
// DEBUG
if(panel.keyH.debug) {
String s;
switch (dayState) {
case DAY -> s = "DAY";
case DUSK -> s = "DUSK";
case NIGHT -> s = "NIGHT";
case DAWN -> s = "DAWN";
default -> s = "UNKNOWN";
}
g2.setColor(Color.white);
g2.setFont(g2.getFont().deriveFont(50f));
g2.drawString(s + " " + dayCount, 700, 500);
}
}
public void update() {
if(panel.player.lightUpdated) {
setLightSource();
panel.player.lightUpdated = false;
}
switch (dayState) {
case DAY -> {
dayCount++;
if (dayCount > 36000) { //10 minutes
dayState = DayState.DUSK;
dayCount = 0;
}
}
case DUSK -> {
filterAlpha += 0.001f;
if (filterAlpha > 1f) {
filterAlpha = 1f;
dayState = DayState.NIGHT;
}
}
case NIGHT -> {
dayCount++;
if (dayCount > 36000) { //10 minutes
dayState = DayState.DAWN;
dayCount = 0;
}
}
case DAWN -> {
filterAlpha -= 0.001f;
if (filterAlpha < 0f) {
filterAlpha = 0f;
dayState = DayState.DAY;
}
}
}
}
public void resetDay() {
dayState = DayState.DAY;
filterAlpha = 0f;
dayCount = 0;
}
// ...
public void setLightSource() {
darknessFilter = new BufferedImage(panel.screenWidth, panel.screenHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = darknessFilter.createGraphics();
int centerX = panel.player.screenX + panel.tileSize/2;
int centerY = panel.player.screenY + panel.tileSize/2;
RadialGradientPaint gPaint = getRadialGradientPaint(centerX, centerY, 0F,0F, 0.1F);
g2.setPaint(gPaint);
g2.fillRect(0, 0, panel.screenWidth, panel.screenHeight);
g2.dispose();
}
// UTILITY
private RadialGradientPaint getRadialGradientPaint(int centerX, int centerY, float r, float g, float b) {
Color[] color = new Color[] {
new Color(r, g, b, 0.1f),
new Color(r, g, b, 0.42f),
new Color(r, g, b, 0.52f),
new Color(r, g, b, 0.61f),
new Color(r, g, b, 0.69f),
new Color(r, g, b, 0.76f),
new Color(r, g, b, 0.82f),
new Color(r, g, b, 0.87f),
new Color(r, g, b, 0.91f),
new Color(r, g, b, 0.94f),
new Color(r, g, b, 0.96f),
new Color(r, g, b, 0.97f)
};
final int lim = 3;
if(panel.player.currentLight == null) {
for(int i = 0; i < lim; i++) {
color[i] = color[lim];
}
}
float[] fraction = new float[] {
0f, 0.4f, 0.5f, 0.6f, 0.65f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 0.95f, 1f
};
return new RadialGradientPaint(centerX, centerY, (panel.player.currentLight == null ? 75 : panel.player.currentLight.lightRadius), fraction, color);
}
public enum DayState {
DAY,
DUSK,
NIGHT,
DAWN,
}
}

View File

@@ -0,0 +1,93 @@
package de.miaurizius.jgame2d.tile;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.enums.Map;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class MiniMap extends TileManager {
GamePanel panel;
BufferedImage worldMap[];
public boolean miniMapOn;
public MiniMap(GamePanel panel) throws IOException {
super(panel);
this.panel = panel;
createWorldMap();
}
public void createWorldMap() {
worldMap = new BufferedImage[Map.values().length];
int worldMapWidth = panel.maxWorldCol * panel.tileSize;
int worldMapHeight = panel.maxWorldRow * panel.tileSize;
for (int i = 0; i < Map.values().length; i++) {
worldMap[i] = new BufferedImage(worldMapWidth, worldMapHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = worldMap[i].createGraphics();
int col = 0;
int row = 0;
while(col < panel.maxWorldCol && row < panel.maxWorldRow) {
int tileNum = mapTileNum[i][col][row];
int x = col * panel.tileSize;
int y = row * panel.tileSize;
g2.drawImage(panel.tileM.tile[tileNum].image, x, y, null);
col++;
if(col != panel.maxWorldCol) continue;
col = 0;
row++;
}
g2.dispose();
}
}
public void drawFullMapScreen(Graphics2D g2) {
// BACKGROUND
g2.setColor(Color.black);
g2.fillRect(0, 0, panel.screenWidth, panel.screenHeight);
// DRAW MAP
int width = 500;
int height = 500;
int x = panel.screenWidth / 2 - width / 2;
int y = panel.screenHeight / 2 - height / 2;
g2.drawImage(worldMap[panel.currentMap.getIndex()], x, y, width, height, null);
// DRAW PLAYER
double scale = (double)(panel.tileSize * panel.maxWorldCol)/width;
int playerX = (int)(x + panel.player.worldX/scale);
int playerY = (int)(y + panel.player.worldY/scale);
int playerSize = (int)(panel.tileSize/scale);
g2.drawImage(panel.player.down1, playerX, playerY, playerSize, playerSize, null);
// HINT
g2.setFont(panel.ui.font.deriveFont(32F));
g2.setColor(Color.white);
g2.drawString("Press M to close", 750, 550);
}
public void drawMiniMap(Graphics2D g2) {
if(!miniMapOn) return;
// DRAW MAP
int width = 300;
int height = 300;
int x = panel.screenWidth - width - 50;
int y = 50;
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
g2.drawImage(worldMap[panel.currentMap.getIndex()], x, y, width, height, null);
// DRAW PLAYER
double scale = (double)(panel.tileSize * panel.maxWorldCol)/width;
int playerX = (int)(x + panel.player.worldX/scale);
int playerY = (int)(y + panel.player.worldY/scale);
int playerSize = (int)(panel.tileSize/3);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
g2.drawImage(panel.player.down1, playerX-6, playerY-6, playerSize, playerSize, null);
}
}

View File

@@ -3,30 +3,65 @@ package de.miaurizius.jgame2d.tile;
import de.miaurizius.jgame2d.core.Boot;
import de.miaurizius.jgame2d.core.GamePanel;
import de.miaurizius.jgame2d.core.Utility;
import de.miaurizius.jgame2d.core.enums.Map;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
public class TileManager {
GamePanel panel;
public Tile[] tile;
public int[][] mapTileNum;
public int[][][] mapTileNum;
ArrayList<String> filesNames = new ArrayList<>();
ArrayList<String> collisionStatus = new ArrayList<>();
public TileManager(GamePanel panel) {
public TileManager(GamePanel panel) throws IOException {
this.panel = panel;
tile = new Tile[50];
mapTileNum = new int[panel.maxWorldCol][panel.maxWorldRow];
InputStream is = new FileInputStream("assets/maps/tiledata");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// READ TILE DATA FROM FILE
try {
String line;
while((line = br.readLine()) != null) {
filesNames.add(line);
collisionStatus.add(br.readLine());
}
br.close();
} catch(IOException e) {
Boot.logger.log(Level.SEVERE, "Could not read tile data file", e);
}
tile = new Tile[filesNames.size()];
getTileImage();
loadMap(panel.currentMap);
// GETTING WORLD SIZES
is = new FileInputStream("assets/maps/editoredmap.map");
br = new BufferedReader(new InputStreamReader(is));
try {
String line = br.readLine();
String maxTile[] = line.split(" ");
panel.maxWorldCol = maxTile.length;
panel.maxWorldRow = maxTile.length;
mapTileNum = new int[Map.values().length][panel.maxWorldCol][panel.maxWorldRow];
br.close();
} catch(IOException e) {
Boot.logger.log(Level.SEVERE, "Could not read map size data", e);
}
for(Map m : Map.values()) loadMap(m);
}
public void initializeTile(int i, String name, boolean col) {
try {
tile[i] = new Tile();
tile[i].image = ImageIO.read(new FileInputStream("assets/tiles/" + name + ".png"));
tile[i].image = ImageIO.read(new FileInputStream("assets/tiles/" + name));
tile[i].collision = col;
} catch(IOException e) {
Boot.logger.log(Level.SEVERE, "Could not load tile", e);
@@ -34,56 +69,14 @@ public class TileManager {
}
public void getTileImage() {
// PLACEHOLDER
initializeTile(0, "grass00", false);
initializeTile(2, "grass00", false);
initializeTile(3, "grass00", false);
initializeTile(4, "grass00", false);
initializeTile(5, "grass00", false);
initializeTile(6, "grass00", false);
initializeTile(7, "grass00", false);
initializeTile(8, "grass00", false);
initializeTile(9, "grass00", false);
// GRASS
initializeTile(10, "grass00", false);
initializeTile(11, "grass01", false);
// WATER
initializeTile(12, "water00", true);
initializeTile(13, "water01", true);
initializeTile(14, "water02", true);
initializeTile(15, "water03", true);
initializeTile(16, "water04", true);
initializeTile(17, "water05", true);
initializeTile(18, "water06", true);
initializeTile(19, "water07", true);
initializeTile(20, "water08", true);
initializeTile(21, "water09", true);
initializeTile(22, "water10", true);
initializeTile(23, "water11", true);
initializeTile(24, "water12", true);
initializeTile(25, "water13", true);
// ROAD
initializeTile(26, "road00", false);
initializeTile(27, "road01", false);
initializeTile(28, "road02", false);
initializeTile(29, "road03", false);
initializeTile(30, "road04", false);
initializeTile(31, "road05", false);
initializeTile(32, "road06", false);
initializeTile(33, "road07", false);
initializeTile(34, "road08", false);
initializeTile(35, "road09", false);
initializeTile(36, "road10", false);
initializeTile(37, "road11", false);
initializeTile(38, "road12", false);
// WORLD
initializeTile(39, "earth", false);
initializeTile(40, "wall", true);
initializeTile(41, "tree", true);
for(int i = 0; i < filesNames.size(); i++) {
String fileName;
boolean collision;
fileName = filesNames.get(i);
collision = Boolean.parseBoolean(collisionStatus.get(i));
initializeTile(i, fileName, collision);
}
for (Tile tile : tile) {
if(tile == null) continue;
@@ -91,9 +84,9 @@ public class TileManager {
}
}
public void loadMap(String map) {
public void loadMap(Map map) {
try {
InputStream stream = new FileInputStream("assets/maps/"+map+".map");
InputStream stream = new FileInputStream("assets/maps/"+map.getName()+".map");
BufferedReader bReader = new BufferedReader(new InputStreamReader(stream));
int col = 0;
int row = 0;
@@ -102,7 +95,7 @@ public class TileManager {
while(col < panel.maxWorldCol) {
String[] numbers = line.split(" ");
int num = Integer.parseInt(numbers[col]);
mapTileNum[col][row] = num;
mapTileNum[map.getIndex()][col][row] = num;
col++;
}
if(col == panel.maxWorldCol) {
@@ -121,7 +114,7 @@ public class TileManager {
int worldRow = 0;
while(worldCol < panel.maxWorldCol && worldRow < panel.maxWorldRow) {
int tileNum = mapTileNum[worldCol][worldRow];
int tileNum = mapTileNum[panel.currentMap.getIndex()][worldCol][worldRow];
int worldX = worldCol * panel.tileSize;
int worldY = worldRow * panel.tileSize;
@@ -132,7 +125,14 @@ public class TileManager {
worldX - panel.tileSize < panel.player.worldX + panel.player.screenX &&
worldY + panel.tileSize > panel.player.worldY - panel.player.screenY &&
worldY - panel.tileSize < panel.player.worldY + panel.player.screenY
) graphics2D.drawImage(tile[tileNum].image, screenX, screenY, null);
) {
graphics2D.drawImage(tile[tileNum].image, screenX, screenY, null);
// if(panel.keyH.debug && tile[tileNum].collision) {
// graphics2D.setColor(new Color(255, 0, 0, 70));
// graphics2D.fillRect(worldX - panel.player.worldX + panel.player.screenX, worldY - panel.player.worldY + panel.player.screenY, panel.tileSize, panel.tileSize);
// }
}
worldCol++;
@@ -141,6 +141,17 @@ public class TileManager {
worldRow++;
}
}
if(panel.keyH.debug) {
graphics2D.setColor(new Color(255, 0, 0, 70));
for(int i = 0; i < panel.pFinder.pathList.size(); i++) {
int worldX = panel.pFinder.pathList.get(i).col * panel.tileSize;
int worldY = panel.pFinder.pathList.get(i).row * panel.tileSize;
int screenX = worldX - panel.player.worldX + panel.player.screenX;
int screenY = worldY - panel.player.worldY + panel.player.screenY;
graphics2D.fillRect(screenX, screenY, panel.tileSize, panel.tileSize);
}
}
}
}