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

U0 UnitDraw(CDC *dc, Unit *tmpu, I64 x, I64 y, F64 f)
{
    x += x0;
    y += y0;
    if (tmpu->infantry)
        Sprite3(dc, x, y, 0, tmpu->img);
    else
        Sprite3ZB(dc, x, y, 0, tmpu->img, f);
    if (phase & ~1 == PHASE_INDIRECT && tmpu->indirect_fire && !tmpu->fired && tmpu->player == cur_player)
    {
        dc->thick = 2;
        if (cur_player)
            dc->color = PURPLE;
        else
            dc->color = CYAN;
        GrCircle3(dc, x, y, 0, 20 * Saw(4 * tS, 2.0));
        GrCircle3(dc, x, y, 0, 20 * Saw(4 * tS + 1.0, 2.0));
        dc->thick = 1;
    }
}

U0 UnitsDraw(CDC *dc)
{
    I64   i, j;
    F64   x, y;
    Unit *tmpu;

    for (j = 0; j < 2; j++)
    {
        for (i = 0; i < UNITS_NUM; i++)
        {
            tmpu = &units[j][i];
            if (tmpu == target_unit)
            {
                if (target_hit)
                    dc->color = RED;
                else
                    dc->color = GREEN;
            }
            else
            {
                if (j)
                    dc->color = LTPURPLE;
                else
                    dc->color = LTCYAN;
            }
            if (tmpu->life > 0 && Bt(&tmpu->vis[view_player], 0) && tmpu != moving_unit)
            {
                RowCol2XY(&x, &y, tmpu->row, tmpu->col);
                if (    phase & ~1 == PHASE_MOVE && tmpu->remaining_movement ||
                        (phase & ~1 == PHASE_INDIRECT && tmpu->indirect_fire || phase & ~1 == PHASE_DIRECT &&
                        !tmpu->indirect_fire) &&
                        !tmpu->fired || Blink(5))
                    UnitDraw(dc, tmpu, x, y, tmpu->facing * 60.0 * pi / 180.0);
            }
        }
    }
}

U0 DrawIt(CTask *task, CDC *dc)
{
    F64              x, y;
    I64              i, j, r, c;
    U8               buf[STR_LEN];
    IndirectOrders  *tmpi;

    //Erase text beneath.
    dc->color = WHITE;
    GrRect(dc, -task->scroll_x, -task->scroll_y, dc->width, dc->height);

    map_dc->flags |= DCF_NO_TRANSPARENTS;
    GrBlot(dc, x0, y0, map_dc);

    i = mouse.pos.x - task->pix_left - task->scroll_x;
    j = mouse.pos.y - task->pix_top  - task->scroll_y;
    if (CursorInWin(task, i, j))
    {
        i -= x0;
        j -= y0;
        CursorUpdate(task, i, j);
    }
    RowCol2XY(&x, &y, cursor_row, cursor_col);

    //Roads require multiple cursor fills
    dc->color = YELLOW;
    c=terrain[cursor_row][cursor_col];
    for (i=-(HEX_SIDE + DCOS) / 2;i <= (HEX_SIDE + DCOS) / 2; i++)
    {
        if (GrPeek(dc, x + i + x0, y + y0) == c)
            GrFloodFill(dc, x + i + x0, y + y0);
        for (j = -HEX_SIDE / 2; j <= HEX_SIDE / 2; j++)
            if (GrPeek(dc, x + j + x0, y + i + y0) == c)
                GrFloodFill(dc, x + j + x0, y + i + y0);
    }

    UnitsDraw(dc);
    if (firing)
    {
        dc->color = BLACK;
        GrCircle(dc, fire_x + x0, fire_y + y0, 2);
    }
    if (indirect_explosion)
    {
        for (i = 0; i < 7; i++)
        {
            if (indirect_row & 1)
                c = indirect_col + col_offsets_odd[i];
            else
                c = indirect_col + col_offsets_even[i];
            r = indirect_row + row_offsets[i];
            if (0 <= r < map_rows && 0 <= c < map_cols)
            {
                RowCol2XY(&x, &y, r, c);
                for (j = 0; j < 10; j++)
                {
                    if (j & 1)
                        dc->color = LTRED;
                    else
                        dc->color = YELLOW;
                    GrCircle(dc, x + RandU16 % HEX_SIDE - HEX_SIDE / 2 + x0, 
                                 y + RandU16 % HEX_SIDE - HEX_SIDE / 2 + y0, 2);
                }
            }
        }
    }
    if (moving_unit && moving_unit->vis[view_player])
    {
        dc->color = YELLOW;
        UnitDraw(dc, moving_unit, move_x, move_y, move_facing);
    }
    ProgressBarsReset;
    if (moving_unit)
    {
        if (mouse.pos.y < GR_HEIGHT / 2)
        {
            progress4_max = moving_unit->movement;
            progress4 = moving_unit->remaining_movement;
        }
        else
        {
            progress1_max = moving_unit->movement;
            progress1 = moving_unit->remaining_movement;
        }
    }
    if (fire_radius)
    {
        dc->color = YELLOW;
        GrCircle(dc, fire_radius_x + x0, fire_radius_y + y0, fire_radius - 1);
        GrCircle(dc, fire_radius_x + x0, fire_radius_y + y0, fire_radius + 1);
        dc->color = RED;
        GrCircle(dc, fire_radius_x + x0, fire_radius_y + y0, fire_radius);
    }
    if (Blink(10))
    {
        tmpi = indirect_head.next;
        while (tmpi != &indirect_head)
        {
            if (tmpi->attacker->player == view_player)
            {
                RowCol2XY(&x, &y, tmpi->row, tmpi->col);
                Sprite3(dc, x + x0, y + y0, 0, <1>);
            }
            tmpi = tmpi->next;
        }
    }
    if (Bt(kbd.down_bitmap, SC_SHIFT))
    {
        if (show_vis_row != cursor_row || show_vis_col != cursor_col)
        {
            show_vis_row = cursor_row;
            show_vis_col = cursor_col;
            VisRecalcMap(show_vis_row, show_vis_col);
        }

        dc->color = LTGRAY;
        for (j = 0; j < map_rows; j++)
            for (i = 0; i < map_cols; i++)
                if (!vis_map[j][i])
                {
                    RowCol2XY(&x, &y, j, i);
                    GrLine(dc, x - 6 + x0,  y - 6 + y0, x + 6 + x0, y + 6 + y0);
                    GrLine(dc, x + 6 + x0,  y - 6 + y0, x - 6 + x0, y + 6 + y0);
                    GrLine(dc, x + x0,      y - 6 + y0, x + x0,     y + 6 + y0);
                    GrLine(dc, x + 6 + x0,  y + y0,     x - 6 + x0, y + y0);
                }
    }
    if (i = StrLen(message_buf) * FONT_WIDTH)
    {
        dc->color = BLACK;
        GrRect(dc, (task->pix_width - i) >> 1 - 10 - task->scroll_x, 
                    (task->pix_height - FONT_HEIGHT) >> 1 - 10 - task->scroll_y, 
                    i + 20, FONT_HEIGHT + 20);

        dc->color = YELLOW;
        GrRect(dc, (task->pix_width-i) >> 1 - 7 - task->scroll_x, 
                    (task->pix_height-FONT_HEIGHT) >> 1 - 7 - task->scroll_y, 
                    i + 14, FONT_HEIGHT + 14);

        dc->color = RED;
        GrPrint(dc, (task->pix_width - i) >> 1 - task->scroll_x, 
                    (task->pix_height - FONT_HEIGHT) >> 1 - task->scroll_y, 
                    message_buf);
        if (message_off_timeout)
        {
            if (message_off_timeout - counts.jiffies < 3 * JIFFY_FREQ / 2 * animation_delay)
                Sound;
            if (counts.jiffies > message_off_timeout)
                *message_buf = 0;
        }
    }

    dc->color = WHITE;
    GrRect(dc, -task->scroll_x, -task->scroll_y, (13 + 7 + 10 + 10) * FONT_WIDTH, FONT_HEIGHT);

    if (phase&~1 == PHASE_INDIRECT)
        StrPrint(buf, "Turn:%2d Artillery", turn);
    else if (phase & ~1 == PHASE_MOVE)
        StrPrint(buf, "Turn:%2d Move", turn);
    else
        StrPrint(buf, "Turn:%2d Fire", turn);
    dc->color = BLACK;
    GrPrint(dc, -task->scroll_x, -task->scroll_y, buf);

    StrPrint(buf, "%3d Units", alive_count[0]);
    if (cur_player || Blink)
        dc->color = CYAN;
    else
        dc->color = LTCYAN;
    GrPrint(dc, -task->scroll_x + (13 + 7) * FONT_WIDTH, -task->scroll_y, buf);

    StrPrint(buf, "%3d Units", alive_count[1]);
    if (!cur_player || Blink)
        dc->color = PURPLE;
    else
        dc->color = LTPURPLE;
    GrPrint(dc, -task->scroll_x + (13 + 7 + 10) * FONT_WIDTH, -task->scroll_y, buf);
}