//*********************************************************************************
//Democrocy: Pride and Joy
//Jared Moeller
//
//A parody of old unliscenced movie tie-in games,
//Democracy: Pride and Joy is made in the image of 'National Treasure' the movie
//staring Nicholas Cage. In this interactive toy, the player (Nikoli Container) attempts to traverse a
//series of hazzards to steal the 'Statement of Freedom'.
//
//Controls -
//Left and Right arrow keys (or 'A' and 'D' keys) to move left and right respectively.
//*********************************************************************************
/// GLOBAL VARIABLES ///
// system variables
boolean artifactObtained = false;
boolean winCondition = false;
boolean loseCondition = false;
int time = millis();
int timeLimit=(2*60*1000);
int health = 12;
// player variables
boolean playerMoving = false;
float playerPositionX = 30;
int playerPositionY = 175;
boolean playerDirection = true;
int playerWidth = 20;
int playerHeight = 50;
// electric variables
float electricTopY=115;
float electricMiddleTopX;
float electricMiddleBottomX;
int electricWidth = 30;
int electricHeight = 18;
// spikes variables
int spikeX = 135;
int spikeY = 115;
int spikeWidth;
// 1 = inactive, 2 = 2 seconds until active, 3 = active
int spikeState = 1;
float spikeSwitchTime = time + (2 * 1000);
// dart variables
boolean dartTrigger1 = false;
boolean dartTrigger2 = false;
boolean dartMoving = false;
float dartFireDelay = 0;
int dartFireCount = 0;
float dart1Y = 90;
float dart2Y = 90;
float dart3Y = 90;
float dart4Y = 90;
// fire variables
float fireY=200;
int fireX = 255;
boolean fireMoving = false;
boolean fireDirection = false;
float fireSwitchTime = (3*1000);
// sawblade variables
int sawHeight = 50;
int sawSegmentHeight = 10;
boolean sawDirection = true;
float sawY = 200;
int sawX = 305;
void setup() {
size(400, 400);
frameRate(60);
rectMode(CORNER);
ellipseMode(CENTER);
}
void draw() {
// update time
time=millis();
// process traps/projectiles
updateTrapElectric();
updateTrapSpikes();
updateTrapDarts();
updateTrapFire();
updateTrapSawblade();
// process player movement
updatePlayer();
// check for a collision with the updated info
checkCollision();
// check score
updateScore();
// draw background pieces
drawBackground();
drawArtifact();
//draw traps
drawTrapElectric();
drawTrapSpikes();
drawTrapDarts();
drawTrapFire();
drawTrapSawblade();
// draw player
drawPlayer();
// draw front wall and UI
drawUI();
}
//////////////////////////////////////////////////////////////////////////////////
//
// Land of the Functions
//
//////////////////////////////////////////////////////////////////////////////////
//
///
//// BACKGROUND
///
//
void drawBackground() {
// floor
background(75, 87, 118);
// back wall
noStroke();
fill(152, 55, 55);
rect(0, 0, width, height/4);
// back wall brick pattern
strokeWeight(1);
stroke(175, 88, 88);
for (int brickVertical = 0; brickVertical<10; brickVertical++) {
for (int brickHorizontal = 0; brickHorizontal<50; brickHorizontal++) {
line((brickHorizontal*15), (brickVertical*10), ((brickHorizontal+1)*15), ((brickVertical)*10));
line(((brickVertical%2)*5)+(brickHorizontal*15), (brickVertical*10), ((brickVertical%2)*5)+(brickHorizontal*15), 10+((brickVertical)*10));
}
}
}
//
///
//// UPDATING
///
//
void updatePlayer() {
// processes player movement
if (playerMoving==true) {
if ((keyCode==RIGHT||key==100)&&(playerPositionX<330)) {
playerPositionX+=0.5;
} else if ((keyCode==LEFT||key==97)&&(playerPositionX>30)) {
playerPositionX-=0.5;
} else {
}
}
}
void keyPressed() {
// allows movement
playerMoving = true;
}
void keyReleased() {
// stops movement
playerMoving = false;
}
//
///
//// ELECTRIC
///
//
void updateTrapElectric() {
// move bolt
electricTopY+=.7;
// randomize graphic
electricMiddleTopX = 90+(random(-15, 15));
electricMiddleBottomX = 90+(random(-15, 15));
// reset projectile if its reached the bottom of the path
if (electricTopY+electricHeight>=290) {
electricTopY=115;
}
}
//
///
//// SPIKE
///
//
void updateTrapSpikes() {
// inactive to warning
if (spikeState==0) {
if (time>=spikeSwitchTime) {
spikeState = 1;
spikeSwitchTime = time + (2 * 1000);
}
}
// warning to active
if (spikeState==1) {
if (time>=spikeSwitchTime) {
spikeState = 2;
spikeSwitchTime = time + (5 * 1000);
}
}
// active to inactive
if (spikeState==2) {
if (time>=spikeSwitchTime) {
spikeState = 0;
spikeSwitchTime = time + ((5+random(1, 3)) * 1000);
}
}
}
//
///
//// DART
///
//
void updateTrapDarts() {
// catch to disable darts when they reach the end of the screen
if (dart4Y>400) {
dartMoving = false;
dart1Y = 90;
dart2Y = 90;
dart3Y = 90;
dart4Y = 90;
}
// first firing cycle
if (dartTrigger1 == true) {
if (dartFireCount==0) {
if (time>=dartFireDelay) {
// begins cycle
dartMoving = true;
// counts the darts fired
dartFireCount++;
// set the dart in moving range
dart1Y=91;
// delay to next dart
dartFireDelay = time + 1000;
}
}
if (dartFireCount==1) {
if (time>=dartFireDelay) {
dartFireCount++;
dart2Y=91;
dartFireDelay = time + 1000;
}
}
if (dartFireCount==2) {
if (time>=dartFireDelay) {
dartFireCount++;
dart3Y=91;
dartFireDelay = time + 1000;
}
}
if (dartFireCount==3) {
if (time>=dartFireDelay) {
dartFireCount++;
dart4Y=91;
}
}
}
// second firing cycle
if (dartTrigger2 == true) {
if (dartFireCount==4) {
if (time>=dartFireDelay) {
dartMoving = true;
dartFireCount++;
dart1Y=91;
dartFireDelay = time + 1000;
}
}
if (dartFireCount==5) {
if (time>=dartFireDelay) {
dartFireCount++;
dart2Y=91;
// larger delay between bolts to trick players into false security
dartFireDelay = time + 2000;
}
}
if (dartFireCount==6) {
if (time>=dartFireDelay) {
dartFireCount++;
dart3Y=91;
dartFireDelay = time + 1000;
}
}
if (dartFireCount==7) {
if (time>=dartFireDelay) {
dartFireCount++;
dart4Y=91;
}
}
}
// move darts
if (dart1Y>90) {
dart1Y+=2;
}
if (dart2Y>90) {
dart2Y+=2;
}
if (dart3Y>90) {
dart3Y+=2;
}
if (dart4Y>90) {
dart4Y+=2;
}
}
//
///
//// FIRE
///
//
void updateTrapFire() {
// catches for if the fire reaches an edge of the vertical path
if (fireY+30>310) {
fireDirection = true;
}
if (fireY<110) {
fireDirection = false;
}
// moves the fire
if (fireMoving==true) {
if (fireDirection==true) {
fireY-=.4;
}
if (fireDirection==false) {
fireY+=.4;
}
}
// processes the fire's modes (active/inactive)
if (time>=fireSwitchTime) {
if (fireMoving == true) {
fireMoving = false;
// semi-random time until resumes movement 3-6 seconds
fireSwitchTime = time+ (2 * 1000) + (random(1, 4) * 1000);
} else {
// after inactive period, the fire's direction will be randomized, (true = up, false = down)
fireMoving=true;
if (random(0, 10) >= 5) {
fireDirection = true;
} else {
fireDirection = false;
}
fireSwitchTime = time+(2 * 1000) + (random(1, 4) * 1000);
}
}
}
//
///
//// SAWBLADE
///
//
void updateTrapSawblade() {
// catches for if the saw reaches end of path
if (sawY<110) {
sawDirection = false;
}
if (sawY+sawHeight>310) {
sawDirection = true;
}
// moves saw
if (sawDirection == true) {
sawY -= .4;
}
if (sawDirection == false) {
sawY += .4;
}
}
//
///
//// DRAWING
///
//
void drawPlayer() {
// head
noStroke();
fill(227, 204, 169);
rect(5+playerPositionX, 5+playerPositionY, 10, 15);
rect(playerPositionX, 10+playerPositionY, 20, 5);
// body
fill(178, 119, 0);
rect(5+playerPositionX, 20+playerPositionY, 10, 15);
// player direction flips when artifact is obtained
if (playerDirection==true) {
// face
fill(255);
rect(10+playerPositionX, 5+playerPositionY, 5, 5);
fill(0);
rect(playerPositionX, 10+playerPositionY, 5, 5);
rect(5+playerPositionX, 5+playerPositionY, 5, 5);
// pant
fill(106, 82, 35);
rect(5+playerPositionX, 35+playerPositionY, 10, 15);
rect(5+playerPositionX, 45+playerPositionY, 15, 5);
} else {
// face
fill(255);
rect(5+playerPositionX, 5+playerPositionY, 5, 5);
fill(0);
rect(15+playerPositionX, 10+playerPositionY, 5, 5);
rect(10+playerPositionX, 5+playerPositionY, 5, 5);
// pant
fill(106, 82, 35);
rect(5+playerPositionX, 35+playerPositionY, 10, 15);
rect(playerPositionX, 45+playerPositionY, 15, 5);
}
// hat
fill(106, 82, 35);
rect(5+playerPositionX, playerPositionY, 10, 5);
strokeWeight(2);
stroke(106, 82, 35);
line(playerPositionX, 5+playerPositionY, 20+playerPositionX, 5+playerPositionY);
noStroke();
}
void drawArtifact() {
noStroke();
// base (pillar)
fill(72, 61, 139);
rect(350, 195, 20, 5);
rect(355, 200, 10, 20);
rect(350, 220, 20, 5);
// artifact (statement of freedom)
if (artifactObtained == false) {
fill(147, 112, 219);
rect(355, 175-9, 10, 15);
}
}
//
///
//// ELECTRIC
///
//
void drawTrapElectric() {
// fantasy style electric rods
fill(101, 123, 129);
triangle(75, 85, 105, 85, 90, 120);
fill(125, 145, 147);
ellipse(90, 120, 20, 20);
fill(101, 123, 129);
triangle(75, 305, 105, 305, 90, 280);
fill(125, 145, 147);
ellipse(90, 280, 20, 20);
// electric bolt
stroke(255);
strokeWeight(2);
line(90, electricTopY, electricMiddleTopX, electricTopY+6);
line(electricMiddleTopX, electricTopY+6, electricMiddleBottomX, electricTopY+12);
line(electricMiddleBottomX, electricTopY+12, 90, electricTopY+18);
}
//
///
//// SPIKES
///
//
void drawTrapSpikes() {
noStroke();
// draw spike trap
int spikeCollumn = 0;
for (int spikeRow = 0; spikeRow<99; spikeRow++) {
if (spikeRow!=0&&spikeRow%3==0) {
spikeCollumn++;
};
// spike holes
fill(62, 53, 44);
ellipse(spikeX+((spikeRow%3)*10+5), spikeY+(spikeCollumn*10), 10, 5);
// spikes
fill(170, 163, 155);
triangle(spikeX+((spikeRow%3)*10), spikeY+(spikeCollumn*10), spikeX+((spikeRow%3)*10)+10, spikeY+(spikeCollumn*10), spikeX+((spikeRow%3)*10)+5, spikeY+(spikeCollumn*10)-(spikeState*5));
// checkering effect
spikeRow++;
if (spikeRow%3==0) {
spikeCollumn++;
};
}
}
//
///
//// DARTS
///
//
void drawTrapDarts() {
// blowhole in the wall
noStroke();
fill(80, 80, 80);
ellipse(210, 90, 10, 10);
// preassure plate 1
if (dartTrigger1 == true) {
fill(165, 165, 165);
rect(170, 215, 25, 25);
} else if (dartTrigger1 == false) {
fill(165, 165, 165);
rect(170, 210, 25, 25);
fill(80, 80, 80);
rect(170, 235, 25, 5);
}
// preassure plate 2
if (dartTrigger2 == true) {
fill(165, 165, 165);
rect(225, 215, 25, 25);
} else if (dartTrigger2 == false) {
fill(165, 165, 165);
rect(225, 210, 25, 25);
fill(80, 80, 80);
rect(225, 235, 25, 5);
}
// draw darts
if (dartMoving == true) {
fill(0);
stroke(0);
strokeWeight(2);
line(210, dart1Y, 210, dart1Y+10);
triangle(210, dart1Y+10, 210-2, dart1Y+10-2, 210+2, dart1Y+10-2);
line(210, dart2Y, 210, dart2Y+10);
triangle(210, dart2Y+10, 210-2, dart2Y+10-2, 210+2, dart2Y+10-2);
line(210, dart3Y, 210, dart3Y+10);
triangle(210, dart3Y+10, 210-2, dart3Y+10-2, 210+2, dart3Y+10-2);
line(210, dart4Y, 210, dart4Y+10);
triangle(210, dart4Y+10, 210-2, dart4Y+10-2, 210+2, dart4Y+10-2);
}
}
//
///
//// FIRE
///
//
void drawTrapFire() {
// draw oil
noStroke();
fill(0);
rect(260, 110, 10, 250);
// draw fire tips
fill(255, 0, 0);
ellipse(fireX+3+random(1, 14), fireY+3, 6, 6);
ellipse(fireX+3+random(1, 14), fireY+3, 6, 6);
ellipse(fireX+3+random(1, 14), fireY+3, 6, 6);
// draw fire arms
fill(255, 30, 30);
ellipse(fireX+5+random(1, 10), fireY+8, 10, 10);
ellipse(fireX+5+random(1, 10), fireY+8, 10, 10);
// draw fire neck
fill(255, 60, 60);
ellipse(fireX+7+random(1, 6), fireY+15, 14, 14);
// draw fire body
fill(255, 70, 70);
ellipse(fireX+10, fireY+20, 20, 20);
}
//
///
//// SAWBLADE
///
//
void drawTrapSawblade() {
// draw saw path
noStroke();
fill(62, 53, 44);
rect(310, 110, 5, 400);
// draw saw base
fill(150, 150, 150);
rect(sawX, sawY, 15, sawHeight);
// draw saw teeth effect
int firstBladeY = int(sawY);
int firstBladeHeight=10;
int lastBladeHeight = 10;
if ((int(sawY)/10)%2==0) {
firstBladeHeight = int(sawY)%10;
} else {
firstBladeY += int(sawY)%10;
}
if (int(sawY)<firstBladeY) {
lastBladeHeight = 10- (firstBladeY - int(sawY));
}
fill(0, 0, 0, 50);
rect(sawX, firstBladeY, 15, firstBladeHeight);
rect(sawX, firstBladeY+firstBladeHeight+10, 15, 10);
rect(sawX, firstBladeY+firstBladeHeight+30, 15, lastBladeHeight);
}
//
///
//// COLLISION CHECK
///
//
void checkCollision() {
// player - artifact collision
if (playerPositionX >= 330 && artifactObtained == false) {
playerDirection = false;
artifactObtained = true;
timeLimit+=(30*1000);
}
// player - door collision
if (playerPositionX <= 30 && artifactObtained == true) {
winCondition = true;
}
// player - electric collision
if ((playerPositionX+playerWidth>=75&&playerPositionX<=105)&&(playerPositionY<=(electricTopY+electricHeight-20)&&playerPositionY+playerHeight>=electricTopY)) {
artifactObtained = false;
playerDirection = true;
playerPositionX = 30;
health--;
dartTrigger1 = false;
dartTrigger2 = false;
dartFireCount=0;
dartMoving = false;
}
// player - spike collision
if ((playerPositionX+playerWidth>=spikeX&&playerPositionX<=spikeX+30)&&spikeState == 2) {
artifactObtained = false;
playerDirection = true;
playerPositionX = 30;
health--;
dartTrigger1 = false;
dartTrigger2 = false;
dartFireCount=0;
dartMoving = false;
}
// player - dart plate 1 collision
if ((playerPositionX+playerWidth>=165&&playerPositionX<=190)&&(dartTrigger1!=true)) {
dartTrigger1 = true;
dartFireDelay = time;
dartFireCount=0;
}
// player - dart plate 2 collision
if ((playerPositionX+playerWidth>=225&&playerPositionX<=250)&&(artifactObtained == true)&&(dartTrigger2!=true)) {
dartTrigger2 = true;
//dartFireCount=0;
dartFireDelay = time+(1.5*1000);
}
// player - dart collision
if ((playerPositionX+playerWidth>=210&&playerPositionX<=210)&&((playerPositionY<=(dart1Y+10-20)&&playerPositionY+playerHeight>=dart1Y)||(playerPositionY<=(dart2Y+10-20)&&playerPositionY+playerHeight>=dart2Y)||(playerPositionY<=(dart3Y+10-20)&&playerPositionY+playerHeight>=dart3Y)||(playerPositionY<=(dart4Y+10-20)&&playerPositionY+playerHeight>=dart4Y))) {
artifactObtained = false;
playerDirection = true;
playerPositionX = 30;
health--;
dartTrigger1 = false;
dartTrigger2 = false;
dartFireCount=0;
dartMoving = false;
}
// player - fire collision
if ((playerPositionX+playerWidth>=fireX&&playerPositionX<=fireX+20)&&(playerPositionY<=(fireY+30-20)&&playerPositionY+playerHeight>=fireY)) {
artifactObtained = false;
playerDirection = true;
playerPositionX = 30;
health--;
dartTrigger1 = false;
dartTrigger2 = false;
dartFireCount=0;
dartMoving = false;
}
// player - saw collision
if ((playerPositionX+playerWidth>=sawX&&playerPositionX<=sawX+15)&&(playerPositionY<=(sawY+50-20)&&playerPositionY+playerHeight>=sawY)) {
artifactObtained = false;
playerDirection = true;
playerPositionX = 30;
health--;
dartTrigger1 = false;
dartTrigger2 = false;
dartFireCount=0;
dartMoving = false;
}
}
void updateScore() {
// check for win/lose
if (artifactObtained == true && playerPositionX == 30) {
winCondition = true;
} else if ((time >= timeLimit || health == 0) && winCondition == false) {
loseCondition = true;
}
}
//
///
//// USER INTERFACE
///
//
void drawUI() {
noStroke();
if (winCondition == true) {
// win screen (American Flag)
// base
fill(255);
rect(0, 0, width, height);
// stripes
fill(255, 0, 0);
for (int flagStripes = 0; flagStripes<13; flagStripes++) {
if (flagStripes%2 == 0) {
rect(0, (height/19.4)*flagStripes, width, height/19.4);
}
}
// corner (blue)
fill(0, 0, 128);
rect(0, 0, width/2, (height/26)*11);
// stars
fill(255);
int starCollumn = 0;
int starSide = 16;
for (int starRow = 0; starRow<99; starRow++) {
// for the checkering
if (starRow!=0&&starRow%11==0) {
starCollumn++;
};
// top point
triangle(12+(starSide/2)+((starRow)%11)*starSide, 12+(starCollumn*starSide), 12+(((starSide/5)*4)+((starRow)%11)*starSide), 12+starSide+(starCollumn*starSide), 12+(((starSide/3))+((starRow)%11)*starSide), 12+((starSide/3)*2)+(starCollumn*starSide));
// star arms
triangle(12+((starRow)%11)*starSide, 12+((starSide/5)*2)+(starCollumn*starSide), 12+(starSide)+((starRow)%11)*starSide, 12+((starSide/5)*2)+(starCollumn*starSide), 12+(starSide/2)+((starRow)%11)*starSide, 12+((starSide/5)*4)+(starCollumn*starSide));
// remaining leg
triangle(12+(starSide/2)+((starRow)%11)*starSide, 12+(starCollumn*starSide), 12+(((starSide/5))+((starRow)%11)*starSide), 12+starSide+(starCollumn*starSide), 12+(((starSide/3)*2)+((starRow)%11)*starSide), 12+((starSide/3)*2)+(starCollumn*starSide));
// for the checkering
starRow++;
if (starRow%11==0) {
starCollumn++;
};
}
} else if (loseCondition == true) {
// lose screen
fill(0);
rect(0, 0, width, height);
} else {
// time bar
fill(32, 178, 170);
rect(0, 0, (timeLimit-time)/(timeLimit/400), 30);
// front wall
fill(152, 55, 55);
rect(0, 0+((height/4)*3), width, height/4);
// brick pattern
strokeWeight(1);
stroke(175, 88, 88);
for (int brickVertical = 0; brickVertical<17; brickVertical++) {
for (int brickHorizontal = 0; brickHorizontal<50; brickHorizontal++) {
line((brickHorizontal*15), ((height/4)*3)+(brickVertical*10), ((brickHorizontal+1)*15), ((height/4)*3)+((brickVertical)*10));
line(((brickVertical%2)*5)+(brickHorizontal*15), ((height/4)*3)+(brickVertical*10), ((brickVertical%2)*5)+(brickHorizontal*15), 10+((height/4)*3)+((brickVertical)*10));
}
}
// front wall plate (for UI)
noStroke();
fill(152, 55, 55);
rect((width/5), ((height/10)*8)-9, (width/5)*3, (height/15)*3+1);
// artifact obtained indicator
if (artifactObtained == true) {
fill(147, 112, 219);
rect(275, 360, 20, 30);
}
// health hearts (12 points, 3 hearts, 4 quarters per heart
for (int healthParts = health; healthParts>0; healthParts--) {
fill(255, 0, 0);
if (healthParts%4==0) {
arc((width/2)-140+(30*(healthParts/2)), 370-9, 15, 15, radians(180), radians(360));
}
if (healthParts%4==1) {
arc((width/2)-95+(30*(healthParts/2)), 370-9, 15, 15, radians(180), radians(360));
}
if (healthParts%4==2) {
triangle((width/2)-132+(30*(healthParts/2)), 370-9, (width/2)-117+(30*(healthParts/2)), 370-9, (width/2)-117+(30*(healthParts/2)), 390-9);
}
if (healthParts%4==3) {
triangle((width/2)-117+(30*(healthParts/2)), 370-9, (width/2)-102+(30*(healthParts/2)), 370-9, (width/2)-117+(30*(healthParts/2)), 390-9);
}
}
}
// "Democracy" title
fill(255, 20, 20);
textSize(44);
text("Democracy", 80, 344);
noStroke();
}