void TheGooniesApp::titleanimation_draw(void)
{
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

	m_titleanimation_shift -= m_titleanimation_speed;
	m_titleanimation_shift += 40;
	m_titleanimation_shift = (m_titleanimation_shift%40)-40;
	if ((m_state_cycle%8)==0) {
		if (m_titleanimation_state==0 || m_titleanimation_state==1) {
			if (m_titleanimation_speed<4) m_titleanimation_speed++;
		} else {
			if (m_titleanimation_speed>0) m_titleanimation_speed--;
		}
	} 

    m_GLTM->get
    ("bg_copyright")->draw(0, 0, 0, 0, 1);
    m_GLTM->get_smooth("title_logo")->draw(46, 17, 0, 0, 1);

    switch (m_titleanimation_state) {
        case 0: {
                float f = float(m_state_cycle) / 50;

                glColor4f(0, 0, 0, f);
#ifndef HAVE_GLES
                glBegin(GL_QUADS);
                glVertex3f(0, 256, 0);
                glVertex3f(0, 400, 0);
                glVertex3f(640, 400, 0);
                glVertex3f(640, 256, 0);
                glEnd();
#else
		GLfloat vtx1[] = {
		0, 256, 0,
		0, 400, 0,
		640, 400, 0,
		640, 256, 0
		};

      glEnableClientState(GL_VERTEX_ARRAY);
 
      glVertexPointer(3, GL_FLOAT, 0, vtx1);
      glDrawArrays(GL_TRIANGLE_FAN,0,4);
 
      glDisableClientState(GL_VERTEX_ARRAY);
#endif

				// film strip
				{
					GLTile *strip = m_GLTM->get("intro-film-strip");
					for (int x = m_titleanimation_shift; x < 640; x+= 40)
					{
						strip->draw(1, 1, 1, f, float(x), 236, 0, 0, 1);
						strip->draw(1, 1, 1, f, float(x), 400, 0, 0, 1);
					}
				}
            }
            break;
        case 1:
        case 2: {
                float f = 1;
                bool scissor_state = (glIsEnabled(GL_SCISSOR_TEST) ? true : false);
                int scissor_window[4];

                if (m_titleanimation_state == 1)
                    f = 1;
                if (m_titleanimation_state == 2)
                    f = float(50 - m_state_cycle) / 50;
                glEnable(GL_SCISSOR_TEST);
                if (scissor_state)
                    glGetIntegerv(GL_SCISSOR_BOX, scissor_window);
                glScissor(screen_x(0), screen_y(60), screen_x(640), screen_y(184));

                glColor4f(0, 0, 0, f);
#ifndef HAVE_GLES
                glBegin(GL_QUADS);
                glVertex3f(0, 0, 0);
                glVertex3f(0, 480, 0);
                glVertex3f(640, 480, 0);
                glVertex3f(640, 0, 0);
                glEnd();
#else
		GLfloat vtx2[] = {
		0, 0, 0,
		0, 480, 0,
		640, 480, 0,
		640, 0, 0
		};

      glEnableClientState(GL_VERTEX_ARRAY);
 
      glVertexPointer(3, GL_FLOAT, 0, vtx2);
      glDrawArrays(GL_TRIANGLE_FAN,0,4);
 
      glDisableClientState(GL_VERTEX_ARRAY);
#endif

				// film strip
				{
//					int shift = -(m_titleanimation_cycle % 20) * 2;
					GLTile *strip = m_GLTM->get("intro-film-strip");
					for (int x = m_titleanimation_shift; x < 640; x+= 40)
					{
						strip->draw(1, 1, 1, f, float(x), 236, 0, 0, 1);
						strip->draw(1, 1, 1, f, float(x), 400, 0, 0, 1);
					}
				}

                // character:
                if (m_titleanimation_cycle > 50 &&
                        m_titleanimation_cycle <= 300) {
                    // running right:
                    int sp = (m_titleanimation_cycle / 8) % 4;
                    if (sp == 0)
                        m_GLTM->get
                        ("intro-character-r1")->draw(1, 1, 1, f, 512 - (300 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-character-r2")->draw(1, 1, 1, f, 512 - (300 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                    if (sp == 2)
                        m_GLTM->get
                        ("intro-character-r1")->draw(1, 1, 1, f, 512 - (300 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                    if (sp == 3)
                        m_GLTM->get
                        ("intro-character-r3")->draw(1, 1, 1, f, 512 - (300 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                } // if
				if (m_titleanimation_cycle > 300 &&
						m_titleanimation_cycle <= 312) {
					// turning:
					int sp = (m_titleanimation_cycle - 301) / 4;
					if (sp == 0)
						m_GLTM->get ("intro-character-turning_rl_1")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get ("intro-character-turning_rl_2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get ("intro-character-turning_rl_3")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
				}
                if (m_titleanimation_cycle > 312 &&
                        m_titleanimation_cycle <= 1500) {
                    // standing left:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
						("intro-character-standing-l1")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
						("intro-character-standing-l2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
						("intro-character-standing-l3")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
						("intro-character-standing-l2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1500 &&
                        m_titleanimation_cycle <= 1850) {
                    int sp = (m_titleanimation_cycle / 8) % 2;
					int s2 = (m_titleanimation_cycle / 5) % 3;
                    // knocked:
					if (s2 == 0) m_GLTM->get("intro-character-stars1")->draw(1, 1, 1, f, 532, 334, 0, 0, 1);
					if (s2 == 1) m_GLTM->get("intro-character-stars2")->draw(1, 1, 1, f, 532, 334, 0, 0, 1);
					if (s2 == 2) m_GLTM->get("intro-character-stars3")->draw(1, 1, 1, f, 532, 334, 0, 0, 1);

                    if (sp == 0)
                        m_GLTM->get
                        ("intro-character-knocked1")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-character-knocked2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);

                } // if
                if (m_titleanimation_cycle > 1850 &&
                        m_titleanimation_cycle <= 1900) {
                    // standing left:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
						("intro-character-standing-l1")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
						("intro-character-standing-l2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
						("intro-character-standing-l3")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
						("intro-character-standing-l2")->draw(1, 1, 1, f, 512, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1900 &&
                        m_titleanimation_cycle <= 2200) {
                    // running right:
                    int sp = (m_titleanimation_cycle / 8) % 4;
                    if (sp == 0)
                        m_GLTM->get
                        ("intro-character-l1")->draw(1, 1, 1, f, 512 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-character-l2")->draw(1, 1, 1, f, 512 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                    if (sp == 2)
                        m_GLTM->get
                        ("intro-character-l1")->draw(1, 1, 1, f, 512 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                    if (sp == 3)
                        m_GLTM->get
                        ("intro-character-l3")->draw(1, 1, 1, f, 512 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                } // if

                // Mike
				if (m_titleanimation_cycle > 300 + 0*150 &&
						m_titleanimation_cycle <= 500 + 0*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-mike-r1")->draw(1, 1, 1, f, (464 - 0*60) - (500 + 0*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-mike-r2")->draw(1, 1, 1, f, (464 - 0*60) - (500 + 0*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-mike-r3")->draw(1, 1, 1, f, (464 - 0*60) - (500 + 0*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-mike-r2")->draw(1, 1, 1, f, (464 - 0*60) - (500 + 0*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 0*150 &&
						m_titleanimation_cycle <= 1624 + 0*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-mike-standing1")->draw(1, 1, 1, f, float(464 - 0*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-mike-standing2")->draw(1, 1, 1, f, float(464 - 0*60), 312, 0, 0, 1);
				}

				// Mouth
				if (m_titleanimation_cycle > 300 + 1*150 &&
						m_titleanimation_cycle <= 500 + 1*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-mouth-r1")->draw(1, 1, 1, f, (464 - 1*60) - (500 + 1*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-mouth-r2")->draw(1, 1, 1, f, (464 - 1*60) - (500 + 1*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-mouth-r3")->draw(1, 1, 1, f, (464 - 1*60) - (500 + 1*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-mouth-r2")->draw(1, 1, 1, f, (464 - 1*60) - (500 + 1*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 1*150 &&
						m_titleanimation_cycle <= 1624 + 1*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-mouth-standing1")->draw(1, 1, 1, f, float(464 - 1*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-mouth-standing2")->draw(1, 1, 1, f, float(464 - 1*60), 312, 0, 0, 1);
				}

				//
				// Data
				//
				//		Added some variables to look for best values in the rope effect. Enjoy ^o^.
				//		Should be replaced by constants or something once we feel happy with the values.
				//		Ps: yes, I know Bresenham's algorithm to draw lines. But mee too lazy, too tired, too late :-).
				//
				float wave_amplitude = 1.0;		// Wave amplitude when launching the rope
				float wave_lenght = 120.0;		// Wave lenght when launching the rope
				int rope_cycles = 100;			// Cycles to reach the other side of the screen
				float rope_y = 260;				// Y coordinate for the left side of the rope
				float rope_y_delta = 10;		// Hight delta between left and right sides
				float data_weight = 10;			// "weight" of Data using the rope
				float data_shift = -30;			// Data shift to adjust Data graphic to the rope :-P

				int rope_start_cycle = 500 + 1*150 - rope_cycles;
				GLTile *rope = m_GLTM->get("intro-data-rope");

				// Throwing rope
				if (m_titleanimation_cycle > rope_start_cycle &&
						m_titleanimation_cycle <= rope_start_cycle + rope_cycles) {
					int fragments = (m_titleanimation_cycle - rope_start_cycle)*64 / rope_cycles;
					for (int i = 0; i < fragments; ++i)
						rope->draw(1, 1, 1, f, float(i * 10), float(rope_y + i*10*rope_y_delta/640 + wave_amplitude * sin(i*10 * 2*M_PI/wave_lenght)), 0, 0, 1);
				}

				// Data descending
				if (m_titleanimation_cycle > 300 + 2*150 &&
						m_titleanimation_cycle <= 500 + 2*150) {
					float x = (464 - 2*60) - (500 + 2*150 - m_titleanimation_cycle)*2.5f;
					float y = rope_y + data_weight + x*rope_y_delta/640.0f;

					// The Rope
					if (x >= 0 && x < 640) {
						int i;
						float fst_y_delta = data_weight + x*rope_y_delta/640;
						float snd_y_delta = rope_y_delta - fst_y_delta;

						for (i = 0; i < x; i+=10)
							rope->draw(1, 1, 1, f, float(i), rope_y + (i)*fst_y_delta/x, 0, 0, 1);

						for (i = 0; i < (640 - x); i+=10)
							rope->draw(1, 1, 1, f, float(i+x), rope_y + fst_y_delta + (i)*snd_y_delta/(640-x), 0, 0, 1);
					}
					else if (m_titleanimation_cycle > rope_start_cycle + rope_cycles) {
						int i;
						for (i = 0; i < 640; i+=10)
							rope->draw(1, 1, 1, f, float(i), rope_y + i*rope_y_delta/640, 0, 0, 1);
					}

					// The kiddo
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-data-hang1")->draw(1, 1, 1, f, x+data_shift, y, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-data-hang2")->draw(1, 1, 1, f, x+data_shift, y, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-data-hang3")->draw(1, 1, 1, f, x+data_shift, y, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-data-hang2")->draw(1, 1, 1, f, x+data_shift, y, 0, 0, 1);
				}
				else if (m_titleanimation_cycle > rope_start_cycle + rope_cycles) {
					// Rope dissapearing
					float rf;
					if (m_titleanimation_cycle < 900)
						rf = 1.0;
					else if (m_titleanimation_cycle > 1000)
						rf = 0.0;
					else
						rf = (1000 - m_titleanimation_cycle) / 100.0f;

					for (int i = 0; i < 640; i+=10)
						rope->draw(1, 1, 1, rf, float(i), rope_y + i*rope_y_delta/640, 0, 0, 1);
				}

				if (m_titleanimation_cycle > 500 + 2*150 &&
						m_titleanimation_cycle <= 1624 + 2*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-data-standing1")->draw(1, 1, 1, f, float(464 - 2*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-data-standing2")->draw(1, 1, 1, f, float(464 - 2*60), 312, 0, 0, 1);
				}

				// Chunk
				if (m_titleanimation_cycle > 300 + 3*150 &&
						m_titleanimation_cycle <= 500 + 3*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-chunk-r1")->draw(1, 1, 1, f, (464 - 3*60) - (500 + 3*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-chunk-r2")->draw(1, 1, 1, f, (464 - 3*60) - (500 + 3*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-chunk-r3")->draw(1, 1, 1, f, (464 - 3*60) - (500 + 3*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-chunk-r2")->draw(1, 1, 1, f, (464 - 3*60) - (500 + 3*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 3*150 &&
						m_titleanimation_cycle <= 1624 + 3*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-chunk-standing1")->draw(1, 1, 1, f, float(464 - 3*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-chunk-standing2")->draw(1, 1, 1, f, float(464 - 3*60), 312, 0, 0, 1);
				}

				// Brand
				if (m_titleanimation_cycle > 300 + 4*150 &&
						m_titleanimation_cycle <= 500 + 4*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-brand-r1")->draw(1, 1, 1, f, (464 - 4*60) - (500 + 4*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-brand-r2")->draw(1, 1, 1, f, (464 - 4*60) - (500 + 4*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-brand-r3")->draw(1, 1, 1, f, (464 - 4*60) - (500 + 4*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-brand-r2")->draw(1, 1, 1, f, (464 - 4*60) - (500 + 4*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 4*150 &&
						m_titleanimation_cycle <= 1624 + 4*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-brand-standing1")->draw(1, 1, 1, f, float(464 - 4*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-brand-standing2")->draw(1, 1, 1, f, float(464 - 4*60), 312, 0, 0, 1);
				}

				// Andy
				if (m_titleanimation_cycle > 300 + 5*150 &&
						m_titleanimation_cycle <= 500 + 5*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-andy-r1")->draw(1, 1, 1, f, (464 - 5*60) - (500 + 5*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-andy-r2")->draw(1, 1, 1, f, (464 - 5*60) - (500 + 5*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-andy-r3")->draw(1, 1, 1, f, (464 - 5*60) - (500 + 5*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-andy-r2")->draw(1, 1, 1, f, (464 - 5*60) - (500 + 5*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 5*150 &&
						m_titleanimation_cycle <= 1624 + 5*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-andy-standing1")->draw(1, 1, 1, f, float(464 - 5*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-andy-standing2")->draw(1, 1, 1, f, float(464 - 5*60), 312, 0, 0, 1);
				}

				// Steff
				if (m_titleanimation_cycle > 300 + 6*150 &&
						m_titleanimation_cycle <= 500 + 6*150) {
					// running right:
					int sp = (m_titleanimation_cycle / 8) % 4;
					if (sp == 0)
						m_GLTM->get
							("intro-steff-r1")->draw(1, 1, 1, f, (464 - 6*60) - (500 + 6*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-steff-r2")->draw(1, 1, 1, f, (464 - 6*60) - (500 + 6*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 2)
						m_GLTM->get
							("intro-steff-r3")->draw(1, 1, 1, f, (464 - 6*60) - (500 + 6*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
					if (sp == 3)
						m_GLTM->get
							("intro-steff-r2")->draw(1, 1, 1, f, (464 - 6*60) - (500 + 6*150 - m_titleanimation_cycle)*2.5f, 312, 0, 0, 1);
				}
				if (m_titleanimation_cycle > 500 + 6*150 &&
						m_titleanimation_cycle <= 1624 + 6*24) {
					// standing:
					int sp = (m_titleanimation_cycle / 16) % 2;
					if (sp == 0)
						m_GLTM->get
							("intro-steff-standing1")->draw(1, 1, 1, f, float(464 - 6*60), 312, 0, 0, 1);
					if (sp == 1)
						m_GLTM->get
							("intro-steff-standing2")->draw(1, 1, 1, f, float(464 - 6*60), 312, 0, 0, 1);
				}

                // Fratelli:
                if (m_titleanimation_cycle > 1400 &&
                        m_titleanimation_cycle <= 1500) {
                    // wlking left:
                    int sp = (m_titleanimation_cycle / 8) % 2;
                    if (sp == 0)
                        m_GLTM->get
                        ("intro-fratelli-l1")->draw(1, 1, 1, f, 544 + (1500 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-fratelli-l2")->draw(1, 1, 1, f, 544 + (1500 - m_titleanimation_cycle)*2.5f, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1500 &&
                        m_titleanimation_cycle <= 1600) {
                    // standing left:
                    m_GLTM->get
                    ("intro-fratelli-l1")->draw(1, 1, 1, f, 544, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1600 &&
                        m_titleanimation_cycle <= 1780) {
                    // wlking left:
                    int sp = (m_titleanimation_cycle / 8) % 2;
                    if (sp == 0)
                        m_GLTM->get
                        ("intro-fratelli-l1")->draw(1, 1, 1, f, 544 - (m_titleanimation_cycle - 1600)*2.5f, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-fratelli-l2")->draw(1, 1, 1, f, 544 - (m_titleanimation_cycle - 1600)*2.5f, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1780 &&
                        m_titleanimation_cycle <= 1900) {
                    // laughting:
                    int sp = (m_titleanimation_cycle / 8) % 2;
                    if (sp == 0) m_GLTM->get("intro-fratelli-laught-r1")->draw(1, 1, 1, f, 94, 296, 0, 0, 1);
                    if (sp == 1) m_GLTM->get("intro-fratelli-laught-r2")->draw(1, 1, 1, f, 94, 296, 0, 0, 1);
                } // if
                if (m_titleanimation_cycle > 1900 &&
                        m_titleanimation_cycle <= 2000) {
                    // wlking left:
                    int sp = (m_titleanimation_cycle / 8) % 2;
                    if (sp == 0)
                        m_GLTM->get
                        ("intro-fratelli-l1")->draw(1, 1, 1, f, 94 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                    if (sp == 1)
                        m_GLTM->get
                        ("intro-fratelli-l2")->draw(1, 1, 1, f, 94 - (m_titleanimation_cycle - 1900)*2.5f, 296, 0, 0, 1);
                } // if

                if (!scissor_state)
                    glDisable(GL_SCISSOR_TEST);
                if (scissor_state)
                    glScissor(scissor_window[0], scissor_window[1], scissor_window[2], scissor_window[3]);

            }
            break;
    } // switch

} /* TheGooniesApp::titleanimation_draw */
void TGLapp::levelpackscreen_draw(void)
{
	char buffer[256];
	float replay_full_factor=0;

	glClearColor(0,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);

	TGLinterface::draw();

	// Draw scores:
	sprintf(buffer,"Total Points: %i",m_player_profile->get_points());
	TGLinterface::print_left(buffer,m_font16,230,40);
	sprintf(buffer,"Level Pack Points: %i",m_player_profile->get_points(m_current_levelpack->m_id));
	TGLinterface::print_left(buffer,m_font16,230,60);

	
	// Draw Selected ship:
	{
		int i,s;
		GLTile *t;

		for(i=-1;i<2;i++) {
			s= indexOf<int>(m_player_profile->m_ships, m_selected_ship)+i;
			if (s>=0 && s<m_player_profile->m_ships.size()) {
				t=m_GLTM->get(TGL::ship_tiles[getAt<int>(m_player_profile->m_ships, s)]);

				if (i==0) {
					t->draw(495,160,0,0,1);
				} else {
					t->draw(1,1,1,0.33f,float(495+i*48),160,0,0,0.66f);
				} // if 

			} // if
		} // for

		TGLinterface::print_center(TGL::ship_names[m_selected_ship],m_font32,495,220);
	}

	switch(m_lp_replay_mode) {
	case 0:
			replay_full_factor=0;
			break;
	case 1:
			{
				float f=0;
				f=abs(m_lp_replay_timmer)/25.0F;
				fade_in_alpha(f);
				replay_full_factor=f;
			}
			break;
	case 2: fade_in_alpha(1);
			replay_full_factor=1;
			break;
	case 3:
			{
				float f=0;
				f=abs(25-m_lp_replay_timmer)/25.0F;
				fade_in_alpha(f);
				replay_full_factor=f;
			}
			break;
	} // switch

	// Draw tutorial:
	{
		if (m_lp_tutorial_game!=0) {
			int old[4];

			glGetIntegerv(GL_VIEWPORT,old);
			glViewport(int(380*(1-replay_full_factor)),int(80*(1-replay_full_factor)), 
					   int(SCREEN_X*replay_full_factor+230*(1-replay_full_factor)),int(SCREEN_Y*replay_full_factor+172*(1-replay_full_factor)));
            glScissor(int(380*(1-replay_full_factor)),int(80*(1-replay_full_factor)),
                      int(SCREEN_X*replay_full_factor+230*(1-replay_full_factor)),int(SCREEN_Y*replay_full_factor+172*(1-replay_full_factor)));
            glEnable(GL_SCISSOR_TEST);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
			m_lp_tutorial_game->draw(1.0, m_GLTM);
            glDisable(GL_SCISSOR_TEST);
			glViewport(old[0],old[1],old[2],old[3]);
            
			{
				float f=0.6f+0.4f*float(sin(m_state_cycle*0.1));

				if (m_lp_replay_mode==0 || m_lp_replay_mode==1) TGLinterface::print_center("Press F to maximize",m_font16,320*replay_full_factor+495*(1-replay_full_factor),20*replay_full_factor+250*(1-replay_full_factor),1,1,1,f);
				if (m_lp_replay_mode==2 || m_lp_replay_mode==3) TGLinterface::print_center("Press F to minimize",m_font16,320*replay_full_factor+495*(1-replay_full_factor),20*replay_full_factor+250*(1-replay_full_factor),1,1,1,f);
			}

			{
				int i,j;
				float y;
				char buffer[128];
				char *tmp=0;

				/* Text messages in replays */ 
				{
                    for(TextNode *n:m_lp_tutorial_replay_text) {
						if (n->m_time<m_lp_tutorial_game->get_cycle()) tmp = n->m_text;
					} // while 
				}

				if (tmp!=0) {
					i=0;
					y=445*replay_full_factor+425*(1-replay_full_factor);
					while(tmp[i]!=0) {
						for(j=0;tmp[i]!=0 && tmp[i]!='/';i++,j++) buffer[j]=tmp[i];
						buffer[j]=0;
						if (tmp[i]=='/') i++;
						TGLinterface::print_center(buffer,m_font16,320*replay_full_factor+495*(1-replay_full_factor),y);
						y+=20;
					} // while

				} // if 
			} 
		} else {
			TGLinterface::print_center("No tutorial available",m_font16,320*replay_full_factor+495*(1-replay_full_factor),240*replay_full_factor+300*(1-replay_full_factor));
		} // if 
	} 

	switch(m_state_fading) {
	case 0:	
			{
				float f=0;
				f=abs(int(25-m_state_fading_cycle))/25.0F;

				fade_in_alpha(f);
			}
			break;
	case 1:
			break;
	case 2:
			{
				float f=0;
				f=abs(int(m_state_fading_cycle))/25.0F;

				fade_in_alpha(f);
			}
			break;
	} // switch
} /* TGLapp::levelpackscreen_draw */ 
Example #3
0
void F1SpiritApp::gameoptions_draw(void)
{
	GLTile *menu;
	SDL_Surface *sfc1 = 0, *sfc2 = 0;
	int w1, w2, wt;
	float sel_factor, enter_factor = 1.0F;
	int menu_y = 160;

	glClearColor(1, 1, 1, 1);
	glClear(GL_COLOR_BUFFER_BIT);

	if (menu_state < MENU_CONSTANT)
		enter_factor = menu_state / float(MENU_CONSTANT);

	if (menu_state == MENU_CONSTANT)
		enter_factor = 1.0F;

	if (menu_state > MENU_CONSTANT)
		enter_factor = ((MENU_CONSTANT * 2) - menu_state) / float(MENU_CONSTANT);

	race_game->draw(true);

	{
		if (menu_fading != 0) {
			float f = 0;
			f = abs(menu_fading_ctnt) / float(MENU_CONSTANT);
			glColor4f(0, 0, 0, (1 - f) / 2);
		} else {
			glColor4f(0, 0, 0, 0.5F);
		} 

		glNormal3f(0.0, 0.0, 1.0);

		{
			GLfloat vtx[] = {MINX, MINY, -4, 
							 MINX, MAXY, -4, 
							 MAXX, MAXY, -4,
							 MAXX, MINY, -4 };
			glEnableClientState(GL_VERTEX_ARRAY);
			glVertexPointer(3, GL_FLOAT, 0, vtx);
			glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
			glDisableClientState(GL_VERTEX_ARRAY);
		}
	}


	if (menu_options[0] != 0) {
		sel_factor = float(0.6F - 0.4F * sin(menu_selected_timmer[0] / 10.0F));

		if (menu_prev_nmenus == 2 &&
		        (menu_current_menu != 3 || menu_selected[1] != 0)
		        && menu_current_menu != 4) {
			sfc1 = draw_menu(11, menu_title[0], menu_options[0], menu_option_type[0], menu_selected[0], sel_factor, 1, font, &(menu_first_option[0]));
		} else {
			if ((menu_option_type[0][menu_selected[0]] == 11 && menu_state > MENU_CONSTANT) ||
			        (menu_state < MENU_CONSTANT && menu_options[1] != 0)) {
				sfc1 = draw_menu(11, menu_title[0], menu_options[0], menu_option_type[0], menu_selected[0], sel_factor, 1, font, &(menu_first_option[0]));
			} else {
				sfc1 = draw_menu(11, menu_title[0], menu_options[0], menu_option_type[0], menu_selected[0], sel_factor, enter_factor, font, &(menu_first_option[0]));
			} 
		} 
	} 

	if (menu_options[1] != 0) {
		sel_factor = float(0.6F - 0.4F * sin(menu_selected_timmer[1] / 10.0F));

		if (menu_redefining_key)
			sel_factor = 0;

		sfc2 = draw_menu(11, menu_title[1], menu_options[1], menu_option_type[1], menu_selected[1], sel_factor, enter_factor, font, &(menu_first_option[1]));
	} 

	w1 = w2 = wt = 0;

	if (sfc1 != 0) {
		wt += sfc1->w;
		w1 = sfc1->w;
	} 

	if (sfc2 != 0) {
		wt += sfc2->w;
		w2 = sfc2->w;
	} 

	if (sfc1 != 0 && sfc2 != 0)
		wt += 16;

	if (menu_current_menu == 23)
		menu_y = 400;

	if (sfc1 != 0) {
		menu = new GLTile(sfc1);
		menu->set_hotspot(0, 0);

		if ((menu_prev_nmenus == 2 && (menu_current_menu != 3 || menu_selected[1] != 0) && menu_current_menu != 4) ||
		        (menu_state < MENU_CONSTANT && menu_options[1] != 0)) {
			float f = float(sqrt(enter_factor));
			menu->draw((320 - wt / 2)*(f) + (menu_x[0])*(1 - f), float(menu_y), 0, 0, 1);

			if (enter_factor == 1.0)
				menu_x[0] = 320 - wt / 2;
		} else {
			if (menu_option_type[0][menu_selected[0]] == 11 && menu_state > MENU_CONSTANT) {
				float f = float(sqrt(enter_factor));

				menu->draw((320 - wt / 2)*(f) + (320 - (wt*3) / 4)*(1 - f), float(menu_y), 0, 0, 1);
				menu_x[0] = int((320 - wt / 2) * (f) + (320 - (wt * 3) / 4) * (1 - f));
			} else {
				menu->draw(float(320 - wt / 2), float(menu_y), 0, 0, 1);
				menu_x[0] = 320 - wt / 2;
			} 
		} 

		delete menu;

		//  SDL_FreeSurface(sfc1);
	} 

	if (sfc2 != 0) {
		menu = new GLTile(sfc2);
		menu->set_hotspot(sfc2->w, 0);
		menu->draw(float(320 + wt / 2), float(menu_y), 0, 0, 1);
		delete menu;
		//  SDL_FreeSurface(sfc2);
	} 

}