/*
* BB: The portable demo
*
* (C) 1997 by AA-group (e-mail: aa@horac.ta.jcu.cz)
*
* 3rd August 1997
* version: 1.2 [final3]
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public Licences as by published
* by the Free Software Foundation; either version 2; or (at your option)
* any later version
*
* This program is distributed in the hope that it will entertaining,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Publis License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <math.h>
#include <string.h>
#include "bb.h"
#define ETIME 650000
#define RATE 60
static char *mesg;
static char *lastmesg;
static char pos, lastpos;
#define MAXPOS (ETIME1)
#define STATE (TIME-starttime)
#define N 10000
#define ETIME1 2500000
void blur(int n)
{
unsigned char *pos = context->imagebuffer, *posend = pos + aa_imgwidth(context) * aa_imgheight(context);
while (pos < posend) {
(*pos) >>= n;
pos++;
}
}
void dvojprujezd(int starttime, char *text2, char *text1)
{
int pos = (getwidth(2) * strlen(text1) + 1);
centerprint(-pos / 2 + (aa_imgwidth(context) + pos * 1.2) * STATE / (endtime - starttime), 2 * aa_imgheight(context) / 3, 2, 255, text1, 0);
pos = (getwidth(2) * strlen(text2) + 1);
centerprint(aa_imgwidth(context) + pos / 2 - (aa_imgwidth(context) + pos * 1.2) * STATE / (endtime - starttime), aa_imgheight(context) / 3, 2, 255, text2, 0);
}
static void dvojprujezd2(int starttime, char *text1, char *text2)
{
int pos = (getwidth(2) * strlen(text1) + 1);
centerprint(-pos / 2 + (aa_imgwidth(context) + pos * 1.2) * STATE / (endtime - starttime), aa_imgheight(context) / 3, 2, 255, text1, 0);
pos = (getwidth(2) * strlen(text2) + 1);
centerprint(aa_imgwidth(context) + pos / 2 - (aa_imgwidth(context) + pos * 1.2) * STATE / (endtime - starttime), 2 * aa_imgheight(context) / 3, 2, 255, text2, 0);
}
void message(char *text, int starttime)
{
if (STATE > 0 && STATE < MAXPOS) {
double pp = STATE * M_PI / MAXPOS * 2;
double width = (1 + cos(pp)) * 5 + 2;
int pos = aa_imgheight(context) - aa_imgheight(context) * STATE / MAXPOS;
if (width <= 0)
return;
centerprint(aa_imgwidth(context) / 2, pos, width, sin(pp / 2) * 255, text, 0);
}
}
static float xpos, xpos1, f, t;
#define TTIME1 80
#define TTIME 100
#define G 0.02
#define AMP 40
void ctrllepic(int i)
{
for (; i; i--) {
t++;
f += G,
f *= 0.96;
if (t < TTIME) {
if (t < TTIME1)
f -= xpos / (double) AMP;
else
f -= xpos / (double) AMP / 2;
xpos += f;
}
else {
xpos1 += f;
xpos += G;
}
if (xpos < 0)
xpos = 0, f = -f;
}
}
void drawlepic(char *mesg)
{
print(0, xpos1 * aa_imgheight(context), aa_imgwidth(context) / (double) strlen(mesg), aa_imgheight(context) * xpos, font, 255, mesg);
}
void drawzoomer(char *mesg, int starttime, int pos)
{
float width = 1000000.0 / (STATE);
if (width > 1.0) {
int color = (width - 1) * 255;
if (color > 255)
color = 255;
centerprint(aa_imgwidth(context) / 2, pos * aa_imgheight(context) / 6, width, color, mesg, 0);
}
}
#define ETIME2 1000000
void drawlevotoc(char *mesg, char *mesg1, int starttime)
{
if (STATE < ETIME2 && STATE > 0) {
print(0, 0, aa_imgwidth(context) / (double) strlen(mesg) * ((float) STATE / ETIME2), aa_imgheight(context), font, 255, mesg);
print(aa_imgwidth(context) * ((float) STATE / ETIME2), 0, aa_imgwidth(context) / (double) strlen(mesg1) * (1 - (float) STATE / ETIME2), aa_imgheight(context), font, 255, mesg1);
}
if (STATE > ETIME2)
print(0, 0, aa_imgwidth(context) / (double) strlen(mesg), aa_imgheight(context), font, 255, mesg);
}
void drawpravotoc(char *mesg, char *mesg1, int starttime)
{
if (STATE < ETIME2 && STATE > 0) {
print(0, 0, aa_imgwidth(context) / (double) strlen(mesg1) * (1 - (float) STATE / ETIME2), aa_imgheight(context), font, 255, mesg1);
print(aa_imgwidth(context) * (1 - (float) STATE / ETIME2), 0, aa_imgwidth(context) / (double) strlen(mesg) * ((float) STATE / ETIME2), aa_imgheight(context), font, 255, mesg);
}
if (STATE > ETIME2)
print(0, 0, aa_imgwidth(context) / (double) strlen(mesg), aa_imgheight(context), font, 255, mesg);
}
void drawhorotoc(char *mesg, char *mesg1, int starttime)
{
if (STATE < ETIME2 && STATE > 0) {
print(0, 0, aa_imgwidth(context) / strlen(mesg), aa_imgheight(context) * ((float) STATE / ETIME2), font, 255, mesg);
print(0, aa_imgheight(context) * ((float) STATE / ETIME2), aa_imgwidth(context) / strlen(mesg1), aa_imgheight(context) * (1 - (float) STATE / ETIME2), font, 255, mesg1);
}
if (STATE > ETIME2)
print(0, 0, aa_imgwidth(context) / strlen(mesg), aa_imgheight(context), font, 255, mesg);
}
#define LTIME 200000
void drawprujezd(char *mesg, int starttime)
{
double height = aa_imgheight(context) / 3 + aa_imgheight(context) / 4 * cos(STATE / (double) LTIME);
double width = (double) aa_imgwidth(context) * 0.75 * 2.0 / 3.0 / 3;
int pos = aa_imgwidth(context) - width * STATE / LTIME;
print(pos + height, (aa_imgheight(context) - height) / 2, width, height, font, 255, mesg);
}
void initlepic()
{
t = 0;
f = 0;
xpos = 0;
xpos1 = 0;
}
static void messaguj()
{
clrscr();
drawzoomer(lastmesg, starttime - ETIME, lastpos);
drawzoomer(mesg, starttime, pos);
}
static void mydraw()
{
clrscr();
dvojprujezd2(starttime, "Greetings", "To");
/*drawpravotoc(mesg, lastmesg, starttime); */
}
void scene2(void)
{
char *pokec[] =
{
"Future",
"Crew",
"Triton",
"Cascada",
"Complex",
"Pascal",
"Titans",
"Xography",
"Sonic PC",
"Scrymag",
"...",
"Microsoft",
"",
"!?!",
};
int i;
params->randomval = 0;
drawptr = mydraw;
timestuff(60, NULL, draw, 2.75 * 1000000);
drawptr = messaguj;
mesg = "";
pos = 2;
lastpos = 1;
for (i = 0; i < sizeof(pokec) / sizeof(char *); i++) {
lastpos = pos;
pos++;
if (pos > 4)
pos = 2;
lastmesg = mesg;
mesg = pokec[i];
if (i == sizeof(pokec) / sizeof(char *) - 1)
timestuff(0, NULL, draw, 3 * ETIME);
else
timestuff(0, NULL, draw, ETIME);
}
}