...
 
Commits (9)
assets/test_level2_background.csv,assets/test_level2_tiles.csv,assets/test_level2_objects.csv
This diff is collapsed.
This diff is collapsed.
sheet:sprites00.png,,,,,,,,,,,,,,,,,,,,,,,,,,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,15
15,0,15,0,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,15
15,0,15,0,0,0,15,15,0,15,0,0,0,0,0,0,0,27,0,27,0,0,15,15,0,0,15
15,0,15,15,15,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,15,15,0,15,15
15,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,0,0,0,0,27,0,0,0,0,0,15
15,85,86,87,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,15
15,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,27,0,0,28,0,0,0,0,15
15,85,86,87,0,0,0,85,86,87,0,15,15,0,0,15,15,0,0,0,0,0,0,0,0,0,15
15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15
40,40,40,40,40,40,40,0,0,0,0,48,40,40,40,15,15,15,15,15,15,15,15,0,0,0,15
43,43,43,43,43,0,0,0,0,0,0,43,43,43,43,43,43,43,43,43,43,43,15,0,0,0,15
43,43,43,43,43,56,47,0,0,43,0,0,43,43,43,43,43,43,43,56,43,43,15,0,0,15,15
43,43,43,44,43,43,43,47,0,0,0,0,43,43,43,43,43,43,43,43,44,43,15,0,0,128,15
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,44,43,43,43,43,43,15,15,15,15,15
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,93,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,94,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,93,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,109,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,20,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,37,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,39,38,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,36,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,60,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,111,-1,-1,-1,105,105,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,74,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24
24,-1,-1,27,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,24,24,24,24,24,-1,-1,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,24,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24,24,24,24,24,24,24,24,24,24,24,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24,24,-1,-1,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,29,30,30,30,30,30,30,30,31,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,46,49,43,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24
24,-1,-1,-1,-1,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,29,30,30,30,30,31,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,24
24,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
43,43,43,43,43,43,43,43,43,43,43,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,43,43,43,43,43,43,43,43,43,43,43,47,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,43,45,-1,-1,50,-1,-1,50,-1,-1,46,43,47,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,-1,24,-1,-1,24,-1,24,-1,-1,-1,-1,-1,24
43,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,4,-1,-1,2,3,3,3,3,3,3,4,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,27,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,24
43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,85,86,87,-1,-1,-1,-1,-1,85,86,87,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24
5,-1,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,-1,-1,24
5,-1,-1,-1,-1,-1,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,48,40,40,40,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,27,-1,27,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,40,40,40,43,43,43,43,43,47,-1,48,40,40,40,47,-1,-1,-1,-1,-1,58,24
5,-1,-1,-1,27,-1,27,27,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,40,40,40,40,40,47,48,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,24,24,24,24,24,24,24
51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,40,40,40,40,40,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,40,40,47,48,40,47,-1,48,40,40,40,47,48,40,40,40,36,40,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
63,63,63,63,63,63,63,14,43,43,43,43,43,43,43,43,43,43,43,57,57,43,40,40,40,40,40,40,40,40,40,40,40,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,56,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,57,43,14,43,43,43,43,43,43,15,43,43,57,43,57,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,57,43
43,43,43,43,43,43,43,14,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,56,57,43,43,57,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,43,43,43,43,43,56,57,43,43,43,43,43,43,43,43,43,43,43,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
......@@ -13,23 +13,10 @@ use crate::resource::SpriteSheets;
use crate::vec2d::Vec2d;
/// Create a Player entity at the X,Y coords in the World
pub fn player(
world: &mut World,
x: u32,
y: u32,
sprite_id: &str,
sprite_sheets: &SpriteSheets,
) -> usize {
pub fn player(world: &mut World, x: u32, y: u32, sprite_id: &str) -> usize {
if let Ok(ent) = world.entities.get_free_slot() {
let world_y =
world.level_map.dimensions.y() * world.level_map.tile_size.y();
let mut pos = world.from_tile(x, y);
pos.set_y(world_y as i32 - pos.y());
pos.set_x(pos.x() + (world.level_map.tile_size.x() as i32 / 2));
let pos = Vec2d::new(f64::from(pos.x()), f64::from(pos.y()));
let mut player = Particle::new(1.0, 0.85);
player.set_position(pos);
player.set_position(Vec2d::new(f64::from(x), f64::from(y)));
player.set_acceleration(Vec2d::new(0.0, -9.81));
let id = world.physics_world.add_particle(player).unwrap();
let particle_ptr = world
......@@ -40,7 +27,7 @@ pub fn player(
.entities
.add_part::<ParticleID>(ent, ParticleID { id });
let tx = sprite_sheets.get_ref(sprite_id);
let tx = world.sprite_sheets.get_ref(sprite_id);
let rec = Rect::new(0, 0, tx.width(), tx.height());
world
......@@ -59,8 +46,6 @@ pub fn player(
.entities
.add_part::<Player>(ent, Player::new(5.0, 15.0));
world.level_map.objects.push(ent as i32);
// Message listener to act on messages to player entity
world.add_listener(PlayerListener::new(ent, particle_ptr));
......@@ -83,16 +68,10 @@ pub fn background_tile(
rec: Rect,
) {
if let Ok(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.entities.add_part::<Position>(
ent,
Position::new(f64::from(pos.x()), f64::from(pos.y()), 0.0),
);
world
.entities
.add_part::<Sprite>(ent, Sprite::new(sprite_id, rec));
// Insert entity_id in to layer reference
world.level_map.background.push(ent as i32);
// Insert entity_id in to layer reference
} else {
println!("No more entity slots left");
}
......@@ -110,26 +89,10 @@ pub fn level_tile(
rec: Rect,
) {
if let Ok(ent) = world.entities.get_free_slot() {
let world_y =
world.level_map.dimensions.y() * world.level_map.tile_size.y();
let mut pos = world.from_tile(x, y);
pos.set_y(world_y as i32 - pos.y());
pos.set_x(pos.x() + (world.level_map.tile_size.x() as i32 / 2));
// infinite mass particle
let mut particle = Particle::new(0.0, 0.85);
let particle_pos = Vec2d::new(f64::from(pos.x()), f64::from(pos.y()));
particle.set_position(particle_pos);
let id = world.physics_world.add_particle(particle).unwrap();
world
.entities
.add_part::<ParticleID>(ent, ParticleID { id });
world
.entities
.add_part::<Sprite>(ent, Sprite::new(sprite_id, rec));
// Insert entity_id in to layer reference
world.level_map.foreground.push(ent as i32);
// Insert entity_id in to layer reference
} else {
println!("No more entity slots left");
}
......@@ -148,16 +111,10 @@ pub fn object_tile(
rec: Rect,
) {
if let Ok(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.entities.add_part::<Position>(
ent,
Position::new(f64::from(pos.x()), f64::from(pos.y()), 0.0),
);
world
.entities
.add_part::<Sprite>(ent, Sprite::new(sprite_id, rec));
// Insert entity_id in to layer reference
world.level_map.objects.push(ent as i32);
// Insert entity_id in to layer reference
} else {
println!("No more entity slots left");
}
......
......@@ -23,6 +23,7 @@ impl Position {
}
}
#[derive(Debug)]
pub struct ParticleID {
pub id: usize,
}
......@@ -74,7 +75,7 @@ pub enum InputTypes {
Menu(Bindings),
}
///
#[derive(Debug)]
pub struct Sprite {
pub sid: String,
pub frame: Rect,
......
......@@ -3,12 +3,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::collections::HashMap;
use std::f32;
use crate::components::parts::*;
use crate::controls::Input;
use crate::messaging::MessageBus;
use crate::tiny_ecs::Entities;
use crate::FP;
/// Check for entities that have an `INPUT` and check if they had any input queued,
/// if so, add a message to the message queue keyed to that entity ID for processing
......@@ -46,7 +46,7 @@ pub fn input_update(
/// Update all animations
///
#[allow(unused_variables)]
pub fn animation_update(eid: usize, entities: &mut Entities, dt: f32) {}
pub fn animation_update(eid: usize, entities: &mut Entities, dt: FP) {}
/// Update all sprites
///
......@@ -55,7 +55,7 @@ pub fn animation_update(eid: usize, entities: &mut Entities, dt: f32) {}
pub fn sprite_update(
active: &[usize],
amask: &[u32],
dt: f32,
dt: FP,
s: &mut HashMap<u32, Sprite>,
) {
}
......@@ -5,9 +5,9 @@
use sdl2::keyboard::Scancode;
use sdl2::pixels::PixelFormatEnum;
use sdl2::rect::Rect;
use sdl2::render::Canvas;
use sdl2::render::{Canvas, TextureCreator};
use sdl2::surface::Surface;
use sdl2::video::Window;
use sdl2::video::{Window, WindowContext};
use sdl2::Sdl;
use crate::controls::{Bindings, Input};
......@@ -15,6 +15,7 @@ use crate::states::menu::Menu;
use crate::states::pause::Pause;
use crate::states::play::Play;
use crate::states::States;
use crate::FP;
pub struct Game<'surface> {
bindings: Bindings,
......@@ -22,6 +23,7 @@ pub struct Game<'surface> {
states: States,
canvas: Canvas<Window>,
surface: Surface<'surface>,
texture_creator: TextureCreator<WindowContext>,
view_rect: Rect,
running: bool,
state_changing: bool,
......@@ -49,6 +51,8 @@ impl<'surface> Game<'surface> {
.build()
.unwrap();
let texture_creator = canvas.texture_creator();
let view_width = (y / 3) * 4;
let view_x = (x - view_width) / 2;
let view_rect = Rect::new(view_x as i32, 0, view_width, y);
......@@ -68,17 +72,20 @@ impl<'surface> Game<'surface> {
input,
states,
canvas,
surface: Surface::new(x, y, PixelFormatEnum::RGB24).unwrap(),
texture_creator,
surface: Surface::new(x, y, PixelFormatEnum::RGBA32).unwrap(),
view_rect,
running: true,
state_changing: false,
}
}
/// Called by the main loop
pub fn update(&mut self, time: f32) {
pub fn update(&mut self, time: FP) {
self.states.update(time, &self.input, &mut self.bindings);
self.running = !self.input.get_quit();
}
/// `handle_events` updates the current events and inputs plus changes `states`
///
/// In an C++ engine, using a button to switch states would probably be
......@@ -124,6 +131,7 @@ impl<'surface> Game<'surface> {
self.state_changing = false;
}
}
/// `render` calls the `states.render()` method with a time-step for state renders
///
/// The main loop, in this case, the `'running : loop` in lib.rs should calculate
......@@ -131,12 +139,12 @@ impl<'surface> Game<'surface> {
/// from which the game states (or menu) will use to render objects at the correct
/// point in time.
///
pub fn render(&mut self, dt: f32) {
pub fn render(&mut self, dt: FP) {
// The state machine will handle which state renders to the surface
self.states.render(dt, &mut self.surface);
let texture_creator = self.canvas.texture_creator();
let texture = texture_creator
let texture = self
.texture_creator
.create_texture_from_surface(&self.surface)
.unwrap();
......@@ -145,6 +153,7 @@ impl<'surface> Game<'surface> {
.expect("Texture to canvas failed");
self.canvas.present();
}
/// Called by the main loop
pub fn running(&self) -> bool {
self.running
......
......@@ -42,14 +42,15 @@ pub mod controls;
/// The possible messages between components
pub mod messaging;
const MS_PER_UPDATE: f32 = 4.0;
type FP = f64;
const MS_PER_UPDATE: FP = 4.0;
#[derive(Debug)]
pub struct TimeStep {
last_time: Instant,
delta_time: f32,
delta_time: FP,
frame_count: u32,
frame_time: f32,
frame_time: FP,
}
impl TimeStep {
......@@ -62,10 +63,10 @@ impl TimeStep {
}
}
pub fn delta(&mut self) -> f32 {
pub fn delta(&mut self) -> FP {
let current_time = Instant::now();
let delta = current_time.duration_since(self.last_time).subsec_micros()
as f32
let delta = current_time.duration_since(self.last_time).as_micros()
as FP
* 0.001;
self.last_time = current_time;
self.delta_time = delta;
......
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::fs;
use std::io::BufRead;
use std::io::BufReader;
use std::path::Path;
use sdl2::rect::Rect;
/// Use `Level` in conjunction with `TileSet.get_frame(number)`, this will return a `Rect` to
/// use with the `Sprite` component
pub struct Level {
pub sheet: String,
pub background: Vec<Vec<i32>>,
pub level_tiles: Vec<Vec<i32>>,
pub objects: Vec<Vec<i32>>,
}
impl Level {
pub fn new(level: &str) -> Level {
let mut buffer = String::new();
let mut background: Vec<Vec<i32>> = Vec::new();
let mut tiles: Vec<Vec<i32>> = Vec::new();
let mut objects: Vec<Vec<i32>> = Vec::new();
for part in level.split(',') {
let file = match fs::File::open(Path::new(part)) {
Ok(f) => f,
Err(e) => panic!("Can't open level {:?}", e),
};
let mut reader = BufReader::new(file);
let mut level = &mut Vec::new();
if part.ends_with("background.csv") {
level = &mut background
} else if part.ends_with("tiles.csv") {
level = &mut tiles
} else if part.ends_with("objects.csv") {
level = &mut objects
}
while reader.read_line(&mut buffer).unwrap() > 0 {
let mut row: Vec<i32> = Vec::new();
// parse a csv file to level
buffer.pop();
for c in buffer.split(',') {
match c.to_string().parse::<i32>() {
Ok(n) => row.push(n),
Err(e) => println!(
"Failed to read level on {:?} : {:?}",
c, e
),
}
}
level.push(row);
buffer.clear();
}
}
Level {
sheet: "sprites00".to_string(),
background,
level_tiles: tiles,
objects,
}
}
}
/// Parse all `Level` objects in the sequence they are loaded
pub fn parse_levels(level_list: &str) -> Vec<Level> {
// parse the level_list line by line for Path data, then build level
let file =
fs::File::open(Path::new(&level_list)).expect("Can't open level list");
let mut reader = BufReader::new(file);
let mut level = String::new();
let mut levels: Vec<Level> = Vec::new();
while reader.read_line(&mut level).unwrap() > 0 {
// parse level file
levels.push(Level::new(level.trim()));
level.clear();
}
levels
}
/// A tile set is associated with a `SpriteSheet` ID
pub struct TileSet {
/// the `id` of the related sprite sheet in the `SpriteStore`
tile_width: u32,
tile_height: u32,
/// gap between tiles (x and y)
spacing: u32,
/// the gap around the edge of the sprite sheet
margin: u32,
columns: u32,
}
impl TileSet {
pub fn new(
_id: &str,
tw: u32,
th: u32,
sp: u32,
m: u32,
col: u32,
) -> TileSet {
TileSet {
tile_width: tw,
tile_height: th,
spacing: sp,
margin: m,
columns: col,
}
}
pub fn get_frame(&self, num: u32) -> Option<Rect> {
let x = (num % self.columns) * self.tile_width
+ (self.margin + self.spacing * num);
let y = (num / self.columns) * self.tile_height
+ (self.margin + self.spacing * num);
Some(Rect::new(
x as i32,
y as i32,
self.tile_width,
self.tile_height,
))
}
}
......@@ -2,7 +2,5 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/// Load and parse level files plus set up `tile_sets`
pub mod level;
//// The world controls such things as the viewport, rendering, entities and their updates
pub mod world;
This diff is collapsed.
......@@ -4,7 +4,6 @@
use crate::components::parts::*;
use crate::vec2d::Vec2d;
use core::borrow::Borrow;
///
/// The main way of passing messages between components
///
......
......@@ -24,8 +24,8 @@ impl<'a> SpriteSheets<'a> {
}
/// Insert a new sprite in to the `SpriteSheets`
pub fn push(&mut self, id: &str, path: &str) {
match Surface::from_file(Path::new(path)) {
pub fn push(&mut self, id: &str, path: &Path) {
match Surface::from_file(path) {
Ok(s) => {
if !self.store.contains_key(id) {
self.store.insert(id.to_string(), Box::new(s));
......@@ -45,3 +45,16 @@ impl<'a> SpriteSheets<'a> {
}
}
}
pub struct CachedTile<'a> {
surface: Surface<'a>,
}
impl<'a> CachedTile<'a> {
pub fn new(surface: Surface<'a>) -> Self {
CachedTile { surface }
}
pub fn get_surface_ref(&self) -> &Surface {
&self.surface
}
}
......@@ -2,11 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use sdl2::pixels::Color as SdlColour;
use sdl2::surface::Surface as SdlSurface;
use sdl2::{pixels::Color, surface::Surface};
use super::GameState;
use crate::controls::{Bindings, Input};
use crate::{
controls::{Bindings, Input},
states::GameState,
FP,
};
pub struct Menu {
id: String,
......@@ -20,17 +22,19 @@ impl Menu {
}
impl GameState for Menu {
fn update(&mut self, _dt: f32, _input: &Input, _bindings: &mut Bindings) {}
fn render(&mut self, _dt: f32, sdl_surface: &mut SdlSurface) {
let alive = SdlColour::RGB(200, 200, 230);
fn update(&mut self, _dt: FP, _input: &Input, _bindings: &mut Bindings) {}
fn render(&mut self, _dt: FP, sdl_surface: &mut Surface) {
let alive = Color::RGB(200, 200, 230);
sdl_surface.fill_rect(None, alive).unwrap();
}
fn enter(&mut self) {
println!("Entered Menu");
}
fn exit(&mut self) {
println!("Exited Menu");
}
fn enter(&mut self) {}
fn resume(&mut self) {}
fn pause(&mut self) {}
fn exit(&mut self) {}
fn get_id(&self) -> &String {
&self.id
}
......
......@@ -10,31 +10,31 @@ pub mod pause;
pub mod play;
use crate::controls::{Bindings, Input};
use crate::FP;
use sdl2::pixels::Color as SdlColour;
use sdl2::surface::Surface as SdlSurface;
use std::collections::VecDeque;
/// Required traits for proper interaction with each state
pub trait GameState {
/// A game state performs input checking against control bindings, and updates active objects.
///
fn update(&mut self, dt: f32, input: &Input, bindings: &mut Bindings);
/// General I/O will happen here
fn update(&mut self, dt: FP, input: &Input, bindings: &mut Bindings);
/// Calls the `draw()` method on all active objects
///
/// The state should call `draw()` for all active objects.
/// A mutable surface needs be passed in to the state for which to blit objects to.
/// The surface is then rendered to screen by the game loop.
fn render(&mut self, dt: f32, sdl_surface: &mut SdlSurface);
/// Rendering is separated from updates so that both can run at different speeds
fn render(&mut self, dt: FP, sdl_surface: &mut SdlSurface);
/// Called when the state is entered
///
/// This is where any set-up methods should live, such as level loading, object loading
fn enter(&mut self);
/// Called on the state below the popped state
fn resume(&mut self);
/// Called on the existing state when a new state is pushed on top
fn pause(&mut self);
/// Called when the state exits
///
/// An example of use here would be to save the current `play` state.
fn exit(&mut self);
/// Returns the state ID, used for checking which state is active
......@@ -53,64 +53,30 @@ impl States {
}
/// Push a new state on to the queue
///
/// ```rust
/// # extern crate framework;
/// # use framework::manager::states::States;
/// # use framework::states::menu::*;
/// # fn main() {
/// let mut states = States::new(1024, 768);
/// states.push(Box::new(Menu::new()));
/// assert_eq!(states.get_state_id().unwrap(), "_MENU")
/// # }
/// ```
pub fn push(&mut self, state: impl GameState + 'static) {
// Call pause on the currently running state
if let Some(state) = self.game_states.back_mut() {
state.pause()
}
self.game_states.push_back(Box::new(state));
match self.game_states.back_mut() {
Some(st) => st.enter(),
_ => println!("No game states found"),
if let Some(state) = self.game_states.back_mut() {
state.enter()
}
}
/// Pop the active state from the queue
///
/// ```rust
/// # extern crate framework;
/// # use framework::manager::states::States;
/// # use framework::states::menu::*;
/// # use framework::states::play::*;
/// # fn main() {
/// let mut states = States::new(1024, 768);
/// states.push(Box::new(Menu::new()));
/// states.push(Box::new(Play::new()));
/// # assert_eq!(states.get_state_id().unwrap(), "_PLAY");
/// states.pop();
/// assert_eq!(states.get_state_id().unwrap(), "_MENU")
/// # }
/// ```
pub fn pop(&mut self) {
match self.game_states.pop_back() {
Some(mut st) => st.exit(),
_ => println!("No game states found"),
if let Some(state) = &mut self.game_states.pop_back() {
state.exit();
if let Some(last) = self.game_states.back_mut() {
last.resume();
}
}
}
/// Change the active state
///
/// Swaps the active state in the Queue for the one requested
///
/// ```rust
/// # extern crate framework;
/// # use framework::manager::states::States;
/// # use framework::states::menu::*;
/// # use framework::states::play::*;
/// # fn main() {
/// let mut states = States::new(1024, 768);
/// states.push(Box::new(Menu::new()));
/// states.change(Box::new(Play::new()));
/// assert_eq!(states.get_state_id().unwrap(), "_PLAY")
/// # }
/// ```
pub fn change(&mut self, state: impl GameState + 'static) {
if let Some(st) = self.game_states.back() {
if st.get_id() == state.get_id() {
......@@ -133,7 +99,7 @@ impl States {
///
pub fn update(
&mut self,
dt: f32,
dt: FP,
input: &Input,
mut bindings: &mut Bindings,
) {
......@@ -158,7 +124,7 @@ impl States {
/// for which objects can be drawn to. Once the state has finished its work, the surface
/// is then drawn to the screen.
///
pub fn render(&mut self, dt: f32, surface: &mut SdlSurface) {
pub fn render(&mut self, dt: FP, surface: &mut SdlSurface) {
match self.game_states.back_mut() {
Some(state) => state.render(dt, surface),
_ => surface.fill_rect(None, SdlColour::RGB(30, 30, 30)).unwrap(),
......
......@@ -2,11 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use sdl2::pixels::Color as SdlColour;
use sdl2::surface::Surface as SdlSurface;
use sdl2::{pixels::Color, surface::Surface};
use super::GameState;
use crate::controls::{Bindings, Input};
use crate::{
controls::{Bindings, Input},
states::GameState,
FP,
};
pub struct Pause {
id: String,
......@@ -20,17 +22,19 @@ impl Pause {
}
impl GameState for Pause {
fn update(&mut self, _dt: f32, _input: &Input, _bindings: &mut Bindings) {}
fn render(&mut self, _dt: f32, sdl_surface: &mut SdlSurface) {
let alive = SdlColour::RGB(60, 1, 1);
fn update(&mut self, _dt: FP, _input: &Input, _bindings: &mut Bindings) {}
fn render(&mut self, _dt: FP, sdl_surface: &mut Surface) {
let alive = Color::RGB(60, 1, 1);
sdl_surface.fill_rect(None, alive).unwrap();
}
fn enter(&mut self) {
println!("Entered Pause");
}
fn exit(&mut self) {
println!("Exited Pause");
}
fn enter(&mut self) {}
fn resume(&mut self) {}
fn pause(&mut self) {}
fn exit(&mut self) {}
fn get_id(&self) -> &String {
&self.id
}
......
......@@ -2,142 +2,50 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::collections::HashMap;
use sdl2::{pixels::Color, surface::Surface};
use sdl2::pixels::Color;
use sdl2::surface::Surface;
use crate::{
controls::{Bindings, Input},
manager::world::World,
states::GameState,
FP,
};
use crate::components::create;
use crate::controls::{Bindings, Input};
use crate::manager::level::*;
use crate::manager::world::World;
use crate::resource::SpriteSheets;
use super::GameState;
use std::path::PathBuf;
pub struct Play<'a> {
id: String,
world: World<'a>,
levels: Vec<Level>,
tile_sets: HashMap<String, TileSet>,
sprite_sheets: SpriteSheets<'a>,
}
// Note: test sprite for tiles is 256x128, 16x8 h/w = 16x16
///
/// The `Play` module is used to;
/// * keep track of game entities
/// * update the entities per game tick
/// * handle any input/commands to the game or current player object.
/// * render the results to a surface that `States::update()` gives it
///
impl<'a> Play<'a> {
pub fn new() -> Play<'a> {
Play {
id: "_PLAY".to_string(),
world: World::new(),
levels: Vec::new(),
tile_sets: HashMap::new(),
sprite_sheets: SpriteSheets::new(),
}
}
pub fn load_level(&mut self, num: usize) {
// TODO: tw and th need to come from elsewhere, not hardcoded
let (tw, th) = (16, 16); //tile width and height
let row = (self.levels[num].level_tiles.len()) as u32;
let col = (self.levels[num].level_tiles[0].len()) as u32;
self.world.initialize(col, row, tw, th);
let level_bg = &self.levels[num].background;
let level_fg = &self.levels[num].level_tiles;
let level_obj = &self.levels[num].objects;
let sheet = &self.levels[num].sheet;
// loop over each layer of the level
for row in 0..level_bg.len() {
for col in 0..level_bg[row].len() {
let num_bg = level_bg[row][col];
let num_fg = level_fg[row][col];
let num_obj = level_obj[row][col];
let col = col as u32;
let row = row as u32;
if num_bg == -1 {
self.world.level_map.background.push(-1);
} else {
let rec =
self.tile_sets[sheet].get_frame(num_bg as u32).expect(
"frame number was out of bounds of sprite sheet",
);
create::background_tile(
&mut self.world,
col,
row,
sheet,
rec,
);
}
if num_fg == -1 {
self.world.level_map.foreground.push(-1);
} else {
let rec =
self.tile_sets[sheet].get_frame(num_fg as u32).expect(
"frame number was out of bounds of sprite sheet",
);
create::level_tile(&mut self.world, col, row, sheet, rec);
}
if num_obj != -1 {
let rec =
self.tile_sets[sheet].get_frame(num_obj as u32).expect(
"frame number was out of bounds of sprite sheet",
);
// TODO: object type should be tied to number ID
create::object_tile(&mut self.world, col, row, sheet, rec);
}
}
world: World::new(PathBuf::from("assets/test.json")),
}
}
}
impl<'a> GameState for Play<'a> {
fn update(&mut self, dt: f32, input: &Input, _bindings: &mut Bindings) {
fn update(&mut self, dt: FP, input: &Input, _bindings: &mut Bindings) {
self.world.update(dt, input);
}
fn render(&mut self, dt: f32, mut sf: &mut Surface) {
fn render(&mut self, dt: FP, mut sf: &mut Surface) {
let c = Color::RGB(0, 0, 0);
sf.fill_rect(None, c).unwrap();
self.world.render(dt, &mut sf, &self.sprite_sheets);
self.world.render(dt, &mut sf);
}
fn enter(&mut self) {
println!("Entered Play");
self.sprite_sheets
.push(&"QuakeFace".to_string(), &"assets/test.png".to_string());
let sheet_name = "sprites00".to_string();
let sheet_path = "assets/sprites00.png".to_string();
self.sprite_sheets.push(&sheet_name, &sheet_path);
fn enter(&mut self) {}
self.tile_sets.insert(
sheet_name.clone(),
TileSet::new(&sheet_name, 16, 16, 0, 0, 16),
);
fn resume(&mut self) {}
self.levels = parse_levels("assets/level_list");
self.load_level(0);
fn pause(&mut self) {}
fn exit(&mut self) {}
create::player(
&mut self.world,
2,
2,
&"QuakeFace".to_string(),
&self.sprite_sheets,
); // TEST
}
fn exit(&mut self) {
println!("Exited Play");
}
fn get_id(&self) -> &String {
&self.id
}
......
Subproject commit ea6fd18e60af404d89c4dab809b8c71bdcf9aa6a
Subproject commit 46e68b87743e71da08c9d877227339599f522185
Subproject commit 32bc6b388a2cb334ac9b2155b9acdb5cde474347
Subproject commit 216373bc83ce935c489a29a70de81206e9156927