/** Raycasting demo 3 for Pokitto. Minecraft-like demo, shows an interactive terrain editing and raycasting without textures. Don't forget to compile with -O3! author: Miloslav "drummyfish" Ciz license: CC0 1.0 */ #define SUBSAMPLE 1 #define PLAYER_SPEED (RCL_UNITS_PER_SQUARE * 4 * SPEED_MULTIPLIER) #define PLAYER_JUMP_SPEED 600 #define RCL_HORIZONTAL_FOV ((3 * RCL_UNITS_PER_SQUARE) / 10) #define GRAVITY_ACCELERATION (RCL_UNITS_PER_SQUARE * 2 * SPEED_MULTIPLIER) #define RCL_CAMERA_COLL_HEIGHT_BELOW ((3 * RCL_UNITS_PER_SQUARE) / 2) #define FPS 255 #define HEAD_BOB_HEIGHT 150 #define HEAD_BOB_STEP 20 #define RCL_COMPUTE_WALL_TEXCOORDS 0 // we won't be using textures, so turn them off #define RCL_COMPUTE_CEILING_DEPTH 0 // again, we don't need ceiling depth #define TEXTURE_W 32 // required to define even though we use no textures #define TEXTURE_H 32 #include "general.hpp" #define LEVEL_X_RES 29 #define LEVEL_Y_RES 21 Player player; #define SPRITE_MAX_DISTANCE 5 * RCL_UNITS_PER_SQUARE #define JUMP_SPEED 500 RCL_Vector2D selectedSquare; ///< Coords of a square selected for editing. /** Represents one terrain change against the implicit terrain. */ class Change { public: RCL_Vector2D mCoords; RCL_Unit mHeight; int8_t mColor; }; #define MAX_CHANGES 16 ///< Maximum number of simultaneous terrain changes. Change changes[MAX_CHANGES]; ///< Terrain change list. // helpers bool editReleased = false; bool editing = false; uint16_t changeIndex = 0; int16_t editCounter = 0; #define SQUARE_COLORS 4 const uint8_t squareColors[SQUARE_COLORS] = { HUE(10), HUE(8), HUE(14), HUE(15) }; #define FLOOR_COLORS 8 const uint8_t floorColors[FLOOR_COLORS] = { HUE(2), HUE(3), HUE(10), HUE(11), HUE(1), HUE(5), HUE(6), HUE(14) }; #define HEIGHT_PROFILE_LENGTH 256 /// Script-generated 1D terrain height profile, used for terrain generation. const int8_t heightProfile[] = { 9,9,9,10,10,10,11,11,12,13,13,14,14,14,15,15,15,16,16,16,16,16,15,15,15,14,14, 13,13,12,11,10,10,9,9,9,8,8,8,8,8,8,7,7,7,6,5,4,4,3,3,3,3,3,3,4,5,7,8,10,11,12, 12,13,13,13,14,16,19,20,21,21,22,22,22,23,23,23,23,22,22,21,20,19,18,18,17,17, 17,17,16,16,16,16,16,16,16,15,15,15,14,14,13,12,11,10,8,7,6,5,5,5,4,4,4,4,4,5, 5,5,6,6,7,7,7,8,8,8,8,8,8,8,7,7,7,7,6,6,5,4,4,3,2,2,2,1,1,1,1,2,3,5,6,7,9,13, 13,13,18,18,22,22,22,22,22,22,21,21,20,20,19,16,16,16,14,14,14,15,15,15,15,15, 16,17,17,18,18,18,16,16,16,16,15,15,15,14,14,13,12,8,7,7,7,8,9,11,12,12,13,13, 13,12,11,10,10,10,10,11,11,12,13,13,12,12,11,11,10,10,9,9,9,9,9,9,10,10,11,12, 13,13,14,14,14,14,14,13,13,12,11,11,11,11,10,10,10,10 }; const unsigned char imageBackground[] = { 110, 44 // width, height ,0x7f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x7d,0x7d,0x0f,0x0f,0x2f,0x2f ,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9 ,0xa9,0xa9,0x7f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x7d,0x7d,0x0f,0x0f ,0x2f,0x2f,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec ,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xa9,0xa9,0xa9,0xa9,0xa9 ,0xa9,0xa9,0xa9,0xa9,0x7f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x7d,0x7d ,0x0f,0x0f,0x2f,0x2f,0x08,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec ,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xa9,0xa9,0xa9 ,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x2f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f ,0x7d,0x7d,0x0f,0x0f,0x2f,0x2f,0x2f,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xa9 ,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x0f,0x0f,0x0f,0x2f,0x2f ,0x2f,0x2f,0x7d,0x7d,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x6c,0xee,0xee,0xee ,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda ,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0x7f,0x2f,0x0f,0x0f ,0x2f,0x2f,0x2f,0x2f,0x7d,0x2f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0x7f,0x0f ,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x7d,0x2f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f ,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0x7f,0x2f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x7d,0x2f,0x0f,0x0f,0x0f,0x2f ,0x2f,0x2f,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0xaa,0xaa,0x7f,0x2f,0x0f,0x2f,0x2f,0x2f,0x2f,0x2f,0x7d,0x2f,0x0f,0x0f ,0x0f,0x2f,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec ,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0xaa,0xaa,0xaa,0xaa,0x7f,0x2f,0x0f,0x0f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f ,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xaa,0xab,0xaa,0xab ,0xaa,0xab,0xaa,0xab,0xaa,0xab,0x7f,0x2f,0x0f,0x2f,0x2f,0x2f,0x2f,0x2f ,0x2f,0x2f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec ,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xab,0xaa ,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0x7f,0x2f,0x0f,0x0f,0x2f,0x2f ,0x2f,0x2f,0x2f,0x2f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0xee,0x6c,0xee,0xee ,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda ,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0x7f,0x2f,0x0f,0x2f ,0x2f,0x2f,0x0f,0x2f,0x2f,0x2f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x6c,0xee ,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda ,0xdd,0xda,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0x7f,0x2f ,0x0f,0x2f,0x2f,0x2f,0x0f,0x0f,0x2f,0x2f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f ,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd ,0xdd,0xdd,0xda,0xda,0xac,0xab,0xac,0xab,0xac,0xab,0xac,0xab,0xac,0xab ,0x7f,0x2f,0x0f,0x2f,0x2f,0x0f,0x0f,0x0f,0x2f,0x2f,0x0f,0x0f,0x0f,0x0f ,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xab,0xac,0xab,0xac,0xab,0xac,0xab,0xac ,0xab,0xac,0x7f,0x2f,0x2f,0x2f,0x2f,0x0f,0x0f,0x0f,0x2f,0x2f,0x0f,0x0f ,0x0f,0x0f,0x2f,0x2f,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec ,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xac,0xac,0xac,0xac,0xac,0xac ,0xac,0xac,0xac,0xac,0x7f,0x2f,0x0f,0x2f,0x7f,0x0f,0x0f,0x0f,0x2f,0x0f ,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec ,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xac,0xac,0xac ,0xac,0xac,0xac,0xac,0xac,0xac,0x7f,0x2f,0x2f,0x2f,0x7f,0x0f,0x0f,0x0f ,0x0f,0x2f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0xee,0x6c,0xee,0xee,0xee,0xee ,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xad ,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0x7f,0x2f,0x0f,0x2f,0x7f,0x0f ,0x0f,0x0f,0x2f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x6c,0xee,0xee,0xee ,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda ,0x38,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0x7f,0x2f,0x2f,0x2f ,0x7f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0x38,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0x7f,0x2f ,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x2f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f ,0x08,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xda,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad ,0x7f,0x2f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f ,0x2f,0x2f,0x08,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xad,0xae,0xad,0xae,0xad,0xae,0xad ,0xae,0xad,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x2f,0x0f,0x0f,0x0f ,0x2f,0x2f,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec ,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xae,0xad,0xae,0xad,0xae ,0xad,0xae,0xad,0xae,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x0f,0x0f ,0x0f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xae,0xae,0xae ,0xae,0xae,0xae,0xae,0xae,0xae,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f ,0x0f,0x0f,0x7d,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x08,0xee,0xee,0xee,0xec ,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda ,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f ,0x0f,0x0f,0x0f,0x0f,0x7d,0x7d,0x2f,0x2f,0x2f,0x2f,0x2f,0x08,0xee,0xee ,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda ,0xda,0xda,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae,0xaf,0x7f,0x7f,0x2f,0x2f ,0x7f,0x7f,0x0f,0x0f,0x0f,0x2f,0x7d,0x6c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f ,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda ,0xdd,0xda,0xda,0xda,0xaf,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae,0x7f,0x7f ,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x0f,0x2f,0x7d,0x7d,0x2f,0x2f,0x2f,0x2f ,0x2f,0x2f,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd ,0xdd,0xdd,0xda,0xda,0xda,0xda,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf ,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x2f,0x2f,0x7d,0x6c,0x2f,0x2f ,0x2f,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0xaf,0x2f,0xaf,0x2f,0xaf ,0x2f,0xaf,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x2f,0x2f,0x7d,0x7d ,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec ,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0x2f,0xaf,0x2f ,0xaf,0x2f,0xaf,0x2f,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f,0x2f,0x2f ,0x7d,0x6c,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xec,0xee,0xec ,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0x2f ,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x0f,0x0f ,0x2f,0x7d,0x7d,0x7d,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xee ,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda ,0x38,0x1f,0x2f,0x1f,0x2f,0x1f,0x2f,0x1f,0x7f,0x7f,0x2f,0x7f,0x7f,0x7f ,0x0f,0x0f,0x2f,0x7d,0x7d,0x6c,0x7d,0x2f,0x2f,0x2f,0x2f,0x2f,0xee,0xee ,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda ,0xda,0xda,0x38,0x2f,0x1f,0x2f,0x1f,0x2f,0x1f,0x2f,0x7f,0x7f,0x2f,0x7f ,0x7f,0x7f,0x0f,0x0f,0x2f,0x7d,0x7d,0x7d,0x6c,0x2f,0x2f,0x2f,0x2f,0x2f ,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0xda,0xda,0x38,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x0f,0x0f,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x2f,0x2f ,0x2f,0x08,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0xaf,0x2f,0xaf,0x2f,0xaf,0x2f,0xaf ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x2f,0x2f,0x2f,0x08,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0x2f,0xaf,0x2f,0xaf,0x2f ,0xaf,0x2f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x0f,0x7d,0x7d,0x7d,0x6c ,0x7d,0x6c,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec ,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0xaf,0xaf,0xaf ,0xaf,0xaf,0xaf,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x0f,0x7d,0x7d ,0x7d,0x7d,0x6c,0x6c,0x2f,0x2f,0x2f,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0xaf ,0xae,0xaf,0xae,0xaf,0xae,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x2f,0x2f,0x2f,0xee,0xee,0xee,0xee,0xec ,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda ,0x38,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x2f,0x2f,0x2f,0x6c,0xee,0xee ,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda ,0xda,0xda,0x38,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x2f,0x08,0xee ,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda ,0xdd,0xda,0xda,0xda,0x38,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c ,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd ,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0xad,0xae,0xad,0xae,0xad,0xae,0xad ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c ,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0xae,0xad,0xae,0xad,0xae ,0xad,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d ,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec ,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0xad,0xad,0xad ,0xad,0xad,0xad,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d ,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec ,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0xad,0xad ,0xad,0xad,0xad,0xad,0xad,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f ,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda ,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee ,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda ,0xda,0xda,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0xda,0x38,0xac,0xac,0xac,0xac,0xac,0xac,0xac,0xac,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c ,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xda,0x38,0xac,0xac,0xac,0xac,0xac,0xac,0xac,0xac ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0x38,0xac,0xab,0xac,0xab,0xac,0xab ,0xac,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c ,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec ,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0x38,0xab,0xac,0xab,0xac ,0xab,0xac,0xab,0xac,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d ,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0x38,0xab,0xab ,0xab,0xab,0xab,0xab,0xab,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec ,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xab ,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee ,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda ,0xda,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee ,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda ,0xdd,0xda,0xda,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c ,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd ,0xdd,0xdd,0xda,0xda,0xda,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c ,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0xec,0x2f,0x08,0xec ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0xaa,0xaa,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d ,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0xec,0x2f ,0x2f,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xaa,0xaa,0xaa,0xaa,0xaa ,0xaa,0xaa,0xaa,0xaa,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d ,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec ,0x08,0x2f,0x2f,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xa9,0xaa,0xa9 ,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f ,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0xec,0xec,0x2f,0x2f,0x2f,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xaa ,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee ,0xee,0xec,0xee,0xec,0x2f,0x2f,0x2f,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda ,0x38,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0xec,0x2f,0x2f,0x2f,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c ,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0x2f,0x2f,0x2f,0x2f,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9 ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0x2f,0x2f,0x2f,0x2f ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9 ,0xa9,0xa9,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c ,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0x2f,0x2f ,0x2f,0x2f,0x08,0xda,0xdd,0xda,0xdd,0xda,0xaa,0xa9,0xaa,0xa9,0xaa,0xa9 ,0xaa,0xa9,0xaa,0xa9,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d ,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0x2f,0x2f,0x2f,0x2f,0x2f,0xdd,0xdd,0xdd,0xda,0xda,0xa9,0xaa,0xa9,0xaa ,0xa9,0xaa,0xa9,0xaa,0xa9,0xaa,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec ,0xee,0x08,0x2f,0x2f,0x2f,0x2f,0x2f,0xda,0xdd,0xda,0xdd,0xda,0xaa,0xaa ,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee ,0xee,0xee,0xec,0x2f,0x2f,0x2f,0x2f,0x2f,0x08,0xdd,0xdd,0xdd,0xda,0xda ,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee ,0xee,0xee,0xee,0xec,0x2f,0x2f,0x0f,0x2f,0x2f,0x2f,0xdd,0xda,0xdd,0xda ,0xdd,0xda,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c ,0xee,0x6c,0xee,0xee,0xee,0xee,0x2f,0x2f,0x0f,0x0f,0x2f,0x2f,0xdd,0xdd ,0xdd,0xdd,0xda,0xda,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c ,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0x2f,0x0f,0x0f,0x0f,0x2f,0x2f ,0xdd,0xda,0xdd,0xda,0xdd,0xda,0x38,0xab,0xab,0xab,0xab,0xab,0xab,0xab ,0xab,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d ,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0x2f,0x0f,0x0f,0x0f ,0x2f,0x2f,0x2f,0xdd,0xdd,0xdd,0xda,0xda,0x38,0xab,0xac,0xab,0xac,0xab ,0xac,0xab,0xac,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d ,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0x0f,0x0f ,0x0f,0x0f,0x0f,0x2f,0x2f,0xdd,0xdd,0xda,0xdd,0xda,0x38,0xac,0xac,0xac ,0xac,0xac,0xac,0xac,0xac,0xac,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f ,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x08,0xdd,0xdd,0xda,0xda,0x38,0xac ,0xac,0xac,0xac,0xac,0xac,0xac,0xac,0xac,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee ,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0xdd,0xda,0xdd,0xda ,0x38,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c ,0xee,0xee,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x08,0xdd ,0xda,0xda,0xda,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0xad,0xac,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c ,0x6c,0xee,0xee,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f ,0x08,0xda,0xdd,0xda,0xda,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad,0xad ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x6c,0x6c,0xee,0x6c,0xee,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f ,0x2f,0x2f,0x2f,0xdd,0xda,0xda,0xda,0xad,0xae,0xad,0xae,0xad,0xae,0xad ,0xae,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c ,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f ,0x0f,0x0f,0x2f,0x2f,0x2f,0xda,0xdd,0xda,0xda,0xae,0xad,0xae,0xad,0xae ,0xad,0xae,0xad,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d ,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0x0f,0x0f,0x0f,0x0f ,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0x2f,0xdd,0xda,0xda,0xda,0xae,0xae,0xae ,0xae,0xae,0xae,0xae,0xae,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0x0f,0x0f,0x0f ,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0xda,0xdd,0xda,0xda,0x38 ,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0x0f ,0x0f,0x0f,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0xdd,0xda,0xda ,0xda,0x38,0xaf,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee ,0xee,0x0f,0x0f,0xec,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0x2f,0xda ,0xdd,0xda,0xda,0x38,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c ,0xee,0x6c,0xee,0x0f,0x0f,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f ,0x2f,0xdd,0xda,0xda,0xda,0x38,0xaf,0x2f,0xaf,0x2f,0xaf,0x2f,0xaf,0x2f ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c ,0x6c,0x6c,0x6c,0xee,0xee,0x0f,0x0f,0xec,0xee,0x0f,0x0f,0x0f,0x0f,0x0f ,0x0f,0x0f,0x2f,0xda,0xdd,0xda,0xda,0xda,0x2f,0xaf,0x2f,0xaf,0x2f,0xaf ,0x2f,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d ,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0x0f,0x0f ,0x0f,0x0f,0x0f,0x0f,0x2f,0xdd,0xda,0xda,0xda,0xda,0x2f,0x1f,0x2f,0x1f ,0x2f,0x1f,0x2f,0x1f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d ,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec ,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x2f,0xda,0xdd,0xda,0xda,0xda,0xaf,0x2f ,0xaf,0x2f,0xaf,0x2f,0xaf,0x2f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f ,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0xec,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xdd,0xda,0xda,0xda,0xda ,0xda,0xaf,0x2f,0xaf,0x2f,0xaf,0x2f,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee ,0xee,0xec,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xda,0xdd,0xda ,0xda,0xda,0xda,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0xaf,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xdd ,0xda,0xda,0xda,0xda,0xda,0xaf,0xae,0xaf,0xae,0xaf,0xae,0xaf,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c ,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f ,0x0f,0xda,0xdd,0xda,0xda,0xda,0xda,0xae,0xaf,0xae,0xaf,0xae,0xaf,0xae ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0x0f,0x0f,0x0f,0x0f ,0x0f,0x0f,0x0f,0xdd,0xda,0xda,0xda,0xda,0xda,0xae,0xae,0xae,0xae,0xae ,0xae,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c ,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0x0f,0x0f ,0x0f,0x0f,0x0f,0x0f,0x0f,0xda,0xdd,0xda,0xda,0xda,0xda,0x38,0xae,0xad ,0xae,0xad,0xae,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d ,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0x0f ,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xdd,0xda,0xda,0xda,0xda,0xda,0x38 ,0xad,0xae,0xad,0xae,0xad,0xae,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec ,0xee,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xdd,0xda,0xdd,0xda,0xda,0xda ,0xda,0x38,0xad,0xad,0xad,0xad,0xad,0xad,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee ,0xee,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0xdd,0xdd,0xda,0xda ,0xda,0xda,0xda,0x38,0xac,0xad,0xac,0xad,0xac,0xad,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee ,0xee,0xee,0xee,0xec,0xee,0x0f,0x0f,0x0f,0xdd,0x0f,0x0f,0x0f,0xdd,0xda ,0xdd,0xda,0xda,0xda,0xda,0x38,0xad,0xac,0xad,0xac,0xad,0xac,0x7f,0x7f ,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c ,0xee,0x6c,0xee,0xee,0xee,0xee,0x0f,0x0f,0x0f,0x0f,0xec,0x0f,0x0f,0x0f ,0xdd,0xdd,0xda,0xda,0xda,0xda,0xda,0x38,0xac,0xac,0xac,0xac,0xac,0xac ,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c ,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0xdd,0x0f ,0x0f,0x0f,0xdd,0xda,0xdd,0xda,0xda,0xda,0xda,0x38,0xac,0xab,0xac,0xab ,0xac,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d ,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0x0f,0x0f,0x0f,0x0f ,0xec,0x0f,0x0f,0x0f,0xdd,0xdd,0xda,0xda,0xda,0xda,0xda,0x38,0xab,0xac ,0xab,0xac,0xab,0xac,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d ,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0x0f,0x0f ,0x0f,0x0f,0xdd,0xec,0x0f,0x0f,0xdd,0xda,0xdd,0xda,0xda,0xda,0xda,0xab ,0xab,0xab,0xab,0xab,0xab,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7f ,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee ,0x0f,0x0f,0x0f,0x0f,0xec,0xdd,0x0f,0x0f,0xdd,0xdd,0xda,0xda,0xda,0xda ,0xda,0xab,0xaa,0xab,0xaa,0xab,0xaa,0xab,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee ,0xee,0xec,0x0f,0x0f,0x0f,0x0f,0xdd,0xec,0x0f,0xda,0xdd,0xda,0xdd,0xda ,0xda,0xda,0xda,0xaa,0xab,0xaa,0xab,0xaa,0xab,0xaa,0x7f,0x7f,0x7f,0x7f ,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c,0x6c,0x6c,0xee,0x6c ,0xee,0xee,0xee,0xee,0xec,0x0f,0x0f,0x0f,0xec,0xdd,0xdd,0xdd,0xdd,0xdd ,0xda,0xda,0xda,0xda,0x38,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x7f,0x7f ,0x7f,0x2f,0x7f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x7d,0x6c,0x6c,0x6c ,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0x0f,0x0f,0x0f,0xdd,0xec,0xdd,0xda ,0xdd,0xda,0xdd,0xda,0xda,0xda,0x38,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa ,0x7f,0x7f,0x2f,0x2f,0x7f,0x7f,0x7d,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c,0x6c ,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec,0x0f,0x0f,0xec,0xdd ,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0x38,0xa9,0xaa,0xa9,0xaa,0xa9 ,0xaa,0xa9,0x7f,0x7f,0x2f,0x2f,0x2f,0x7f,0x7f,0x7d,0x7d,0x7d,0x7d,0x6c ,0x0f,0x6c,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec,0xee,0xec,0x0f,0x0f ,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0xda,0xa9,0xaa,0xa9,0xaa ,0xa9,0xaa,0xa9,0xaa,0x7f,0x2f,0x2f,0x2f,0x2f,0x2f,0x7d,0x7f,0x7d,0x7d ,0x7d,0x0f,0x0f,0x2f,0x6c,0x6c,0xee,0x6c,0xee,0xee,0xee,0xee,0xec,0xec ,0x0f,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda,0xda,0xda,0xa9,0xa9 ,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x2f,0x0f,0x0f,0x2f,0x2f,0x7f,0x7d ,0x7d,0x7d,0x7d,0x0f,0x0f,0x2f,0x6c,0x6c,0x6c,0xee,0xee,0xee,0xee,0xec ,0xee,0xec,0xec,0xec,0xdd,0xec,0xdd,0xda,0xdd,0xda,0xdd,0xda,0xda,0x38 ,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0x7f,0x0f,0x0f,0x0f,0x2f,0x2f ,0x2f,0x7f,0x7d,0x7d,0x7d,0x0f,0x2f,0x2f,0x6c,0x6c,0xee,0x6c,0xee,0xee ,0xee,0xee,0xec,0xec,0xec,0xec,0xec,0xdd,0xdd,0xdd,0xdd,0xdd,0xda,0xda ,0xda,0x38,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9 }; RCL_Unit floorHeightAt(int16_t x, int16_t y) { /* This for loop may become a bottleneck, since this function is called very often - if more changes are to be kept, optimizations are needed - probably a hash table, sorting by coordinates etc. Maybe the better option yet would be to generate the terrain around the player into an array and pull values from there. */ for (uint16_t i = 0; i < MAX_CHANGES; ++i) if (changes[i].mCoords.x == x && changes[i].mCoords.y == y) return changes[i].mHeight; return (heightProfile[RCL_absVal(x) % HEIGHT_PROFILE_LENGTH] + heightProfile[RCL_absVal(y + 20) % HEIGHT_PROFILE_LENGTH]) * RCL_UNITS_PER_SQUARE; } RCL_Unit colorAt(int16_t x, int16_t y) { for (uint16_t i = 0; i < MAX_CHANGES; ++i) if (changes[i].mCoords.x == x && changes[i].mCoords.y == y) return changes[i].mColor; return min((heightProfile[RCL_absVal(x * 2) % HEIGHT_PROFILE_LENGTH] + heightProfile[RCL_absVal(y) % HEIGHT_PROFILE_LENGTH]) / 10,3); } uint16_t previousColumn = 255; ///< Helper for precomputing background. uint16_t backgroundColumn = 0; ///< Precomputed background column. /** Function for drawing a single pixel (like fragment shader). */ inline void pixelFunc(RCL_PixelInfo *pixel) { uint8_t color = 0; uint8_t intensity = 0; if (pixel->isWall) { if (pixel->hit.square.x != selectedSquare.x || pixel->hit.square.y != selectedSquare.y || (editing && pokitto.frameCount % 2) == 0) { intensity = pixel->depth / (RCL_UNITS_PER_SQUARE * 2) + ((pixel->hit.direction == 0 || pixel->hit.direction == 2) ? 4 : 0); color = plusIntensity(squareColors[pixel->hit.type],intensity); } else color = 30; } else if (pixel->isFloor) { if (!pixel->isHorizon) { intensity = pixel->depth / RCL_UNITS_PER_SQUARE; color = plusIntensity(floorColors[(pixel->height / RCL_UNITS_PER_SQUARE) % FLOOR_COLORS],intensity); } else color = floorColors[0]; } else { if (previousColumn != pixel->position.x) { backgroundColumn = RCL_absVal(pixel->position.x + (110 * player.mCamera.direction) / RCL_UNITS_PER_SQUARE) % 110; previousColumn = pixel->position.x; } color = imageBackground[2 + backgroundColumn * 44 + RCL_clamp(pixel->position.y - player.mCamera.shear,0,43)]; } putSubsampledPixel(pixel->position.x,pixel->position.y,color); } bool flyBy = true; void draw() { player.mCamera.height += player.mHeadBob; RCL_renderComplex(player.mCamera,floorHeightAt,0,colorAt,defaultConstraints); player.mCamera.height -= player.mHeadBob; if (flyBy && (pokitto.frameCount >> 3) % 3 != 0) { pokitto.display.setColor(0); pokitto.display.fillRect(22,3,66,10); pokitto.display.setCursor(25,5); pokitto.display.setColor(47); pokitto.display.invisiblecolor = 0; pokitto.display.print("press any key"); } } void cameraFlyBy(uint32_t dt) { RCL_Unit height = floorHeightAt( RCL_divRoundDown(player.mCamera.position.x,RCL_UNITS_PER_SQUARE), RCL_divRoundDown(player.mCamera.position.y,RCL_UNITS_PER_SQUARE)) + RCL_UNITS_PER_SQUARE * 3; RCL_Unit heightDiff = player.mCamera.height - height; RCL_Unit step = (200 * dt) / 1000; if (heightDiff > RCL_UNITS_PER_SQUARE * 2) { player.mCamera.height -= step * heightDiff / 200; player.mCamera.shear = max(player.mCamera.shear - 1,-80); } else { if (heightDiff < RCL_UNITS_PER_SQUARE) player.mCamera.height += step * RCL_absVal(heightDiff / 70); if (player.mCamera.shear < 0 && pokitto.frameCount % 2 == 0) player.mCamera.shear++; } player.mCamera.position.x += step * 30; player.mCamera.position.y += step * 15; player.mCamera.direction = RCL_sinInt(pokitto.frameCount / 8); } int main() { initGeneral(); defaultConstraints.maxHits = 6; defaultConstraints.maxSteps = 20; player.setPositionSquare(4,5); player.mCamera.height = floorHeightAt(4,5); // init changes for (uint16_t i = 0; i < MAX_CHANGES; ++i) { changes[i].mCoords.x = (i + 1) * 1000; changes[i].mCoords.y = 0; changes[i].mHeight = floorHeightAt(i,0); } uint32_t previousTime = 0; uint32_t dt; int16_t moveDirection; int16_t shearDirection; int16_t rotationDirection; bool strafe; while (pokitto.isRunning()) { if (pokitto.update()) { draw(); moveDirection = 0; shearDirection = 0; rotationDirection = 0; strafe = false; uint32_t timeNow = pokitto.getTime(); dt = timeNow - previousTime; previousTime = timeNow; if (flyBy) { cameraFlyBy(dt); if (pokitto.aBtn() || pokitto.bBtn() || pokitto.cBtn() || pokitto.upBtn() || pokitto.downBtn() || pokitto.leftBtn() || pokitto.rightBtn()) flyBy = false; continue; } strafe = pokitto.aBtn(); if (pokitto.cBtn()) { if (editReleased) { editing = !editing; if (editing) { RCL_Vector2D facingOffset; facingOffset.x = 0; facingOffset.y = 0; if (player.mCamera.direction > (4 * RCL_UNITS_PER_SQUARE / 12) && player.mCamera.direction <= (8 * RCL_UNITS_PER_SQUARE / 12)) facingOffset.x = -1; else if (player.mCamera.direction < (2 * RCL_UNITS_PER_SQUARE / 12) || player.mCamera.direction >= (10 * RCL_UNITS_PER_SQUARE / 12)) facingOffset.x = 1; else facingOffset.x = 0; if (player.mCamera.direction > (RCL_UNITS_PER_SQUARE / 12) && player.mCamera.direction <= (5 * RCL_UNITS_PER_SQUARE / 12)) facingOffset.y = -1; else if (player.mCamera.direction > (6 * RCL_UNITS_PER_SQUARE / 12) && player.mCamera.direction <= (11 * RCL_UNITS_PER_SQUARE / 12)) facingOffset.y = 1; else facingOffset.y = 0; selectedSquare.x = RCL_divRoundDown(player.mCamera.position.x,RCL_UNITS_PER_SQUARE) + facingOffset.x; selectedSquare.y = RCL_divRoundDown(player.mCamera.position.y,RCL_UNITS_PER_SQUARE) + facingOffset.y; changeIndex = (changeIndex + 1) % MAX_CHANGES; for (uint16_t i = 0; i < MAX_CHANGES; ++i) if (changes[i].mCoords.x == selectedSquare.x && changes[i].mCoords.y == selectedSquare.y) { changeIndex = i; break; } changes[changeIndex].mHeight = floorHeightAt(selectedSquare.x,selectedSquare.y); changes[changeIndex].mColor = colorAt(selectedSquare.x,selectedSquare.y); changes[changeIndex].mCoords.x = selectedSquare.x; changes[changeIndex].mCoords.y = selectedSquare.y; editCounter = 0; } editReleased = false; } } else editReleased = true; if (pokitto.upBtn()) { if (editing) { if (editCounter == 0) { changes[changeIndex].mHeight += RCL_UNITS_PER_SQUARE / 4; editCounter = 4; } } else if (strafe) shearDirection = 1; else moveDirection = 1; } else if (pokitto.downBtn()) { if (editing) { if (editCounter == 0) { changes[changeIndex].mHeight -= RCL_UNITS_PER_SQUARE / 4; editCounter = 4; } } else if (strafe) shearDirection = -1; else moveDirection = -1; } uint16_t colorAddition = 0; if (pokitto.rightBtn()) { if (strafe) moveDirection = 1; else if (!editing) rotationDirection = 1; else colorAddition = 1; } else if (pokitto.leftBtn()) { if (strafe) moveDirection = - 1; else if (!editing) rotationDirection = -1; else colorAddition = -1; } if (editing) { int16_t heightDiff = changes[changeIndex].mHeight - player.mCamera.height; if (heightDiff > RCL_UNITS_PER_SQUARE / 2) shearDirection = 1; else if (heightDiff < -1 * RCL_UNITS_PER_SQUARE / 2) shearDirection = -1; if (editCounter == 0 && colorAddition != 0) { changes[changeIndex].mColor = RCL_wrap(changes[changeIndex].mColor + colorAddition,SQUARE_COLORS); editCounter = 4; } } editCounter = max(0, editCounter - 1); player.update(moveDirection,strafe,rotationDirection,pokitto.bBtn(),shearDirection, floorHeightAt,0,true,dt); } } return 0; }