cube

Dependencies:   mbed

Fork of manworm_tv_gpu by Jared DiCarlo

Revision:
4:02e3ae7a3aea
Parent:
3:d9edc0575aa3
Child:
5:2859a892497f
--- a/main.cpp	Sun Nov 19 05:00:14 2017 +0000
+++ b/main.cpp	Sun Nov 19 07:05:01 2017 +0000
@@ -7,11 +7,10 @@
 #define Y_MIN 7
 #define Y_MAX (V_RES/4 - 15)
 
-int SX_MIN = 30;
-int SX_MAX = 95;
-int SY_MIN = 10;
-int SY_MAX = 48;
-int PADDLE_LEN = 10;
+#define SX_MIN 30
+#define SX_MAX 95
+#define SY_MIN 10
+#define SY_MAX 48
 
 #define Y_0 ( (Y_MIN + Y_MAX)/2 )
 #define X_0 ( (X_MIN + X_MAX)/2 )
@@ -23,6 +22,7 @@
 #define BY_0 (V_RES/4 - 15)
 #define BX 42
 #define BY 15
+#define BY2 9
 #define DEMO_LENGTH 600
 
 
@@ -148,6 +148,15 @@
 1,0,0,0,0,0,
 1,0,0,0,0,0,};
 
+uint8_t chr_R[] = {
+1,1,1,1,1,0,
+1,0,0,0,0,1,
+1,0,0,0,0,1,
+1,0,0,0,1,0,
+1,0,0,1,0,0,
+1,0,0,0,1,0,
+1,0,0,0,0,1,};
+
 uint8_t chr_S[] = {
 0,1,1,1,1,1,
 1,0,0,0,0,0,
@@ -157,6 +166,25 @@
 0,0,0,0,0,1,
 1,1,1,1,1,0,};
 
+uint8_t chr_V[] = {
+1,0,0,0,0,1,
+1,0,0,0,0,1,
+1,0,0,0,0,1,
+0,1,0,0,1,0,
+0,1,0,0,1,0,
+0,1,0,0,1,0,
+0,0,1,1,0,0,};
+
+uint8_t sprite_tree[] = {
+0,0,0,1,0,0,0,
+0,0,1,1,1,0,0,
+0,1,1,1,1,1,0,
+1,1,1,1,1,1,1,
+0,1,1,1,1,1,0,
+1,1,1,1,1,1,1,
+0,0,0,1,0,0,0,
+0,0,0,1,0,0,0,};
+
 uint16_t l=0; //current line of scan
 
 uint8_t im_line_s[H_RES]; //image sync buffer
@@ -194,6 +222,7 @@
 uint8_t im_line_va[H_RES*V_RES]; //image buffer
 
 //pong variables
+#define PADDLE_LEN 10
 float p1 = (SY_MIN+SY_MAX)/2-PADDLE_LEN/2, p2 = (SY_MIN+SY_MAX)/2-PADDLE_LEN/2;
 float p1v = 0.1, p2v = -0.1;
 
@@ -212,6 +241,12 @@
 float uvy[8] = {1,1,1,-1,-1,-1,-1,1};
 int ulive[8] = {1,1,1,1,1,1,1,1};
 
+//tunnel variables
+#define TUN_LEN (SY_MAX - SY_MIN)
+uint8_t tunnel[TUN_LEN];
+float tunnp = 50;
+int tundir = 1;
+
 int fdeath_ticker = FDEATH_RESET;
 float fs = 0;
 
@@ -686,14 +721,83 @@
     }
 }
 
+void dispsprite(int x0, int y0, uint8_t* chr) {
+    int bmi = 0;
+    for(int y = SY_MIN + y0; y < SY_MIN + y0 + 8; y++)
+    {
+        for(int x = SX_MIN + x0; x < SX_MIN + x0 + 7; x++)
+        {
+            im_line_va[H_RES*y + x] = chr[bmi];
+            bmi++;
+        }
+    }
+}
+
+void disp_tunnel() {
+    for (int y = SY_MIN; y < SY_MAX; y++) {
+        int tunw = 30 * (y) / TUN_LEN;
+        int yy = SY_MAX-(SY_MAX-y)*3/4;
+        for (int x = SX_MIN; x < SX_MIN + tunnel[y - SY_MIN]; x++) im_line_va[H_RES*yy+x] = 1;
+        for (int x = SX_MIN + tunnel[y - SY_MIN]; x < SX_MIN + tunnel[y - SY_MIN] + tunw; x++) im_line_va[H_RES*yy+x] = 0;
+        for (int x = SX_MIN + tunnel[y - SY_MIN] + tunw; x < SX_MAX; x++) im_line_va[H_RES*yy+x] = 1;
+    }
+}
+
+void init_tunnel() {
+    for (int i = 0; i < TUN_LEN; i++) tunnel[i] = 20;
+    disp_tunnel();
+    
+    int bmi = 0;
+    
+    for(int y = SY_MIN; y < SY_MIN + BY; y++)
+    {
+        for(int x = SX_MIN; x < SX_MIN + BX; x++)
+        {
+            im_line_va[H_RES*y + x + 10] = tv[bmi];
+            bmi++;
+        }
+    }
+    dispsprite(1,2,sprite_tree);
+    dispsprite(50,2,sprite_tree);
+    dispsprite(11,2,sprite_tree);
+}
+
+void update_tunnel() {
+    for (int j = TUN_LEN-1; j > 0; j--) tunnel[j] = tunnel[j-1];
+    
+    int x = rand() % 8;
+    if (x == 0) tundir = -tundir;
+    tunnel[0] = tunnel[0]+tundir;
+    
+    if (tunnel[0] < 1) {
+        tunnel[0] = 1;
+        tundir = 1;
+    }
+    if (SX_MIN + tunnel[0] + 30 + 1 > SX_MAX) {
+        tunnel[0] = SX_MAX-SX_MIN-30-1;
+        tundir = -1;
+    }
+    
+    disp_tunnel();
+    
+    int cmd1 = p1_in.read();
+    int cmd2 = p2_in.read();
+    if (cmd1) tunnp+=1;
+    if (cmd2) tunnp-=1;
+    if (tunnp<SX_MIN+1) tunnp = SX_MIN+1;
+    if (tunnp>SX_MAX-1) tunnp = SX_MAX-1;
+    im_line_va[H_RES*SY_MAX+(int)tunnp] = 1;
+    
+    wait(0.007);
+}
 int main() {
     potato:
     init_buffers();
     t.attach_us(&isr,63);
-    
+
     int bmi = 0;
     
-    for(int y = SY_MIN; y < SY_MIN + BY; y++)
+    for(int y = SY_MIN; y < SY_MIN + BY2; y++)
     {
         for(int x = SX_MIN; x < SX_MIN + BX; x++)
         {
@@ -702,20 +806,25 @@
         }
     }
     
-    dispchr(4, BY+2, chr_P);
-    dispchr(11, BY+2, chr_A);
-    dispchr(18, BY+2, chr_N);
-    dispchr(25, BY+2, chr_G);
+    dispchr(4, BY2+1, chr_P);
+    dispchr(11, BY2+1, chr_A);
+    dispchr(18, BY2+1, chr_N);
+    dispchr(25, BY2+1, chr_G);
+    
+    dispchr(4, BY2+9, chr_F);
+    dispchr(11, BY2+9, chr_A);
+    dispchr(18, BY2+9, chr_S);
+    dispchr(25, BY2+9, chr_H);
     
-    dispchr(4, BY+10, chr_F);
-    dispchr(11, BY+10, chr_A);
-    dispchr(18, BY+10, chr_S);
-    dispchr(25, BY+10, chr_H);
+    dispchr(4, BY2+17, chr_D);
+    dispchr(11, BY2+17, chr_A);
+    dispchr(18, BY2+17, chr_M);
+    dispchr(25, BY2+17, chr_O);
     
-    dispchr(4, BY+18, chr_D);
-    dispchr(11, BY+18, chr_A);
-    dispchr(18, BY+18, chr_M);
-    dispchr(25, BY+18, chr_O);
+    dispchr(4, BY2+25, chr_D);
+    dispchr(11, BY2+25, chr_R);
+    dispchr(18, BY2+25, chr_A);
+    dispchr(25, BY2+25, chr_V);
     
     int cursor_pos = 0;
     
@@ -724,7 +833,7 @@
         int cmd2 = p2_in.read();
         
         int cursor_x = SX_MIN;
-        int cursor_y = SY_MIN + 8*cursor_pos + BY + 5;
+        int cursor_y = SY_MIN + 8*cursor_pos + BY2 + 5;
         
         if (cmd1 || cmd2) im_line_va[H_RES*cursor_y+cursor_x] = 0;
         
@@ -733,10 +842,10 @@
         if (!cmd1 && !cmd2) break;
         
         if (cursor_pos < 0) cursor_pos = 0;
-        if (cursor_pos > 2) cursor_pos = 2;
+        if (cursor_pos > 3) cursor_pos = 3;
         
         cursor_x = SX_MIN;
-        cursor_y = SY_MIN + 8*cursor_pos + BY + 5;
+        cursor_y = SY_MIN + 8*cursor_pos + BY2 + 5;
         
         im_line_va[H_RES*cursor_y+cursor_x] = 1;
         
@@ -751,8 +860,14 @@
         }
     } else if (cursor_pos == 1) {
         for (;;) fishy();
+    } else if (cursor_pos == 2) {
+        for (;;) update_image();
     } else {
-        for (;;) update_image();
+        init_tunnel();    
+        for (;;) 
+        {
+            update_tunnel();
+        }
     }
     goto potato;
 }