/***************************************************************
* Interactive Firefly-powered Television Cabinet *
* By Connor "Ramtan" Gilhuly *
* *
* Ever wanted an interactive television that can only be *
* powered inconvienently by a firefly (whose name is kind of *
* a misnomer, since he has more to do with electricity than *
* he does with actual fire)? Well then you're in luck! *
* *
* Each television cabinet comes with three interactive *
* channels, and your own firefly pet to power the television! *
* Simply wake him up whenever you want to watch TV, and it'll *
* do the rest. *
* *
* This particular cabinet comes with 3 channels. Enjoy! *
***************************************************************/
void setup (){
size (400, 400);
frameRate(60);
println("(Click the Firefly to wake him up)");
rectMode(CORNERS);
}
int ffx = 85;
int ffy = 320;
int sequence = 0;
int f = 0;
String face = "sleep";
int channel = 0;
boolean powered = false;
int search = 60;
boolean flying = false;
boolean animating = false;
void draw() {
background(20);
drawChannel();
drawCabinet();
updateFirefly();
drawFirefly();
}
void keyPressed(){
//If TV is on when Space is pressed, change channel. Randomly.
if (key == ' ' && powered) {
search = 60;
channel ++;
if (channel >= 3){
channel = 0;
}
}
}
void mouseClicked(){
if (!animating){
if (!powered){
if (mouseX >= 50 && mouseX <= 110 && mouseY >= 280 && mouseY <= 350 && sequence == 0){
animating = true;
sequence = 1;
face = " ";
println("Oh, I'm sorry! I'll get right to work!");
}
} else if (mouseX >= 290 && mouseX <= 370 && mouseY >= 290 && mouseY <= 370 && sequence == 7){
animating = true;
face = "mad";
sequence = 8;
println("Hey! Don't touch me while I'm at work!");
}
}
}
//The fuzzy b/w screen that is shown for a moment when you change the channel.
void screenFuzz(int vis) {
for (int x = 40; x < 360; x += 5){
for (int y = 20; y < 280; y += 5){
float shade = random(256);
fill(shade, shade, shade, vis);
noStroke();
rect(x, y, x+5, y+5);
}
}
}
void drawChannel() {
if (powered) {
if (search <= 0) {
if (channel == 0){
//Sirens singing
//Sunset
fill(255, 140, 0);
rect(60, 40, 340, 260);
fill(255, 255, 0);
ellipse(200, 190, 100, 100);
fill(255);
ellipse(200, 190, 80, 80);
//Musical Note
fill(0);
ellipse(mouseX, (mouseY/10)*10, 10, 8);
stroke(0);
line(mouseX+5, (mouseY/10)*10, mouseX+5, (mouseY/10)*10 - 25);
if (((mouseY/10)*10) % 20 == 10){
line(mouseX-9, (mouseY/10)*10, mouseX+9, (mouseY/10)*10);
}
noStroke();
//Left Siren
fill(#84D684);
ellipse(135, sirenPos(140, 112), 8, 8);
ellipse(145, sirenPos(140, 112), 8, 8);
quad(132, sirenPos(140, 112), 138, sirenPos(140, 112), 130, sirenPos(140, 135), 125, sirenPos(140, 130));
quad(148, sirenPos(140, 112), 142, sirenPos(140, 112), 150, sirenPos(140, 135), 155, sirenPos(140, 130));
triangle(130, sirenPos(140, 135), 125, sirenPos(140, 130), 110, sirenPos(140, 145));
triangle(150, sirenPos(140, 135), 155, sirenPos(140, 130), 170, sirenPos(140, 145));
fill(140, 110, 255);
rect(138, sirenPos(140, 112), 142, sirenPos(140, 150));
ellipse(140, sirenPos(140, 110), 10, 10);
ellipse(158, sirenPos(140, 120), 4, 4);
ellipse(132, sirenPos(140, 125), 4, 4);
strokeWeight(2);
stroke(140, 110, 255);
line(142, sirenPos(140, 114), 158, sirenPos(140, 120));
line(138, sirenPos(140, 114), 132, sirenPos(140, 125));
noStroke();
ellipse(138, sirenPos(140, 119), 6, 6);
ellipse(142, sirenPos(140, 119), 6, 6);
//Mid Siren
fill(#84D684);
ellipse(195, sirenPos(200, 112), 8, 8);
ellipse(205, sirenPos(200, 112), 8, 8);
quad(192, sirenPos(200, 112), 198, sirenPos(200, 112), 190, sirenPos(200, 135), 185, sirenPos(200, 130));
quad(208, sirenPos(200, 112), 202, sirenPos(200, 112), 210, sirenPos(200, 135), 215, sirenPos(200, 130));
triangle(190, sirenPos(200, 135), 185, sirenPos(200, 130), 170, sirenPos(200, 145));
triangle(210, sirenPos(200, 135), 215, sirenPos(200, 130), 230, sirenPos(200, 145));
fill(200, 110, 255);
rect(198, sirenPos(200, 112), 202, sirenPos(200, 150));
ellipse(200, sirenPos(200, 110), 10, 10);
ellipse(218, sirenPos(200, 120), 4, 4);
ellipse(192, sirenPos(200, 125), 4, 4);
strokeWeight(2);
stroke(200, 110, 255);
line(202, sirenPos(200, 114), 218, sirenPos(200, 120));
line(198, sirenPos(200, 114), 192, sirenPos(200, 125));
noStroke();
ellipse(198, sirenPos(200, 119), 6, 6);
ellipse(202, sirenPos(200, 119), 6, 6);
//Right Siren
fill(#84D684);
ellipse(255, sirenPos(260, 112), 8, 8);
ellipse(265, sirenPos(260, 112), 8, 8);
quad(252, sirenPos(260, 112), 258, sirenPos(260, 112), 250, sirenPos(260, 135), 245, sirenPos(260, 130));
quad(268, sirenPos(260, 112), 262, sirenPos(260, 112), 270, sirenPos(260, 135), 275, sirenPos(260, 130));
triangle(250, sirenPos(260, 135), 245, sirenPos(260, 130), 230, sirenPos(260, 145));
triangle(270, sirenPos(260, 135), 275, sirenPos(260, 130), 290, sirenPos(260, 145));
fill(255, 40, 50);
rect(258, sirenPos(260, 112), 262, sirenPos(260, 150));
ellipse(260, sirenPos(260, 110), 10, 10);
ellipse(278, sirenPos(260, 120), 4, 4);
ellipse(252, sirenPos(260, 125), 4, 4);
strokeWeight(2);
stroke(255, 40, 50);
line(262, sirenPos(260, 114), 278, sirenPos(260, 120));
line(258, sirenPos(260, 114), 252, sirenPos(260, 125));
noStroke();
ellipse(258, sirenPos(260, 119), 6, 6);
ellipse(262, sirenPos(260, 119), 6, 6);
//Water and rocks
noStroke();
fill(200);
ellipse(140, 195, 37, 120);
ellipse(195, 200, 40, 140);
ellipse(255, 197, 42, 134);
fill(60, 60, 255);
for (int w = 60; w <= 340; w += 20){
triangle(w, 180, w+10, 190, w-10, 190);
}
rect(40, 190, 340, 260);
//Then I noticed that nothing else in this program changes the stroke weight.
strokeWeight(1);
} else if (channel == 1) {
//Just guess at what this is. Just guess.
background(20);
fill(130);
rect(60, 40, 100, 260);
rect(220, 40, 260, 260);
rect(260, 140, 340, 260);
fill(190);
rect(230, 80, 250, 120);
fill(255);
rect(233, 83, 247, 97);
fill(255, 0, 0);
rect(233, 103, 247, 117);
//Flickering Glowy eyes of potential doom.
int showEyes = int(random(21));
if (mouseX > 265 && showEyes < 10){
fill(200);
ellipse(305, 90, 18, 30);
ellipse(275, 90, 18, 30);
fill(255);
ellipse(304, 92, 10, 20);
ellipse(274, 92, 10, 20);
}
//Person who is probably going to die.
fill(200);
quad(202, 210, 207, 207, 220, 230, 212, 230);
rect(230, 230, 242, 300);
fill(#FF891A);
quad(170, 160, 180, 150, 209, 209, 200, 212);
rect(210, 230, 260, 240);
fill(#4389FF);
quad(187, 130, 230, 210, 210, 210, 175, 140);
rect(183, 146, 195, 230);
fill(#3D6CBC);
quad(210, 210, 220, 230, 260, 230, 280, 210);
rect(260, 210, 280, 300);
fill(#FFF6DE);
ellipse(190, 236, 20, 20);
ellipse(170, 130, 44, 40);
fill(0);
ellipse(165, 114, 16, 8);
fill(#FFF6DE);
ellipse(165, 114, 14, 6);
quad(165, 113, 159, 130, 148, 126, 160, 113);
triangle(174, 112, 186, 102, 183, 120);
fill(#4389FF);
quad(130, 120, 142, 125, 150, 153, 145, 165);
fill(0);
quad(142, 125, 150, 153, 157, 157, 147, 104);
ellipseMode(CORNERS);
ellipse(187, 128, 187 - (mouseY/40.0 + 4), 128 + (mouseY/40.0 + 4));
ellipseMode(CENTER);
//And a slight video fuzz effect to add a bit of atmosphere :)
screenFuzz(20);
fill(255);
text("CAM 0", 100, 70);
} else if (channel == 2) {
//Pole-dancing Bee
background(#FF8ED0);
fill(0);
ellipse(200, 90, 16, 16);
fill(50, 255, 50);
rect(195, 40, 205, 210);
ellipse(200, 210, 10, 5);
stroke(0);
line(192, 90, 190+(mouseX-200)/8, 110);
noStroke();
fill(255, 255, 255, 100);
ellipse(246+(mouseX-200)/4, 90, 34, 100);
ellipse(294+(mouseX-200)/4, 90, 34, 100);
stroke(0);
line(190+(mouseX-200)/8, 110, 240+(mouseX-200)/4, 130);
line(260+(mouseX-200)/4, 110, 230+(mouseX-200)/4, 70);
line(215+(mouseX-200)/4, 90, 230+(mouseX-200)/4, 70);
line(260+(mouseX-200)/4, 110, 290+(mouseX-200)/4, 70);
line(305+(mouseX-200)/4, 90, 290+(mouseX-200)/4, 70);
noStroke();
fill(250, 250, 0);
ellipse(270+(mouseX-200)/4, 150, 48, 48);
fill(#6A4216);
ellipse(260+(mouseX-200)/4, 110, 60, 60);
ellipse(255+(mouseX-200)/4, 178, 66, 66);
rect(246+(mouseX-200)/4, 144, 294+(mouseX-200)/4, 156);
stroke(0);
fill(0);
line(290+(mouseX-200)/4, 140, 304+(mouseX-200)/4, 160);
line(304+(mouseX-200)/4, 160, 287+(mouseX-200)/4, 180);
noStroke();
ellipse(289+(mouseX-200)/4, 180, 10, 16);
fill(250, 250, 0);
ellipse(258+(mouseX-200)/4, 110, 54, 54);
ellipse(250+(mouseX-200)/4, 182, 61, 61);
fill(0);
ellipse(248+(mouseX-200)/4, 108, 10, 20);
ellipse(266+(mouseX-200)/4, 108, 10, 20);
ellipse(245+(mouseX-200)/4, 187, 10, 10);
triangle(245+(mouseX-200)/4, 182, 245+(mouseX-200)/4, 192, 214+(mouseX-200)/4, 200);
fill(250, 250, 0);
rect(238+(mouseX-200)/4, 94, 276+(mouseX-200)/4, 108);
}
//One quick note that I'm placing here because I'm not sure where else to put it:
//The firefly finds channel 1 scary...
if (channel == 1){
face = "sad";
} else {
if (face != "mad"){
face = " ";
}
}
} else {
screenFuzz(255);
search--;
}
}
}
int sirenPos(int x, int y){
return (abs(x-mouseX)/2+y);
}
void updateFirefly(){
/*If framerate is 60 fps, and f increases by 1
with every frame, then 1 second should have
passed when f == 60*/
if (sequence == 1){
f ++;
if (f >= 180){
sequence = 2;
flying = true;
f = 0;
}
} else if (sequence == 2) {
ffy -= 1;
if (ffy <= 160){
sequence = 3;
}
} else if (sequence == 3) {
ffx += 1;
if (ffx >= 315){
sequence = 4;
}
} else if (sequence == 4) {
f ++;
if (f >= 60){
sequence = 5;
f = 10;
}
} else if (sequence == 5) {
if (ffy - f >= 340) {
ffy = 340;
sequence = 6;
flying = false;
animating = false;
f = 0;
} else {
ffy -= f;
f --;
}
} else if (sequence == 6) {
f ++;
if (f >= 100) {
f = 0;
sequence = 7;
powered = true;
}
} else if (sequence == 8) {
f++;
if (f >= 200){
face = " ";
sequence = 9;
f = 0;
powered = false;
println("I'm going back to bed!");
flying = true;
}
} else if (sequence == 9) {
ffy -= 1;
if (ffy <= 160){
sequence = 10;
}
} else if (sequence == 10) {
ffx -= 1;
if (ffx <= 85) {
sequence = 11;
println("Good night!");
}
} else if (sequence == 11) {
f ++;
if (f >= 60){
f = 10;
sequence = 12;
face = "sleep";
}
} else if (sequence == 12){
if (ffy - f >= 320) {
ffy = 320;
sequence = 0;
flying = false;
animating = false;
f = 0;
} else {
ffy -= f;
f --;
}
}
}
void drawFirefly(){
//Tail
noStroke();
if (powered){
fill(255, 255, 0, 150);
ellipse(ffTailGloX(), ffTailGloY(), 80, 80);
}
fill(255, 255, 0);
ellipse(ffTailX(), ffTailY(), 40, 40);
//Torso
fill(0, 255, 255);
ellipse(ffTorsoX(), ffTorsoY(), 40, 40);
quad(ffx+20, ffy, ffx-20, ffy, ffTorsoX()-20, ffTorsoY(), ffTorsoX()+20, ffTorsoY());
quad(ffx, ffy+20, ffx, ffy-20, ffTorsoX(), ffTorsoY()-20, ffTorsoX(), ffTorsoY()+20);
//Wings
fill(255, 255, 255, 100);
ellipseMode(CORNERS);
if (animating && frameCount%2==0){
ellipse(ffx-2, ffy-5, ffx-25, ffy-70);
ellipse(ffx+2, ffy-5, ffx+25, ffy-70);
} else {
ellipse(ffx-2, ffy-5, ffx-70, ffy-25);
ellipse(ffx+2, ffy-5, ffx+70, ffy-25);
}
ellipseMode(CENTER);
//Antannae
stroke(0);
strokeWeight(1);
line(ffx-10, ffy-10, ffx-20, ffy-25);
line(ffx-20, ffy-25, ffx-25, ffy-15);
line(ffx+10, ffy-10, ffx+20, ffy-25);
line(ffx+20, ffy-25, ffx+25, ffy-15);
//Arms
noFill();
if (flying){
curve(ffx+40, ffy, ffx-10, ffy+10, ffx-10, ffy+40, ffx+30, ffy+60);
curve(ffx-40, ffy, ffx+10, ffy+10, ffx+10, ffy+40, ffx-30, ffy+60);
} else {
curve(ffx+100, ffy+10, ffx-10, ffy+10, ffx-10, ffy+20, ffx+100, ffy+20);
curve(ffx-100, ffy+10, ffx+10, ffy+10, ffx+10, ffy+20, ffx-100, ffy+20);
}
//Head
noStroke();
fill(0, 255, 255);
ellipse(ffx, ffy, 40, 40);
//Face (Handled in seperate function)
ffFace();
//Hands
fill(0);
if (flying){
ellipse(ffx-10, ffy+40, 10, 10);
ellipse(ffx+10, ffy+40, 10, 10);
} else {
ellipse(ffx-10, ffy+20, 10, 10);
ellipse(ffx+10, ffy+20, 10, 10);
}
}
//Draw the FF's eyes, then cover some of them to invoke some sort of facial expression.
void ffFace(){
fill(255, 255, 0);
ellipse(ffEyesX()-7, ffEyesY(), 7, 14);
ellipse(ffEyesX()+7, ffEyesY(), 7, 14);
fill(0, 255, 255);
if (face == "sleep"){
ellipse(ffEyesX()-7, ffEyesY(), 4, 10);
ellipse(ffEyesX()+7, ffEyesY(), 4, 10);
quad(ffEyesX()+12, ffEyesY(), ffEyesX()-12, ffEyesY(), ffEyesX()-10, ffEyesY()-7, ffEyesX()+10, ffEyesY()-7);
}
if (face == "mad"){
triangle(ffEyesX()-3, ffEyesY(), ffEyesX()-10, ffEyesY()-7, ffEyesX()-4, ffEyesY()-7);
triangle(ffEyesX()+3, ffEyesY(), ffEyesX()+10, ffEyesY()-7, ffEyesX()+4, ffEyesY()-7);
}
if (face == "sad"){
triangle(ffEyesX()-11, ffEyesY(), ffEyesX()-10, ffEyesY()-7, ffEyesX()-4, ffEyesY()-7);
triangle(ffEyesX()+11, ffEyesY(), ffEyesX()+10, ffEyesY()-7, ffEyesX()+4, ffEyesY()-7);
}
}
void drawCabinet(){
//Screen Border
fill(0);
noStroke();
rect(40, 20, 360, 40);
rect(40, 20, 60, 280);
rect(340, 20, 360, 280);
rect(40, 260, 360, 280);
fill(100);
rect(0, 0, 400, 20);
rect(0, 0, 40, 400);
rect(360, 0, 400, 400);
rect(0, 280, 400, 400);
//Cabinet Dashboard
fill(140);
rect(0, 310, 400, 400);
//Power Spot
fill(100);
quad(300, 320, 360, 320, 380, 360, 280, 360);
fill(120);
rect(300, 320, 360, 360);
fill(140);
quad(300, 330, 360, 330, 370, 360, 290, 360);
fill(200);
ellipse(315, 345, 10, 5);
ellipse(345, 345, 10, 5);
stroke(0);
line(307, 353, 318, 353);
line(342, 353, 353, 353);
line(346, 349, 349, 358);
//Space Bar
noStroke();
textAlign(CENTER);
textSize(20);
if (keyPressed && key == ' '){
fill(160);
quad(145, 335, 255, 335, 270, 360, 130, 360);
fill(0);
text("SPACE", 200, 355);
} else {
fill(120);
rect(130, 340, 270, 360);
fill(160);
quad(145, 315, 255, 315, 270, 340, 130, 340);
fill(0);
text("SPACE", 200, 335);
}
//Pillow
fill(100);
quad(20, 360, 120, 360, 100, 320, 40, 320);
fill(#C061CB);
ellipse(70, 310, 60, 10);
stroke(#C061CB);
curve(70, 310, 40, 310, 20, 350, 20, 380);
curve(70, 310, 100, 310, 120, 350, 120, 380);
curve(20, 300, 20, 350, 120, 350, 120, 300);
quad(20, 350, 120, 350, 100, 310, 40, 310);
stroke(#954C9D);
ellipse(70, 320, 16, 6);
}
float ffTorsoX(){
float x = (ffx-200)*0.1 + ffx;
return x;
}
float ffTorsoY(){
float y = (ffy-280)*(-0.1) + ffy;
return y;
}
float ffTailX(){
float x = (ffx-200)*0.2 + ffx;
return x;
}
float ffTailY(){
float y = (ffy-280)*(-0.2) + ffy;
return y;
}
float ffTailGloX(){
float x = (ffx-200)*0.22 + ffx;
return x;
}
float ffTailGloY(){
float y = (ffy-280)*(-0.33) + ffy;
return y;
}
float ffEyesX(){
float x = (ffx-200)*(-0.05) + ffx;
return x;
}
float ffEyesY(){
float y = (ffy-280)*(-0.1) + ffy;
return y;
}