#define LASER_TEMP_MAX          30.0
#define LASER_THRESHOLD_TEMP    10.0
#define MASS_TEMP_MAX           5.0

class CtrlPanelState
{
  I64 shot_radius,fuse_time;
  F64 laser_temperature;
  Bool spacewalk;
} ctrl_panel;

#define CTRL_PANEL_SPACING 33
#define CTRL_PANEL_RANGE   30
#define CTRL_PANEL_BORDER  2
#define CTRL_PANEL_BTTN_SIZE    12

#define TMP_Y   (+2)

U0 DrawCtrlPanelCtrl(CDC *dc,CCtrl *c)
{
  CtrlPanelState *s=c->state;
  F64 d,d_range;

  dc->color=LTRED;
  GrRect(dc, c->left,c->top,CTRL_PANEL_SPACING*3+2,
        CTRL_PANEL_SPACING*2+CTRL_PANEL_RANGE+CTRL_PANEL_BTTN_SIZE);
  dc->color=DKGRAY;
  GrRect(dc, c->left+CTRL_PANEL_BORDER,c->top+CTRL_PANEL_BORDER,
        CTRL_PANEL_SPACING*3+2-2*CTRL_PANEL_BORDER,
        CTRL_PANEL_SPACING*2+CTRL_PANEL_RANGE+CTRL_PANEL_BTTN_SIZE
        -2*CTRL_PANEL_BORDER);
  dc->color=BLACK;
  GrLine(dc,c->left+CTRL_PANEL_SPACING,(c->top+CTRL_PANEL_BTTN_SIZE)+
        CTRL_PANEL_SPACING,c->left+CTRL_PANEL_SPACING,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+CTRL_PANEL_RANGE-1);
  GrLine(dc,c->left+2*CTRL_PANEL_SPACING+1,(c->top+CTRL_PANEL_BTTN_SIZE)+
        CTRL_PANEL_SPACING,c->left+2*CTRL_PANEL_SPACING+1,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+CTRL_PANEL_RANGE-1);

  dc->color=BLACK;
  GrRect(dc,(c->left+c->right+1)/2-9*FONT_WIDTH/2-3,
        c->top+CTRL_PANEL_BORDER+(CTRL_PANEL_SPACING-FONT_HEIGHT)/2,
        9*FONT_WIDTH+6,FONT_HEIGHT+6);

  if (s->spacewalk)
    dc->color=YELLOW;
  else
    dc->color=DKGRAY;
  GrRect(dc,(c->left+c->right+1)/2-9*FONT_WIDTH/2-2,
        c->top+CTRL_PANEL_BORDER+1+(CTRL_PANEL_SPACING-FONT_HEIGHT)/2,
        9*FONT_WIDTH+4,FONT_HEIGHT+4);

  dc->color=RED;
  GrPrint(dc,(c->left+c->right+1)/2-9*FONT_WIDTH/2,
        c->top+CTRL_PANEL_BORDER+3+
        (CTRL_PANEL_SPACING-FONT_HEIGHT)/2,"SpaceWalk");
  GrPrint(dc,c->left+CTRL_PANEL_SPACING-4*FONT_WIDTH/2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+
        CTRL_PANEL_SPACING-FONT_HEIGHT-2,"Size");
  GrPrint(dc,c->left+2*CTRL_PANEL_SPACING+1-4*FONT_WIDTH/2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+
        CTRL_PANEL_SPACING-FONT_HEIGHT-2,"Fuse");
  dc->color=LTRED;
  GrPrint(dc,c->left+CTRL_PANEL_SPACING-FONT_WIDTH/2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+CTRL_PANEL_RANGE+3,
        "%d",s->shot_radius*10/CTRL_PANEL_RANGE);
  GrPrint(dc,c->left+2*CTRL_PANEL_SPACING+1-FONT_WIDTH/2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+CTRL_PANEL_RANGE+3,
        "%d",s->fuse_time*10/CTRL_PANEL_RANGE);
  GrRect(dc,c->left+CTRL_PANEL_SPACING-3,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+
        CTRL_PANEL_RANGE-1-s->shot_radius-2 ,7,5);
  GrRect(dc,c->left+2*CTRL_PANEL_SPACING+1-3,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+
        CTRL_PANEL_RANGE-1-s->fuse_time-2,7,5);
  dc->color=YELLOW;
  GrRect(dc,c->left+CTRL_PANEL_SPACING-2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+
        CTRL_PANEL_RANGE-1-s->shot_radius-1 ,5,3);
  GrRect(dc,c->left+2*CTRL_PANEL_SPACING+1-2,
        (c->top+CTRL_PANEL_BTTN_SIZE)+CTRL_PANEL_SPACING+
        CTRL_PANEL_RANGE-1-s->fuse_time-1,5,3);

  d_range=c->right-c->left-5-5;
  d=s->laser_temperature*d_range/LASER_TEMP_MAX;
  dc->color=BLACK;
  GrRect(dc,c->left+5-1,c->bottom+TMP_Y-2,d_range+2,2+1+1);
  if (d>1.0) {
    dc->color=GREEN;
    GrRect(dc,c->left+5,c->bottom+TMP_Y-1,Min(d,d_range/3),2);
    if (d>=d_range/3) {
      dc->color=YELLOW;
      GrRect(dc,c->left+5+d_range/3,c->bottom+TMP_Y-1,
            Min(d,2*d_range/3)-d_range/3,2);
      if (d>=2*d_range/3) {
        dc->color=RED;
        GrRect(dc,c->left+5+2*d_range/3,c->bottom+TMP_Y-1,d-2*d_range/3,2);
      }
    }
  }
}

U0 UpdateDerivedCtrlPanelCtrl(CCtrl *c)
{
  CtrlPanelState *s=c->state;
  c->left=c->win_task->pix_width-(CTRL_PANEL_SPACING*3+2);
  c->right=c->left+CTRL_PANEL_SPACING*3+2;
  c->top=c->win_task->pix_height-(CTRL_PANEL_SPACING*2+
        CTRL_PANEL_RANGE+CTRL_PANEL_BTTN_SIZE);
  c->bottom=c->top+CTRL_PANEL_SPACING*2+CTRL_PANEL_RANGE;

  s->shot_radius=ClampI64(s->shot_radius,0,CTRL_PANEL_RANGE-1);
  s->fuse_time=ClampI64(s->fuse_time,0,CTRL_PANEL_RANGE-1);
}

U0 LeftClickCtrlPanel(CCtrl *c,I64 x,I64 y,Bool)
{
  CtrlPanelState *s=c->state;
  if (y<c->top+CTRL_PANEL_BORDER+(CTRL_PANEL_SPACING-FONT_HEIGHT)/2+
        FONT_HEIGHT+6)
    s->spacewalk=TRUE;
  else {
    if (x<(c->right+c->left)/2)
      s->shot_radius=CTRL_PANEL_RANGE-1
            -(y-(c->top+CTRL_PANEL_SPACING+CTRL_PANEL_BTTN_SIZE));
    else
      s->fuse_time=CTRL_PANEL_RANGE-1
            -(y-(c->top+CTRL_PANEL_SPACING+CTRL_PANEL_BTTN_SIZE));
  }
  if (c->update_derived_vals)
    (*c->update_derived_vals)(c);
}

CCtrl *CtrlPanelNew()
{
  CCtrl *c=CAlloc(sizeof(CCtrl));
  MemSet(&ctrl_panel,0,sizeof(ctrl_panel));
  c->win_task=Fs;
  c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_MS;
  c->type=CTRLT_GENERIC;
  c->state=&ctrl_panel;
  c->draw_it=&DrawCtrlPanelCtrl;
  c->left_click=&LeftClickCtrlPanel;
  c->update_derived_vals=&UpdateDerivedCtrlPanelCtrl;
  QueIns(c,Fs->last_ctrl);
  TaskDerivedValsUpdate;
  return c;
}

U0 CtrlPanelDel(CCtrl *c)
{
  QueRem(c);
  Free(c);
}