diff --git a/project/data/config/config.json b/project/data/config/config.json index 93ef4f9..19b8bdf 100644 --- a/project/data/config/config.json +++ b/project/data/config/config.json @@ -8,5 +8,10 @@ 60, 40 ] - } + }, + "themes": [ + "tutorial", + "cave", + "castle" + ] } \ No newline at end of file diff --git a/project/data/levels/0-tutorial.csv b/project/data/levels/0-tutorial.csv index 54fd856..b41b1e6 100644 --- a/project/data/levels/0-tutorial.csv +++ b/project/data/levels/0-tutorial.csv @@ -1,43 +1,43 @@ -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,+,+,+,+,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,+,+,+,+,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,#,#,#,#,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,#,#,#,#,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,+,+,+,+,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,#,#,#,#,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,+,+,+,+,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,#,#,#,#,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,C,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,D,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,S,S,S,S,,,,,,,,,,,L,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,, -+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,,,,,,,,,, -#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, -#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, -#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, -#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, -#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -AP,34,id=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -BF,32,requires_or=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,+,+,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,+,+,+,+,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,+,+,+,+,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,#,#,#,#,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,#,#,#,#,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,+,+,+,+,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,#,#,#,#,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,+,+,+,+,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,#,#,#,#,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,+,+,+,+,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,C,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,D,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,,,, +,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,,,S,S,S,S,,,,,,,,,,,L,,,,#,#,#,#,#,#,#,#,#,,,,,, ++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,+,+,+,+,+,+ +#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# +#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# +#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# +#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# +#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +AP,34,id=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +BF,32,requires_or=lever,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/project/data/levels/level-01.csv b/project/data/levels/level-01.csv index 2d96568..6747d7a 100644 --- a/project/data/levels/level-01.csv +++ b/project/data/levels/level-01.csv @@ -6,18 +6,18 @@ #,#,>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# -#,L,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# +#,,L,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,+,+,+,+,+,+,+,+,+,+,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# -#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,# +#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,+,+,+,+,+,+,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,# @@ -39,8 +39,8 @@ #,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,# #,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -BF,20,id=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -B,17,id=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +BE,20,id=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +C,17,id=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, X,13,requires_or=lever_1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, C,27,requires_or=lever_2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, O,11,size=2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/project/data/levels/level-02.csv b/project/data/levels/level-02.csv index 1b734b7..a455836 100644 --- a/project/data/levels/level-02.csv +++ b/project/data/levels/level-02.csv @@ -22,7 +22,7 @@ r,,,,,,,,,,,,,,,,,,,~,+,+,|,,,,,,,,,,,,,,,~,+,+,+,+,+,+,|,,,,,,,,,,,,,,<,l r,,,,,,,,,,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,<,l r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l #,+,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l -#,-,-,-,-,,,,,,~,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l +#,-,-,-,-,,,,,,~,+,+,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,l r,,,,,,,,,,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,+,+,+,+,+,+,+,+,+,+,# r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,# r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l diff --git a/project/data/levels/level-07.csv b/project/data/levels/level-07.csv index 1a75dff..b6482ef 100644 --- a/project/data/levels/level-07.csv +++ b/project/data/levels/level-07.csv @@ -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,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# #,,,,,,,,,,,,,,,,,,,,,<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,# diff --git a/project/data/levels/levels.json b/project/data/levels/levels.json index 9fb032a..86e3acf 100644 --- a/project/data/levels/levels.json +++ b/project/data/levels/levels.json @@ -1,4 +1,11 @@ - [ +[ + { + "name": "playground", + "theme": "tutorial", + "abilities": [ + ], + "file": "playground.csv" + }, { "name": "0-tutorial", "theme": "tutorial", @@ -6,14 +13,14 @@ ], "file": "0-tutorial.csv" }, - { + { "name": "level-01", "theme": "cave", "abilities": [ ], "file": "level-01.csv" }, - { + { "name": "level-02", "theme": "cave", "abilities": [ @@ -48,7 +55,7 @@ ], "file": "level-06.csv" }, - { + { "name": "level-07", "theme": "castle", "abilities": [ diff --git a/project/data/levels/playground.csv b/project/data/levels/playground.csv new file mode 100644 index 0000000..95d68ab --- /dev/null +++ b/project/data/levels/playground.csv @@ -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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/project/level/LevelManager.py b/project/level/LevelManager.py index 9069e29..8c64292 100644 --- a/project/level/LevelManager.py +++ b/project/level/LevelManager.py @@ -1,6 +1,8 @@ import json +from typing import Optional from level.Level import Level +from physics import ConstantsParser class LevelManager: @@ -34,4 +36,20 @@ class LevelManager: levels_by_theme[level.theme].append(level) 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 diff --git a/project/level/elements/static/GoalDoorReceiverLevelElement.py b/project/level/elements/static/GoalDoorReceiverLevelElement.py index 2353fa5..2b3dd98 100644 --- a/project/level/elements/static/GoalDoorReceiverLevelElement.py +++ b/project/level/elements/static/GoalDoorReceiverLevelElement.py @@ -1,12 +1,14 @@ from level.Level import Level from level.elements.static.ReceiverLevelElement import ReceiverLevelElement from physics.SpriteManager import SpriteManager +from physics.TickData import TickData from sprite.SpritesheetManager import SpritesheetManager class GoalDoorReceiverLevelElement(ReceiverLevelElement): def __init__(self, tile: dict, level: Level, level_screen_manager: 'LevelScreenManager'): super().__init__(tile, level, level_screen_manager) + self.is_collider = False def load(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager, level: Level): self.spritesheet = spritesheet_manager.get_sheet('goal_door') @@ -17,4 +19,11 @@ class GoalDoorReceiverLevelElement(ReceiverLevelElement): super().set_active(active) self.set_animation_state('open' if self.active_state else 'close') 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() diff --git a/project/level/elements/static/VacuumCleanerElement.py b/project/level/elements/static/VacuumCleanerElement.py index 2af4a9d..ab1b486 100644 --- a/project/level/elements/static/VacuumCleanerElement.py +++ b/project/level/elements/static/VacuumCleanerElement.py @@ -3,7 +3,7 @@ from level.elements.static.StaticLevelElement import StaticLevelElement from physics.SpriteManager import SpriteManager from sprite.SpritesheetManager import SpritesheetManager -from project.physics.TickData import TickData +from physics.TickData import TickData BLOCK_TYPES = { 'A': 'staubsauger' diff --git a/project/level/selection/LevelScreenManager.py b/project/level/selection/LevelScreenManager.py index 9b1af17..66234aa 100644 --- a/project/level/selection/LevelScreenManager.py +++ b/project/level/selection/LevelScreenManager.py @@ -1,5 +1,7 @@ from abc import abstractmethod +import pygame.time + from level.Level import Level from level.elements.LoadedLevel import LoadedLevel from level.selection.ScreenManager import ScreenManager @@ -29,6 +31,10 @@ class LevelScreenManager(ScreenManager): def tick(self, tick_data: TickData): if tick_data.key_manager.is_keymap_down(KeyManager.KEY_ESCAPE): self.main_loop.select_level_selection(self.level.theme) + pygame.time.delay(100) def player_death(self): self.main_loop.player_death(self.level) + + def player_success(self): + self.main_loop.player_success(self.level) diff --git a/project/level/selection/LevelSelectionScreenManager.py b/project/level/selection/LevelSelectionScreenManager.py index dcb6b83..0c069c2 100644 --- a/project/level/selection/LevelSelectionScreenManager.py +++ b/project/level/selection/LevelSelectionScreenManager.py @@ -3,6 +3,7 @@ from typing import Optional from level.Level import Level from level.LevelManager import LevelManager from level.selection.ScreenManager import ScreenManager +from physics import ConstantsParser from physics.SpriteManager import SpriteManager, DrawLayers from physics.TickData import TickData from sprite.PositionScale import PositionScale @@ -23,7 +24,7 @@ class LevelSelectionScreenManager(ScreenManager): self.level_manager = level_manager 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.theme_label: Optional[TextLabel] = None @@ -137,4 +138,4 @@ class LevelSelectionScreenManager(ScreenManager): def tick(self, tick_data: TickData): if tick_data.key_manager.is_keymap_down(KeyManager.KEY_ESCAPE): - self.main_loop.select_main_menu() \ No newline at end of file + self.main_loop.select_main_menu() diff --git a/project/level/selection/MainMenuScreenManager.py b/project/level/selection/MainMenuScreenManager.py index a364539..1ec6627 100644 --- a/project/level/selection/MainMenuScreenManager.py +++ b/project/level/selection/MainMenuScreenManager.py @@ -19,21 +19,22 @@ class MainMenuScreenManager(ScreenManager): self.main_loop.select_level_selection() 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): 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("OPTIONS", size[0] * 0.5, size[1] * 0.65) + self.create_button("START", size[0] * 0.5, size[1] * 0.5, 70) + self.create_button("SCREEN SIZE", size[0] * 0.5, size[1] * 0.7, 40) - def create_button(self, name: str, x_position, y_position): - label = TextLabel(name, x_position, y_position, font_size=70, alignment="center") + def create_button(self, name: str, x_position, y_position, font_size): + label = TextLabel(name, x_position, y_position, font_size, alignment="center") self.add_element(DrawLayers.UI, label) label.position_scale.scale = (1, 1) if name == "START": 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)) def destroy(self): diff --git a/project/level/selection/OptionsScreenManager.py b/project/level/selection/OptionsScreenManager.py new file mode 100644 index 0000000..2f4b5f3 --- /dev/null +++ b/project/level/selection/OptionsScreenManager.py @@ -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() diff --git a/project/main.py b/project/main.py index 00083b6..64d16b8 100644 --- a/project/main.py +++ b/project/main.py @@ -8,6 +8,7 @@ from level.LevelManager import LevelManager from level.selection.LevelScreenManager import LevelScreenManager from level.selection.LevelSelectionScreenManager import LevelSelectionScreenManager from level.selection.MainMenuScreenManager import MainMenuScreenManager +from level.selection.OptionsScreenManager import OptionsScreenManager from level.selection.ScreenManager import ScreenManager from physics import ConstantsParser from physics.SpriteManager import SpriteManager @@ -46,6 +47,7 @@ class MainLoop: self.GAME_STATE_MENU = 'main_menu' self.GAME_STATE_LEVEL_SELECTION = 'level_selection' self.GAME_STATE_LEVEL = 'level' + self.GAME_STATE_OPTIONS = 'options' self.screen_transform: PositionScale = PositionScale((0, 0), (1.5, 1.5)) self.window_size: tuple[float, float] = (1, 1) @@ -101,9 +103,16 @@ class MainLoop: def player_death(self, 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): 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): self.game_state = game_state @@ -122,6 +131,10 @@ class MainLoop: self.screen_manager = LevelSelectionScreenManager( 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: print('Invalid game state', self.game_state) diff --git a/project/physics/ConstantsParser.py b/project/physics/ConstantsParser.py index 9441b72..196a848 100644 --- a/project/physics/ConstantsParser.py +++ b/project/physics/ConstantsParser.py @@ -6,6 +6,7 @@ class ConstantsParser: parsed = json.load(open(file)) 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.themes = parsed['themes'] CONFIG = ConstantsParser("data/config/config.json") diff --git a/project/physics/PhysicsElementsHandler.py b/project/physics/PhysicsElementsHandler.py index 2f38802..8ae9aba 100644 --- a/project/physics/PhysicsElementsHandler.py +++ b/project/physics/PhysicsElementsHandler.py @@ -58,10 +58,19 @@ class PhysicsElementsHandler: skip_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': skip_sprites.append(sprite) 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] closest_sprites: dict[UiElement, list[tuple[int, StaticSprite]]] = {}