Merge remote-tracking branch 'origin/main'
commit
017ff1f860
|
@ -8,5 +8,10 @@
|
||||||
60,
|
60,
|
||||||
40
|
40
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"themes": [
|
||||||
|
"tutorial",
|
||||||
|
"cave",
|
||||||
|
"castle"
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
|
@ -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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
|
@ -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,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,4 +1,11 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"name": "playground",
|
||||||
|
"theme": "tutorial",
|
||||||
|
"abilities": [
|
||||||
|
],
|
||||||
|
"file": "playground.csv"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "0-tutorial",
|
"name": "0-tutorial",
|
||||||
"theme": "tutorial",
|
"theme": "tutorial",
|
||||||
|
@ -6,14 +13,14 @@
|
||||||
],
|
],
|
||||||
"file": "0-tutorial.csv"
|
"file": "0-tutorial.csv"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "level-01",
|
"name": "level-01",
|
||||||
"theme": "cave",
|
"theme": "cave",
|
||||||
"abilities": [
|
"abilities": [
|
||||||
],
|
],
|
||||||
"file": "level-01.csv"
|
"file": "level-01.csv"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "level-02",
|
"name": "level-02",
|
||||||
"theme": "cave",
|
"theme": "cave",
|
||||||
"abilities": [
|
"abilities": [
|
||||||
|
@ -48,7 +55,7 @@
|
||||||
],
|
],
|
||||||
"file": "level-06.csv"
|
"file": "level-06.csv"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "level-07",
|
"name": "level-07",
|
||||||
"theme": "castle",
|
"theme": "castle",
|
||||||
"abilities": [
|
"abilities": [
|
||||||
|
|
|
@ -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,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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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]]] = {}
|
||||||
|
|
Loading…
Reference in New Issue