Okay, I figured that ready or not I need to release this as is. I have some ideas for added features that I'll probably release outside the challenge.
This version of Pong is only a one player game, mostly because I use the mouse for input and can't quite figure out how to use two meeces and mouse vs. keyboard puts someone at a disadvantage. Maybe the next version will will include joystick input.
AAR, I'm including some background notes on the program itself in this post. Hopefully the code is documented enough to explain what isn't in the notes. One thing to note is that this program requires two additional header files that contain somewhat large arrays. Here's hoping they aren't too large.
main.cpp
///////////////////////////////////////////////////////////////////////////
// NewPong //
// Author: Lilith Calbridge //
// Release: .000015 //
// Release Date: 05/29/09 //
///////////////////////////////////////////////////////////////////////////
#include "DarkGDK.h"
#include "balldata.h"
#include "paddle.h"
const int bitTemp = 1;
int temp;
// screen related data
const int screenWidth = 800;
const int screenHeight = 600;
int lastPointTo = 1; // 1 = computer, 2 = player
class Pong
{ // base class for the sprite-based classes
protected:
int sprite; // maintains the sprite number for the object
int image; // maintains the image number for the object
int Width; // the width of the sprite
int Height; // the height of the sprite
int X; // the integer x position of the sprite
int Y; // the integer y position of the sprite
public:
Pong (){} // default constructor, does nothing
Pong (int *gsize, DWORD *gdata) // constructor with image input
{
Pong(); // calls the default constructor
GenGraphic (gsize, gdata); // gets the image data from two arrays
}
~Pong () // the destructor
{ // gets rid of the sprite and image
if (dbSpriteExist(sprite)) dbDeleteSprite(sprite);
if (dbImageExist(image)) dbDeleteImage(image);
}
protected:
void GenGraphic (int *sizes, DWORD *imgData)
{ // pulls the pizels in from an array and feeds them to the bitmap
Width = sizes[0]; // get the width and height from the array
Height = sizes[1];
dbCreateBitmap (bitTemp, Width, Height); // use a temporary bitmap
dbSetCurrentBitmap (bitTemp); // draw to the temporary bitmap
int index = 0; // this is the counter into imgData
for (int i = 0; i < Height; i++) { // scan the rows
for (int j = 0; j < Width; j++){ // scan the columns
dbInk (imgData[index++], 0x00); // use the array to set the ink color
dbDot(j, i); // and place it in the bitmap
}
}
dbGetImage(image, 0, 0, Width, Height, 1); // make an image from the bitmap
dbSprite (sprite, 20, 20, image); // associate the image with the sprite
dbDeleteBitmap (bitTemp); // recycle the bitmap
}
public:
int GetX(){return X;} // feeds the x position to the caller
int GetY(){return Y;} // feeds the y position to the caller
int GetWidth() {return Width;} // same for width
int GetHeight() {return Height;} // and height
int StruckAt (int yPos) { // returns a value based on where the paddle was struck
if (yPos > ( Y - Height/2) && yPos < ( Y + Height/2)) {
return ( (Y + Height/2) - yPos); // indicates where on the paddle the ball hit
}
return -1; // indicates that the paddle was not struck
}
};
class Player : public Pong // derives from the Pong class
{
private:
static const int Image = 1; // forces the player to be identified as image
static const int Sprite = 1; // and sprite number 1. updated in constructors
int MinY; // highest position the paddle can get
int MaxY; // lowest position the paddle can get
int MaxDisp; // used to keep the speed of the paddle down
int Score; // the player's score.
public:
Player () { // default constructor
image = Image; // sets the local image number
sprite = Sprite; // same for the sprite
Width = 20; // these are really useless but I do them
Height = 80; // anyway to make sure they're initialized
MinY = Height/2;
MaxY = screenHeight - Height/2;
X = screenHeight - Width/2;
Y = screenHeight;
MaxDisp = 10; // set the maximum number of pixels player can move
// in each cycle
Score = 0; // always start the game at zero
}
Player (int *sizes, DWORD *imagedata)
{ // constructor that creates image data
image = Image; // some repeats of the default constructor
sprite = Sprite;
GenGraphic (sizes, imagedata); // read in the image data
MinY = Height/2; // image data sets the sizes so now we
MaxY = screenHeight - Height/2; // need to set the dependent variables
X = screenHeight - Width/2;
Y = screenHeight/2;
MaxDisp = 10;
Score = 0;
dbSprite (sprite, X, Y, image); // position on the right side, half way down (or up)
}
void Init ()
{
dbOffsetSprite (sprite, Width/2, Height/2);
MinY = Height/2; //
MaxY = screenHeight - Height/2;
X = screenWidth - Width/2;
Y = 0;
Score = 0;
}
void Set()
{ // calculates where the paddle should be based on the mouse's Y postion
// the displacement speed is limited by the paddleMaxDisp value so the
// player can't just zoom to a position
int spriteY = dbSpriteY(sprite); // find where the sprite is
int mouseY = dbMouseY(); // find where the mouse is
if (abs(spriteY - mouseY) <= MaxDisp) { // if sprite is within the displacement
Y = mouseY; // range just put it where the mouse is
} else if (mouseY > Y) { // if mouse is below the paddles position
Y += MaxDisp; // displace by the maximum in that direction
} else Y -= MaxDisp; // otherwise displace in the other direction
if (Y < MinY) Y = MinY; // make sure the paddle position isn't too high
if (Y > MaxY) Y = MaxY; // or too low
dbSprite (sprite, X, Y, image); // position the sprite
dbPositionMouse(X, Y);
}
int GetScore ()
{
return Score;
}
int IncrementScore () {
return Score++;
}
};
class Computer : public Pong
{
private:
static const int Image = 2;
static const int Sprite = 2;
int maxDisp; // maximum displacement
int Score;
public:
Computer ()
{ // defaults set just so the program has something to work with
image = Image;
sprite = Sprite;
Width = 20;
Height = 80;
X = Width/2;
Y = screenHeight/2;
X = Width/2;
Y = Height/2;
maxDisp = 7;
}
Computer (int *sizes, DWORD *imagedata)
{
image = Image;
sprite = Sprite;
GenGraphic(sizes, imagedata);
X = Width/2;
Y = screenHeight/2;
X = Width/2;
Y = Height/2;
maxDisp = 7;
}
void Init()
{
dbOffsetSprite (sprite, Width/2, Height/2);
X = Width/2;
Y = screenHeight/2;
X = Width/2;
Y = screenHeight/2; // initial setting halfway down screen
Score = 0;
}
void Set(int ballY)
{ // this function needs to know the Y position of the ball in order to
// work its AI "magic"
if (ballY < Y) { // ball is above the paddle
if (abs(ballY - Y) < maxDisp) Y = ballY;
else Y -= maxDisp;
} else {
if (abs(ballY - Y) < maxDisp) Y = ballY;
else Y += maxDisp;
}
if (Y < Height/2) Y = Height/2;
if (Y > screenHeight - Height/2) Y = screenHeight - Height/2;
dbSprite (sprite, X, Y, image);
}
int GetScore ()
{
return Score;
}
int IncrementScore () {
return Score++;
}
};
class Ball : public Pong
{
static const int Sprite = 3;
static const int Image = 3;
int Radius;
float Velocity; // the speed of the ball
float InitVelocity; // starting speed
float XVector; // the speed in the X direction
float YVector; // the speed in the Y direction
float XLoc; // ball X postiion
float YLoc; // ball Y position
float Angle; // direction ball is traveling
int bounceCount;
bool movingRight;
bool Active;
public:
Ball (){ // default constructor
sprite = Sprite;
image = Image;
InitVelocity = Velocity = 10.0f;
Angle = 0.11f;
XVector = cos(Angle)* Velocity;
YVector = sin(Angle)* Velocity;
XLoc = (float) screenWidth/2;
YLoc = (float) screenHeight/2;
Radius = Width/2;
dbOffsetSprite (sprite, Radius, Radius);
movingRight = true;
Active = true;
}
Ball (int *sizes, DWORD *imagedata)
{
sprite = Sprite;
image = Image;
InitVelocity = Velocity = 10.0f;
Angle = 0.11f;
XVector = cos(Angle * 0.0175f)* Velocity;
YVector = sin(Angle * 0.0175f)* Velocity;
GenGraphic (sizes, imagedata);
Radius = Width/2;
dbOffsetSprite (sprite, Radius, Radius);
XLoc = (float) screenWidth/2;
YLoc = (float) screenHeight/2;
X = (int) (XLoc + 0.5f);
Y = (int) (YLoc + 0.5f);
dbSprite (sprite, X, Y, image);
movingRight = true;
Active = false;
}
void Init (int lastScorer)
{ // set the initial conditions on the ball
Velocity = InitVelocity;
bounceCount = 0;
Angle = (float) (dbRND(90) - 45); // get a random angle between 45 degrees and - 45
movingRight = true; // initially send towards player
XVector = cos(Angle * 0.0175f)* Velocity; // calculate the X and Y velocity components
YVector = sin(Angle * 0.0175f)* Velocity;
if (lastScorer == 2) { // last score to player
XVector = -XVector; // if the player scored last we reverse the direction so the
movingRight = false; // computer receives the serve
}
XLoc = (float) screenWidth/2; // position the ball
YLoc = (float) screenHeight/2; // using float values
X = (int) (XLoc + 0.5f); // use integer values
Y = (int) (YLoc + 0.5f); // for the on-screen position
dbSprite (sprite, X, Y, image); // position the sprite
Active = false; // set for initially
}
bool SetActive (bool tf)
{
return (Active = tf);
}
bool IsMovingRight (void)
{
return movingRight;
}
void Update ()
{
if (!Active) return;
if ( Y >= screenHeight - Radius) YVector = - YVector; // bounce off bottom
if ( Y <= 0) YVector = - YVector; // bounce off top
XLoc += XVector;
YLoc += YVector;
X = (int) (XLoc + .5);
Y = (int) (YLoc + .5);
dbSprite (sprite, X, Y, image);
}
int Collision (Pong &paddle)
{
int hitAt;
if (movingRight) { // check against the player's paddle
if (X < screenWidth - paddle.GetWidth() - Radius) return -1; // not near the paddle
if (X > screenWidth) return -2; // if beyond the screen it's past the paddle
// if we got here it means we're in contact with the paddle (we hope)
// this section checks to see if the ball hit the paddle on the right (player)
// if not, it returns -1. if it did hit the paddle it determines where on the paddle
// it struck and calculates a deflection angle. The upper half deflects the ball upward
// the lower half deflects downward. the further from the center the steeper the
// deflection.
if ((hitAt = paddle.StruckAt(Y)) == -1)
return -1; // no contact, otherwise
Angle = ((float)((float) hitAt)/(float) paddle.GetHeight()) * 120.0f - 60.0f;
if (++bounceCount % 6) Velocity += 0.1f;
XVector = -Velocity * cos (Angle * 0.0175f);
YVector = -Velocity * sin (Angle * 0.0175f);
movingRight = false;
return 0;
}
// if the ball is moving left the code should drop down to here
if (X > paddle.GetWidth() + Radius) return -1; // not near the paddle
if (X < 0) return -2; // if beyond the screen it's past the paddle
if ((hitAt = paddle.StruckAt(Y)) == -1) return -1; // no contact, otherwise
Angle = ((float)((int) hitAt)/(float) paddle.GetHeight()) * 120.0f - 60.0f;
if (++bounceCount % 6) Velocity += 0.1f;
XVector = Velocity * cos (Angle * 0.0175f);
YVector = -Velocity * sin (Angle * 0.0175f);
movingRight = true;
return 0;
}
};
////////////////////////////////////////////////////////////
// the main entry point for the application is this function
////////////////////////////////////////////////////////////
void DarkGDK ( void )
{
char strScores [50]; // large enough string to hold the scores
bool replay = true; // flag for player to start new game
dbSetDisplayMode(screenWidth, screenHeight, 32);
// dbSetWindowOff();
dbSyncOn ( );
dbSyncRate ( 60 );
dbRandomize(dbTimer());
dbDisableEscapeKey ( );
dbHideMouse();
// create the components and
Player player(paddlesizes, paddleimgData);
Computer comp (paddlesizes, paddleimgData);
Ball ball (ballsizes, ballimgData);
dbSetCurrentBitmap(0);
while (replay){
lastPointTo = 1;
player.Init();
comp.Init();
ball.Init(lastPointTo);
// now we come to our main loop, we call LoopGDK so some internal
// work can be carried out by the GDK
while ( LoopGDK ( ) && (comp.GetScore() != 6) && (player.GetScore() != 6))
{
if ( dbEscapeKey ( )){
replay = false;
break;
}
if ( dbSpaceKey () ) ball.SetActive (true);
dbCLS(0xffffffff); // clear the screen
// draw a vertical line in the center of the screen
dbInk (0xff000000, 0xff000000);
dbLine (screenWidth/2, 0, screenWidth/2, screenHeight);
// print the scores to the screen
sprintf (strScores, "%d %d", comp.GetScore(), player.GetScore());
dbInk (0xff00ff00, 0x00000000); // using green ink
dbSetTextFont ("Arial"); // it's a nice font
dbSetTextSize (36); // that can grow to 36 points
dbCenterText (screenWidth/2, 20, strScores);// print the scores centered near the top
player.Set(); // update all the components
comp.Set(ball.GetY()); // computer needs the ball's vertical position
ball.Update(); // move the ball
if (ball.IsMovingRight()) { // if the ball is moving right
switch (ball.Collision(player)){ // check for collision with player's paddle
case -1: break; // not near the paddle
case -2: comp.IncrementScore(); // out of bounds player side
lastPointTo = 1;
ball.Init(lastPointTo);
break;
}
} else {
switch (ball.Collision(comp)) {
case -1: break; // not near the paddle
case -2: player.IncrementScore(); // out of bounds computer side
lastPointTo = 2;
ball.Init(lastPointTo);
break;
}
}
dbSync ( );
}
if (!replay) break; // player pressed escape during play
// someone won the game
dbSetCurrentBitmap(0);
dbCLS (0x80ffffff);
// print the scores for posterity
sprintf (strScores, "%d %d", comp.GetScore(), player.GetScore());
dbInk (0xff00ff00, 0x00000000);
dbSetTextFont ("Arial");
dbSetTextSize (36);
dbCenterText (screenWidth/2, 20, strScores);
if (player.GetScore() == 6) {
dbCenterText (screenWidth/2, screenHeight/2 - 60, "Congratulations!!! You've won!!");
} else {
dbCenterText (screenWidth/2, screenHeight/2 - 60, "Sorry! You lost");
}
dbCenterText (screenWidth/2, screenHeight/2 + 40, "Play again?");
dbCenterText (screenWidth/2, screenHeight/2 + 80, "Enter to continue, Space to quit");
dbSync();
while (true) { // await input
if (dbReturnKey()) {
replay = true;
break;
}
if (dbSpaceKey()) {
replay = false;
break;
}
}
if (replay) continue;
}
return;
}
balldata.h
int ballsizes [] = {20, 20};
DWORD ballimgData [] = {
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff1c0101, 0Xff580404, 0Xff940606,
0Xffb60707, 0Xffbc0606, 0Xffb60303, 0Xffad0101, 0Xff6d0101, 0Xff380000, 0Xff120000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff580404, 0Xffa30d0d, 0Xffd01919, 0Xffd31e1e,
0Xffce1d1d, 0Xffcb1818, 0Xffc60f0f, 0Xffc00808, 0Xffb80303, 0Xffaf0000, 0Xff7d0000, 0Xff390000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff0e0101, 0Xff780909, 0Xffda2424, 0Xffdc3a3a, 0Xffde4c4c, 0Xffdc4e4e,
0Xffd64646, 0Xffcf3939, 0Xffc72626, 0Xffc01818, 0Xffb90b0b, 0Xffb30404, 0Xffaa0101, 0Xff9e0000,
0Xff4f0000, 0Xff090000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff6f0909, 0Xffd12323, 0Xffe24d4d, 0Xffe96969, 0Xffed7979, 0Xffea7878,
0Xffe06969, 0Xffd65656, 0Xffc93b3b, 0Xffc12828, 0Xffb81414, 0Xffb20909, 0Xffa90202, 0Xffa10000,
0Xff8b0000, 0Xff4c0000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff4d0303, 0Xffd92424, 0Xffe14d4d, 0Xfff17e7e, 0Xfffb9898, 0Xffffa4a4, 0Xfffba1a1,
0Xffee8d8d, 0Xffdf7373, 0Xffcd5151, 0Xffc13737, 0Xffb71e1e, 0Xffb11010, 0Xffa80505, 0Xffa00101,
0Xff940000, 0Xff830000, 0Xff2c0000, 0Xff000000,
0Xff1c0101, 0Xffa60d0d, 0Xffdc3a3a, 0Xffe86868, 0Xfffc9898, 0Xffffacac, 0Xffffb3b3, 0Xffffb0b0,
0Xfff69e9e, 0Xffe48282, 0Xffce5c5c, 0Xffc14040, 0Xffb52323, 0Xffaf1313, 0Xffa60707, 0Xff9e0303,
0Xff920000, 0Xff850000, 0Xff520000, 0Xff0c0000,
0Xff4f0303, 0Xffcd1919, 0Xffde4c4c, 0Xffec7979, 0Xfffea5a5, 0Xffffb3b3, 0Xffffb9b9, 0Xffffb5b5,
0Xfff6a3a3, 0Xffe38686, 0Xffcd6060, 0Xffbf4444, 0Xffb22626, 0Xffab1616, 0Xffa20808, 0Xff9b0303,
0Xff8f0000, 0Xff820000, 0Xff660000, 0Xff1b0000,
0Xff8e0606, 0Xffd31e1e, 0Xffdc4f4f, 0Xffea7979, 0Xfffca2a2, 0Xffffb0b0, 0Xffffb5b5, 0Xfffeb1b1,
0Xffef9b9b, 0Xffdd7f7f, 0Xffc85b5b, 0Xffbb4040, 0Xffaf2525, 0Xffa81515, 0Xff9f0808, 0Xff970303,
0Xff8b0000, 0Xff7f0000, 0Xff670000, 0Xff360000,
0Xffb80707, 0Xffce1d1d, 0Xffd64646, 0Xffe06969, 0Xffee8d8d, 0Xfff69e9e, 0Xfff6a2a2, 0Xffef9b9b,
0Xffdf8585, 0Xffd06d6d, 0Xffc04e4e, 0Xffb43737, 0Xffaa1f1f, 0Xffa31212, 0Xff9a0808, 0Xff920303,
0Xff860000, 0Xff790000, 0Xff620000, 0Xff4f0000,
0Xffc30505, 0Xffcb1717, 0Xffcf3939, 0Xffd55656, 0Xffdf7373, 0Xffe48181, 0Xffe38686, 0Xffdd8080,
0Xffd06d6d, 0Xffc55a5a, 0Xffb84040, 0Xffae2d2d, 0Xffa41a1a, 0Xff9e0e0e, 0Xff950606, 0Xff8d0202,
0Xff800000, 0Xff730000, 0Xff5e0000, 0Xff4f0000,
0Xffc20303, 0Xffc60f0f, 0Xffc72727, 0Xffc93b3b, 0Xffcd5151, 0Xffce5c5c, 0Xffcd6060, 0Xffc85b5b,
0Xffc04e4e, 0Xffb84040, 0Xffad2d2d, 0Xffa71f1f, 0Xff9e1212, 0Xff980a0a, 0Xff8f0303, 0Xff850101,
0Xff780000, 0Xff690000, 0Xff590000, 0Xff550000,
0Xffaf0101, 0Xffc00909, 0Xffc01919, 0Xffc12727, 0Xffc13737, 0Xffc14040, 0Xffbf4444, 0Xffbb4040,
0Xffb43737, 0Xffae2d2d, 0Xffa71f1f, 0Xffa11515, 0Xff980b0b, 0Xff920606, 0Xff890202, 0Xff7f0000,
0Xff700000, 0Xff5f0000, 0Xff590000, 0Xff520000,
0Xff7b0000, 0Xffb70303, 0Xffb90b0b, 0Xffb81414, 0Xffb71e1e, 0Xffb52323, 0Xffb22626, 0Xffaf2525,
0Xffaa2020, 0Xffa41a1a, 0Xff9e1111, 0Xff980b0b, 0Xff900606, 0Xff8a0303, 0Xff800101, 0Xff750000,
0Xff630000, 0Xff5a0000, 0Xff590000, 0Xff3d0000,
0Xff440000, 0Xffac0101, 0Xffb30404, 0Xffb20909, 0Xffb11010, 0Xffaf1313, 0Xffab1616, 0Xffa81515,
0Xffa31212, 0Xff9e0e0e, 0Xff980a0a, 0Xff920606, 0Xff8a0303, 0Xff820101, 0Xff760000, 0Xff6a0000,
0Xff5b0000, 0Xff590000, 0Xff570000, 0Xff230000,
0Xff130000, 0Xff7d0000, 0Xffaa0101, 0Xffa90202, 0Xffa80505, 0Xffa60707, 0Xffa20808, 0Xff9f0808,
0Xff9a0808, 0Xff950606, 0Xff8f0303, 0Xff890202, 0Xff800101, 0Xff760000, 0Xff680000, 0Xff5c0000,
0Xff590000, 0Xff590000, 0Xff470000, 0Xff0e0000,
0Xff000000, 0Xff390000, 0Xff9c0000, 0Xffa10000, 0Xffa00101, 0Xff9e0303, 0Xff9b0303, 0Xff970303,
0Xff920303, 0Xff8d0202, 0Xff850101, 0Xff7f0000, 0Xff750000, 0Xff6a0000, 0Xff5c0000, 0Xff590000,
0Xff590000, 0Xff590000, 0Xff260000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff510000, 0Xff8b0000, 0Xff940000, 0Xff920000, 0Xff8f0000, 0Xff8b0000,
0Xff860000, 0Xff800000, 0Xff780000, 0Xff700000, 0Xff640000, 0Xff5b0000, 0Xff590000, 0Xff590000,
0Xff550000, 0Xff310000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff090000, 0Xff4d0000, 0Xff830000, 0Xff850000, 0Xff820000, 0Xff7f0000,
0Xff790000, 0Xff730000, 0Xff690000, 0Xff5f0000, 0Xff5a0000, 0Xff590000, 0Xff590000, 0Xff570000,
0Xff350000, 0Xff060000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff2c0000, 0Xff520000, 0Xff660000, 0Xff670000,
0Xff630000, 0Xff5d0000, 0Xff590000, 0Xff590000, 0Xff590000, 0Xff560000, 0Xff450000, 0Xff200000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff0a0000, 0Xff230000, 0Xff410000,
0Xff4f0000, 0Xff540000, 0Xff590000, 0Xff520000, 0Xff390000, 0Xff220000, 0Xff0c0000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000
};
paddle.h
int paddlesizes [] = {26, 94};
DWORD paddleimgData [] = {
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff0f0f0f, 0Xff272727, 0Xff404040, 0Xff424242, 0Xff434343, 0Xff444444, 0Xff2a2a2a,
0Xff111111, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff070707, 0Xff414141,
0Xff848484, 0Xffafafaf, 0Xffbababa, 0Xffc0c0c0, 0Xffc4c4c4, 0Xffc7c7c7, 0Xffcacaca, 0Xffcccccc,
0Xffc8c8c8, 0Xff9e9e9e, 0Xff646464, 0Xff080808, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff464646, 0Xff959595, 0Xffa9a9a9,
0Xffb1b1b1, 0Xffb7b7b7, 0Xffbdbdbd, 0Xffc2c2c2, 0Xffc6c6c6, 0Xffcacaca, 0Xffcdcdcd, 0Xffd0d0d0,
0Xffd2d2d2, 0Xffd3d3d3, 0Xffd5d5d5, 0Xffc8c8c8, 0Xff5e5e5e, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff0b0b0b, 0Xff686868, 0Xff979797, 0Xffa1a1a1, 0Xffa9a9a9,
0Xffb0b0b0, 0Xffb6b6b6, 0Xffbcbcbc, 0Xffc1c1c1, 0Xffc5c5c5, 0Xffc9c9c9, 0Xffcccccc, 0Xffcfcfcf,
0Xffd2d2d2, 0Xffd4d4d4, 0Xffd6d6d6, 0Xffd7d7d7, 0Xffd7d7d7, 0Xff9a9a9a, 0Xff161616, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff0c0c0c, 0Xff6a6a6a, 0Xff8a8a8a, 0Xff969696, 0Xff9f9f9f, 0Xffa6a6a6,
0Xffadadad, 0Xffb3b3b3, 0Xffb9b9b9, 0Xffbebebe, 0Xffc2c2c2, 0Xffc7c7c7, 0Xffcacaca, 0Xffcdcdcd,
0Xffd0d0d0, 0Xffd3d3d3, 0Xffd5d5d5, 0Xffd7d7d7, 0Xffd8d8d8, 0Xffd8d8d8, 0Xffb8b8b8, 0Xff191919,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff020202, 0Xff484848, 0Xff767676, 0Xff858585, 0Xff909090, 0Xff999999, 0Xffa1a1a1,
0Xffa8a8a8, 0Xffaeaeae, 0Xffb4b4b4, 0Xffb9b9b9, 0Xffbebebe, 0Xffc2c2c2, 0Xffc6c6c6, 0Xffc9c9c9,
0Xffcecece, 0Xffd2d2d2, 0Xffd2d2d2, 0Xffd5d5d5, 0Xffd6d6d6, 0Xffd7d7d7, 0Xffd7d7d7, 0Xff9b9b9b,
0Xff030303, 0Xff000000,
0Xff000000, 0Xff232323, 0Xff5c5c5c, 0Xff6e6e6e, 0Xff7d7d7d, 0Xff888888, 0Xff929292, 0Xff9a9a9a,
0Xffa1a1a1, 0Xffa8a8a8, 0Xffaeaeae, 0Xffb3b3b3, 0Xffb8b8b8, 0Xffbdbdbd, 0Xffc1c1c1, 0Xffc4c4c4,
0Xffd5d5d5, 0Xffefefef, 0Xffd0d0d0, 0Xffd1d1d1, 0Xffd3d3d3, 0Xffd4d4d4, 0Xffd4d4d4, 0Xffd3d3d3,
0Xff4f4f4f, 0Xff000000,
0Xff000000, 0Xff4a4a4a, 0Xff595959, 0Xff616161, 0Xff717171, 0Xff7e7e7e, 0Xff888888, 0Xff919191,
0Xff999797, 0Xffa29a9a, 0Xffaa9c9c, 0Xffaaa0a0, 0Xffb1a2a2, 0Xffb6a6a6, 0Xffb6abab, 0Xffbcb3b3,
0Xffbfbaba, 0Xffc4c2c2, 0Xffc8c8c8, 0Xffcbcbcb, 0Xffcdcdcd, 0Xffcfcfcf, 0Xffd0d0d0, 0Xffd0d0d0,
0Xffa7a7a7, 0Xff000000,
0Xff090909, 0Xff575757, 0Xff595959, 0Xff595959, 0Xff656565, 0Xff757575, 0Xff986f6f, 0Xffcd2e2e,
0Xffb54141, 0Xffa24a4a, 0Xffa94747, 0Xff984d4d, 0Xffb04646, 0Xffa84949, 0Xffae4747, 0Xffad4a4a,
0Xffa94a4a, 0Xffc33f3f, 0Xffd73434, 0Xffd0abab, 0Xffc8c8c8, 0Xffc9c9c9, 0Xffcacaca, 0Xffcbcbcb,
0Xffc7c7c7, 0Xff161616,
0Xff191818, 0Xff735454, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9e6969, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xfffe0202, 0Xfff80909, 0Xfff40a0a, 0Xfff60a0a, 0Xfff70909, 0Xfffa0707,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a6a6, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc5c4c4,
0Xffa78585, 0Xff2c2b2b,
0Xff191010, 0Xff774e4e, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a7a7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc5c3c3,
0Xff824e4e, 0Xff150b0b,
0Xff000000, 0Xff0e0b0b, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa16464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff0d0b0b, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a6a6, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a1a1, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa16161, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06565, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06565, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa16363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a0a0, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa16464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49f9f, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9e6666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa16565, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49f9f, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc7c7c7,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a1a1, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff747474, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd1a8a8, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6969, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49d9d, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9d6a6a, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49d9d, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49c9c, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6969, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49c9c, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa16363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49c9c, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9d6a6a, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa16363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49d9d, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9e6969, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff636363, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa16464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49e9e, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9e6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a4a4, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd1a8a8, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc8c8c8, 0Xffc8c8c8, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a5a5, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9e6969, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd4a1a1, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a5a5, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a6a6, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06666, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd49b9b, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa06464, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a2a2, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a6a6, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a3a3, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xffa16363, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd39f9f, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a5a5, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff000000, 0Xff050505, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6868, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd2a7a7, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c6c6,
0Xff070707, 0Xff000000,
0Xff0e0b0b, 0Xff654343, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a0a0, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c4c4,
0Xffa07e7e, 0Xff171414,
0Xff1e1b1b, 0Xff7b5252, 0Xff595959, 0Xff595959, 0Xff626262, 0Xff737373, 0Xff9f6767, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffff0000,
0Xffff0000, 0Xffff0000, 0Xffff0000, 0Xffd3a0a0, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc7c7c7, 0Xffc6c4c4,
0Xffc7a2a2, 0Xff3f3a3a,
0Xff0d0d0d, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff616161, 0Xff737373, 0Xff9d6b6b, 0Xffef3434,
0Xffe35656, 0Xffdd6a6a, 0Xffd87d7d, 0Xffda8181, 0Xffd58989, 0Xffd18d8d, 0Xffd38989, 0Xffd67474,
0Xffd85c5c, 0Xffdf4343, 0Xffec2525, 0Xffd1a1a1, 0Xffc6c6c6, 0Xffc7c7c7, 0Xffc6c6c6, 0Xffc3c3c3,
0Xffbab9b9, 0Xff161616,
0Xff010101, 0Xff4e4e4e, 0Xff595959, 0Xff595959, 0Xff5a5a5a, 0Xff686868, 0Xff7a7878, 0Xff8c8686,
0Xff9a8f8f, 0Xffa49595, 0Xffab9b9b, 0Xffb19f9f, 0Xffb6a2a2, 0Xffbaa5a5, 0Xffbda8a8, 0Xffbcafaf,
0Xffbdb3b3, 0Xffc3b2b2, 0Xffc0baba, 0Xffc1bfbf, 0Xffc1c1c1, 0Xffc0c0c0, 0Xffbebebe, 0Xffb9b9b9,
0Xff969696, 0Xff020202,
0Xff000000, 0Xff2c2c2c, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff5b5b5b, 0Xff676767, 0Xff767676,
0Xff828282, 0Xff8c8c8c, 0Xff949494, 0Xff9b9b9b, 0Xffa1a1a1, 0Xffa6a6a6, 0Xffababab, 0Xffaeaeae,
0Xffb2b2b2, 0Xffb4b4b4, 0Xffb6b6b6, 0Xffb7b7b7, 0Xffb7b7b7, 0Xffb5b5b5, 0Xffb2b2b2, 0Xffaaaaaa,
0Xff464646, 0Xff000000,
0Xff000000, 0Xff040404, 0Xff4c4c4c, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff5a5a5a, 0Xff636363,
0Xff717171, 0Xff7d7d7d, 0Xff868686, 0Xff8e8e8e, 0Xff959595, 0Xff9a9a9a, 0Xff9f9f9f, 0Xffa3a3a3,
0Xffa6a6a6, 0Xffa8a8a8, 0Xffaaaaaa, 0Xffababab, 0Xffaaaaaa, 0Xffa8a8a8, 0Xffa2a2a2, 0Xff797979,
0Xff040404, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff111111, 0Xff545454, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959,
0Xff5d5d5d, 0Xff696969, 0Xff747474, 0Xff7d7d7d, 0Xff858585, 0Xff8b8b8b, 0Xff909090, 0Xff949494,
0Xff989898, 0Xff9a9a9a, 0Xff9b9b9b, 0Xff9c9c9c, 0Xff9a9a9a, 0Xff959595, 0Xff828282, 0Xff131313,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff131313, 0Xff4c4c4c, 0Xff595959, 0Xff595959, 0Xff595959,
0Xff595959, 0Xff5a5a5a, 0Xff5f5f5f, 0Xff686868, 0Xff717171, 0Xff787878, 0Xff7e7e7e, 0Xff828282,
0Xff868686, 0Xff888888, 0Xff898989, 0Xff878787, 0Xff828282, 0Xff676767, 0Xff181818, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff060606, 0Xff393939, 0Xff595959, 0Xff595959,
0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff5b5b5b, 0Xff606060, 0Xff656565, 0Xff6a6a6a,
0Xff6e6e6e, 0Xff6f6f6f, 0Xff6d6d6d, 0Xff666666, 0Xff404040, 0Xff060606, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff101010, 0Xff373737,
0Xff525252, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959, 0Xff595959,
0Xff595959, 0Xff515151, 0Xff333333, 0Xff0f0f0f, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff030303, 0Xff161616, 0Xff232323, 0Xff2f2f2f, 0Xff2f2f2f, 0Xff2f2f2f, 0Xff2f2f2f, 0Xff272727,
0Xff111111, 0Xff030303, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000, 0Xff000000,
0Xff000000, 0Xff000000};
Notes:
NewPong
Okay, so the name isn’t clever. It came about because my initial
solution got corrupted somehow and I had to copy the code into a
new solution. At least I didn’t call it UltraPong.
This is a basic game with little frills. The computer plays the
paddle on the left and the player controls the paddle on the
right. The player’s paddle is controlled by the mouse using
vertical movement. In order to allow for some degree difficulty
the player’s movement is constricted to a maximum speed. The AI
for the computer controlled left paddle is fairly simplistic. It
tracks the vertical position of the ball. However, its speed is
a bit less than that of the player’s paddle so the player has a
chance to beat it.
At the beginning of each round the ball is positioned in the
center of the screen. Pressing the space bar launches the ball,
which is always served to the player the first round of a set.
Thereafter the ball is served to the competitor who lost the
last point. When the ball passes a paddle and goes out of bounds
the point goes to the opposing contender. A game is six points.
The program then allows you to chose whether to play again or to
quit.
The one feature is that the angle of deflection is determined by
the position on the paddle where the ball is struck. If struck
on the upper half the ball deflects upward. If struck on the
lower half the ball is directed downward. The further from the
center of the paddle the greater the angle. This gives the
player a bit of control over where the ball goes. The computer’s
paddle provides the same type of deflection but the current AI
doesn’t attempt to do anything clever with it. Where on the
paddle the ball strikes depends on whether the paddle can catch
up with the ball and how far behind it lags.
The Inner Workins
The player, computer and ball are class objects of the Player,
Computer and Ball classes respectively. They are all derived
from the Pong class. The Pong class carries the common elements
that the child classes will need, including their position on the
screen, the size of the graphic, the associated sprite number and
image number. Among the member functions are the public
interfaces to provide the private data to the rest of the
program.
The StruckAt function tests to see if an integer value passed to
it, usually representing the vertical position of the ball falls
along it’s height. If not the function returns a -1 to indicate
it was not struck or the pixel position from the bottom of the
sprite where it was hit. This could be used for certain types of
collision detection but is used in this application to determine
the degree of deflection.
The other function in the Pong class is GenGraphic. Its purpose
is to read data from two arrays to create the image to be used.
The first array had only two elements that define the width and
height of the graphic and the second array is composed of DWORDs
that contain the pixel information. This information is read in
and drawn to a temporary bitmap which is then copied to an
image. The source of the image data derives from a utility
program that generates the array from an image read into the
program.
The Computer and Player classes take care of positioning
themselves using the Set function. However, this function
differs for each class. The Player class uses the function to
input the mouse’s Y value and moves the paddle in the right
direction. However, the paddle can only move a certain number if
pixels with each cycle. The Computer class’ Set function tracks
the vertical position of the ball, which has to be passed to it,
and tries to match the position. But its movement is slower than
the player’s paddle to help offset its advantage in response
time. Both classes also have Init function that reset their
values at the beginning of each round.
The Ball class is the most involved of the three active classes.
The Ball class uses floating point numbers to track its velocity,
position and displacement in the x and y directions in order to
keep its movement consistent. When an angle is determined
separate x and y components to the speed are determined in order
to keep the ball’s diagonal velocity the same regardless of the
angle it’s traveling at. Floating point is used in order to
avoid any problems that the calculations might introduce if
incremental values are used. The angle is maintained in degrees
but a multiplier is used to pass it to the trig functions as
radians.
The Ball class does the collision detection for the program. It
maintains a flag that indicates whether it’s moving right or left
so the program can have it check for collision with the player’s
paddle or the computer’s paddle. The collision routine is passed
a reference to either the Computer object or the Player object
but they’re passed as a Pong reference to use the StruckAt
routine. If there is no collision it passes back a -1, If there
is a collision it updates its internal data to indicate its new
direction, calculates a new angle and sets the x and y velocity
components. If the ball passes beyond the paddle it returns a -2
to let the program know it needs to update the scores and reset
the ball.
All three classes have Init functions to reset them where
needed. The Computer and Player objects only have to be
initialized at the beginning of the set whereas the Ball object
needs to be reset after each point is earned.
At the beginning of a round the program loops and updates all
three objects. However, the Ball object has been set to an
inactive state so won’t move itself until the program tells it to
start moving. Each loop through the program tests to see if the
space bar has been pressed. If so, the ball is told to activate
itself and it can now move when told to update itself. Otherwise
the player can move his/her paddle while the computer’s paddle is
stuck tracking the unmoving ball.
Once the movement has begun each cycle the program checks to see
if the ball is moving right, at which point it checks for
collision with the player’s paddle, or left, where it will check
for collision with the computer’s paddle. The only result it
really needs to react to is if the ball passed out of bounds.
Otherwise it takes care of its own needs during the collision
routine itself. If it receives a -2 result it updates the
appropriate score and resets the ball to the center of the play
field where it waits for the space bar to be pressed again.
When either opponent reaches a score of six the game is over and
a congratulatory message or a consolement message is displayed
with the options to press Enter to play a new game or the space
bar to quit.
Lilith, Night Butterfly
I'm not a programmer but I play one in the office