<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=ms.pos.x-task->pix_left-task->scroll_x;
  j=ms.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);
  }
  ProgressBarsRst;
  if (moving_unit) {
    if (ms.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(msg_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,
          msg_buf);
    if (msg_off_timeout) {
      if (msg_off_timeout-cnts.jiffies<3*JIFFY_FREQ/2*animation_delay)
        Snd;
      if (cnts.jiffies>msg_off_timeout)
        *msg_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_cnt[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_cnt[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);
}