/*This shows how you can make a
background very easily.
*/


<1>/* Graphics Not Rendered in HTML */

<2>/* Graphics Not Rendered in HTML */

CDC *background;

#define BALL_TIME   0.2
#define FANS_NUM    10
I64  x[FANS_NUM], y[FANS_NUM];
Bool hit[FANS_NUM];
F64  theta[FANS_NUM], ball_t;
I64  target_x, target_y, pitcher_x, pitcher_y;

U0 DrawIt(CTask *,CDC *dc)
{
    I64 i, *r;
    F64 xx, yy, t0;

    background->flags |= DCF_NO_TRANSPARENTS;
    GrBlot(dc, 0, 0, background);
    for (i = 0; i < FANS_NUM; i++)
        Sprite3ZB(dc, x[i], y[i], 0, <fan>, theta[i]);
    if (ball_t)
    {
        t0 = (tS - ball_t) / BALL_TIME;
        if (t0 > 1.0)
            ball_t = 0;
        else
        {
            xx = t0 * target_x + (1.0 - t0) * pitcher_x;
            yy = t0 * target_y + (1.0 - t0) * pitcher_y;
            xx /= 1.5 - t0;
            yy /= 1.5 - t0;
            r = Mat4x4New(dc->r, dc->mem_task);
            Mat4x4Scale(r, 1.5 - t0);
            Free(dc->r);
            DCMat4x4Set(dc,r);
            dc->flags |= DCF_TRANSFORMATION;
            Sprite3ZB(dc, xx, yy, 0, <ball>, t0);
        }
    }
    dc->color = RED;
    GrPrint(dc, FONT_WIDTH, FONT_HEIGHT, "Peg the Fans");
}

U0 AnimateTask(I64)
{
    I64 i;
    F64 xx, yy, t0;

    while (TRUE)
    {
        if (ball_t)
        {
            t0 = (tS - ball_t) / BALL_TIME;
            xx = t0 * target_x + (1.0 - t0) * pitcher_x;
            yy = t0 * target_y + (1.0 - t0) * pitcher_y;
        }
        for (i = 0; i < FANS_NUM; i++)
        {
            if (ball_t)
                if (Sqr(x[i] - xx) + Sqr(y[i] - yy) < 200)
                {
                    hit[i] = TRUE;
                    theta[i] = -pi / 2;
                }
            if (!hit[i])
            {
                x[i] += SignI64(RandI16);
                y[i] += SignI64(RandI16);
                theta[i] += Sign(RandI16) / 25.0;
                if (!(0 <= x[i] < GR_WIDTH))
                    x[i] = GR_WIDTH / 2;

                if (!(10 <= y[i] < 100))
                    y[i] = 50;

                if (!(-0.75 <= theta[i] < 0.75))
                    theta[i] = 0;
            }
        }
        Sleep(10);
    }
}

U0 Init()
{
    I64 i;

    for (i = 0; i < FANS_NUM; i++)
    {
        x[i] = RandU16 % GR_WIDTH;
        y[i] = 50;
        theta[i] = 0;
        hit[i] = FALSE;
    }
}

U0 Stadium()
{
    I64 message_code, arg1, arg2, ch = 0;

    SettingsPush; //See SettingsPush
    Cd(__DIR__);
    Fs->win_inhibit |= WIG_DBL_CLICK;

    MenuPush(   "File {"
                "  Abort(,CH_SHIFT_ESC);"
                "  Exit(,CH_ESC);"
                "}"
                "Play {"
                "  Restart(,'\n');"
                "}"
                );
    AutoComplete;
    WinBorder;
    WinMax;
    DocCursor;
    DocClear;
    Init;
    Fs->animate_task = Spawn(&AnimateTask, NULL, "Animate",, Fs);

    background = GRRead("StadiumBG");
    Fs->draw_it = &DrawIt;
    do
    {
        message_code = MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN + 1 << MESSAGE_MS_L_DOWN);
        if (message_code == MESSAGE_KEY_DOWN)
        {
            ch = arg1;
            if (ch == '\n')
                Init;
        }
        else
        {
            target_x = arg1;
            target_y = arg2;
            pitcher_x = GR_WIDTH / 2;
            pitcher_y = GR_HEIGHT;
            ball_t = tS;
        }
    }
    while (ch != CH_SHIFT_ESC && ch != CH_ESC);

    MessageGet(,, 1 << MESSAGE_KEY_UP);

    DCDel(background);
    SettingsPop;
    MenuPop;
}

Stadium;