diff --git a/CMakeLists.txt b/CMakeLists.txt index f5695fa..5d24261 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,4 +27,5 @@ add_subdirectory(engine) add_subdirectory(test) add_subdirectory(demos/demo1-basicfeatures) -add_subdirectory(demos/demo2-arkanoid) \ No newline at end of file +add_subdirectory(demos/demo2-arkanoid) +add_subdirectory(demos/demo3-foodthrowing) \ No newline at end of file diff --git a/demos/demo2-arkanoid/src/main.cpp b/demos/demo2-arkanoid/src/main.cpp index 58a9ec3..2c64793 100644 --- a/demos/demo2-arkanoid/src/main.cpp +++ b/demos/demo2-arkanoid/src/main.cpp @@ -10,7 +10,7 @@ int main() { std::shared_ptr engine(new GBAEngine()); - ArkanoidGameScene* scene = new ArkanoidGameScene(engine); + auto scene = new ArkanoidGameScene(engine); engine->setScene(scene); while (true) { diff --git a/demos/demo3-foodthrowing/CMakeLists.txt b/demos/demo3-foodthrowing/CMakeLists.txt new file mode 100644 index 0000000..33d244f --- /dev/null +++ b/demos/demo3-foodthrowing/CMakeLists.txt @@ -0,0 +1,13 @@ +project(foodthrowing) + +add_executable(${PROJECT_NAME}.elf + src/main.cpp + src/food_scene.cpp + src/food_scene.h + src/avatar.h src/bullet.h) + +target_link_libraries(${PROJECT_NAME}.elf gba-sprite-engine) + +add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -v -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.gba + ) diff --git a/demos/demo3-foodthrowing/avatar.png b/demos/demo3-foodthrowing/avatar.png new file mode 100644 index 0000000..0fce9e8 Binary files /dev/null and b/demos/demo3-foodthrowing/avatar.png differ diff --git a/demos/demo3-foodthrowing/src/avatar.h b/demos/demo3-foodthrowing/src/avatar.h new file mode 100644 index 0000000..5caa6e0 --- /dev/null +++ b/demos/demo3-foodthrowing/src/avatar.h @@ -0,0 +1,724 @@ +/* avatar.h + * generated by png2gba program */ + +#define avatar_width 64 +#define avatar_height 128 + +const unsigned char avatar_data [] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x05, 0x05, + 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, 0x09, 0x09, 0x0A, 0x0A, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x03, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x0B, 0x0B, + 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x0A, 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, + 0x09, 0x09, 0x0A, 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0C, 0x0C, + 0x0A, 0x0A, 0x0E, 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0B, 0x0B, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0B, 0x0B, 0x0C, 0x0C, 0x0A, 0x0A, + 0x09, 0x09, 0x0F, 0x0F, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x09, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x01, 0x01, + 0x08, 0x08, 0x03, 0x03, 0x05, 0x05, 0x03, 0x03, 0x08, 0x08, 0x03, 0x03, + 0x05, 0x05, 0x03, 0x03, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x08, 0x08, + 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x03, 0x03, 0x01, 0x01, 0x10, 0x10, + 0x11, 0x11, 0x03, 0x03, 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x04, 0x04, + 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x04, 0x04, 0x01, 0x01, 0x10, 0x10, + 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x07, 0x07, 0x09, 0x09, 0x0A, 0x0A, + 0x12, 0x12, 0x08, 0x08, 0x07, 0x07, 0x0F, 0x0F, 0x12, 0x12, 0x08, 0x08, + 0x07, 0x07, 0x0F, 0x0F, 0x08, 0x08, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, + 0x08, 0x08, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x05, 0x05, 0x03, 0x03, + 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x07, 0x07, 0x05, 0x05, + 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x07, 0x07, 0x0D, 0x0D, 0x0C, 0x0C, + 0x0A, 0x0A, 0x0E, 0x0E, 0x0E, 0x0E, 0x12, 0x12, 0x09, 0x09, 0x07, 0x07, + 0x0E, 0x0E, 0x12, 0x12, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x0F, 0x0F, 0x0B, 0x0B, 0x0B, 0x0B, 0x07, 0x07, 0x0F, 0x0F, 0x0B, 0x0B, + 0x0B, 0x0B, 0x07, 0x07, 0x05, 0x05, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x0B, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x13, 0x13, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x13, 0x13, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x04, 0x04, 0x07, 0x07, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, + 0x03, 0x03, 0x04, 0x04, 0x0B, 0x0B, 0x04, 0x04, 0x0B, 0x0B, 0x04, 0x04, + 0x0B, 0x0B, 0x04, 0x04, 0x0B, 0x0B, 0x04, 0x04, 0x0B, 0x0B, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, + 0x08, 0x08, 0x03, 0x03, 0x05, 0x05, 0x02, 0x02, 0x08, 0x08, 0x03, 0x03, + 0x05, 0x05, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x02, 0x02, 0x10, 0x10, + 0x03, 0x03, 0x04, 0x04, 0x02, 0x02, 0x10, 0x10, 0x11, 0x11, 0x03, 0x03, + 0x10, 0x10, 0x02, 0x02, 0x11, 0x11, 0x03, 0x03, 0x10, 0x10, 0x02, 0x02, + 0x12, 0x12, 0x12, 0x12, 0x0B, 0x0B, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, 0x01, + 0x02, 0x02, 0x11, 0x11, 0x10, 0x10, 0x01, 0x01, 0x02, 0x02, 0x11, 0x11, + 0x10, 0x10, 0x01, 0x01, 0x11, 0x11, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, + 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x05, 0x05, + 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x05, 0x05, 0x01, 0x01, 0x10, 0x10, + 0x04, 0x04, 0x03, 0x03, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x03, 0x03, + 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x08, 0x01, 0x01, 0x10, 0x10, + 0x04, 0x04, 0x08, 0x08, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x07, 0x07, 0x08, 0x08, 0x07, 0x07, + 0x08, 0x08, 0x05, 0x05, 0x08, 0x08, 0x07, 0x07, 0x08, 0x08, 0x05, 0x05, + 0x07, 0x07, 0x09, 0x09, 0x0E, 0x0E, 0x13, 0x13, 0x07, 0x07, 0x09, 0x09, + 0x0E, 0x0E, 0x13, 0x13, 0x0F, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0F, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0F, 0x0C, 0x0C, + 0x14, 0x14, 0x15, 0x15, 0x05, 0x05, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x0B, + 0x13, 0x13, 0x05, 0x05, 0x08, 0x08, 0x07, 0x07, 0x13, 0x13, 0x05, 0x05, + 0x08, 0x08, 0x07, 0x07, 0x13, 0x13, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, + 0x13, 0x13, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x13, 0x13, + 0x09, 0x09, 0x09, 0x09, 0x0E, 0x0E, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, + 0x0C, 0x0C, 0x0A, 0x0A, 0x13, 0x13, 0x07, 0x07, 0x0B, 0x0B, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x13, 0x13, 0x0E, 0x0E, 0x0F, 0x0F, 0x13, 0x13, + 0x13, 0x13, 0x0E, 0x0E, 0x0F, 0x0F, 0x13, 0x13, 0x0E, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0x13, 0x13, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x13, 0x13, + 0x09, 0x09, 0x09, 0x09, 0x13, 0x13, 0x0E, 0x0E, 0x09, 0x09, 0x09, 0x09, + 0x13, 0x13, 0x0E, 0x0E, 0x07, 0x07, 0x13, 0x13, 0x0A, 0x0A, 0x0C, 0x0C, + 0x12, 0x12, 0x12, 0x12, 0x0B, 0x0B, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x0B, 0x0B, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0B, 0x0B, + 0x13, 0x13, 0x0E, 0x0E, 0x09, 0x09, 0x07, 0x07, 0x13, 0x13, 0x0E, 0x0E, + 0x09, 0x09, 0x07, 0x07, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0C, 0x0F, 0x0F, + 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0C, 0x0F, 0x0F, 0x15, 0x15, 0x14, 0x14, + 0x0C, 0x0C, 0x0F, 0x0F, 0x11, 0x11, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, + 0x04, 0x04, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, 0x04, 0x04, 0x04, 0x04, + 0x10, 0x10, 0x01, 0x01, 0x05, 0x05, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, + 0x05, 0x05, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, 0x03, 0x03, 0x04, 0x04, + 0x10, 0x10, 0x01, 0x01, 0x03, 0x03, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, + 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x08, + 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x08, 0x01, 0x01, 0x10, 0x10, + 0x04, 0x04, 0x08, 0x08, 0x0E, 0x0E, 0x0B, 0x0B, 0x04, 0x04, 0x08, 0x08, + 0x0E, 0x0E, 0x0B, 0x0B, 0x04, 0x04, 0x08, 0x08, 0x0E, 0x0E, 0x0B, 0x0B, + 0x16, 0x16, 0x0E, 0x0E, 0x0E, 0x0E, 0x0B, 0x0B, 0x16, 0x16, 0x0E, 0x0E, + 0x07, 0x07, 0x0B, 0x0B, 0x17, 0x17, 0x0E, 0x0E, 0x0F, 0x0F, 0x0C, 0x0C, + 0x14, 0x14, 0x15, 0x15, 0x0E, 0x0E, 0x15, 0x15, 0x18, 0x18, 0x18, 0x18, + 0x0E, 0x0E, 0x15, 0x15, 0x18, 0x18, 0x18, 0x18, 0x11, 0x11, 0x11, 0x11, + 0x05, 0x05, 0x13, 0x13, 0x11, 0x11, 0x11, 0x11, 0x05, 0x05, 0x13, 0x13, + 0x12, 0x12, 0x03, 0x03, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x03, 0x03, + 0x11, 0x11, 0x11, 0x11, 0x08, 0x08, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, + 0x0C, 0x0C, 0x0A, 0x0A, 0x13, 0x13, 0x07, 0x07, 0x15, 0x15, 0x15, 0x15, + 0x0C, 0x0C, 0x1C, 0x1C, 0x15, 0x15, 0x15, 0x15, 0x0C, 0x0C, 0x1C, 0x1C, + 0x1D, 0x1D, 0x18, 0x18, 0x0A, 0x0A, 0x1E, 0x1E, 0x1D, 0x1D, 0x18, 0x18, + 0x0A, 0x0A, 0x1E, 0x1E, 0x11, 0x11, 0x01, 0x01, 0x03, 0x03, 0x09, 0x09, + 0x11, 0x11, 0x01, 0x01, 0x03, 0x03, 0x09, 0x09, 0x01, 0x01, 0x01, 0x01, + 0x04, 0x04, 0x05, 0x05, 0x07, 0x07, 0x13, 0x13, 0x0A, 0x0A, 0x0C, 0x0C, + 0x1C, 0x1C, 0x0C, 0x0C, 0x15, 0x15, 0x15, 0x15, 0x1C, 0x1C, 0x0C, 0x0C, + 0x15, 0x15, 0x15, 0x15, 0x1E, 0x1E, 0x0A, 0x0A, 0x18, 0x18, 0x0F, 0x0F, + 0x1E, 0x1E, 0x0A, 0x0A, 0x18, 0x18, 0x0F, 0x0F, 0x09, 0x09, 0x03, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x09, 0x09, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x04, 0x04, 0x01, 0x01, 0x1F, 0x1F, 0x15, 0x15, 0x14, 0x14, + 0x0C, 0x0C, 0x0F, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x01, 0x01, 0x11, 0x11, + 0x0F, 0x0F, 0x05, 0x05, 0x01, 0x01, 0x11, 0x11, 0x01, 0x01, 0x11, 0x11, + 0x08, 0x08, 0x12, 0x12, 0x01, 0x01, 0x11, 0x11, 0x08, 0x08, 0x12, 0x12, + 0x01, 0x01, 0x11, 0x11, 0x03, 0x03, 0x0E, 0x0E, 0x01, 0x01, 0x11, 0x11, + 0x03, 0x03, 0x0E, 0x0E, 0x1A, 0x1A, 0x1B, 0x1B, 0x01, 0x01, 0x08, 0x08, + 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, 0x08, 0x08, 0x04, 0x04, + 0x10, 0x10, 0x01, 0x01, 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, 0x01, + 0x08, 0x08, 0x04, 0x04, 0x0B, 0x0B, 0x0E, 0x0E, 0x08, 0x08, 0x04, 0x04, + 0x0B, 0x0B, 0x0E, 0x0E, 0x07, 0x07, 0x16, 0x16, 0x0B, 0x0B, 0x0E, 0x0E, + 0x07, 0x07, 0x16, 0x16, 0x0B, 0x0B, 0x0E, 0x0E, 0x0E, 0x0E, 0x17, 0x17, + 0x0B, 0x0B, 0x07, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x07, 0x07, 0x0B, 0x0B, 0x17, 0x17, 0x0E, 0x0E, 0x0B, 0x0B, 0x03, 0x03, + 0x12, 0x12, 0x0E, 0x0E, 0x0B, 0x0B, 0x03, 0x03, 0x12, 0x12, 0x0E, 0x0E, + 0x12, 0x12, 0x03, 0x03, 0x12, 0x12, 0x1C, 0x1C, 0x12, 0x12, 0x03, 0x03, + 0x12, 0x12, 0x1C, 0x1C, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x0C, + 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x0C, 0x01, 0x01, 0x03, 0x03, + 0x12, 0x12, 0x13, 0x13, 0x08, 0x08, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, + 0x07, 0x07, 0x09, 0x09, 0x14, 0x14, 0x09, 0x09, 0x07, 0x07, 0x09, 0x09, + 0x14, 0x14, 0x09, 0x09, 0x1C, 0x1C, 0x0A, 0x0A, 0x09, 0x09, 0x07, 0x07, + 0x1C, 0x1C, 0x0A, 0x0A, 0x09, 0x09, 0x07, 0x07, 0x1D, 0x1D, 0x14, 0x14, + 0x1D, 0x1D, 0x0D, 0x0D, 0x1D, 0x1D, 0x14, 0x14, 0x1D, 0x1D, 0x0D, 0x0D, + 0x09, 0x09, 0x0A, 0x0A, 0x1C, 0x1C, 0x14, 0x14, 0x01, 0x01, 0x01, 0x01, + 0x04, 0x04, 0x05, 0x05, 0x0B, 0x0B, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x0C, + 0x0B, 0x0B, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x0C, 0x09, 0x09, 0x0C, 0x0C, + 0x09, 0x09, 0x1E, 0x1E, 0x09, 0x09, 0x0C, 0x0C, 0x09, 0x09, 0x1E, 0x1E, + 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x18, 0x18, + 0x15, 0x15, 0x18, 0x18, 0x20, 0x20, 0x1D, 0x1D, 0x1C, 0x1C, 0x21, 0x21, + 0x05, 0x05, 0x04, 0x04, 0x01, 0x01, 0x1F, 0x1F, 0x0C, 0x0C, 0x07, 0x07, + 0x03, 0x03, 0x0B, 0x0B, 0x0C, 0x0C, 0x07, 0x07, 0x03, 0x03, 0x0B, 0x0B, + 0x1E, 0x1E, 0x09, 0x09, 0x0C, 0x0C, 0x09, 0x09, 0x1E, 0x1E, 0x09, 0x09, + 0x0C, 0x0C, 0x09, 0x09, 0x18, 0x18, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, + 0x18, 0x18, 0x15, 0x15, 0x18, 0x18, 0x15, 0x15, 0x22, 0x22, 0x1C, 0x1C, + 0x1D, 0x1D, 0x20, 0x20, 0x1A, 0x1A, 0x1B, 0x1B, 0x01, 0x01, 0x08, 0x08, + 0x09, 0x09, 0x14, 0x14, 0x09, 0x09, 0x07, 0x07, 0x09, 0x09, 0x14, 0x14, + 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x0A, 0x0A, 0x1C, 0x1C, + 0x07, 0x07, 0x09, 0x09, 0x0A, 0x0A, 0x1C, 0x1C, 0x0D, 0x0D, 0x1D, 0x1D, + 0x14, 0x14, 0x1D, 0x1D, 0x0D, 0x0D, 0x1D, 0x1D, 0x14, 0x14, 0x1D, 0x1D, + 0x14, 0x14, 0x1C, 0x1C, 0x0A, 0x0A, 0x09, 0x09, 0x0E, 0x0E, 0x17, 0x17, + 0x0B, 0x0B, 0x07, 0x07, 0x0E, 0x0E, 0x12, 0x12, 0x03, 0x03, 0x0B, 0x0B, + 0x0E, 0x0E, 0x12, 0x12, 0x03, 0x03, 0x0B, 0x0B, 0x1C, 0x1C, 0x12, 0x12, + 0x03, 0x03, 0x12, 0x12, 0x1C, 0x1C, 0x12, 0x12, 0x03, 0x03, 0x12, 0x12, + 0x0C, 0x0C, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x0C, 0x07, 0x07, + 0x03, 0x03, 0x07, 0x07, 0x13, 0x13, 0x12, 0x12, 0x03, 0x03, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, + 0x12, 0x12, 0x13, 0x13, 0x01, 0x01, 0x03, 0x03, 0x08, 0x08, 0x0F, 0x0F, + 0x01, 0x01, 0x03, 0x03, 0x08, 0x08, 0x0F, 0x0F, 0x01, 0x01, 0x01, 0x01, + 0x08, 0x08, 0x0E, 0x0E, 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x0E, 0x0E, + 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x0D, 0x0D, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x03, 0x0D, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x09, 0x09, + 0x09, 0x09, 0x0A, 0x0A, 0x1C, 0x1C, 0x14, 0x14, 0x13, 0x13, 0x0A, 0x0A, + 0x14, 0x14, 0x23, 0x23, 0x13, 0x13, 0x0A, 0x0A, 0x14, 0x14, 0x23, 0x23, + 0x0F, 0x0F, 0x1C, 0x1C, 0x18, 0x18, 0x15, 0x15, 0x0F, 0x0F, 0x1C, 0x1C, + 0x18, 0x18, 0x15, 0x15, 0x0F, 0x0F, 0x15, 0x15, 0x1E, 0x1E, 0x0A, 0x0A, + 0x0F, 0x0F, 0x15, 0x15, 0x1E, 0x1E, 0x0A, 0x0A, 0x13, 0x13, 0x1C, 0x1C, + 0x15, 0x15, 0x0C, 0x0C, 0x20, 0x20, 0x1D, 0x1D, 0x1C, 0x1C, 0x21, 0x21, + 0x1C, 0x1C, 0x09, 0x09, 0x0F, 0x0F, 0x24, 0x24, 0x1C, 0x1C, 0x09, 0x09, + 0x0F, 0x0F, 0x24, 0x24, 0x13, 0x13, 0x05, 0x05, 0x08, 0x08, 0x12, 0x12, + 0x13, 0x13, 0x05, 0x05, 0x08, 0x08, 0x12, 0x12, 0x0C, 0x0C, 0x1D, 0x1D, + 0x0A, 0x0A, 0x13, 0x13, 0x0C, 0x0C, 0x1D, 0x1D, 0x0A, 0x0A, 0x13, 0x13, + 0x1C, 0x1C, 0x1E, 0x1E, 0x23, 0x23, 0x1C, 0x1C, 0x22, 0x22, 0x1C, 0x1C, + 0x1D, 0x1D, 0x20, 0x20, 0x24, 0x24, 0x0F, 0x0F, 0x09, 0x09, 0x1C, 0x1C, + 0x24, 0x24, 0x0F, 0x0F, 0x09, 0x09, 0x1C, 0x1C, 0x12, 0x12, 0x08, 0x08, + 0x05, 0x05, 0x13, 0x13, 0x12, 0x12, 0x08, 0x08, 0x05, 0x05, 0x13, 0x13, + 0x13, 0x13, 0x0A, 0x0A, 0x1D, 0x1D, 0x0C, 0x0C, 0x13, 0x13, 0x0A, 0x0A, + 0x1D, 0x1D, 0x0C, 0x0C, 0x1C, 0x1C, 0x23, 0x23, 0x1E, 0x1E, 0x1C, 0x1C, + 0x14, 0x14, 0x1C, 0x1C, 0x0A, 0x0A, 0x09, 0x09, 0x23, 0x23, 0x14, 0x14, + 0x0A, 0x0A, 0x13, 0x13, 0x23, 0x23, 0x14, 0x14, 0x0A, 0x0A, 0x13, 0x13, + 0x15, 0x15, 0x18, 0x18, 0x1C, 0x1C, 0x0F, 0x0F, 0x15, 0x15, 0x18, 0x18, + 0x1C, 0x1C, 0x0F, 0x0F, 0x0A, 0x0A, 0x1E, 0x1E, 0x15, 0x15, 0x0F, 0x0F, + 0x0A, 0x0A, 0x1E, 0x1E, 0x15, 0x15, 0x0F, 0x0F, 0x0C, 0x0C, 0x15, 0x15, + 0x1C, 0x1C, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x03, 0x03, 0x01, 0x01, + 0x0F, 0x0F, 0x08, 0x08, 0x03, 0x03, 0x01, 0x01, 0x0F, 0x0F, 0x08, 0x08, + 0x03, 0x03, 0x01, 0x01, 0x0E, 0x0E, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x0E, 0x0E, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, 0x03, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x09, 0x09, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x09, 0x09, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x13, 0x13, 0x1C, 0x1C, + 0x15, 0x15, 0x0C, 0x0C, 0x09, 0x09, 0x0D, 0x0D, 0x1C, 0x1C, 0x07, 0x07, + 0x09, 0x09, 0x0D, 0x0D, 0x1C, 0x1C, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, + 0x0D, 0x0D, 0x0D, 0x0D, 0x07, 0x07, 0x0E, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0B, 0x0B, 0x0F, 0x0F, 0x0C, 0x0C, 0x1D, 0x1D, 0x0B, 0x0B, 0x0F, 0x0F, + 0x0C, 0x0C, 0x1D, 0x1D, 0x01, 0x01, 0x0B, 0x0B, 0x13, 0x13, 0x0C, 0x0C, + 0x1C, 0x1C, 0x1E, 0x1E, 0x23, 0x23, 0x1C, 0x1C, 0x08, 0x08, 0x25, 0x25, + 0x25, 0x25, 0x25, 0x25, 0x08, 0x08, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x0D, 0x0D, 0x1C, 0x1C, 0x15, 0x15, 0x26, 0x26, 0x0D, 0x0D, 0x1C, 0x1C, + 0x15, 0x15, 0x26, 0x26, 0x0D, 0x0D, 0x09, 0x09, 0x07, 0x07, 0x06, 0x06, + 0x0D, 0x0D, 0x09, 0x09, 0x07, 0x07, 0x06, 0x06, 0x1D, 0x1D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x15, 0x15, 0x1C, 0x1C, 0x23, 0x23, 0x1E, 0x1E, 0x1C, 0x1C, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x08, 0x08, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x25, 0x08, 0x08, 0x26, 0x26, 0x15, 0x15, 0x1C, 0x1C, 0x0D, 0x0D, + 0x26, 0x26, 0x15, 0x15, 0x1C, 0x1C, 0x0D, 0x0D, 0x06, 0x06, 0x07, 0x07, + 0x09, 0x09, 0x0D, 0x0D, 0x06, 0x06, 0x07, 0x07, 0x09, 0x09, 0x0D, 0x0D, + 0x15, 0x15, 0x0D, 0x0D, 0x0D, 0x0D, 0x1D, 0x1D, 0x0C, 0x0C, 0x15, 0x15, + 0x1C, 0x1C, 0x13, 0x13, 0x07, 0x07, 0x1C, 0x1C, 0x0D, 0x0D, 0x09, 0x09, + 0x07, 0x07, 0x1C, 0x1C, 0x0D, 0x0D, 0x09, 0x09, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0E, 0x0E, 0x07, 0x07, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x07, 0x07, + 0x1D, 0x1D, 0x0C, 0x0C, 0x0F, 0x0F, 0x0B, 0x0B, 0x1D, 0x1D, 0x0C, 0x0C, + 0x0F, 0x0F, 0x0B, 0x0B, 0x0C, 0x0C, 0x13, 0x13, 0x0B, 0x0B, 0x01, 0x01, + 0x09, 0x09, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x12, 0x12, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0B, 0x0B, 0x13, 0x13, 0x0C, 0x0C, + 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, + 0x05, 0x05, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1D, 0x1D, 0x0D, 0x0D, + 0x0D, 0x0D, 0x15, 0x15, 0x0E, 0x0E, 0x1C, 0x1C, 0x15, 0x15, 0x23, 0x23, + 0x0E, 0x0E, 0x1C, 0x1C, 0x15, 0x15, 0x23, 0x23, 0x0B, 0x0B, 0x07, 0x07, + 0x13, 0x13, 0x13, 0x13, 0x0B, 0x0B, 0x07, 0x07, 0x13, 0x13, 0x13, 0x13, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x15, 0x15, 0x0D, 0x0D, 0x0D, 0x0D, 0x1D, 0x1D, 0x23, 0x23, 0x15, 0x15, + 0x1C, 0x1C, 0x0E, 0x0E, 0x23, 0x23, 0x15, 0x15, 0x1C, 0x1C, 0x0E, 0x0E, + 0x13, 0x13, 0x13, 0x13, 0x07, 0x07, 0x0B, 0x0B, 0x13, 0x13, 0x13, 0x13, + 0x07, 0x07, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x0C, 0x0C, 0x13, 0x13, 0x0B, 0x0B, 0x01, 0x01, + 0x12, 0x12, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x12, 0x12, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x08, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, + 0x04, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x04, 0x04, 0x03, 0x03, 0x03, + 0x02, 0x03, 0x03, 0x05, 0x05, 0x03, 0x03, 0x0B, 0x02, 0x03, 0x03, 0x05, + 0x05, 0x03, 0x03, 0x0B, 0x03, 0x08, 0x08, 0x07, 0x07, 0x0F, 0x0F, 0x0A, + 0x03, 0x08, 0x08, 0x07, 0x07, 0x0F, 0x0F, 0x0A, 0x08, 0x12, 0x12, 0x08, + 0x08, 0x07, 0x07, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x03, 0x03, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x0B, + 0x0B, 0x08, 0x08, 0x08, 0x0B, 0x07, 0x07, 0x0A, 0x0A, 0x0E, 0x0E, 0x0C, + 0x0B, 0x07, 0x07, 0x0A, 0x0A, 0x0E, 0x0E, 0x0C, 0x0A, 0x0D, 0x0D, 0x0C, + 0x0C, 0x13, 0x13, 0x0E, 0x0A, 0x0D, 0x0D, 0x0C, 0x0C, 0x13, 0x13, 0x0E, + 0x0F, 0x0E, 0x0E, 0x12, 0x12, 0x09, 0x09, 0x07, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0B, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0B, 0x0C, 0x0C, 0x0C, 0x0E, + 0x0E, 0x09, 0x09, 0x0F, 0x0C, 0x0C, 0x0C, 0x0E, 0x0E, 0x09, 0x09, 0x0F, + 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x0E, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x13, 0x13, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0B, 0x03, 0x03, 0x03, + 0x03, 0x04, 0x04, 0x01, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x01, + 0x0F, 0x08, 0x08, 0x03, 0x03, 0x05, 0x05, 0x03, 0x0F, 0x08, 0x08, 0x03, + 0x03, 0x05, 0x05, 0x03, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x05, + 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x05, 0x08, 0x08, 0x08, 0x03, + 0x03, 0x05, 0x05, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x04, 0x04, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x05, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x08, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x03, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x11, 0x11, 0x03, 0x01, 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x04, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x11, 0x11, 0x04, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x04, 0x04, 0x04, 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x04, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x05, 0x08, 0x12, 0x12, 0x08, + 0x08, 0x07, 0x07, 0x0F, 0x03, 0x08, 0x08, 0x03, 0x03, 0x07, 0x07, 0x0F, + 0x03, 0x08, 0x08, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x04, 0x05, 0x05, 0x03, + 0x03, 0x07, 0x07, 0x05, 0x04, 0x05, 0x05, 0x03, 0x03, 0x07, 0x07, 0x05, + 0x04, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x07, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x05, 0x05, 0x07, 0x05, 0x08, 0x08, 0x07, 0x07, 0x08, 0x08, 0x05, + 0x0F, 0x0E, 0x0E, 0x12, 0x12, 0x09, 0x09, 0x07, 0x0F, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x05, 0x0F, 0x0F, 0x0B, 0x0B, 0x0B, 0x0B, 0x07, 0x05, 0x0F, 0x0F, 0x0B, + 0x0B, 0x0B, 0x0B, 0x07, 0x07, 0x05, 0x05, 0x0B, 0x0B, 0x08, 0x08, 0x0B, + 0x07, 0x05, 0x05, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x05, 0x13, 0x13, 0x05, + 0x05, 0x08, 0x08, 0x07, 0x07, 0x13, 0x13, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x04, 0x04, 0x07, 0x07, 0x03, 0x03, 0x04, 0x07, 0x04, 0x04, 0x07, + 0x07, 0x03, 0x03, 0x04, 0x07, 0x0B, 0x0B, 0x04, 0x04, 0x0B, 0x0B, 0x04, + 0x07, 0x0B, 0x0B, 0x04, 0x04, 0x0B, 0x0B, 0x04, 0x0B, 0x0B, 0x0B, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x0B, 0x0B, 0x0B, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x13, 0x13, 0x0E, 0x0E, 0x0F, 0x0F, 0x13, 0x08, 0x08, 0x08, 0x03, + 0x03, 0x05, 0x05, 0x02, 0x04, 0x03, 0x03, 0x04, 0x04, 0x02, 0x02, 0x10, + 0x04, 0x03, 0x03, 0x04, 0x04, 0x02, 0x02, 0x10, 0x04, 0x11, 0x11, 0x03, + 0x03, 0x10, 0x10, 0x02, 0x04, 0x11, 0x11, 0x03, 0x03, 0x10, 0x10, 0x02, + 0x07, 0x12, 0x12, 0x12, 0x12, 0x0B, 0x0B, 0x04, 0x07, 0x12, 0x12, 0x12, + 0x12, 0x0B, 0x0B, 0x04, 0x13, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0B, + 0x02, 0x02, 0x02, 0x10, 0x10, 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, + 0x02, 0x02, 0x02, 0x11, 0x11, 0x10, 0x10, 0x01, 0x02, 0x02, 0x02, 0x11, + 0x11, 0x10, 0x10, 0x01, 0x04, 0x11, 0x11, 0x04, 0x04, 0x10, 0x10, 0x01, + 0x04, 0x11, 0x11, 0x04, 0x04, 0x10, 0x10, 0x01, 0x0B, 0x04, 0x04, 0x04, + 0x04, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x05, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x04, 0x04, 0x03, 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x03, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x04, 0x04, 0x08, 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x04, 0x04, 0x08, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x04, 0x04, 0x08, 0x05, 0x08, 0x08, 0x07, 0x07, 0x08, 0x08, 0x05, + 0x03, 0x07, 0x07, 0x09, 0x09, 0x0E, 0x0E, 0x13, 0x03, 0x07, 0x07, 0x09, + 0x09, 0x0E, 0x0E, 0x13, 0x08, 0x0F, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, + 0x08, 0x0F, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x08, 0x0F, 0x0F, 0x0C, + 0x0C, 0x14, 0x14, 0x15, 0x08, 0x0F, 0x0F, 0x0C, 0x0C, 0x14, 0x14, 0x15, + 0x08, 0x0E, 0x0E, 0x15, 0x15, 0x18, 0x18, 0x18, 0x05, 0x13, 0x13, 0x05, + 0x05, 0x08, 0x08, 0x07, 0x13, 0x13, 0x13, 0x0E, 0x0E, 0x1C, 0x1C, 0x15, + 0x13, 0x13, 0x13, 0x0E, 0x0E, 0x1C, 0x1C, 0x15, 0x0D, 0x0E, 0x0E, 0x1C, + 0x1C, 0x09, 0x09, 0x09, 0x0D, 0x0E, 0x0E, 0x1C, 0x1C, 0x09, 0x09, 0x09, + 0x15, 0x0C, 0x0C, 0x0A, 0x0A, 0x13, 0x13, 0x1C, 0x15, 0x0C, 0x0C, 0x0A, + 0x0A, 0x13, 0x13, 0x1C, 0x18, 0x15, 0x15, 0x1C, 0x1C, 0x0E, 0x0E, 0x1C, + 0x07, 0x13, 0x13, 0x0E, 0x0E, 0x0F, 0x0F, 0x13, 0x15, 0x15, 0x15, 0x1C, + 0x1C, 0x0E, 0x0E, 0x1C, 0x15, 0x15, 0x15, 0x1C, 0x1C, 0x0E, 0x0E, 0x1C, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x1C, 0x1C, 0x0E, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x1C, 0x1C, 0x0E, 0x1C, 0x15, 0x15, 0x13, 0x13, 0x0A, 0x0A, 0x0F, + 0x1C, 0x15, 0x15, 0x13, 0x13, 0x0A, 0x0A, 0x0F, 0x1C, 0x1C, 0x1C, 0x09, + 0x09, 0x09, 0x09, 0x27, 0x13, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0B, + 0x1C, 0x13, 0x13, 0x0E, 0x0E, 0x09, 0x09, 0x07, 0x1C, 0x13, 0x13, 0x0E, + 0x0E, 0x09, 0x09, 0x07, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, + 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0C, 0x0C, 0x0F, 0x0F, 0x15, 0x15, 0x14, + 0x14, 0x0C, 0x0C, 0x0F, 0x0F, 0x15, 0x15, 0x14, 0x14, 0x0C, 0x0C, 0x0F, + 0x27, 0x14, 0x14, 0x18, 0x18, 0x15, 0x15, 0x0E, 0x0B, 0x04, 0x04, 0x04, + 0x04, 0x10, 0x10, 0x01, 0x07, 0x05, 0x05, 0x04, 0x04, 0x10, 0x10, 0x01, + 0x07, 0x05, 0x05, 0x04, 0x04, 0x10, 0x10, 0x01, 0x0F, 0x03, 0x03, 0x04, + 0x04, 0x10, 0x10, 0x01, 0x0F, 0x03, 0x03, 0x04, 0x04, 0x10, 0x10, 0x01, + 0x0F, 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, 0x0F, 0x08, 0x08, 0x04, + 0x04, 0x10, 0x10, 0x01, 0x0E, 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, + 0x10, 0x04, 0x04, 0x08, 0x01, 0x0E, 0x0E, 0x0B, 0x0B, 0x04, 0x04, 0x07, + 0x01, 0x0E, 0x0E, 0x0B, 0x0B, 0x04, 0x04, 0x07, 0x01, 0x0E, 0x0E, 0x0B, + 0x0B, 0x16, 0x16, 0x08, 0x01, 0x0E, 0x0E, 0x0B, 0x0B, 0x16, 0x16, 0x08, + 0x01, 0x07, 0x07, 0x0B, 0x0B, 0x12, 0x12, 0x0B, 0x01, 0x07, 0x07, 0x0B, + 0x0B, 0x12, 0x12, 0x0B, 0x01, 0x0B, 0x0B, 0x03, 0x03, 0x12, 0x12, 0x12, + 0x08, 0x0E, 0x0E, 0x15, 0x15, 0x18, 0x18, 0x18, 0x07, 0x0B, 0x0B, 0x0B, + 0x0B, 0x12, 0x12, 0x0C, 0x07, 0x0B, 0x0B, 0x0B, 0x0B, 0x12, 0x12, 0x0C, + 0x08, 0x1D, 0x1D, 0x09, 0x09, 0x07, 0x07, 0x11, 0x08, 0x1D, 0x1D, 0x09, + 0x09, 0x07, 0x07, 0x11, 0x0B, 0x07, 0x07, 0x01, 0x01, 0x28, 0x28, 0x29, + 0x0B, 0x07, 0x07, 0x01, 0x01, 0x28, 0x28, 0x29, 0x12, 0x05, 0x05, 0x28, + 0x28, 0x04, 0x04, 0x01, 0x18, 0x15, 0x15, 0x1C, 0x1C, 0x0E, 0x0E, 0x1C, + 0x0C, 0x20, 0x20, 0x27, 0x27, 0x1C, 0x1C, 0x0E, 0x0C, 0x20, 0x20, 0x27, + 0x27, 0x1C, 0x1C, 0x0E, 0x11, 0x0B, 0x0B, 0x12, 0x12, 0x1D, 0x1D, 0x15, + 0x11, 0x0B, 0x0B, 0x12, 0x12, 0x1D, 0x1D, 0x15, 0x29, 0x11, 0x11, 0x04, + 0x04, 0x07, 0x07, 0x1D, 0x29, 0x11, 0x11, 0x04, 0x04, 0x07, 0x07, 0x1D, + 0x01, 0x29, 0x29, 0x01, 0x01, 0x05, 0x05, 0x13, 0x1C, 0x1C, 0x1C, 0x09, + 0x09, 0x09, 0x09, 0x27, 0x0E, 0x0E, 0x0E, 0x0C, 0x0C, 0x27, 0x27, 0x1D, + 0x0E, 0x0E, 0x0E, 0x0C, 0x0C, 0x27, 0x27, 0x1D, 0x15, 0x0C, 0x0C, 0x15, + 0x15, 0x0E, 0x0E, 0x0B, 0x15, 0x0C, 0x0C, 0x15, 0x15, 0x0E, 0x0E, 0x0B, + 0x1D, 0x0A, 0x0A, 0x07, 0x07, 0x04, 0x04, 0x11, 0x1D, 0x0A, 0x0A, 0x07, + 0x07, 0x04, 0x04, 0x11, 0x13, 0x1E, 0x1E, 0x05, 0x05, 0x01, 0x01, 0x28, + 0x27, 0x14, 0x14, 0x18, 0x18, 0x15, 0x15, 0x0E, 0x1D, 0x13, 0x13, 0x05, + 0x05, 0x0B, 0x0B, 0x0B, 0x1D, 0x13, 0x13, 0x05, 0x05, 0x0B, 0x0B, 0x0B, + 0x0B, 0x11, 0x11, 0x07, 0x07, 0x09, 0x09, 0x1D, 0x0B, 0x11, 0x11, 0x07, + 0x07, 0x09, 0x09, 0x1D, 0x11, 0x28, 0x28, 0x29, 0x29, 0x01, 0x01, 0x07, + 0x11, 0x28, 0x28, 0x29, 0x29, 0x01, 0x01, 0x07, 0x28, 0x01, 0x01, 0x04, + 0x04, 0x29, 0x29, 0x05, 0x0E, 0x08, 0x08, 0x04, 0x04, 0x10, 0x10, 0x01, + 0x0B, 0x07, 0x07, 0x04, 0x04, 0x0B, 0x0B, 0x0E, 0x0B, 0x07, 0x07, 0x04, + 0x04, 0x0B, 0x0B, 0x0E, 0x1D, 0x08, 0x08, 0x16, 0x16, 0x0B, 0x0B, 0x0E, + 0x1D, 0x08, 0x08, 0x16, 0x16, 0x0B, 0x0B, 0x0E, 0x07, 0x0B, 0x0B, 0x12, + 0x12, 0x0B, 0x0B, 0x07, 0x07, 0x0B, 0x0B, 0x12, 0x12, 0x0B, 0x0B, 0x07, + 0x05, 0x12, 0x12, 0x12, 0x12, 0x03, 0x03, 0x0B, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0E, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x0B, 0x0B, 0x03, 0x03, 0x12, 0x12, 0x12, + 0x01, 0x12, 0x12, 0x03, 0x03, 0x12, 0x12, 0x0C, 0x01, 0x12, 0x12, 0x03, + 0x03, 0x12, 0x12, 0x0C, 0x01, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0C, + 0x01, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0C, 0x01, 0x01, 0x01, 0x03, + 0x03, 0x07, 0x07, 0x0A, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0A, + 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x12, 0x05, 0x05, 0x28, + 0x28, 0x04, 0x04, 0x01, 0x0C, 0x0E, 0x0E, 0x03, 0x03, 0x2A, 0x2A, 0x2A, + 0x0C, 0x0E, 0x0E, 0x03, 0x03, 0x2A, 0x2A, 0x2A, 0x0C, 0x15, 0x15, 0x0E, + 0x0E, 0x03, 0x03, 0x12, 0x0C, 0x15, 0x15, 0x0E, 0x0E, 0x03, 0x03, 0x12, + 0x0A, 0x15, 0x15, 0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x0A, 0x15, 0x15, 0x1E, + 0x1E, 0x1E, 0x1E, 0x18, 0x07, 0x0E, 0x0E, 0x09, 0x09, 0x15, 0x15, 0x0C, + 0x01, 0x29, 0x29, 0x01, 0x01, 0x05, 0x05, 0x13, 0x2A, 0x0C, 0x0C, 0x1E, + 0x1E, 0x07, 0x07, 0x0A, 0x2A, 0x0C, 0x0C, 0x1E, 0x1E, 0x07, 0x07, 0x0A, + 0x12, 0x0C, 0x0C, 0x18, 0x18, 0x1C, 0x1C, 0x0C, 0x12, 0x0C, 0x0C, 0x18, + 0x18, 0x1C, 0x1C, 0x0C, 0x18, 0x14, 0x14, 0x1E, 0x1E, 0x1C, 0x1C, 0x21, + 0x18, 0x14, 0x14, 0x1E, 0x1E, 0x1C, 0x1C, 0x21, 0x0C, 0x07, 0x07, 0x09, + 0x09, 0x0F, 0x0F, 0x24, 0x13, 0x1E, 0x1E, 0x05, 0x05, 0x01, 0x01, 0x28, + 0x0A, 0x15, 0x15, 0x07, 0x07, 0x1E, 0x1E, 0x0C, 0x0A, 0x15, 0x15, 0x07, + 0x07, 0x1E, 0x1E, 0x0C, 0x0C, 0x21, 0x21, 0x1C, 0x1C, 0x18, 0x18, 0x0C, + 0x0C, 0x21, 0x21, 0x1C, 0x1C, 0x18, 0x18, 0x0C, 0x21, 0x22, 0x22, 0x1C, + 0x1C, 0x1E, 0x1E, 0x1E, 0x21, 0x22, 0x22, 0x1C, 0x1C, 0x1E, 0x1E, 0x1E, + 0x24, 0x24, 0x24, 0x0F, 0x0F, 0x09, 0x09, 0x07, 0x28, 0x01, 0x01, 0x04, + 0x04, 0x29, 0x29, 0x05, 0x0C, 0x2A, 0x2A, 0x2A, 0x2A, 0x03, 0x03, 0x0E, + 0x0C, 0x2A, 0x2A, 0x2A, 0x2A, 0x03, 0x03, 0x0E, 0x0C, 0x12, 0x12, 0x03, + 0x03, 0x0E, 0x0E, 0x15, 0x0C, 0x12, 0x12, 0x03, 0x03, 0x0E, 0x0E, 0x15, + 0x1E, 0x14, 0x14, 0x18, 0x18, 0x1E, 0x1E, 0x15, 0x1E, 0x14, 0x14, 0x18, + 0x18, 0x1E, 0x1E, 0x15, 0x07, 0x0C, 0x0C, 0x15, 0x15, 0x09, 0x09, 0x0A, + 0x05, 0x12, 0x12, 0x12, 0x12, 0x03, 0x03, 0x0B, 0x0E, 0x0C, 0x0C, 0x12, + 0x12, 0x03, 0x03, 0x12, 0x0E, 0x0C, 0x0C, 0x12, 0x12, 0x03, 0x03, 0x12, + 0x15, 0x0C, 0x0C, 0x07, 0x07, 0x03, 0x03, 0x07, 0x15, 0x0C, 0x0C, 0x07, + 0x07, 0x03, 0x03, 0x07, 0x15, 0x0A, 0x0A, 0x07, 0x07, 0x03, 0x03, 0x01, + 0x15, 0x0A, 0x0A, 0x07, 0x07, 0x03, 0x03, 0x01, 0x0A, 0x07, 0x07, 0x07, + 0x07, 0x03, 0x03, 0x01, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x12, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x01, 0x01, 0x01, 0x03, + 0x03, 0x13, 0x13, 0x06, 0x01, 0x01, 0x01, 0x03, 0x03, 0x13, 0x13, 0x06, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x07, 0x07, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x07, 0x07, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, 0x13, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, 0x13, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x07, 0x07, 0x0E, 0x0E, 0x09, 0x09, 0x15, 0x15, 0x0C, + 0x06, 0x06, 0x06, 0x13, 0x13, 0x15, 0x15, 0x07, 0x06, 0x06, 0x06, 0x13, + 0x13, 0x15, 0x15, 0x07, 0x07, 0x12, 0x12, 0x13, 0x13, 0x1C, 0x1C, 0x0B, + 0x07, 0x12, 0x12, 0x13, 0x13, 0x1C, 0x1C, 0x0B, 0x13, 0x06, 0x06, 0x13, + 0x13, 0x0C, 0x0C, 0x08, 0x13, 0x06, 0x06, 0x13, 0x13, 0x0C, 0x0C, 0x08, + 0x07, 0x06, 0x06, 0x0F, 0x0F, 0x0A, 0x0A, 0x0F, 0x0C, 0x07, 0x07, 0x09, + 0x09, 0x0F, 0x0F, 0x24, 0x07, 0x12, 0x12, 0x05, 0x05, 0x08, 0x08, 0x12, + 0x07, 0x12, 0x12, 0x05, 0x05, 0x08, 0x08, 0x12, 0x0B, 0x0E, 0x0E, 0x1C, + 0x1C, 0x0F, 0x0F, 0x0B, 0x0B, 0x0E, 0x0E, 0x1C, 0x1C, 0x0F, 0x0F, 0x0B, + 0x08, 0x0E, 0x0E, 0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x08, 0x0E, 0x0E, 0x1E, + 0x1E, 0x1C, 0x1C, 0x1C, 0x0F, 0x1C, 0x1C, 0x09, 0x09, 0x08, 0x08, 0x08, + 0x24, 0x24, 0x24, 0x0F, 0x0F, 0x09, 0x09, 0x07, 0x12, 0x12, 0x12, 0x08, + 0x08, 0x05, 0x05, 0x12, 0x12, 0x12, 0x12, 0x08, 0x08, 0x05, 0x05, 0x12, + 0x0B, 0x0B, 0x0B, 0x0F, 0x0F, 0x1C, 0x1C, 0x0E, 0x0B, 0x0B, 0x0B, 0x0F, + 0x0F, 0x1C, 0x1C, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x1E, 0x0E, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x1E, 0x0E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x09, 0x09, 0x1C, 0x07, 0x0C, 0x0C, 0x15, 0x15, 0x09, 0x09, 0x0A, + 0x12, 0x07, 0x07, 0x15, 0x15, 0x13, 0x13, 0x06, 0x12, 0x07, 0x07, 0x15, + 0x15, 0x13, 0x13, 0x06, 0x0E, 0x0B, 0x0B, 0x1C, 0x1C, 0x13, 0x13, 0x12, + 0x0E, 0x0B, 0x0B, 0x1C, 0x1C, 0x13, 0x13, 0x12, 0x0E, 0x08, 0x08, 0x0C, + 0x0C, 0x13, 0x13, 0x06, 0x0E, 0x08, 0x08, 0x0C, 0x0C, 0x13, 0x13, 0x06, + 0x1C, 0x0F, 0x0F, 0x0A, 0x0A, 0x0F, 0x0F, 0x06, 0x0A, 0x07, 0x07, 0x07, + 0x07, 0x03, 0x03, 0x01, 0x06, 0x06, 0x06, 0x13, 0x13, 0x03, 0x03, 0x01, + 0x06, 0x06, 0x06, 0x13, 0x13, 0x03, 0x03, 0x01, 0x12, 0x13, 0x13, 0x07, + 0x07, 0x01, 0x01, 0x01, 0x12, 0x13, 0x13, 0x07, 0x07, 0x01, 0x01, 0x01, + 0x06, 0x0A, 0x0A, 0x06, 0x06, 0x01, 0x01, 0x01, 0x06, 0x0A, 0x0A, 0x06, + 0x06, 0x01, 0x01, 0x01, 0x06, 0x13, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x12, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x12, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x07, 0x06, 0x06, 0x0F, 0x0F, 0x0A, 0x0A, 0x0F, 0x12, 0x06, 0x06, 0x12, + 0x12, 0x0A, 0x0A, 0x0F, 0x12, 0x06, 0x06, 0x12, 0x12, 0x0A, 0x0A, 0x0F, + 0x08, 0x06, 0x06, 0x06, 0x06, 0x13, 0x13, 0x09, 0x08, 0x06, 0x06, 0x06, + 0x06, 0x13, 0x13, 0x09, 0x01, 0x06, 0x06, 0x08, 0x08, 0x07, 0x07, 0x0A, + 0x01, 0x06, 0x06, 0x08, 0x08, 0x07, 0x07, 0x0A, 0x01, 0x08, 0x08, 0x08, + 0x08, 0x12, 0x12, 0x0C, 0x0F, 0x1C, 0x1C, 0x09, 0x09, 0x08, 0x08, 0x08, + 0x0F, 0x0E, 0x0E, 0x2B, 0x2B, 0x2A, 0x2A, 0x28, 0x0F, 0x0E, 0x0E, 0x2B, + 0x2B, 0x2A, 0x2A, 0x28, 0x09, 0x0F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x09, 0x0F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x12, 0x12, 0x01, + 0x01, 0x2C, 0x2C, 0x01, 0x0A, 0x12, 0x12, 0x01, 0x01, 0x2C, 0x2C, 0x01, + 0x0C, 0x13, 0x13, 0x2A, 0x2A, 0x2D, 0x2D, 0x2E, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x09, 0x09, 0x1C, 0x28, 0x28, 0x28, 0x2A, 0x2A, 0x2B, 0x2B, 0x0E, + 0x28, 0x28, 0x28, 0x2A, 0x2A, 0x2B, 0x2B, 0x0E, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, + 0x01, 0x01, 0x01, 0x2C, 0x2C, 0x01, 0x01, 0x12, 0x01, 0x01, 0x01, 0x2C, + 0x2C, 0x01, 0x01, 0x12, 0x2E, 0x2E, 0x2E, 0x2D, 0x2D, 0x2A, 0x2A, 0x13, + 0x1C, 0x0F, 0x0F, 0x0A, 0x0A, 0x0F, 0x0F, 0x06, 0x0E, 0x0F, 0x0F, 0x0A, + 0x0A, 0x06, 0x06, 0x06, 0x0E, 0x0F, 0x0F, 0x0A, 0x0A, 0x06, 0x06, 0x06, + 0x0F, 0x09, 0x09, 0x13, 0x13, 0x08, 0x08, 0x06, 0x0F, 0x09, 0x09, 0x13, + 0x13, 0x08, 0x08, 0x06, 0x12, 0x0A, 0x0A, 0x07, 0x07, 0x08, 0x08, 0x06, + 0x12, 0x0A, 0x0A, 0x07, 0x07, 0x08, 0x08, 0x06, 0x13, 0x0C, 0x0C, 0x12, + 0x12, 0x08, 0x08, 0x08, 0x06, 0x13, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x06, 0x12, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x12, 0x12, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x06, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x08, + 0x08, 0x12, 0x12, 0x0C, 0x01, 0x01, 0x01, 0x08, 0x08, 0x06, 0x06, 0x0E, + 0x01, 0x01, 0x01, 0x08, 0x08, 0x06, 0x06, 0x0E, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x08, 0x08, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x07, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x0C, 0x13, 0x13, 0x2A, 0x2A, 0x2D, 0x2D, 0x2E, 0x0E, 0x09, 0x09, 0x07, + 0x07, 0x2A, 0x2A, 0x28, 0x0E, 0x09, 0x09, 0x07, 0x07, 0x2A, 0x2A, 0x28, + 0x07, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x06, 0x07, 0x09, 0x09, 0x09, + 0x09, 0x07, 0x07, 0x06, 0x08, 0x0F, 0x0F, 0x0D, 0x0D, 0x14, 0x14, 0x23, + 0x08, 0x0F, 0x0F, 0x0D, 0x0D, 0x14, 0x14, 0x23, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x2E, 0x2E, 0x2E, 0x2D, 0x2D, 0x2A, 0x2A, 0x13, + 0x28, 0x28, 0x28, 0x2A, 0x2A, 0x07, 0x07, 0x09, 0x28, 0x28, 0x28, 0x2A, + 0x2A, 0x07, 0x07, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x09, 0x09, 0x09, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x09, 0x09, 0x09, 0x23, 0x23, 0x23, 0x14, + 0x14, 0x0D, 0x0D, 0x0F, 0x23, 0x23, 0x23, 0x14, 0x14, 0x0D, 0x0D, 0x0F, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x13, 0x0C, 0x0C, 0x12, + 0x12, 0x08, 0x08, 0x08, 0x09, 0x0E, 0x0E, 0x06, 0x06, 0x08, 0x08, 0x01, + 0x09, 0x0E, 0x0E, 0x06, 0x06, 0x08, 0x08, 0x01, 0x09, 0x07, 0x07, 0x08, + 0x08, 0x01, 0x01, 0x01, 0x09, 0x07, 0x07, 0x08, 0x08, 0x01, 0x01, 0x01, + 0x0F, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x08, 0x08, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +}; + +const unsigned short avatar_palette [] = { + 0x7c1f, 0x0000, 0x08a6, 0x110b, 0x0cc9, 0x0cea, 0x154f, 0x1971, 0x152e, + 0x21b5, 0x25f7, 0x110d, 0x2a19, 0x25f9, 0x21d6, 0x1d93, 0x0485, 0x08a7, + 0x1950, 0x1db4, 0x3a9d, 0x367c, 0x10c8, 0x194c, 0x4aff, 0x3def, 0x4e73, + 0x35ad, 0x2e3a, 0x325b, 0x3ebe, 0x294a, 0x42df, 0x3edf, 0x5f5f, 0x4eff, + 0x3213, 0x0973, 0x2e9f, 0x5b3f, 0x39ce, 0x5294, 0x2d6b, 0x14a5, 0x000b, + 0x14b1, 0x0c6f, 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, 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, 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, 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, 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, + 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, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 +}; + diff --git a/demos/demo3-foodthrowing/src/bullet.h b/demos/demo3-foodthrowing/src/bullet.h new file mode 100644 index 0000000..a43f849 --- /dev/null +++ b/demos/demo3-foodthrowing/src/bullet.h @@ -0,0 +1,28 @@ +// +// Created by Wouter Groeneveld on 09/08/18. +// + +#ifndef GBA_SPRITE_ENGINE_PROJECT_BULLET_H +#define GBA_SPRITE_ENGINE_PROJECT_BULLET_H + +const unsigned char bullet_data [] = { + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A +}; + + +#endif //GBA_SPRITE_ENGINE_PROJECT_BULLET_H diff --git a/demos/demo3-foodthrowing/src/food_scene.cpp b/demos/demo3-foodthrowing/src/food_scene.cpp new file mode 100644 index 0000000..f5d83b7 --- /dev/null +++ b/demos/demo3-foodthrowing/src/food_scene.cpp @@ -0,0 +1,91 @@ +// +// Created by Wouter Groeneveld on 09/08/18. +// + +#include +#include +#include +#include +#include "food_scene.h" +#include "avatar.h" +#include "bullet.h" + +#define AVATAR_ROTATION_DIFF 300 +#define MAX_AMOUNT_OF_BULLETS 40 + +FoodScene::FoodScene(const std::shared_ptr &engine) : Scene(engine) {} + +std::vector FoodScene::backgrounds() { + return {}; +} + +std::vector FoodScene::sprites() { + std::vector sprites = { + avatar.get() // order is important for affine transformations because of updateSpritesInScene() + }; + for(auto& b : bullets) { + if(!b->isOffScreen()) { + sprites.push_back(b.get()); + } + } + + return sprites; +} + +void FoodScene::removeBulletsOffScreen() { + // TODO crashes after this + bullets.erase( + std::remove_if(bullets.begin(), bullets.end(), [](std::unique_ptr &s) { return s->isOffScreen(); }), + bullets.end()); +} + +void FoodScene::tick(u16 keys) { + avatar->animateToFrame(0); + + //removeBulletsOffScreen(); + TextStream::instance().setText(std::to_string(bullets.size()) + std::string(" bullets"), 1, 1); + + if(keys & KEY_LEFT) { + avatarRotation -= AVATAR_ROTATION_DIFF; + } else if(keys & KEY_RIGHT) { + avatarRotation += AVATAR_ROTATION_DIFF; + } + if(keys & KEY_A) { + if(bullets.size() < MAX_AMOUNT_OF_BULLETS) { + avatar->animateToFrame(1); + bullets.push_back(createBullet()); + + engine->updateSpritesInScene(); + //addSprite(bullets.at(bullets.size() - 1).get()); + } + } + + avatar->rotate(avatarRotation); + } + + std::unique_ptr FoodScene::createBullet() { + // TODO shared bullet data tiles + return this->spriteBuilder->withData(bullet_data, sizeof(bullet_data)) + .withSize(SIZE_16_16) + .withVelocity(1, 1) + .withLocation(avatar->getX(), avatar->getY()) + .buildPtr(); +} + +void FoodScene::load() { + foregroundPalette = std::unique_ptr(new ForegroundPaletteManager(avatar_palette, sizeof(avatar_palette))); + backgroundPalette = std::unique_ptr(new BackgroundPaletteManager()); + + spriteBuilder = std::unique_ptr>(new SpriteBuilder); + SpriteBuilder affineBuilder; + + // Doom avatar copyright iD Software + avatar = affineBuilder.withData(avatar_data, sizeof(avatar_data)) + .withSize(SIZE_64_64) + .withAnimated(2, 3) + .withLocation(GBA_SCREEN_WIDTH / 2 - 32, GBA_SCREEN_HEIGHT / 2 - 32) + .buildPtr(); + avatar->stopAnimating(); + avatarRotation = 0; + +} \ No newline at end of file diff --git a/demos/demo3-foodthrowing/src/food_scene.h b/demos/demo3-foodthrowing/src/food_scene.h new file mode 100644 index 0000000..dd70955 --- /dev/null +++ b/demos/demo3-foodthrowing/src/food_scene.h @@ -0,0 +1,36 @@ +// +// Created by Wouter Groeneveld on 09/08/18. +// + +#ifndef GBA_SPRITE_ENGINE_PROJECT_FOOD_SCENE_H +#define GBA_SPRITE_ENGINE_PROJECT_FOOD_SCENE_H + + +#include +#include +#include + +class FoodScene : public Scene { +private: + std::unique_ptr avatar; + std::vector> bullets; + int avatarRotation; + + std::unique_ptr> spriteBuilder; + std::unique_ptr createBullet(); + void removeBulletsOffScreen(); + +public: + explicit FoodScene(const std::shared_ptr &engine); + FoodScene(FoodScene& other) = delete; + + std::vector sprites() override; + std::vector backgrounds() override; + + void load() override; + void tick(u16 keys) override; + +}; + + +#endif //GBA_SPRITE_ENGINE_PROJECT_FOOD_SCENE_H diff --git a/demos/demo3-foodthrowing/src/main.cpp b/demos/demo3-foodthrowing/src/main.cpp new file mode 100644 index 0000000..86d9e45 --- /dev/null +++ b/demos/demo3-foodthrowing/src/main.cpp @@ -0,0 +1,19 @@ +// +// Created by Wouter Groeneveld on 09/08/18. +// + +#include +#include "food_scene.h" + +int main() { + std::shared_ptr engine(new GBAEngine()); + + auto scene = new FoodScene(engine); + engine->setScene(scene); + + while (true) { + engine->update(); + } + + return 0; +} \ No newline at end of file diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 4b6e152..b1877a3 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -14,7 +14,7 @@ add_library(${PROJECT_NAME} src/background/text_stream.cpp src/background/background.cpp src/effects/fade_out_scene.cpp - src/sound_control.cpp) + src/sound_control.cpp src/scene.cpp) target_include_directories(${PROJECT_NAME} PUBLIC $ diff --git a/engine/include/libgba-sprite-engine/gba_engine.h b/engine/include/libgba-sprite-engine/gba_engine.h index b70335f..838a61f 100644 --- a/engine/include/libgba-sprite-engine/gba_engine.h +++ b/engine/include/libgba-sprite-engine/gba_engine.h @@ -40,6 +40,7 @@ public: GBAEngine(); void setScene(Scene* scene); + void dynamicallyAddSprite(Sprite* s) { spriteManager.add(s); } void transitionIntoScene(Scene* scene, SceneEffect* effect); bool isTransitioning() { return currentEffectForTransition != nullptr; } @@ -53,6 +54,7 @@ public: u16 readKeys(); void update(); + void updateSpritesInScene(); void delay(int times) { for(int i = 0; i < times; i++){} } diff --git a/engine/include/libgba-sprite-engine/scene.h b/engine/include/libgba-sprite-engine/scene.h index 1b90fbf..148e54a 100644 --- a/engine/include/libgba-sprite-engine/scene.h +++ b/engine/include/libgba-sprite-engine/scene.h @@ -19,6 +19,8 @@ protected: std::unique_ptr backgroundPalette; std::shared_ptr engine; + void addSprite(Sprite* sprite); + public: ForegroundPaletteManager* getForegroundPalette() { return foregroundPalette.get(); } BackgroundPaletteManager* getBackgroundPalette() { return backgroundPalette.get(); } diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index beef000..fefc7fc 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -61,7 +61,7 @@ protected: void setAttributesBasedOnSize(SpriteSize size); public: - Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size); + explicit Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size); virtual ~Sprite() {} void makeAnimated(int amountOfFrames, int animationDelay) { @@ -70,6 +70,7 @@ public: animate(); } void animate() { this->animating = true; } + void animateToFrame(int frame) { this->currentFrame = frame; } void stopAnimating() { this->animating = false; } void setStayWithinBounds(bool b) { stayWithinBounds = b; } void setVelocity(int dx, int dy) { @@ -91,6 +92,7 @@ public: int getWidth() { return w; } int getY() { return y; } int getCurrentFrame() { return currentFrame; } + bool isOffScreen(); friend class SpriteManager; }; diff --git a/engine/include/libgba-sprite-engine/sprites/sprite_manager.h b/engine/include/libgba-sprite-engine/sprites/sprite_manager.h index 6689984..880638a 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite_manager.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite_manager.h @@ -15,12 +15,13 @@ private: std::vector sprites; void copyOverSpriteOAMToVRAM(); + void copyOverImageDataToVRAM(Sprite* s); void copyOverImageDataToVRAM(); public: int getSpriteSize() { return sprites.size(); } - void add(const Sprite& sprite); + void add(Sprite* sprite); void set(std::vector sprites); void persist(); // copies over image and palette data to VRAM, modifies sprite OAM indiches void render(); // copies over OAM buffer to OAM RAM, called in game loop diff --git a/engine/src/gba_engine.cpp b/engine/src/gba_engine.cpp index e0c04fd..ad6755e 100644 --- a/engine/src/gba_engine.cpp +++ b/engine/src/gba_engine.cpp @@ -151,15 +151,18 @@ void GBAEngine::setScene(Scene* scene) { } bgPalette->persist(); - Allocator::free(); TextStream::instance().persist(); - spriteManager.set(scene->sprites()); - spriteManager.persist(); - for(const auto bg : scene->backgrounds()) { bg->persist(); } this->currentScene = scene; + updateSpritesInScene(); } + +void GBAEngine::updateSpritesInScene() { + Allocator::free(); + spriteManager.set(currentScene->sprites()); + spriteManager.persist(); +} \ No newline at end of file diff --git a/engine/src/scene.cpp b/engine/src/scene.cpp new file mode 100644 index 0000000..697ec34 --- /dev/null +++ b/engine/src/scene.cpp @@ -0,0 +1,10 @@ +// +// Created by Wouter Groeneveld on 09/08/18. +// + +#include +#include + +void Scene::addSprite(Sprite *sprite) { + engine->dynamicallyAddSprite(sprite); +} diff --git a/engine/src/sprites/affine_sprite.cpp b/engine/src/sprites/affine_sprite.cpp index efcfafc..9a52f25 100644 --- a/engine/src/sprites/affine_sprite.cpp +++ b/engine/src/sprites/affine_sprite.cpp @@ -6,6 +6,7 @@ #include #include +#include void AffineSprite::identity() { obj_aff_identity(this->affine.get()); @@ -46,6 +47,9 @@ void AffineSprite::buildOam(int tileIndex) { (this->shape_bits << 14); rebuildOamAttr1ForAffineIndex(); - this->affine = std::unique_ptr(new OBJ_AFFINE()); - identity(); + if(!affine) { + TextStream::instance() << "building"; + this->affine = std::unique_ptr(new OBJ_AFFINE()); + identity(); + } } diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index 56898af..d7f924e 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -20,6 +20,10 @@ void Sprite::moveTo(int x, int y) { syncOam(); } +bool Sprite::isOffScreen() { + return x < 0 || x > GBA_SCREEN_WIDTH || y < 0 || y > GBA_SCREEN_HEIGHT; +} + void Sprite::flipHorizontally(bool flip) { if(flip) { oam->attr1 |= ATTR1_HFLIP; @@ -42,8 +46,8 @@ void Sprite::syncVelocity() { } void Sprite::syncAnimation() { - if(!animating) return; - int newTileIndex = this->tileIndex + (currentFrame * w); + int offset = w == 64 ? 2 : 1; // 64xY sprites don't seem to cut currFrame * w + int newTileIndex = this->tileIndex + (currentFrame * w * offset); oam->attr2 &= OAM_TILE_OFFSET_CLEAR; oam->attr2 |= (newTileIndex & OAM_TILE_OFFSET_NEW); @@ -118,7 +122,10 @@ bool Sprite::collidesWith(Sprite &s2) { void Sprite::buildOam(int tileIndex) { this->tileIndex = tileIndex; - this->oam = std::unique_ptr(new OBJ_ATTR()); + + if(!oam) { + this->oam = std::unique_ptr(new OBJ_ATTR()); + } this->oam->attr0 = ATTR0_Y(this->y) | ATTR0_MODE(0) | diff --git a/engine/src/sprites/sprite_manager.cpp b/engine/src/sprites/sprite_manager.cpp index d54521c..3449511 100644 --- a/engine/src/sprites/sprite_manager.cpp +++ b/engine/src/sprites/sprite_manager.cpp @@ -7,36 +7,37 @@ #include #include +#include #define MAX_SPRITE_SIZE 128 #define MAX_AFFINE_SIZE 31 -void SpriteManager::set(std::vector sprites) { +void SpriteManager::set(std::vector sprites) { initialized = false; this->sprites.clear(); this->sprites.insert(this->sprites.end(), sprites.begin(), sprites.end()); } -void SpriteManager::add(const Sprite &sprite) { +void SpriteManager::add(Sprite* sprite) { if(sprites.size() == MAX_SPRITE_SIZE) { - throw std::runtime_error("maximum sprite limit reached"); + failure(MaxSpriteSizeReached); } - const Sprite* sPtr = &sprite; - sprites.push_back(const_cast(sPtr)); + sprites.push_back(sprite); + copyOverImageDataToVRAM(sprite); } void SpriteManager::render() { if(!initialized) { - throw std::runtime_error("can't render before initialization"); + failure(Cant_Render_Before_Init); } copyOverSpriteOAMToVRAM(); } void SpriteManager::persist() { - copyOverImageDataToVRAM(); + copyOverImageDataToVRAM(); initialized = true; } @@ -46,7 +47,7 @@ void SpriteManager::copyOverSpriteOAMToVRAM() { for(auto sprite : this->sprites) { if(affineIndex > MAX_AFFINE_SIZE) { - throw std::runtime_error("max amount of sprites with affine matriches reached"); + failure(MaxSpritesWithAffineReached); } sprite->update(); @@ -70,11 +71,15 @@ void SpriteManager::copyOverSpriteOAMToVRAM() { } } -void SpriteManager::copyOverImageDataToVRAM() { - for(auto sprite : this->sprites) { - const auto allocated = Allocator::allocateObjectTiles(sprite->imageSize); - dma3_cpy(allocated.pointer(), sprite->data, allocated.size); +void SpriteManager::copyOverImageDataToVRAM(Sprite *sprite) { + const auto allocated = Allocator::allocateObjectTiles(sprite->imageSize); + dma3_cpy(allocated.pointer(), sprite->data, allocated.size); - sprite->buildOam(allocated.getTileLocation()); + sprite->buildOam(allocated.getTileLocation()); +} + +void SpriteManager::copyOverImageDataToVRAM() { + for(auto sprite : sprites) { + copyOverImageDataToVRAM(sprite); } }