Pokitto-Raycasting/demo3.cpp
Miloslav Číž fb8ae0f162 Update
2018-09-21 08:47:42 +02:00

744 lines
36 KiB
C++

/**
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
*/
// redefine player's height
#define PLAYER_SPEED (RCL_UNITS_PER_SQUARE * 6)
#define RCL_HORIZONTAL_FOV ((3 * RCL_UNITS_PER_SQUARE) / 10)
#define GRAVITY_ACCELERATION (RCL_UNITS_PER_SQUARE * 2)
#define RCL_CAMERA_COLL_HEIGHT_BELOW ((3 * RCL_UNITS_PER_SQUARE) / 2)
#define FPS 40
#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
char floorColor = 0;
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
uint8_t squareColors[SQUARE_COLORS];
#define HEIGHT_PROFILE_LENGTH 256
/// 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
,0xc7,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc6,0xc6,0xff,0xff,0xbc,0xbc
,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x38,0x38,0x38,0x38,0x38,0x38,0x38
,0x38,0x38,0xc7,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc6,0xc6,0xff,0xff
,0xbc,0xbc,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3
,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x38,0x38,0x38,0x38,0x38
,0x38,0x38,0x38,0x38,0xc7,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc6,0xc6
,0xff,0xff,0xbc,0xbc,0xac,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x38,0x38,0x38
,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xbc,0xff,0xff,0xbc,0xbc,0xbc,0xbc
,0xc6,0xc6,0xff,0xff,0xbc,0xbc,0xbc,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x39
,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xff,0xff,0xff,0xbc,0xbc
,0xbc,0xbc,0xc6,0xc6,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1
,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xbc,0xff,0xff
,0xbc,0xbc,0xbc,0xbc,0xc6,0xbc,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xff
,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc6,0xbc,0xff,0xff,0xbc,0xbc,0xbc,0xbc
,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39
,0xc7,0xbc,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xc6,0xbc,0xff,0xff,0xff,0xbc
,0xbc,0xbc,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x39,0x3a,0x39,0x3a,0x39,0x3a,0x39,0x3a
,0x39,0x3a,0xc7,0xbc,0xff,0xbc,0xbc,0xbc,0xbc,0xbc,0xac,0xbc,0xff,0xff
,0xff,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3
,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x3a,0x39,0x3a,0x39,0x3a,0x39
,0x3a,0x39,0x3a,0x39,0xc7,0xbc,0xff,0xff,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc
,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x3a,0x3a,0x3a,0x3a
,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xbc,0xff,0xbc,0xbc,0xbc,0xbc,0xbc
,0xbc,0xbc,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x3a,0x3a
,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xbc,0xff,0xff,0xbc,0xbc
,0xbc,0xbc,0xbc,0xbc,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc4,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1
,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b,0xc7,0xbc,0xff,0xbc
,0xbc,0xbc,0xff,0xbc,0xbc,0xbc,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc5,0xc4
,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1
,0xc2,0xc1,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0xc7,0xbc
,0xff,0xbc,0xbc,0xbc,0xff,0xff,0xbc,0xbc,0xff,0xff,0xff,0xff,0xbc,0xbc
,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2
,0xc2,0xc2,0xc1,0xc1,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b
,0xc7,0xbc,0xff,0xbc,0xbc,0xff,0xff,0xff,0xbc,0xbc,0xff,0xff,0xff,0xff
,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b
,0x3b,0x3b,0xc7,0xbc,0xbc,0xbc,0xbc,0xff,0xff,0xff,0xbc,0xbc,0xff,0xff
,0xff,0xff,0xbc,0xbc,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3
,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b
,0x3c,0x3b,0x3c,0x3b,0xc7,0xbc,0xff,0xbc,0xc7,0xff,0xff,0xff,0xbc,0xff
,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x3c,0x3b,0x3c
,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0xc7,0xbc,0xbc,0xbc,0xc7,0xff,0xff,0xff
,0xff,0xbc,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x3c
,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xc7,0xbc,0xff,0xbc,0xc7,0xff
,0xff,0xff,0xbc,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1
,0x29,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xc7,0xbc,0xbc,0xbc
,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0x29,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0xc7,0xbc
,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xbc,0xff,0xff,0xff,0xff,0xbc,0xbc,0xbc
,0xac,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0xc1,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c
,0xc7,0xbc,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbc
,0xbc,0xbc,0xac,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d
,0x3d,0x3d,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xbc,0xff,0xff,0xff
,0xbc,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3
,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0x3d,0x3d,0x3d,0x3d,0x3d
,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xff,0xff
,0xff,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0x3d,0x3e,0x3d
,0x3e,0x3d,0x3e,0x3d,0x3e,0x3d,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff
,0xff,0xff,0xc6,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc,0xac,0xc4,0xc4,0xc4,0xc3
,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1
,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7
,0xff,0xff,0xff,0xff,0xc6,0xc6,0xbc,0xbc,0xbc,0xbc,0xbc,0xac,0xc4,0xc4
,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1
,0xc1,0xc1,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7,0xbc,0xbc
,0xc7,0xc7,0xff,0xff,0xff,0xbc,0xc6,0xc5,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc
,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1
,0xc2,0xc1,0xc1,0xc1,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7
,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xff,0xbc,0xc6,0xc6,0xbc,0xbc,0xbc,0xbc
,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2
,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f
,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xbc,0xbc,0xc6,0xc5,0xbc,0xbc
,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x3e,0x3f,0x3e,0x3f,0x3e
,0x3f,0x3e,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xbc,0xbc,0xc6,0xc6
,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3
,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3f,0x3f,0x3f
,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff,0xbc,0xbc
,0xc6,0xc5,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x3f
,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xff,0xff
,0xbc,0xac,0xc6,0xc6,0xbc,0xbc,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1
,0x29,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xbc,0xc7,0xc7,0xc7
,0xff,0xff,0xbc,0xc6,0xc6,0xc5,0xc6,0xbc,0xbc,0xbc,0xbc,0xbc,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1
,0xc1,0xc1,0x29,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xbc,0xc7
,0xc7,0xc7,0xff,0xff,0xbc,0xc6,0xc6,0xc6,0xc5,0xbc,0xbc,0xbc,0xbc,0xbc
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0xc1,0xc1,0x29,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xff,0xff,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xbc,0xbc
,0xbc,0xac,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xff,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xbc,0xbc,0xbc,0xac,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3e,0x3e,0x3e,0x3e,0x3e
,0x3e,0x3e,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xff,0xc6,0xc6,0xc6,0xc5
,0xc6,0xc5,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3
,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x3e,0x3e,0x3e
,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xff,0xc6,0xc6
,0xc6,0xc6,0xc5,0xc5,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3e
,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6
,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xbc,0xbc,0xbc,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1
,0x29,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xbc,0xbc,0xbc,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1
,0xc1,0xc1,0x29,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xbc,0xac,0xc4
,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1
,0xc2,0xc1,0xc1,0xc1,0x29,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5
,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2
,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5
,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x3d,0x3c,0x3d,0x3c,0x3d
,0x3c,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6
,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3
,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3c,0x3c,0x3c
,0x3c,0x3c,0x3c,0x3c,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6
,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x3c,0x3c
,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7
,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1
,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1
,0xc1,0xc1,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0xc1,0x29,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5
,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0xc1,0x29,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0x29,0x3a,0x3b,0x3a,0x3b,0x3a,0x3b
,0x3a,0x3b,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5
,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3
,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0x29,0x3b,0x3a,0x3b,0x3a
,0x3b,0x3a,0x3b,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6
,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0x29,0x3a,0x3a
,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6
,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0x3a
,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1
,0xc1,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4
,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1
,0xc2,0xc1,0xc1,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5
,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2
,0xc2,0xc2,0xc1,0xc1,0xc1,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5
,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xc3,0xbc,0xac,0xc3
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x39,0x39,0x39,0x39,0x39,0x39,0x39
,0x39,0x39,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6
,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xc3,0xbc
,0xbc,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x39,0x39,0x39,0x39,0x39
,0x39,0x39,0x39,0x39,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6
,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xac,0xbc,0xbc,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x39,0x39,0x39
,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7
,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xbc,0xbc,0xbc,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x38
,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xbc,0xbc,0xbc,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1
,0x29,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xbc,0xbc,0xbc,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5
,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xbc,0xbc,0xbc,0xbc,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xbc,0xbc,0xbc,0xbc
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38
,0x38,0x38,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5
,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xbc,0xbc
,0xbc,0xbc,0xac,0xc1,0xc2,0xc1,0xc2,0xc1,0x38,0x38,0x38,0x38,0x38,0x38
,0x38,0x38,0x38,0x38,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6
,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xbc,0xbc,0xbc,0xbc,0xbc,0xc2,0xc2,0xc2,0xc1,0xc1,0x38,0x38,0x38,0x38
,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6
,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xac,0xbc,0xbc,0xbc,0xbc,0xbc,0xc1,0xc2,0xc1,0xc2,0xc1,0x39,0x39
,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xbc,0xbc,0xbc,0xbc,0xbc,0xac,0xc2,0xc2,0xc2,0xc1,0xc1
,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4
,0xc4,0xc4,0xc4,0xc3,0xbc,0xbc,0xff,0xbc,0xbc,0xbc,0xc2,0xc1,0xc2,0xc1
,0xc2,0xc1,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5
,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xbc,0xbc,0xff,0xff,0xbc,0xbc,0xc2,0xc2
,0xc2,0xc2,0xc1,0xc1,0x39,0x3a,0x39,0x3a,0x39,0x3a,0x39,0x3a,0x39,0x3a
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5
,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xbc,0xff,0xff,0xff,0xbc,0xbc
,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a
,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6
,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xbc,0xff,0xff,0xff
,0xbc,0xbc,0xbc,0xc2,0xc2,0xc2,0xc1,0xc1,0x29,0x3a,0x3a,0x3a,0x3a,0x3a
,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6
,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xff,0xff
,0xff,0xff,0xff,0xbc,0xbc,0xc1,0xc2,0xc1,0xc2,0xc1,0x29,0x3a,0x3b,0x3a
,0x3b,0x3a,0x3b,0x3a,0x3b,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7
,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xac,0xc2,0xc2,0xc1,0xc1,0x29,0x3b
,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4
,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xc2,0xc1,0xc2,0xc1
,0x29,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0x3c,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5
,0xc4,0xc4,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xac,0xc2
,0xc1,0xc1,0xc1,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5
,0xc5,0xc4,0xc4,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc
,0xac,0xc1,0xc2,0xc1,0xc1,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
,0xbc,0xbc,0xbc,0xc2,0xc1,0xc1,0xc1,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0x3c
,0x3d,0x3c,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5
,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xff,0xff,0xff,0xff,0xff,0xff
,0xff,0xff,0xbc,0xbc,0xbc,0xc1,0xc2,0xc1,0xc1,0x3d,0x3d,0x3d,0x3d,0x3d
,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6
,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xff,0xff,0xff,0xff
,0xff,0xff,0xff,0xff,0xbc,0xbc,0xbc,0xc2,0xc1,0xc1,0xc1,0x3d,0x3d,0x3d
,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6
,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xff,0xff,0xff
,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc1,0xc2,0xc1,0xc1,0x29
,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0x3d,0x3e,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xff
,0xff,0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc2,0xc1,0xc1
,0xc1,0x29,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4
,0xc4,0xff,0xff,0xc3,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbc,0xc1
,0xc2,0xc1,0xc1,0x29,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5
,0xc4,0xc5,0xc4,0xff,0xff,0xc4,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xbc
,0xbc,0xc2,0xc1,0xc1,0xc1,0x29,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5
,0xc5,0xc5,0xc5,0xc4,0xc4,0xff,0xff,0xc3,0xc4,0xff,0xff,0xff,0xff,0xff
,0xff,0xff,0xbc,0xc1,0xc2,0xc1,0xc1,0xc1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f
,0x3f,0x3f,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6
,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xff,0xff
,0xff,0xff,0xff,0xff,0xbc,0xc2,0xc1,0xc1,0xc1,0xc1,0x3f,0x3f,0x3f,0x3f
,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6
,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3
,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xc1,0xc2,0xc1,0xc1,0xc1,0x3f,0x3f
,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7
,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xc3,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc2,0xc1,0xc1,0xc1,0xc1
,0xc1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xc4,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xc2,0xc1
,0xc1,0xc1,0xc1,0x3f,0x3e,0x3f,0x3e,0x3f,0x3e,0x3f,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc2
,0xc1,0xc1,0xc1,0xc1,0xc1,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5
,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xff,0xff,0xff,0xff,0xff,0xff
,0xff,0xc1,0xc2,0xc1,0xc1,0xc1,0xc1,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xff,0xff,0xff,0xff
,0xff,0xff,0xff,0xc2,0xc1,0xc1,0xc1,0xc1,0xc1,0x3d,0x3e,0x3d,0x3e,0x3d
,0x3e,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5
,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xff,0xff
,0xff,0xff,0xff,0xff,0xff,0xc1,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3d,0x3d
,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6
,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xff
,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc2,0xc1,0xc1,0xc1,0xc1,0xc1,0x29
,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6
,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1
,0xc1,0x29,0x3c,0x3d,0x3c,0x3d,0x3c,0x3d,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc2,0xc2,0xc1,0xc1
,0xc1,0xc1,0xc1,0x29,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4
,0xc4,0xc4,0xc4,0xc3,0xc4,0xff,0xff,0xff,0xc2,0xff,0xff,0xff,0xc2,0xc1
,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3c,0x3b,0x3c,0x3b,0x3c,0x3b,0xc7,0xc7
,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5
,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xff,0xff,0xff,0xff,0xc3,0xff,0xff,0xff
,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0xc1,0x29,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b
,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5
,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xff,0xff,0xff,0xff,0xc2,0xff
,0xff,0xff,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x3b,0x3b,0x3b,0x3b
,0x3b,0x3b,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6
,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xff,0xff,0xff,0xff
,0xc3,0xff,0xff,0xff,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0xc1,0x29,0x3a,0x3b
,0x3a,0x3b,0x3a,0x3b,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6
,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xff,0xff
,0xff,0xff,0xc2,0xc3,0xff,0xff,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0xc1,0x3a
,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0xc7
,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4
,0xff,0xff,0xff,0xff,0xc3,0xc2,0xff,0xff,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1
,0xc1,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4
,0xc4,0xc3,0xff,0xff,0xff,0xff,0xc2,0xc3,0xff,0xc1,0xc2,0xc1,0xc2,0xc1
,0xc1,0xc1,0xc1,0x39,0x3a,0x39,0x3a,0x39,0x3a,0x39,0xc7,0xc7,0xc7,0xc7
,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc5,0xc4,0xc5
,0xc4,0xc4,0xc4,0xc4,0xc3,0xff,0xff,0xff,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2
,0xc1,0xc1,0xc1,0xc1,0x29,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0xc7,0xc7
,0xc7,0xbc,0xc7,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc6,0xc5,0xc5,0xc5
,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xff,0xff,0xff,0xc2,0xc3,0xc2,0xc1
,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x29,0x39,0x39,0x39,0x39,0x39,0x39,0x39
,0xc7,0xc7,0xbc,0xbc,0xc7,0xc7,0xc6,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5,0xc5
,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3,0xff,0xff,0xc3,0xc2
,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x29,0x39,0x39,0x39,0x39,0x39
,0x39,0x39,0xc7,0xc7,0xbc,0xbc,0xbc,0xc7,0xc7,0xc6,0xc6,0xc6,0xc6,0xc5
,0xff,0xc5,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc4,0xc3,0xff,0xff
,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0xc1,0x38,0x38,0x38,0x38
,0x38,0x38,0x38,0x38,0xc7,0xbc,0xbc,0xbc,0xbc,0xbc,0xc6,0xc7,0xc6,0xc6
,0xc6,0xff,0xff,0xbc,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3,0xc3
,0xff,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xc1,0x38,0x38
,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xbc,0xff,0xff,0xbc,0xbc,0xc7,0xc6
,0xc6,0xc6,0xc6,0xff,0xff,0xbc,0xc5,0xc5,0xc5,0xc4,0xc4,0xc4,0xc4,0xc3
,0xc4,0xc3,0xc3,0xc3,0xc2,0xc3,0xc2,0xc1,0xc2,0xc1,0xc2,0xc1,0xc1,0x29
,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0xc7,0xff,0xff,0xff,0xbc,0xbc
,0xbc,0xc7,0xc6,0xc6,0xc6,0xff,0xbc,0xbc,0xc5,0xc5,0xc4,0xc5,0xc4,0xc4
,0xc4,0xc4,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0xc1
,0xc1,0x29,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38
};
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.
*/
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;
int16_t intensity = 0;
if (pixel->isWall)
{
color = pixel->hit.square.x != selectedSquare.x || pixel->hit.square.y != selectedSquare.y || (editing && pokitto.frameCount % 2) == 0 ?
squareColors[pixel->hit.type] : 30;
intensity = pixel->depth / (RCL_UNITS_PER_SQUARE * 3);
intensity += pixel->hit.direction % 2 == 0 ? 2 : 0;
}
else if (pixel->isFloor)
{
color = floorColor;
if (!pixel->isHorizon)
intensity = pixel->depth / (RCL_UNITS_PER_SQUARE * 3);
}
else
{
if (previousColumn == pixel->position.x)
{
color = imageBackground[2 + backgroundColumn * 44 + RCL_clamp(pixel->position.y - player.mCamera.shear,0,43)];
}
else
{
backgroundColumn = RCL_absVal(pixel->position.x + (110 * player.mCamera.direction) / RCL_UNITS_PER_SQUARE) % 110;
previousColumn = pixel->position.x;
}
}
if (intensity != 0)
color = addIntensity(color,intensity);
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(255);
pokitto.display.fillRect(22,3,66,10);
pokitto.display.setCursor(25,5);
pokitto.display.setColor(rgbToIndex(1,0,0));
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;
floorColor = rgbToIndex(4,2,0);
squareColors[0] = rgbToIndex(0,0,3);
squareColors[1] = rgbToIndex(7,0,0);
squareColors[2] = rgbToIndex(0,7,0);
squareColors[3] = rgbToIndex(4,4,0);
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;
}