Merge remote-tracking branch 'origin/main'

main
Jonas Wächter 2023-03-29 16:25:03 +02:00
commit 017ff1f860
17 changed files with 233 additions and 67 deletions

View File

@ -8,5 +8,10 @@
60, 60,
40 40
] ]
} },
"themes": [
"tutorial",
"cave",
"castle"
]
} }

View File

@ -1,43 +1,43 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,+,+,+,+,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,+,+,+,+,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,+,+,+,+,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,+,+,+,+,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,#,#,#,#,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,#,#,#,#,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,#,#,#,#,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,#,#,#,#,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,+,+,+,+,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,+,+,+,+,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,#,#,#,#,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,#,#,#,#,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,+,+,+,+,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,+,+,+,+,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,#,#,#,#,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,#,#,#,#,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,C,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,D,,,,,,,,,,,,, ,,C,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,D,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,
,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,S,S,S,S,,,,,,,,,,,L,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,S,S,S,S,,,,,,,,,,,L,,,,#,#,#,#,#,#,#,#,#,,,,,,
+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,,,,,,,,,, +,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
AP,34,id=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, AP,34,id=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
BF,32,requires_or=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, BF,32,requires_or=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1 1
2
3
4
5
6
7
8
9
10
11
12
13
14 + + + + + + + + + + + + + + + + + +
15 # # # # # # # # # # # # # # # # # #
16 # # # # # # # # # # # # # # # # # #
17 + + + + # # # # # # # # # + + + + # # # # # # # # #
18 # # # # # # # # # # # # # # # # # # # # # # # # # #
19 # # # # # # # # # # # # # # # # # #
20 # # # # # # # # # # # # # # # # # #
21 # # # # # # # # # + + + + # # # # # # # # #
22 + + + + # # # # # # # # # # # # # # # # # # # # # #
23 # # # # # # # # # # # # # + + + + # # # # # # # # #
24 # # # # # # # # # # # # # # # # # # # # # #
25 # # # # # # # # # # # # # # # # # #
26 + + + + # # # # # # # # # # # # # # # # # #
27 # # # # # # # # # # # # # + + + + + + # # # # # # # # #
28 # # # # # # # # # # # # # # # # # # # # # # # #
29 # # # # # # # # # + + + + # # # # # # # # #
30 # # # # # # # # # # # # # # # # # # # # # #
31 + + + + # # # # # # # # # # # # # # # # # #
32 C # # # # # # # # # # # # # # # # # # # # # # D
33 # # # # # # # # # # # # # # # # # #
34 # # # # # # # # # S S S S L # # # # # # # # #
35 + + + + + + + + + + + + + + + + # # # # # # # # # + + + + + + + + + + + + + + + + + + + + # # # # # # # # # + + + + + + +
36 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
37 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
38 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
39 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
40 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
41
42 AP 34 id=lever
43 BF 32 requires_or=lever

View File

@ -6,18 +6,18 @@
#,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,C,,,# #,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,C,,,#
#,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,>,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,S,S,S,S,S,S,S,S,+,+,+,+,+,+,+,+,+,# #,#,>,,,,,,,,,,,,,,,,,,,+,+,+,+,S,S,S,S,S,+,+,+,+,+,S,S,S,S,S,+,+,+,+,+,S,S,S,S,S,+,+,+,+,+,+,+,+,+,#
#,#,>,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,#,>,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,>,,,,,,,,,,,,M,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,>,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,>,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,>,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,L,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,L,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
@ -39,8 +39,8 @@
#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,# #,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
BF,20,id=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, BE,20,id=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
B,17,id=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, C,17,id=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
X,13,requires_or=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, X,13,requires_or=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
C,27,requires_or=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, C,27,requires_or=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
O,11,size=2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, O,11,size=2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
6 # # > C #
7 # # > #
8 # # > #
9 # # > + + + + + S + S + S + S + S + + + + + + S + S + S + S + S + + S + S + S + S S S S S + + + + + + + + + #
10 # # > # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
11 # # > M # #
12 # # > # #
13 # # G #
14 # #
15 # #
16 # + + + + + + + + + + + + + + + #
17 # L L # # # # # # # # # # # # # # # #
18 # + + + + + + + + + + # # # # # # # # # # # # # # # + + + + #
19 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
20 # L L #
21 # + + + + + + + #
22 # # # # # # # # #
23 # #
39 # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #
40 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
41
42 BF BE 20 id=lever_2
43 B C 17 id=lever_1
44 X 13 requires_or=lever_1
45 C 27 requires_or=lever_2
46 O 11 size=2

View File

@ -22,7 +22,7 @@ r,,,,,,,,,,,,,,,,,,,~,+,+,|,,,,,,,,,,,,,,,~,+,+,+,+,+,+,|,,,,,,,,,,,,,,<,l
r,,,,,,,,,,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,<,l r,,,,,,,,,,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,<,l
r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l
#,+,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l #,+,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l
#,-,-,-,-,,,,,,~,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l #,-,-,-,-,,,,,,~,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l
r,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,+,+,+,+,+,+,+,+,+,+,# r,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,+,+,+,+,+,+,+,+,+,+,#
r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,# r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,#
r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l

1 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
22 r - - - - - - - - - - - - < l
23 r < l
24 # + + + | < l
25 # - - - - ~ + + | < l
26 r - - - - ~ + + + + + + + + + + #
27 r - - - - - - - - - - - #
28 r l

View File

@ -1,5 +1,5 @@
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,S,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

1 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2 # s s s s s s s s s s s s s s s s s s s s S s # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
3 # < # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
4 # < # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
5 # < # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

View File

@ -1,4 +1,11 @@
[ [
{
"name": "playground",
"theme": "tutorial",
"abilities": [
],
"file": "playground.csv"
},
{ {
"name": "0-tutorial", "name": "0-tutorial",
"theme": "tutorial", "theme": "tutorial",

View File

@ -0,0 +1,45 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,M,,,,,,,,,,C,,,,,,,,,,,D,,,,,,,,,,,,,,,,,,,,
,,,,,P,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
S,29,size=2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
M,31,id=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
F,30,id=pressure_plate_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
AN,29,requires_and=lever_1;pressure_plate_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 M C D
30 P
31 L
32 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
33 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
34 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
35 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
36 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
37 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
38 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
39 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
40 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
41
42 S 29 size=2
43 M 31 id=lever_1
44 F 30 id=pressure_plate_1
45 AN 29 requires_and=lever_1;pressure_plate_1

View File

@ -1,6 +1,8 @@
import json import json
from typing import Optional
from level.Level import Level from level.Level import Level
from physics import ConstantsParser
class LevelManager: class LevelManager:
@ -34,4 +36,20 @@ class LevelManager:
levels_by_theme[level.theme].append(level) levels_by_theme[level.theme].append(level)
return levels_by_theme return levels_by_theme
def find_next_level(self, level: Level) -> Optional[Level]:
"""
Find the next element in the theme using THEME. If the last element from a theme is reached, the first element
of the next theme is returned. If the last THEME is reached, return None.
:param level: The level to find the next level from
:return: The next level or None
"""
levels_by_theme = self.get_levels_by_theme()
theme_index = ConstantsParser.CONFIG.themes.index(level.theme)
level_index = levels_by_theme[level.theme].index(level)
if level_index + 1 < len(levels_by_theme[level.theme]):
return levels_by_theme[level.theme][level_index + 1]
elif theme_index + 1 < len(ConstantsParser.CONFIG.themes):
return levels_by_theme[ConstantsParser.CONFIG.themes[theme_index + 1]][0]
else:
return None

View File

@ -1,12 +1,14 @@
from level.Level import Level from level.Level import Level
from level.elements.static.ReceiverLevelElement import ReceiverLevelElement from level.elements.static.ReceiverLevelElement import ReceiverLevelElement
from physics.SpriteManager import SpriteManager from physics.SpriteManager import SpriteManager
from physics.TickData import TickData
from sprite.SpritesheetManager import SpritesheetManager from sprite.SpritesheetManager import SpritesheetManager
class GoalDoorReceiverLevelElement(ReceiverLevelElement): class GoalDoorReceiverLevelElement(ReceiverLevelElement):
def __init__(self, tile: dict, level: Level, level_screen_manager: 'LevelScreenManager'): def __init__(self, tile: dict, level: Level, level_screen_manager: 'LevelScreenManager'):
super().__init__(tile, level, level_screen_manager) super().__init__(tile, level, level_screen_manager)
self.is_collider = False
def load(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager, level: Level): def load(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager, level: Level):
self.spritesheet = spritesheet_manager.get_sheet('goal_door') self.spritesheet = spritesheet_manager.get_sheet('goal_door')
@ -17,4 +19,11 @@ class GoalDoorReceiverLevelElement(ReceiverLevelElement):
super().set_active(active) super().set_active(active)
self.set_animation_state('open' if self.active_state else 'close') self.set_animation_state('open' if self.active_state else 'close')
self.is_collider = False self.is_collider = False
self.register_collisions = not self.active_state self.register_collisions = self.active_state
def tick(self, tick_data: TickData):
super().tick(tick_data)
for collision in self.get_collides_with():
if collision.secondary_sprite.id == 'player':
if self.active_state:
self.level_screen_manager.player_success()

View File

@ -3,7 +3,7 @@ from level.elements.static.StaticLevelElement import StaticLevelElement
from physics.SpriteManager import SpriteManager from physics.SpriteManager import SpriteManager
from sprite.SpritesheetManager import SpritesheetManager from sprite.SpritesheetManager import SpritesheetManager
from project.physics.TickData import TickData from physics.TickData import TickData
BLOCK_TYPES = { BLOCK_TYPES = {
'A': 'staubsauger' 'A': 'staubsauger'

View File

@ -1,5 +1,7 @@
from abc import abstractmethod from abc import abstractmethod
import pygame.time
from level.Level import Level from level.Level import Level
from level.elements.LoadedLevel import LoadedLevel from level.elements.LoadedLevel import LoadedLevel
from level.selection.ScreenManager import ScreenManager from level.selection.ScreenManager import ScreenManager
@ -29,6 +31,10 @@ class LevelScreenManager(ScreenManager):
def tick(self, tick_data: TickData): def tick(self, tick_data: TickData):
if tick_data.key_manager.is_keymap_down(KeyManager.KEY_ESCAPE): if tick_data.key_manager.is_keymap_down(KeyManager.KEY_ESCAPE):
self.main_loop.select_level_selection(self.level.theme) self.main_loop.select_level_selection(self.level.theme)
pygame.time.delay(100)
def player_death(self): def player_death(self):
self.main_loop.player_death(self.level) self.main_loop.player_death(self.level)
def player_success(self):
self.main_loop.player_success(self.level)

View File

@ -3,6 +3,7 @@ from typing import Optional
from level.Level import Level from level.Level import Level
from level.LevelManager import LevelManager from level.LevelManager import LevelManager
from level.selection.ScreenManager import ScreenManager from level.selection.ScreenManager import ScreenManager
from physics import ConstantsParser
from physics.SpriteManager import SpriteManager, DrawLayers from physics.SpriteManager import SpriteManager, DrawLayers
from physics.TickData import TickData from physics.TickData import TickData
from sprite.PositionScale import PositionScale from sprite.PositionScale import PositionScale
@ -23,7 +24,7 @@ class LevelSelectionScreenManager(ScreenManager):
self.level_manager = level_manager self.level_manager = level_manager
self.levels_by_theme = self.level_manager.get_levels_by_theme() self.levels_by_theme = self.level_manager.get_levels_by_theme()
self.themes = ['tutorial', 'cave', 'castle'] self.themes = ConstantsParser.CONFIG.themes
self.level_labels: list[TextLabel] = [] self.level_labels: list[TextLabel] = []
self.theme_label: Optional[TextLabel] = None self.theme_label: Optional[TextLabel] = None

View File

@ -19,21 +19,22 @@ class MainMenuScreenManager(ScreenManager):
self.main_loop.select_level_selection() self.main_loop.select_level_selection()
def go_to_options_screen(self, click): def go_to_options_screen(self, click):
self.destroy() if click.is_click_down(ClickEvent.CLICK_LEFT):
self.main_loop.select_options()
def initialize(self): def initialize(self):
size = CoordinateTransform.transform_screen_to_world(self.main_loop.window_size, self.main_loop.screen_transform) size = CoordinateTransform.transform_screen_to_world(self.main_loop.window_size, self.main_loop.screen_transform)
self.create_button("START", size[0] * 0.5, size[1] * 0.5) self.create_button("START", size[0] * 0.5, size[1] * 0.5, 70)
self.create_button("OPTIONS", size[0] * 0.5, size[1] * 0.65) self.create_button("SCREEN SIZE", size[0] * 0.5, size[1] * 0.7, 40)
def create_button(self, name: str, x_position, y_position): def create_button(self, name: str, x_position, y_position, font_size):
label = TextLabel(name, x_position, y_position, font_size=70, alignment="center") label = TextLabel(name, x_position, y_position, font_size, alignment="center")
self.add_element(DrawLayers.UI, label) self.add_element(DrawLayers.UI, label)
label.position_scale.scale = (1, 1) label.position_scale.scale = (1, 1)
if name == "START": if name == "START":
label.add_click_listener(lambda click: self.go_to_menu(click)) label.add_click_listener(lambda click: self.go_to_menu(click))
elif name == "OPTIONS": elif name == "SCREEN SIZE":
label.add_click_listener(lambda click: self.go_to_options_screen(click)) label.add_click_listener(lambda click: self.go_to_options_screen(click))
def destroy(self): def destroy(self):

View File

@ -0,0 +1,51 @@
from level.selection.ScreenManager import ScreenManager
from physics.SpriteManager import DrawLayers, SpriteManager
from physics.TickData import TickData
from sprite.PositionScale import PositionScale
from sprite.SpritesheetManager import SpritesheetManager
from ui_elements import CoordinateTransform
from ui_elements.KeyManager import KeyManager
from ui_elements.TextLabel import TextLabel
class OptionsScreenManager(ScreenManager):
def __init__(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager, main_loop):
super().__init__(sprite_manager, spritesheet_manager, main_loop)
def create_label(self, name: str, x_position, y_position, font_size):
label = TextLabel(name, x_position, y_position, font_size, alignment="left")
self.add_element(DrawLayers.UI, label)
label.position_scale.scale = (1, 1)
self.create_button(name, label)
def create_button(self, name: str, label: TextLabel):
if name == "SMALL":
label.add_click_listener(lambda click: self.make_small_screen(click))
elif name == "MEDIUM":
label.add_click_listener(lambda click: self.make_medium_screen(click))
elif name == "LARGE":
label.add_click_listener(lambda click: self.make_large_screen(click))
def make_small_screen(self, click):
self.main_loop.update_position_scale(PositionScale((0, 0), (1, 1)))
def make_medium_screen(self, click):
self.main_loop.update_position_scale(PositionScale((0, 0), (1.25, 1.25)))
def make_large_screen(self, click):
self.main_loop.update_position_scale(PositionScale((0, 0), (1.5, 1.5)))
def initialize(self):
size = CoordinateTransform.transform_screen_to_world(self.main_loop.window_size,
self.main_loop.screen_transform)
self.create_label("SCREEN SIZE", size[0] * 0.2, size[1] * 0.2, font_size=70)
self.create_label("SMALL", size[0] * 0.15, size[1] * 0.6, font_size=30)
self.create_label("MEDIUM", size[0] * 0.45, size[1] * 0.6, font_size=30)
self.create_label("LARGE", size[0] * 0.75, size[1] * 0.6, font_size=30)
def destroy(self):
super().destroy()
def tick(self, tick_data: TickData):
if tick_data.key_manager.is_keymap_down(KeyManager.KEY_ESCAPE):
self.main_loop.select_main_menu()

View File

@ -8,6 +8,7 @@ from level.LevelManager import LevelManager
from level.selection.LevelScreenManager import LevelScreenManager from level.selection.LevelScreenManager import LevelScreenManager
from level.selection.LevelSelectionScreenManager import LevelSelectionScreenManager from level.selection.LevelSelectionScreenManager import LevelSelectionScreenManager
from level.selection.MainMenuScreenManager import MainMenuScreenManager from level.selection.MainMenuScreenManager import MainMenuScreenManager
from level.selection.OptionsScreenManager import OptionsScreenManager
from level.selection.ScreenManager import ScreenManager from level.selection.ScreenManager import ScreenManager
from physics import ConstantsParser from physics import ConstantsParser
from physics.SpriteManager import SpriteManager from physics.SpriteManager import SpriteManager
@ -46,6 +47,7 @@ class MainLoop:
self.GAME_STATE_MENU = 'main_menu' self.GAME_STATE_MENU = 'main_menu'
self.GAME_STATE_LEVEL_SELECTION = 'level_selection' self.GAME_STATE_LEVEL_SELECTION = 'level_selection'
self.GAME_STATE_LEVEL = 'level' self.GAME_STATE_LEVEL = 'level'
self.GAME_STATE_OPTIONS = 'options'
self.screen_transform: PositionScale = PositionScale((0, 0), (1.5, 1.5)) self.screen_transform: PositionScale = PositionScale((0, 0), (1.5, 1.5))
self.window_size: tuple[float, float] = (1, 1) self.window_size: tuple[float, float] = (1, 1)
@ -101,9 +103,16 @@ class MainLoop:
def player_death(self, level: Level): def player_death(self, level: Level):
self.select_level(level) self.select_level(level)
def player_success(self, level: Level):
next_level = self.parsed_levels_manager.find_next_level(level)
self.select_level(next_level)
def select_main_menu(self): def select_main_menu(self):
self.set_game_state(self.GAME_STATE_MENU) self.set_game_state(self.GAME_STATE_MENU)
def select_options(self):
self.set_game_state(self.GAME_STATE_OPTIONS)
def set_game_state(self, game_state: str): def set_game_state(self, game_state: str):
self.game_state = game_state self.game_state = game_state
@ -122,6 +131,10 @@ class MainLoop:
self.screen_manager = LevelSelectionScreenManager( self.screen_manager = LevelSelectionScreenManager(
self.sprite_manager, self.spritesheet_manager, self, self.parsed_levels_manager self.sprite_manager, self.spritesheet_manager, self, self.parsed_levels_manager
) )
elif self.game_state == self.GAME_STATE_OPTIONS:
self.screen_manager = OptionsScreenManager(
self.sprite_manager, self.spritesheet_manager, self,
)
else: else:
print('Invalid game state', self.game_state) print('Invalid game state', self.game_state)

View File

@ -6,6 +6,7 @@ class ConstantsParser:
parsed = json.load(open(file)) parsed = json.load(open(file))
self.level_size = (parsed['level']['level_size'][0], parsed['level']['level_size'][1]) self.level_size = (parsed['level']['level_size'][0], parsed['level']['level_size'][1])
self.block_size = (parsed['level']['block_size'][0], parsed['level']['block_size'][1]) self.block_size = (parsed['level']['block_size'][0], parsed['level']['block_size'][1])
self.themes = parsed['themes']
CONFIG = ConstantsParser("data/config/config.json") CONFIG = ConstantsParser("data/config/config.json")

View File

@ -58,10 +58,19 @@ class PhysicsElementsHandler:
skip_sprites = [] skip_sprites = []
for sprite in sorted_dynamic_sprites: for sprite in sorted_dynamic_sprites:
if sprite.last_effective_motion == (0, 0) and random.randint(0, 100) > 50\ if sprite.last_effective_motion == (0, 0) and random.randint(0, 100) > 50 \
and not sprite.id == 'player': and not sprite.id == 'player':
skip_sprites.append(sprite) skip_sprites.append(sprite)
continue continue
# remove all skip sprites that are closer than 100 pixels to the player
players = [sprite for sprite in sprites if hasattr(sprite, 'id') and sprite.id == 'player']
if len(players) > 0:
player = players[0]
for sprite in skip_sprites:
if sprite.position_scale.position[1] - player.position_scale.position[1] < 200:
skip_sprites.remove(sprite)
sorted_dynamic_sprites = [sprite for sprite in sorted_dynamic_sprites if sprite not in skip_sprites] sorted_dynamic_sprites = [sprite for sprite in sorted_dynamic_sprites if sprite not in skip_sprites]
closest_sprites: dict[UiElement, list[tuple[int, StaticSprite]]] = {} closest_sprites: dict[UiElement, list[tuple[int, StaticSprite]]] = {}