Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*
Created by Sean Braithwaite
 October 1st, 2015
 Introduction to Computation - Straight Outta Compt'tation series
 
 OmniNOMNOMicon Ascention is a game about eating food by moving the mouse close to it to get a score
 greater than your friends and therefore become better members of society
 
 There are a great deal of reusable original functions in this program
 */

//Global variables for memory-reliant variables... would've made some classes and objects but we haven't covered that quite yet.

//environment related global
int shapeConstant = 0;
color foreGround;
color backGroundColor;
color tertiaryGround;

//character related globals
int characterChosen = -1; //-1 for none, 0 for character 1, 1 for character 2
float characterX;
float speed;
int characterWidth = 35;
int characterHeight = 400;

//GUI GLOBALS
float timeLeft = 0;
long highScore = 0;
long score = 0;
//colours
int minRed = 11;
int maxRed = 22;
int minGreen = 50;
int maxGreen = 180;
int minBlue = 100;
int maxBlue = 180;
int R = (int)random(minRed, maxRed);
int G = (int)random(minGreen, maxGreen);
int B = (int)random(minBlue, maxBlue);
color themeColour = color(R, G, B);
color themeColourSecondary = color(R-10, G-10, B-10);
color themeColourTertiary = color (R-30, G-30, B-10);

//collectable related globals
float fruitYOne;
float fruitOneWidth = 25;
float fruitOneHeight = 25;
color fruitColourOne = themeColour;
float fruitXOne;
float fruitVelocityOne = 0;
char fruitOneLetter;

float fruitYTwo;
float fruitTwoWidth = 25;
float fruitTwoHeight = 25;
color fruitColourTwo = themeColourSecondary;
float fruitXTwo;
float fruitVelocityTwo = 0;

float fruitYThree;
float fruitThreeWidth = 25;
float fruitThreeHeight = 25;
color fruitColourThree = themeColourTertiary;
float fruitXThree;
float fruitVelocityThree = 0;

//food speed
float ascentionSpeed = 3;

//incrementation of background standard
int backgroundTextureYCycle = 0;
int backgroundWidth = 20;
int backgroundHeight = 20;

//open new window, print out basic instructions to console
void setup()
{
  print("Welcome to Omninomnomicon Ascention - Created by Sean Braithwaite - October 2015\n\nMouse over the food as it falls from the waterfall to prolong your miserable existence\n");
  size(400, 400);
  frameRate(60);
}

//some issue with spawning collectibles?
//main loop
void draw()
{
  //show menu whilst a player is not chosen, otherwise show the gamespace
  if (characterChosen==-1)
  {
    showMainMenu();
  } else
  {
    textureBackground(themeColour, themeColourSecondary, themeColourTertiary, backgroundWidth, backgroundHeight, 0, 0, shapeConstant, 3, 3, #E7EDDF, #D4E0C3);
    //showGround();
    showTrees();
    makeFruit(ascentionSpeed);
    showGUI();
    drawCharacter();
    globalTicker();
    //print(score + "\n");
  }
}

//Create a tiled background with one of four shapes; colours and weights are user defined as are the widths and heights of the shapes.
//There is also an additional 'impact' effect which I used as the moons reflection and to reveal falling food

//shape 0 is rect
//shape 1 is ellipse
//shape 2 is diamond
//shape 3 is triangle

void textureBackground(color colourOne, color colourTwo, color backGroundColor, int pixelWidth, int pixelHeight, int strokeWeightAmount, 
color strokeColour, int shape, int impactX, int impactY, color impactOne, color impactTwo)
{
  //set up the background accroding to user input and standardize shape input and characteristics
  background(backGroundColor);
  rectMode(CORNER);
  ellipseMode(CORNER);
  noStroke();
  fill(0);
  rect(0, 0, 400, 50);

  //set up colours and stroke patterns
  stroke(strokeColour);
  if (strokeWeightAmount>0) strokeWeight(strokeWeightAmount);
  else noStroke();

  //set up tiling variable. Will be used to determine which colour is used on a shape
  boolean everyOther = false;

  //build a horizontal row, then move down
  for (int y = 50; y < height; y+=pixelHeight)
  {
    for (int x = 0; x < width; x+=pixelWidth)
    {
      //change 'tile' colours based upon mouse location
      //if the mouse is close
      if (mouseX<=x+pixelWidth*impactX && mouseX>x && mouseY>y && mouseY<=y+pixelHeight*impactY)
      {
        if (everyOther) {
          fill(impactOne);
        } else {
          fill(impactTwo);
        }
        //if the mouse is not close
      } else
      {
        if (everyOther) {
          fill(colourOne);
        } else {
          fill(colourTwo);
        }
      }

      //draw the requested shape
      if (shape == 0) rect(x, y, pixelWidth, pixelHeight);
      else if (shape == 1) ellipse(x, y, pixelWidth, pixelHeight);
      else if (shape == 2) quad(x, y+pixelHeight/2, x+pixelWidth/2, y, x+pixelWidth, y+pixelHeight/2, x+pixelWidth/2, y+pixelHeight);
      else if (shape == 3) triangle(x, y, x+pixelWidth, y, x, y+pixelHeight);
      else print("Unrecognized input '" + shape + "' for shape command in textureBackground function...\nRefer to textureBackground documentation...\nPrinting aborted...\n\n");

      //reverse used colour
      everyOther=!everyOther;
    }
    //move background
    y+=backgroundTextureYCycle;
    everyOther=!everyOther;
  }

  //increment background
  backgroundTextureYCycle++;
  if (backgroundTextureYCycle>pixelHeight) backgroundTextureYCycle = 0;
}

//set temporary colour each time a new game is started
void startGame()
{
  //set colour standards
  R = (int)random(minRed, maxRed);
  G = (int)random(minGreen, maxGreen);
  B = (int)random(minBlue, maxBlue);
  themeColour = color(R, G, B);
  themeColourSecondary = color(R-10, G-10, B-10);
  themeColourTertiary = color (R+10, G+10, B+10);
  //reset timeLeft
  timeLeft = 370;
}

//choose a random character in the range of a-z
char randChar()
{
  return (char)random(65, 90);
}

//perform cleanup operations on game end
void endGame()
{
  //choose a new shape for the main menu and next game
  shapeConstant = (int)random(0, 4);

  //Show score and highscore as well as analysis and breakdown
  print ("GAME OVER\nSCORE: " + score + "\n");
  if (score>highScore)
  { 
    print ("You beat the highscore of " + highScore + " by " + (score-highScore) + " for a grand total of " + score + ". Nice job!\n\n");
    highScore = score;
  } else if (score==highScore) print (" You tied for highscore!\n\n");
  else print ("You were " + (highScore-score) + " points off of the highscore!\n\n");

  //perform consistency cleanup and reset any residual elements
  characterChosen = -1;
  score = 0;
  backgroundWidth = (int)random(5, 50);
  backgroundHeight = (int)random(5, 50);
  fruitYOne=height+fruitOneHeight;
  fruitYTwo=height+fruitTwoHeight;
  fruitYThree=height+fruitThreeHeight;
  ascentionSpeed = 3;
  showMainMenu();
}

//check for proximity of objects
void globalTicker()
{
  //for object one
  if (mouseProximityDetection(fruitXOne, fruitYOne, fruitOneWidth, fruitOneHeight))
  {
    timeLeft+=40;
    print("You ate some food!\n+100 points - +timer\n\n");
    //soft reset, no need to access other functions, will be dealt with in next frame
    fruitYOne=height+fruitOneHeight;
    //increment score and speed based on item collection
    score+=100;
    score*=1.01;
    ascentionSpeed += 0.01;
  }
/*
  //for object two
  if (mouseProximityDetection(fruitXTwo, fruitYTwo, fruitTwoWidth, fruitTwoHeight))
  {
    timeLeft+=50;
    print("You ate some food!\n+100 points - +timer\n\n");
    //soft reset, no need to access other functions, will be dealt with in next frame
    fruitYTwo=height+fruitTwoHeight;
    //increment score and speed based on item collection
    score+=100;
    score*=1.01;
    ascentionSpeed += 0.01;
  }

  //for object three
  if (mouseProximityDetection(fruitXThree, fruitYThree, fruitThreeWidth, fruitThreeHeight))
  {
    timeLeft+=50;
    print("You ate some food!\n+100 points - +timer\n\n");
    //soft reset, no need to access other functions, will be dealt with in next frame
    fruitYThree=height+fruitThreeHeight;
    //increment score and speed based on item collection
    score+=100;
    score*=1.01;
    ascentionSpeed += 0.01;
  }
*/
  if (timeLeft <= 0)
  {
    endGame();
  } else
  {
    timeLeft-=1;
  }
}

//display the GUI
void showGUI()
{
  rectMode(CORNER);
  //TIMELEFT ASSOCIATED WITH FRAMERATE
  timeLeft = constrain(timeLeft, 0, 370);

  //draw inner timer portion; changes based upon time remaining to visually indicate approaching death
  strokeWeight(0);
  fill(#D32929);
  rect(15, 15, timeLeft, 10);

  //draw timer cover
  stroke(255);
  strokeWeight(3);
  noFill();
  rect(15, 15, 370, 10);
}

//behind/ foreground
void showTrees()
{
  //draw rocks
  noStroke();
  fill(#C6C6C6);
  triangle(0, 0, 0, height, 75, height);
  triangle(width, 0, width, height, width-75, height);
  rectMode(CORNER);

  //draw back trees
  fill(#83CB6D);
  rect (10-mouseX/10, 0, 30, height);
  rect(90-mouseX/10, 0, 20, height);
  rect(150-mouseX/10, 0, 30, height);
  rect(180-mouseX/10, 0, 20, height);
  rect(250-mouseX/10, 0, 40, height);
  rect(350-mouseX/10, 0, 10, height);

  //draw forward trees
  fill(#70AA5E);
  rect(-10-mouseX/5, 0, 40, height);
  rect(60-mouseX/5, 0, 30, height);
  rect (130-mouseX/5, 0, 30, height);
  rect(180-mouseX/5, 0, 40, height);
  rect(270-mouseX/5, 0, 20, height);
  rect(360-mouseX/5, 0, 60, height);
  rect(455-mouseX/5, 0, 30, height);
}

//draw ground
void showGround()
{
  fill(random(110, 140));
  rectMode(CORNER);
  rect(0, 380, 400, 20);
}

//shows menu with buttons for starting game and changing options
void showMainMenu()
{
  //Keep the texture in greys so as to visually indicate a session is not on
  textureBackground(#C6C6C6, #B9B9B9, #ADADAD, backgroundWidth, backgroundHeight, 0, 0, shapeConstant, 0, 0, 0, 0);
  rectMode(CORNER);

  //next behind menus
  showTrees();

  //menu locations
  int buttonOneX = 50;
  int buttonOneY = 250;
  int buttonOneW = 100;
  int buttonOneH = 100;

  int buttonTwoX = 250;
  int buttonTwoY = 250;
  int buttonTwoW = 100;
  int buttonTwoH = 100;

  int optionsX = 175;
  int optionsY = 275;
  int optionsW = 50;
  int optionsH = 50;

  //draw the options button and control it
  fill(#E8E8E8);
  stroke(#DEDEDE);
  strokeWeight(5);
  rect (15, 50, 370, 40); //billboard 60

    //draw title
  drawChar('O', 27, 60, 3, themeColour);
  drawChar('M', 52, 60, 3, themeColour);
  drawChar('N', 77, 60, 3, themeColour);
  drawChar('I', 102, 60, 3, themeColour);
  drawChar('N', 127, 60, 3, themeColour);
  drawChar('O', 152, 60, 3, themeColour);
  drawChar('M', 177, 60, 3, themeColour);
  drawChar('N', 202, 60, 3, themeColour);
  drawChar('O', 227, 60, 3, themeColour);
  drawChar('M', 252, 60, 3, themeColour);
  drawChar('I', 277, 60, 3, themeColour);
  drawChar('C', 302, 60, 3, themeColour);
  drawChar('O', 327, 60, 3, themeColour);
  drawChar('N', 352, 60, 3, themeColour);

  //set up shape standards, draw options button
  fill(#E8E8E8);
  stroke(#DEDEDE);
  strokeWeight(5);
  rect (optionsX, optionsY, optionsW, optionsH);
  stroke(#D4D4D4);
  strokeWeight(5);
  ellipse(optionsX+15, optionsY+15, 20, 20);

  //determine if mouse is close to button and if it is change appearance to encourage clicking
  if (mouseX >= optionsX && mouseX <= optionsX+optionsW && mouseY > optionsY && mouseY < optionsY+optionsH)
  {
    //draw depressed button
    stroke(#DEDEDE);
    fill(#CBCBCB);
    rect(optionsX, optionsY, optionsW, optionsH);
    noStroke();
    fill(#E8E8E8);
    rect (optionsX+10, optionsY+10, optionsW-12, optionsH-12);

    //draw depressed center
    stroke(#D4D4D4);
    strokeWeight(5);
    ellipse(optionsX+25, optionsY+25, 20, 20);

    //change global shape for patterning if the button is pressed
    if (mousePressed && mouseX >= optionsX && mouseX <= optionsX+optionsW && mouseY > optionsY && mouseY < optionsY+optionsH)
    {
      backgroundWidth = (int)random(5, 50);
      backgroundHeight = (int)random(5, 50);
      if (shapeConstant >= 0 && shapeConstant <= 2) shapeConstant++;
      else shapeConstant = 0;
    }
  }

  //draw the first character button
  fill(245);
  stroke(255);
  strokeWeight(5);
  rect(buttonOneX, buttonOneY, buttonOneW, buttonOneH);

  //draw center of character button one
  stroke(#D4D4D4);
  strokeWeight(5);
  fill(#ED1388);
  ellipse(buttonOneX+25, buttonOneY+25, 50, 50);

  //draw the second character button
  fill(245);
  stroke(255);
  strokeWeight(5);
  rect(buttonTwoX, buttonTwoY, buttonTwoW, buttonTwoH);

  //draw center of character button two
  stroke(#D4D4D4);
  strokeWeight(5);
  fill(#155DCE);
  ellipse(buttonTwoX+25, buttonTwoY+25, 50, 50);

  //control character button one
  //determine if mouse is close to button and if it is change appearance to encourage clicking
  if (mouseX >= buttonOneX && mouseX <= buttonOneX+buttonOneW && mouseY > buttonOneY && mouseY < buttonOneY+buttonOneH)
  {
    //draw depressed button
    fill(235);
    stroke(255);
    strokeWeight(5);
    rect(buttonOneX, buttonOneY, buttonOneW, buttonOneH);
    fill(245);
    noStroke();
    rect(buttonOneX+10, buttonOneY+10, buttonOneW-12, buttonOneH-12);

    //draw center of button depressed
    stroke(#D4D4D4);
    strokeWeight(5);
    fill(#ED1388);
    ellipse(buttonOneX+35, buttonOneY+35, 50, 50);

    //if the button is pressed, choose the corresponding character and start the game
    if (mousePressed && mouseX >= buttonOneX && mouseX <= buttonOneX+buttonOneW && mouseY > buttonOneY && mouseY < buttonOneY+buttonOneH)
    {
      characterChosen = 1;
      startGame();
    }
  }

  //control character button two
  //determine if mouse is close to button and if it is change appearance to encourage clicking
  if (mouseX >= buttonTwoX && mouseX <= buttonTwoX+buttonTwoW && mouseY > buttonTwoY && mouseY < buttonTwoY+buttonTwoH)
  {
    //draw depressed button
    fill(235);
    stroke(255);
    strokeWeight(5);
    rect(buttonTwoX, buttonTwoY, buttonTwoW, buttonTwoH);
    fill(245);
    noStroke();
    rect(buttonTwoX+10, buttonTwoY+10, buttonTwoW-12, buttonTwoH-12);

    //draw depressed center of character button two
    stroke(#D4D4D4);
    strokeWeight(5);
    fill(#155DCE);
    ellipse(buttonTwoX+35, buttonTwoY+35, 50, 50);

    //if the button is pressed, choose the corresponding character and start the game
    if (mousePressed && mouseX >= buttonTwoX && mouseX <= buttonTwoX+buttonTwoW && mouseY > buttonTwoY && mouseY < buttonTwoY+buttonTwoH)
    {
      characterChosen = 0;
      startGame();
    }
  }
}

//draw the chosen character
void drawCharacter()
{
  rectMode(CENTER);

  //determine character movement; incremement speed based on mouse-to-character location
  if (characterX == mouseX)
  {
  } else if (characterX > mouseX+characterWidth/2)
  {
    speed-=0.7;
  } else if (characterX < mouseX-characterWidth/2)
  {
    speed+=0.7;
  } else
  {
    speed*=0.5;
  }

  //block character from exceeding max speed
  speed = constrain(speed, -20, 20);

  //move character
  characterX+=speed;

  //block character from leaving screen, display character; is performed after movement so as to not allow the character to move outside of the boundary for 1 frame
  characterX = constrain(characterX, 0, width-characterWidth);

  //set up variables for a characters' colours
  color colourMain = 0;
  color colourSecondary = 0;
  color colourTertiary = 0;

  //colour character 1 or 2 accordingly
  if (characterChosen == 1)
  {
    colourTertiary = #F52A96;
    colourMain = #ED1388;
    colourSecondary = #D11177;
  } else if (characterChosen == 0)
  {
    colourTertiary = #2A79F5;
    colourMain = #155DCE;
    colourSecondary = #0B50BC;
  }

  //draw the character
  strokeWeight(1);
  fill(0);
  boolean everyOther = false;
  //pattern the character dynamically
  for (int x = 0; x < characterWidth; x+=5)
  {
    for (int y = 0; y < characterHeight; y+=5)
    {
      //set shape colours
      stroke(colourTertiary);
      if (everyOther) {
        fill(colourMain);
      } else {
        fill(colourSecondary);
      }
      //draw shape and swap colours
      rect(characterX+x, mouseY+y, 5, 5);
      everyOther=!everyOther;
    }
    everyOther=!everyOther;
  }
}

//proximity code; determines if the mouse is within the ||4 cornered|| area of a shape
boolean mouseProximityDetection(float x, float y, float w, float h)
{
  if (mouseX >= fruitXOne && mouseX <= x+w && mouseY > y && mouseY < y+h) return true;
  else return false;
}

//Create new copies of the fruit if they do not exist or have expired
void makeFruit(float ascentionSpeed)
{
  strokeWeight(5);

  //determine if the fruit is within the gamespace still, if not, refresh it, otherwise increment its height
  if (fruitYOne > height+fruitOneHeight)
  {
    //give new co-ordinates
    fruitYOne = 0;
    fruitXOne = random(25, 350);
  } else
  {
    //increment fruit y location, choose colour for spawn
    fruitYOne+=(fruitVelocityOne + ascentionSpeed);

    fill(themeColour);
    stroke(themeColour + 20);
    drawFish(fruitXOne, fruitYOne, fruitOneWidth, fruitOneHeight);
  }
/*
  if (fruitYTwo > height+fruitTwoHeight)
  {
    //give new co-ordinates
    fruitYTwo = 0;
    fruitXTwo = random(25, 350);
  } else
  {
    //increment fruit y location, choose colour for spawn
    fruitYTwo+=(fruitVelocityTwo + ascentionSpeed);

    fill(themeColourSecondary);
    stroke(themeColourSecondary + 20);
    drawFish(fruitXTwo, fruitYTwo, fruitTwoWidth, fruitTwoHeight);
  }

  if (fruitYThree > height+fruitThreeHeight)
  {
    //give new co-ordinates
    fruitYThree = 0;
    fruitXThree = random(25, 350);
  } else
  {
    //increment fruit y location, choose colour for spawn
    fruitYThree+=(fruitVelocityThree + ascentionSpeed);

    fill(themeColourTertiary);
    stroke(themeColourTertiary + 20);
    drawFish(fruitXThree, fruitYThree, fruitThreeWidth, fruitThreeHeight);
  }
  */
}

//draw a fish to the screen at the provided coordinates
void drawFish(float fruitX, float fruitY, float fruitWidth, float fruitHeight)
{
  triangle(fruitX+fruitWidth, fruitY+fruitHeight-15, fruitX+fruitWidth+10, fruitY+5, fruitX+fruitWidth+10, fruitY+fruitHeight-10);
  ellipse(fruitX, fruitY, 30, 20);
  noStroke();
  fill(255);
  ellipse(fruitX+10, fruitY+8, 5, 5);
}

//Draws a char on screen w/ a standardized size at a location designated by users
//with a user-defined weight and colour
//Should prioritize vowels to front to speed process, less common characters at the end
void drawChar(char letterRequested, int x, int y, int strokeWeightAmount, color strokeColour)
{
  stroke(strokeColour);
  strokeWeight(strokeWeightAmount);
  if (letterRequested == 'W' || letterRequested == 'w')
  {
    line(x, y, x, y+20);//leftmost vert
    line(x+10, y+10, x, y+20);//middleleft diag
    line(x+10, y+10, x+20, y+20);//middleright diag
    line(x+20, y, x+20, y+20);//right vert
  } else if (letterRequested == 'E' || letterRequested == 'e')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y+10, x+10, y+10);//mid hori
    line(x, y+20, x+20, y+20);//lower hori
    line(x, y, x, y+20);//left vert
  } else if (letterRequested == 'B' || letterRequested == 'b')
  {
    line(x, y, x+15, y);//upper hori
    line(x, y+10, x+20, y+10);//mid hori
    line(x, y+20, x+20, y+20);//lower hori
    line(x, y, x, y+20);//left vert
    line(x+15, y, x+15, y+10);//upper right vert
    line(x+20, y+10, x+20, y+20);//lower right vert
  } else if (letterRequested == 'L' || letterRequested == 'l')
  {
    line(x, y, x, y+20);//vert
    line(x, y+20, x+20, y+20);//hori
  } else if (letterRequested == 'C' || letterRequested == 'c')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y+20, x+20, y+20);//lower hori
    line(x, y, x, y+20);//left vert
  } else if (letterRequested == 'O' || letterRequested == 'o' || letterRequested == 'D' || letterRequested == 'd' )
  {
    line(x, y, x+20, y);//upper hori
    line(x, y, x, y+20);//left vert
    line(x, y+20, x+20, y+20);//lower hori
    line(x+20, y, x+20, y+20);//right vert
  } else if (letterRequested == 'M' || letterRequested == 'm')
  {
    line(x, y, x, y+20);//left vert
    line(x+20, y, x+20, y+20);//right vert
    line(x, y, x+10, y+10);//middleleft diag
    line(x+20, y, x+10, y+10);//middleright diag
  } else if (letterRequested == 'T' || letterRequested == 't')
  {
    line(x, y, x+20, y);//upper hori
    line(x+10, y, x+10, y+20);//mid vert
  } else if (letterRequested == 'S' || letterRequested == 's')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y, x, y+10);//left vert
    line(x, y+10, x+20, y+10);//mid hori
    line(x+20, y+10, x+20, y+20);//right vert
    line(x, y+20, x+20, y+20);//lower hori
  } else if (letterRequested == 'H' || letterRequested == 'h')
  {
    line(x, y, x, y+20);//left vert
    line(x+20, y, x+20, y+20);//right vert
    line(x, y+10, x+20, y+10);//middle hori
  } else if (letterRequested == 'R' || letterRequested == 'r')
  {
    line(x, y, x, y+20);//left vert
    line(x, y, x+20, y);//top hori
    line(x, y+10, x+20, y+10);//mid hori
    line(x+20, y, x+20, y+10);//right vert
    line(x, y+10, x+20, y+20);//leg
  } else if (letterRequested == 'I' || letterRequested == 'i')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y+20, x+20, y+20);//lower hori
    line(x+10, y, x+10, y+20);//mid vert
  } else if (letterRequested == 'A' || letterRequested == 'a')
  {
    line(x, y, x, y+20);//left vert
    line(x+20, y, x+20, y+20);//right vert
    line(x, y, x+20, y);//upper hori
    line(x, y+10, x+20, y+10);//lower hori
  } else if (letterRequested == 'N' || letterRequested == 'n')
  {
    line(x, y, x, y+20);//left vert
    line(x+20, y, x+20, y+20);//right vert
    line(x, y, x+20, y+20);//mid diag
  } else if (letterRequested == 'U' || letterRequested == 'u')
  {
    line(x, y, x, y+20);//left vert
    line(x, y+20, x+20, y+20);//lower hori
    line(x+20, y, x+20, y+20);//right vert
  } else if (letterRequested == 'P' || letterRequested == 'p')
  {
    line(x, y, x, y+20);//left vert
    line(x, y, x+20, y);//upper hori
    line(x, y+10, x+20, y+10);//lower hori
    line(x+20, y, x+20, y+10);//right vert
  } else if (letterRequested == 'Q' || letterRequested == 'q')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y, x, y+20);//left vert
    line(x, y+20, x+20, y+20);//lower hori
    line(x+20, y, x+20, y+20);//right vert
    line(x+20, y+20, x+10, y+10);//diag
  } else if (letterRequested == 'F' || letterRequested == 'f')
  {
    line(x, y, x+20, y);//upper hori
    line(x, y+10, x+10, y+10);//mid hori
    line(x, y, x, y+20);//left vert
  } else if (letterRequested == 'J' || letterRequested == 'j')
  {
    line (x+20, y, x+20, y+20);//right vert
    line(x, y+20, x+20, y+20);//lower hori
    line(x, y+10, x, y+20);//left vert
  } else if (letterRequested == 'K' || letterRequested == 'k')
  {
    line(x, y, x, y+20);//left vert
    line (x, y+10, x+20, y);//upper vert
    line(x, y+10, x+20, y+20);//lower diag
  } else if (letterRequested == 'V' || letterRequested == 'v')
  {
    line (x, y, x+10, y+20);//left diag
    line(x+20, y, x+10, y+20);//right diag
  } else if (letterRequested == 'X' || letterRequested == 'x')
  {
    line (x, y, x+20, y+20);//left diag
    line(x+20, y, x, y+20);//right diag
  } else if (letterRequested == 'Y' || letterRequested == 'y')
  {
    line(x, y, x+10, y+10);//left diag
    line(x+10, y+10, x+20, y);// right diag
    line(x+10, y+10, x+10, y+20);//mid
  } else if (letterRequested == 'Z' || letterRequested == 'z')
  {
    line(x, y, x+20, y);//upper flat
    line(x, y+20, x+20, y+20);//lower flat
    line(x+20, y, x, y+20);//diag
  } else
  {
    print("Character '" + letterRequested + "' not found...\n aborting printing process...\n\n");
  }
}