#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;
        QueueInsert(c, Fs->last_ctrl);
        TaskDerivedValsUpdate;

        return c;
}

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