diff --git a/assets/tile/checkpoint.png b/assets/tile/checkpoint.png index 22d0299..53baa2a 100644 Binary files a/assets/tile/checkpoint.png and b/assets/tile/checkpoint.png differ diff --git a/assets/tile/flag.png b/assets/tile/flag.png index a6a41ef..4575871 100644 Binary files a/assets/tile/flag.png and b/assets/tile/flag.png differ diff --git a/src/Apps/LightGame/generated/tile_atlas.h b/src/Apps/LightGame/generated/tile_atlas.h index 4f498fd..4e7db2b 100644 --- a/src/Apps/LightGame/generated/tile_atlas.h +++ b/src/Apps/LightGame/generated/tile_atlas.h @@ -777,258 +777,258 @@ static const uint16_t tile_atlas_pixels[] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFEE3, 0xFEE3, 0xFEE3, 0xFEE3, 0xFD51, 0xFD51, 0xFD51, 0x5ADF, 0x5ADF, 0x4A57, 0x4A57, 0x0845, 0x0845, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFF2, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, - 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, - 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, - 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, + 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, - 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, - 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, diff --git a/src/Apps/LightGame/src/editor/LevelEditor.cpp b/src/Apps/LightGame/src/editor/LevelEditor.cpp index f85393b..d2f94c3 100644 --- a/src/Apps/LightGame/src/editor/LevelEditor.cpp +++ b/src/Apps/LightGame/src/editor/LevelEditor.cpp @@ -35,15 +35,13 @@ namespace LightGame switch (type) { case GameObjectType::Player: return "Player"; - case GameObjectType::StaticPlatform: return "StaticPlatform"; case GameObjectType::LightPlatform: return "LightPlatform"; case GameObjectType::ShadowPlatform: return "ShadowPlatform"; - case GameObjectType::Hazard: return "Hazard"; case GameObjectType::Collectible: return "Collectible"; case GameObjectType::Trigger: return "Trigger"; case GameObjectType::Door: return "Door"; } - return "StaticPlatform"; + return "Player"; } static const char* TriggerActionToString(TriggerAction action) @@ -66,7 +64,7 @@ namespace LightGame should_quit_(false), current_tool_(Tool::TileBrush), selected_tile_id_(1), - selected_object_type_(GameObjectType::StaticPlatform), + selected_object_type_(GameObjectType::Player), selected_object_id_(0), preview_light_level_(2048), show_grid_(true), @@ -177,7 +175,7 @@ namespace LightGame const int32_t py = pointer->get_y(); const int32_t world_x = px + camera_.get_x(); - const int32_t world_y = py + camera_.get_y(); + const int32_t world_y = py - LightGame::LevelRenderer::kTopBlackBorder + camera_.get_y(); const int32_t tile_x = world_to_tile_x(world_x); const int32_t tile_y = world_to_tile_y(world_y); @@ -230,11 +228,6 @@ namespace LightGame obj.solid = false; level_.set_spawn_point(obj.position); break; - case GameObjectType::StaticPlatform: - obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); - obj.solid = true; - obj.sprite = &spr_platform; - break; case GameObjectType::LightPlatform: obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); obj.solid = false; @@ -253,11 +246,6 @@ namespace LightGame obj.light_threshold = LightThreshold(1023, 3192); obj.sprite = &spr_door; break; - case GameObjectType::Hazard: - obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, ts / 2), Math::Vector2Int(ts, ts)); - obj.solid = false; - obj.sprite = &spr_spike; - break; case GameObjectType::Collectible: obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(ts / 4, ts / 4), Math::Vector2Int(ts * 3 / 4, ts * 3 / 4)); obj.solid = false; @@ -337,11 +325,11 @@ namespace LightGame for (int32_t x = start_x; x < end_x; x += ts) { const int32_t sx = x - cam_x; - ctx.draw_line(Math::Vector2Int(sx, 0), Math::Vector2Int(sx, screen_height_), grid_color); + ctx.draw_line(Math::Vector2Int(sx, LightGame::LevelRenderer::kTopBlackBorder), Math::Vector2Int(sx, screen_height_), grid_color); } for (int32_t y = start_y; y < end_y; y += ts) { - const int32_t sy = y - cam_y; + const int32_t sy = y - cam_y + LightGame::LevelRenderer::kTopBlackBorder; ctx.draw_line(Math::Vector2Int(0, sy), Math::Vector2Int(screen_width_, sy), grid_color); } } @@ -350,7 +338,7 @@ namespace LightGame { const Math::Vector2Int sp = level_.get_spawn_point(); const int32_t sx = sp.x - camera_.get_x(); - const int32_t sy = sp.y - camera_.get_y(); + const int32_t sy = sp.y - camera_.get_y() + LightGame::LevelRenderer::kTopBlackBorder; if (sx < -16 || sx > screen_width_ + 16 || sy < -16 || sy > screen_height_ + 16) return; const RenderData::Color color(0, 255, 0, 255); @@ -365,7 +353,7 @@ namespace LightGame const RenderData::BoundingBox2D box = obj->get_world_collider(); const int32_t sx = box.min.x - camera_.get_x(); - const int32_t sy = box.min.y - camera_.get_y(); + const int32_t sy = box.min.y - camera_.get_y() + LightGame::LevelRenderer::kTopBlackBorder; const int32_t w = box.max.x - box.min.x; const int32_t h = box.max.y - box.min.y; @@ -386,7 +374,7 @@ namespace LightGame { if (ImGui::MenuItem("New Level", "Ctrl+N")) { - new_level(25, 8, 32); + new_level(32, 18, 32); } if (ImGui::BeginMenu("Load Level")) { @@ -438,7 +426,9 @@ namespace LightGame if (current_tool_ == Tool::TileBrush) { ImGui::Text("Tile Type"); - const char* tile_names[] = { "Empty", "Ground Top", "Ground Fill", "Platform", "Spike" }; + const char* tile_names[] = { + "0 Empty", "1 Ground Top", "2 Ground Fill", "3 Platform", "4 Spike" + }; for (int i = 0; i < 5; ++i) { if (ImGui::RadioButton(tile_names[i], selected_tile_id_ == i)) @@ -451,11 +441,9 @@ namespace LightGame struct ObjEntry { GameObjectType type; const char* name; }; static const ObjEntry entries[] = { { GameObjectType::Player, "Player" }, - { GameObjectType::StaticPlatform, "Platform" }, { GameObjectType::LightPlatform, "Light Platform" }, { GameObjectType::ShadowPlatform, "Shadow Platform" }, { GameObjectType::Door, "Door" }, - { GameObjectType::Hazard, "Hazard" }, { GameObjectType::Collectible, "Collectible" }, { GameObjectType::Trigger, "Trigger" }, }; diff --git a/src/Apps/LightGame/src/engine/GameObject.h b/src/Apps/LightGame/src/engine/GameObject.h index e143ec6..2ad243e 100644 --- a/src/Apps/LightGame/src/engine/GameObject.h +++ b/src/Apps/LightGame/src/engine/GameObject.h @@ -10,10 +10,8 @@ namespace LightGame enum class GameObjectType { Player, - StaticPlatform, LightPlatform, ShadowPlatform, - Hazard, Collectible, Trigger, Door @@ -56,7 +54,7 @@ namespace LightGame GameObject() : id(0), - type(GameObjectType::StaticPlatform), + type(GameObjectType::Player), position(), velocity(), sprite(nullptr), diff --git a/src/Apps/LightGame/src/engine/LevelLoader.cpp b/src/Apps/LightGame/src/engine/LevelLoader.cpp index 9065566..9cc958c 100644 --- a/src/Apps/LightGame/src/engine/LevelLoader.cpp +++ b/src/Apps/LightGame/src/engine/LevelLoader.cpp @@ -20,6 +20,7 @@ namespace LightGame static const RenderData::Sprite spr_shadow_platform_on = MakeTileSprite(&tile_atlas_image, 8, 32, 4); static const RenderData::Sprite spr_door_closed = MakeTileSprite(&tile_atlas_image, 9, 32, 4); static const RenderData::Sprite spr_coin = MakeTileSprite(&tile_atlas_image, 11, 32, 4); + static const RenderData::Sprite spr_flag = MakeTileSprite(&tile_atlas_image, 12, 32, 4); static const RenderData::Sprite spr_checkpoint = MakeTileSprite(&tile_atlas_image, 13, 32, 4); } @@ -59,13 +60,6 @@ namespace LightGame switch (spawn.type) { - case GameObjectType::StaticPlatform: - obj.collider = RenderData::BoundingBox2D( - Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); - obj.solid = true; - obj.sprite = &spr_platform; - break; - case GameObjectType::LightPlatform: obj.collider = RenderData::BoundingBox2D( Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); @@ -90,14 +84,6 @@ namespace LightGame obj.sprite = &spr_door_closed; break; - case GameObjectType::Hazard: - obj.collider = RenderData::BoundingBox2D( - Math::Vector2Int(0, ts / 2), - Math::Vector2Int(ts, ts)); - obj.solid = false; - obj.sprite = &spr_spike; - break; - case GameObjectType::Collectible: obj.collider = RenderData::BoundingBox2D( Math::Vector2Int(ts / 4, ts / 4), @@ -117,12 +103,27 @@ namespace LightGame level.add_checkpoint(Checkpoint(obj.position.x, obj.position.y)); obj.sprite = &spr_checkpoint; } + else if (spawn.trigger_action == TriggerAction::LevelComplete) + { + obj.sprite = &spr_checkpoint; + } break; case GameObjectType::Player: obj.collider = RenderData::BoundingBox2D( Math::Vector2Int(8, 0), Math::Vector2Int(24, 32)); obj.solid = false; + { + GameObject marker; + marker.type = GameObjectType::Trigger; + marker.position = obj.position; + marker.collider = RenderData::BoundingBox2D( + Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); + marker.solid = false; + marker.trigger_action = TriggerAction::None; + marker.sprite = &spr_flag; + level.add_object(marker); + } break; default: @@ -137,4 +138,9 @@ namespace LightGame level.add_tile_light_rule(data.tile_light_rules[i]); } } + + const RenderData::Sprite& LevelLoader::flag_sprite() + { + return spr_flag; + } } diff --git a/src/Apps/LightGame/src/engine/LevelLoader.h b/src/Apps/LightGame/src/engine/LevelLoader.h index 88f3e59..c6ff0a3 100644 --- a/src/Apps/LightGame/src/engine/LevelLoader.h +++ b/src/Apps/LightGame/src/engine/LevelLoader.h @@ -2,6 +2,7 @@ #include "Level.h" #include "LevelData.h" +#include "Sprite.h" namespace LightGame { @@ -9,5 +10,6 @@ namespace LightGame { public: static void load(Level& level, const LevelData& data); + static const RenderData::Sprite& flag_sprite(); }; } diff --git a/src/Apps/LightGame/src/engine/LevelRenderer.cpp b/src/Apps/LightGame/src/engine/LevelRenderer.cpp index d4b3920..0d01167 100644 --- a/src/Apps/LightGame/src/engine/LevelRenderer.cpp +++ b/src/Apps/LightGame/src/engine/LevelRenderer.cpp @@ -11,8 +11,8 @@ namespace LightGame if (tilemap.tiles != nullptr && tilemap.atlas != nullptr) { ctx.draw_tilemap(tilemap, - 0, 0, - camera.get_screen_width(), camera.get_screen_height(), + 0, kTopBlackBorder, + camera.get_screen_width(), camera.get_screen_height() - kTopBlackBorder, camera.get_x(), camera.get_y()); } @@ -32,7 +32,7 @@ namespace LightGame } const int32_t screen_x = obj.position.x - camera.get_x(); - const int32_t screen_y = obj.position.y - camera.get_y(); + const int32_t screen_y = obj.position.y - camera.get_y() + kTopBlackBorder; if (screen_x + sprite->width < 0 || screen_x > camera.get_screen_width() || screen_y + sprite->height < 0 || screen_y > camera.get_screen_height()) @@ -83,12 +83,11 @@ namespace LightGame const RenderData::BoundingBox2D world = obj.get_world_collider(); const int32_t sx = world.min.x - camera.get_x(); - const int32_t sy = world.min.y - camera.get_y(); + const int32_t sy = world.min.y - camera.get_y() + kTopBlackBorder; const int32_t w = world.max.x - world.min.x; const int32_t h = world.max.y - world.min.y; RenderData::Color color = RenderData::Color::Green(); - if (obj.type == GameObjectType::Hazard) color = RenderData::Color::Red(); if (obj.type == GameObjectType::LightPlatform) color = RenderData::Color(255, 255, 0, 255); if (obj.type == GameObjectType::ShadowPlatform) color = RenderData::Color(128, 0, 255, 255); if (obj.type == GameObjectType::Door) color = RenderData::Color(0, 255, 255, 255); diff --git a/src/Apps/LightGame/src/engine/LevelRenderer.h b/src/Apps/LightGame/src/engine/LevelRenderer.h index 395ddf9..4ace605 100644 --- a/src/Apps/LightGame/src/engine/LevelRenderer.h +++ b/src/Apps/LightGame/src/engine/LevelRenderer.h @@ -19,6 +19,8 @@ namespace LightGame class LevelRenderer { public: + static const int32_t kTopBlackBorder = 24; + void draw(Core::DrawContext& ctx, const Level& level, const Camera2D& camera, const LightEffectSystem& light_system, uint16_t light_level); diff --git a/src/Apps/LightGame/src/engine/LightGameApp.cpp b/src/Apps/LightGame/src/engine/LightGameApp.cpp index 4f57b5e..d106ac3 100644 --- a/src/Apps/LightGame/src/engine/LightGameApp.cpp +++ b/src/Apps/LightGame/src/engine/LightGameApp.cpp @@ -9,6 +9,13 @@ #include "Level1Data.h" #include "Level2Data.h" #include "Level3Data.h" +#include "Level4Data.h" +#include "Level5Data.h" +#include "Level6Data.h" +#include "Level7Data.h" +#include "Level8Data.h" +#include "Level9Data.h" +#include "Level10Data.h" #include "sprite_atlas.h" #include "Tilemap.h" #include @@ -20,9 +27,16 @@ namespace LightGame const LevelData* kLevels[] = { &Level1::data, &Level2::data, - &Level3::data + &Level3::data, + &Level4::data, + &Level5::data, + &Level6::data, + &Level7::data, + &Level8::data, + &Level9::data, + &Level10::data }; - const int32_t kLevelCount = 3; + const int32_t kLevelCount = 10; } LightGameApp::LightGameApp( @@ -325,6 +339,8 @@ namespace LightGame break; } } + auto& mut_objects = level_.get_all_objects(); + mut_objects[i].sprite = &LevelLoader::flag_sprite(); break; } diff --git a/src/Apps/LightGame/src/engine/Physics2D.cpp b/src/Apps/LightGame/src/engine/Physics2D.cpp index 3cb0bb0..091497e 100644 --- a/src/Apps/LightGame/src/engine/Physics2D.cpp +++ b/src/Apps/LightGame/src/engine/Physics2D.cpp @@ -40,7 +40,16 @@ namespace LightGame } const uint16_t tile_id = tilemap.get_tile(tile_x, tile_y); - return tile_id != 0 && tile_id != RenderData::Tilemap::EmptyTile; + if (tile_id == 0 || tile_id == RenderData::Tilemap::EmptyTile) + { + return false; + } + // spike(4) 是杀伤物,不参与碰撞 — 玩家须能踩进去触发 check_death + if (tile_id == 4) + { + return false; + } + return true; } void Physics2D::collide_tilemap(GameObject& obj, const RenderData::Tilemap& tilemap, @@ -90,6 +99,7 @@ namespace LightGame obj.position.x += overlap_right; } obj.velocity.x = 0; + sub_pixel_x_ = 0; } else { @@ -103,6 +113,7 @@ namespace LightGame obj.position.y += overlap_bottom; obj.velocity.y = 0; } + sub_pixel_y_ = 0; } } } @@ -207,13 +218,17 @@ namespace LightGame const int32_t ts = tilemap.tile_w; const int32_t tile_left = feet.min.x / ts; const int32_t tile_right = (feet.max.x - 1) / ts; - const int32_t tile_y = feet.min.y / ts; + const int32_t tile_top = feet.min.y / ts; + const int32_t tile_bottom = (feet.max.y - 1) / ts; - for (int32_t tx = tile_left; tx <= tile_right; ++tx) + for (int32_t ty = tile_top; ty <= tile_bottom; ++ty) { - if (is_tile_solid(tilemap, tx, tile_y)) + for (int32_t tx = tile_left; tx <= tile_right; ++tx) { - return true; + if (is_tile_solid(tilemap, tx, ty)) + { + return true; + } } } } diff --git a/src/Apps/LightGame/src/engine/PlayerController.cpp b/src/Apps/LightGame/src/engine/PlayerController.cpp index 982482f..dd8259c 100644 --- a/src/Apps/LightGame/src/engine/PlayerController.cpp +++ b/src/Apps/LightGame/src/engine/PlayerController.cpp @@ -61,12 +61,15 @@ namespace LightGame update_input(keyboard, pointer, screen_width, screen_height); update_movement(obj, dt_ms); - physics.apply_gravity(obj, dt_ms); + if (!was_grounded_) + { + physics.apply_gravity(obj, dt_ms); + } physics.move_and_collide(obj, level, dt_ms); const bool grounded = physics.is_grounded(obj, level); - if (grounded && !was_grounded_ && obj.velocity.y >= 0) + if (grounded && obj.velocity.y >= 0) { obj.velocity.y = 0; } @@ -223,7 +226,7 @@ namespace LightGame } } - void PlayerController::check_death(GameObject& obj, Level& level) +void PlayerController::check_death(GameObject& obj, Level& level) { const LevelBounds& bounds = level.get_bounds(); if (obj.position.y > bounds.max_y) @@ -233,25 +236,38 @@ namespace LightGame return; } - const auto& all_objects = level.get_all_objects(); + const RenderData::Tilemap& tilemap = level.get_tilemap(); const RenderData::BoundingBox2D player_box = obj.get_world_collider(); - - for (size_t i = 0; i < all_objects.size(); ++i) + if (tilemap.tile_w > 0) { - const GameObject& other = all_objects[i]; - if (other.id == obj.id || !other.active) - { - continue; - } + const int32_t ts = tilemap.tile_w; + // Spike 视觉高度 14px,仅 tile 底部 14px 才算杀伤区 + const int32_t kSpikeHitHeight = 14; + const int32_t tile_left = player_box.min.x / ts; + const int32_t tile_right = (player_box.max.x - 1) / ts; + const int32_t tile_top = player_box.min.y / ts; + const int32_t tile_bottom = (player_box.max.y - 1) / ts; - if (other.type == GameObjectType::Hazard) + for (int32_t ty = tile_top; ty <= tile_bottom; ++ty) { - const RenderData::BoundingBox2D other_box = other.get_world_collider(); - if (aabb_overlap(player_box, other_box)) + for (int32_t tx = tile_left; tx <= tile_right; ++tx) { - state_ = PlayerState::Dead; - respawn_timer_ms_ = 0; - return; + if (tx < 0 || tx >= tilemap.width || ty < 0 || ty >= tilemap.height) + { + continue; + } + const uint16_t tile_id = tilemap.get_tile(tx, ty); + if (tile_id == 4) + { + const int32_t spike_top = (ty + 1) * ts - kSpikeHitHeight; + const int32_t spike_bottom = (ty + 1) * ts; + if (player_box.max.y > spike_top && player_box.min.y < spike_bottom) + { + state_ = PlayerState::Dead; + respawn_timer_ms_ = 0; + return; + } + } } } } diff --git a/src/Apps/LightGame/src/levels/Level10Data.h b/src/Apps/LightGame/src/levels/Level10Data.h new file mode 100644 index 0000000..49a9c8b --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level10Data.h @@ -0,0 +1,104 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level10 + { + // 终极之塔:综合最终关。三段、两个 Checkpoint。 + // 段 1:地面尖刺 + 光暗台错位 + 暗门(须切到 0-1023)。 + // 段 2:阶梯爬升,错位光暗台。 + // 段 3:顶板走廊,中间光门(1500-2500)+ 高速节奏跳到出口。 + static const int32_t kMapWidth = 50; + static const int32_t kMapHeight = 12; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + // 顶天墙 1:列 18 row 0..8 (仅 row 9 通道给暗门) + // 顶天墙 2:列 34 row 0..2 (仅 row 3 通道给中间光门,row 4 是门下挡板) + // 阶梯块:(32,4)(33,4) 单格 ground_fill 让玩家从段 2 跳到顶板高度 + // 顶板:row 4=ground_top, row 5=ground_fill (列 35..49),玩家走在 row 3 + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,2,1,1,4,4,4,4,4,4,4,4,4,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 9, 0, 0, TriggerAction::None, 0 }, + + // === 段 1(4-16)地面尖刺 + 光暗错位 === + { GameObjectType::ShadowPlatform, 5, 8, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 7, 7, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 9, 8, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 11, 7, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 13, 6, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 15, 7, 3072, 4095, TriggerAction::None, 0 }, + + // 暗门入口(须切到 0-1023) + { GameObjectType::Door, 18, 9, 0, 1023, TriggerAction::None, 0 }, + + // Checkpoint 1 + { GameObjectType::Trigger, 19, 9, 0, 0, TriggerAction::Checkpoint, 0 }, + + // === 段 2(20-31)阶梯爬升,错位切换 === + { GameObjectType::LightPlatform, 22, 7, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 24, 6, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 26, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 28, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 30, 5, 3072, 4095, TriggerAction::None, 0 }, + // 段 2 顶端阶梯:(32,4)(33,4) 是 tilemap 中的 ground_fill, + // 玩家立足 row 3 在阶梯顶部停留并切换光强。 + + // 中间光门:玩家走在 row 3,门挡在 (34,3) + { GameObjectType::Door, 34, 3, 1500, 2500, TriggerAction::None, 0 }, + + // Checkpoint 2(顶板入口) + { GameObjectType::Trigger, 36, 3, 0, 0, TriggerAction::Checkpoint, 0 }, + + // === 段 3(35-49)顶板走廊:浮空台节奏跳 === + { GameObjectType::ShadowPlatform, 39, 2, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 42, 1, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 45, 2, 0, 1023, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 7, 5, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 13, 4, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 26, 4, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 42, 0, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 45, 1, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 49, 3, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 25, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 9 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level1Data.h b/src/Apps/LightGame/src/levels/Level1Data.h index 435bf35..e9a51b4 100644 --- a/src/Apps/LightGame/src/levels/Level1Data.h +++ b/src/Apps/LightGame/src/levels/Level1Data.h @@ -18,7 +18,7 @@ namespace LightGame 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1, + 1,1,1,1,4,4,4,4,1,1,4,4,4,4,4,4,1,1,4,4,4,4,4,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 }; @@ -27,24 +27,7 @@ namespace LightGame { GameObjectType::Collectible, 5, 5, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 10, 4, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 18, 5, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 12, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 13, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 14, 6, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Trigger, 23, 5, 0, 0, TriggerAction::LevelComplete, 0 }, - { GameObjectType::Hazard, 4, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 6, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 5, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 7, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 10, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 11, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 15, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 18, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 19, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 20, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 20, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 21, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 21, 6, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::Hazard, 22, 6, 0, 0, TriggerAction::None, 0 }, }; static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); @@ -57,7 +40,7 @@ namespace LightGame &kAtlas, tile_atlas_columns, spawns, - 22, + 5, nullptr, 0, Math::Vector2Int(64, 160), diff --git a/src/Apps/LightGame/src/levels/Level4Data.h b/src/Apps/LightGame/src/levels/Level4Data.h new file mode 100644 index 0000000..8c55360 --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level4Data.h @@ -0,0 +1,71 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level4 + { + // 影中漫步:前半段须降到暗(0-1023)踩 ShadowPlatform, + // 中央安全岛切换光强,后半段须升到亮(3072-4095)踩 LightPlatform。 + // 地面间隙下方是 spike,掉下即死。 + static const int32_t kMapWidth = 25; + static const int32_t kMapHeight = 8; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,4,4,4,4,4,4,4,1,1,1,4,4,4,4,4,4,4,4,4,4,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 }, + + // 前半段:暗时实 + { GameObjectType::ShadowPlatform, 4, 4, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 6, 3, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 8, 4, 0, 1023, TriggerAction::None, 0 }, + + // 后半段:亮时实 + { GameObjectType::LightPlatform, 13, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 15, 3, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 17, 2, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 19, 3, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 21, 4, 3072, 4095, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 6, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 11, 5, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 17, 1, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 24, 5, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 13, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 5 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level5Data.h b/src/Apps/LightGame/src/levels/Level5Data.h new file mode 100644 index 0000000..61d3802 --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level5Data.h @@ -0,0 +1,73 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level5 + { + // 三色之门:必须依次通过 3 道光阈值不同的门。 + // 实心墙到顶,门是唯一通路。 + // 门 1:暗门(0-1023) + // 门 2:中间光门(1500-2500) + // 门 3:亮门(3300-4095) + // 每两段间留有空间和提示性平台供玩家手动调光。 + static const int32_t kMapWidth = 25; + static const int32_t kMapHeight = 8; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 3=platform 4=spike + // 墙体 y=0..4 顶天,y=5 留空作为门的通道,y=6 是 ground_top 玩家立足 + static const uint16_t tiles[] = { + 0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0, + 0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0, + 0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0, + 0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0, + 0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 }, + + // 三道门(站立层) + { GameObjectType::Door, 4, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::Door, 12, 5, 1500, 2500, TriggerAction::None, 0 }, + { GameObjectType::Door, 19, 5, 3300, 4095, TriggerAction::None, 0 }, + + // 中段提示:每段中央放对应阈值的浮空平台 + { GameObjectType::ShadowPlatform, 7, 3, 0, 1500, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 15, 3, 1500, 3000, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 22, 3, 3000, 4095, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 7, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 15, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 22, 2, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 24, 5, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 11, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 5 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level6Data.h b/src/Apps/LightGame/src/levels/Level6Data.h new file mode 100644 index 0000000..3b20577 --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level6Data.h @@ -0,0 +1,79 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level6 + { + // 刺影回廊:长尖刺走廊,依靠光感平台跳跃前进。 + // 光台与暗台错位排列,强迫玩家在跳跃中切换光强。 + // 此关引入 Checkpoint,约 1/2 处一个救援点。 + static const int32_t kMapWidth = 35; + static const int32_t kMapHeight = 8; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 }, + + // 第一段尖刺走廊:暗台与光台错位(玩家须在跳跃间切换) + { GameObjectType::ShadowPlatform, 5, 4, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 7, 3, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 9, 4, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 11, 3, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 13, 4, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 15, 3, 3072, 4095, TriggerAction::None, 0 }, + + // 中段安全岛 + Checkpoint + { GameObjectType::Trigger, 18, 5, 0, 0, TriggerAction::Checkpoint, 0 }, + + // 第二段更密:跳跃间隔更短 + { GameObjectType::LightPlatform, 21, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 23, 3, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 25, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 27, 3, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 29, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 31, 4, 0, 1023, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 7, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 13, 3, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 25, 3, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 31, 3, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 34, 5, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 19, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 5 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level7Data.h b/src/Apps/LightGame/src/levels/Level7Data.h new file mode 100644 index 0000000..72756b8 --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level7Data.h @@ -0,0 +1,80 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level7 + { + // 暗井攀登:垂直关卡,从底部 Z 字形爬升到顶部。 + // 光台与暗台交替排布,玩家须不断切换光强。 + // 中段 Checkpoint 作为安全点,顶部出口落在左侧。 + static const int32_t kMapWidth = 25; + static const int32_t kMapHeight = 12; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + // 顶台在 y=1(ground_top) / y=2(ground_fill),玩家从下方跳到顶台上方 y=0 站立。 + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 9, 0, 0, TriggerAction::None, 0 }, + + // Z 字形阶梯:右上方向爬升 + { GameObjectType::LightPlatform, 5, 9, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 8, 8, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 11, 7, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 14, 6, 0, 1023, TriggerAction::None, 0 }, + + // 中段 Checkpoint:站在亮光实台上 + { GameObjectType::LightPlatform, 17, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::Trigger, 17, 5, 0, 0, TriggerAction::Checkpoint, 0 }, + + // 上半段回头向左爬 + { GameObjectType::LightPlatform, 14, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 11, 3, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 8, 3, 3072, 4095, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 8, 7, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 17, 4, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 11, 2, 0, 0, TriggerAction::None, 0 }, + + // 顶部出口:站在顶台 ground_top 上方 + { GameObjectType::Trigger, 7, 0, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 14, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 9 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level8Data.h b/src/Apps/LightGame/src/levels/Level8Data.h new file mode 100644 index 0000000..c5ad194 --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level8Data.h @@ -0,0 +1,85 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level8 + { + // 双相迷宫:节奏跳 + 门锁 + 长尖刺综合关。 + // 三段式:spike 节奏 → 双门夹道(须切换光强通过)→ 长走廊高速切换。 + // Checkpoint 设在第二段后。 + static const int32_t kMapWidth = 40; + static const int32_t kMapHeight = 10; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + // 列 14 与列 24 是顶天实墙(仅留 y=7 一格作为门通道) + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,4,4,4,4,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,4,4,4,4,4,4,4,4,4,4,4,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 7, 0, 0, TriggerAction::None, 0 }, + + // 第一段:spike 4-7 节奏跳 + { GameObjectType::LightPlatform, 5, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 7, 5, 0, 1023, TriggerAction::None, 0 }, + + // 第一道暗门(站立层 14,7):暗光通过 + { GameObjectType::Door, 14, 7, 0, 1023, TriggerAction::None, 0 }, + + // 中段安全区 15-23 + { GameObjectType::Collectible, 18, 6, 0, 0, TriggerAction::None, 0 }, + + // 第二道亮门(24,7):亮光通过 + { GameObjectType::Door, 24, 7, 3072, 4095, TriggerAction::None, 0 }, + + // Checkpoint:刚过亮门 + { GameObjectType::Trigger, 25, 7, 0, 0, TriggerAction::Checkpoint, 0 }, + + // 第三段:spike 27-37 高速切换 + { GameObjectType::LightPlatform, 28, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 30, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 32, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 34, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 36, 6, 3072, 4095, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 5, 4, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 30, 3, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 36, 4, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 39, 7, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 16, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 7 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/src/Apps/LightGame/src/levels/Level9Data.h b/src/Apps/LightGame/src/levels/Level9Data.h new file mode 100644 index 0000000..672688d --- /dev/null +++ b/src/Apps/LightGame/src/levels/Level9Data.h @@ -0,0 +1,93 @@ +#pragma once + +#include "LevelData.h" +#include "tile_atlas.h" + +namespace LightGame +{ + namespace Level9 + { + // 光暗交界:综合挑战。三段,每段一个 Checkpoint。 + // 段 1:尖刺 + 阶梯,引入"中间光"门(1500-2500)。 + // 段 2:长尖刺走廊,光台暗台双层错位。 + // 段 3:双门夹道(暗 → 亮),失误重置回上一 CP。 + static const int32_t kMapWidth = 45; + static const int32_t kMapHeight = 10; + static const int32_t kTileSize = 32; + + // Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike + // 列 16、列 30 是顶天实墙(仅 y=7 通道) + static const uint16_t tiles[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,4,4,4,4,4,4,4,4,1,1,1,1,2,1,4,4,4,4,4,4,4,4,4,4,4,1,2,1,4,4,4,4,1,1,4,4,4,4,4,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + }; + + static const ObjectSpawn spawns[] = { + { GameObjectType::Player, 2, 7, 0, 0, TriggerAction::None, 0 }, + + // === 段 1(4-15) === + { GameObjectType::LightPlatform, 5, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 7, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 9, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 11, 5, 0, 1023, TriggerAction::None, 0 }, + + // 中间光门(须把光强调到中间区间) + { GameObjectType::Door, 16, 7, 1500, 2500, TriggerAction::None, 0 }, + + // 段 1 末尾 Checkpoint + { GameObjectType::Trigger, 17, 7, 0, 0, TriggerAction::Checkpoint, 0 }, + + // === 段 2(18-29)双层错位 === + { GameObjectType::LightPlatform, 19, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 21, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 23, 4, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 25, 5, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 27, 6, 3072, 4095, TriggerAction::None, 0 }, + + // 段 2 末尾 Checkpoint + { GameObjectType::Trigger, 29, 7, 0, 0, TriggerAction::Checkpoint, 0 }, + + // === 段 3(30-43)双门夹道 === + { GameObjectType::Door, 30, 7, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 33, 6, 0, 1023, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 35, 5, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::LightPlatform, 39, 6, 3072, 4095, TriggerAction::None, 0 }, + { GameObjectType::ShadowPlatform, 41, 5, 0, 1023, TriggerAction::None, 0 }, + + { GameObjectType::Collectible, 9, 4, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 23, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 35, 3, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 41, 3, 0, 0, TriggerAction::None, 0 }, + + { GameObjectType::Trigger, 44, 7, 0, 0, TriggerAction::LevelComplete, 0 }, + }; + + static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); + + static const LevelData data = { + tiles, + kMapWidth, + kMapHeight, + kTileSize, + &kAtlas, + tile_atlas_columns, + spawns, + 23, + nullptr, + 0, + Math::Vector2Int(2 * kTileSize, 7 * kTileSize), + 0, + 0, + kMapWidth * kTileSize, + kMapHeight * kTileSize + }; + } +} diff --git a/tests/game_engine_tests.cpp b/tests/game_engine_tests.cpp index c9ec62d..3832dbf 100644 --- a/tests/game_engine_tests.cpp +++ b/tests/game_engine_tests.cpp @@ -16,7 +16,7 @@ namespace { GameObject obj; assert(obj.id == 0); - assert(obj.type == GameObjectType::StaticPlatform); + assert(obj.type == GameObjectType::Player); assert(obj.position.x == 0); assert(obj.position.y == 0); assert(obj.velocity.x == 0); @@ -48,7 +48,7 @@ namespace assert(level.object_count() == 0); GameObject platform; - platform.type = GameObjectType::StaticPlatform; + platform.type = GameObjectType::Collectible; platform.position = Math::Vector2Int(0, 400); uint32_t id1 = level.add_object(platform); assert(id1 == 1); @@ -63,7 +63,7 @@ namespace const GameObject* found = level.get_object(id1); assert(found != nullptr); - assert(found->type == GameObjectType::StaticPlatform); + assert(found->type == GameObjectType::Collectible); assert(found->id == 1); const GameObject* not_found = level.get_object(999); @@ -88,7 +88,7 @@ namespace Level level; GameObject platform; - platform.type = GameObjectType::StaticPlatform; + platform.type = GameObjectType::Collectible; level.add_object(platform); GameObject light_plat; @@ -99,15 +99,15 @@ namespace player.type = GameObjectType::Player; level.add_object(player); - auto platforms = level.get_objects_by_type(GameObjectType::StaticPlatform); + auto platforms = level.get_objects_by_type(GameObjectType::Collectible); assert(platforms.size() == 1); - assert(platforms[0]->type == GameObjectType::StaticPlatform); + assert(platforms[0]->type == GameObjectType::Collectible); auto players = level.get_objects_by_type(GameObjectType::Player); assert(players.size() == 1); - auto hazards = level.get_objects_by_type(GameObjectType::Hazard); - assert(hazards.size() == 0); + auto doors = level.get_objects_by_type(GameObjectType::Door); + assert(doors.size() == 0); } void TestLevelQueryRegion() @@ -115,14 +115,14 @@ namespace Level level; GameObject obj1; - obj1.type = GameObjectType::StaticPlatform; + obj1.type = GameObjectType::Collectible; obj1.position = Math::Vector2Int(100, 100); obj1.collider = RenderData::BoundingBox2D( Math::Vector2Int(0, 0), Math::Vector2Int(32, 32)); level.add_object(obj1); GameObject obj2; - obj2.type = GameObjectType::StaticPlatform; + obj2.type = GameObjectType::Collectible; obj2.position = Math::Vector2Int(500, 500); obj2.collider = RenderData::BoundingBox2D( Math::Vector2Int(0, 0), Math::Vector2Int(32, 32)); @@ -226,7 +226,7 @@ namespace level.set_bounds(LevelBounds(0, 0, 800, 600)); GameObject ground; - ground.type = GameObjectType::StaticPlatform; + ground.type = GameObjectType::Collectible; ground.position = Math::Vector2Int(0, 400); ground.collider = RenderData::BoundingBox2D( Math::Vector2Int(0, 0), Math::Vector2Int(800, 32)); @@ -249,7 +249,8 @@ namespace void TestOneWayPlatform() { Level level; - level.set_bounds(LevelBounds(0, 0, 800, 600)); + LevelBounds bounds(0, 0, 800, 600); + level.set_bounds(bounds); GameObject platform; platform.type = GameObjectType::LightPlatform; @@ -349,17 +350,17 @@ namespace { LightEffectSystem system; - GameObject platform; - platform.type = GameObjectType::StaticPlatform; - platform.solid = true; + GameObject collectible; + collectible.type = GameObjectType::Collectible; + collectible.solid = true; - GameObject hazard; - hazard.type = GameObjectType::Hazard; - hazard.solid = true; + GameObject trigger; + trigger.type = GameObjectType::Trigger; + trigger.solid = true; std::vector objects; - objects.push_back(platform); - objects.push_back(hazard); + objects.push_back(collectible); + objects.push_back(trigger); system.update(objects, 0); assert(objects[0].solid == true); @@ -380,7 +381,7 @@ namespace const ObjectSpawn spawns[] = { { GameObjectType::Player, 1, 1, 0, 0, TriggerAction::None, 0 }, - { GameObjectType::StaticPlatform, 0, 2, 0, 0, TriggerAction::None, 0 }, + { GameObjectType::Collectible, 0, 2, 0, 0, TriggerAction::None, 0 }, }; const LevelData data = {