added controls
This commit is contained in:
parent
13254ba705
commit
a224088372
34
src/main.cpp
34
src/main.cpp
|
@ -43,16 +43,48 @@ int main()
|
||||||
for(int y = 0; y < reactor.height; y++)
|
for(int y = 0; y < reactor.height; y++)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << *reactor.rods[x][y];
|
sim::reactor::rod* r = reactor.rods[x][y];
|
||||||
|
ss << *r;
|
||||||
|
|
||||||
int px = X + (H - 1) * y;
|
int px = X + (H - 1) * y;
|
||||||
int py = Y + (W - 1) * x;
|
int py = Y + (W - 1) * x;
|
||||||
|
|
||||||
display::draw_text(px + 1, py + 2, ss.str().c_str());
|
display::draw_text(px + 1, py + 2, ss.str().c_str());
|
||||||
display::draw_box(px, py, H, W);
|
display::draw_box(px, py, H, W);
|
||||||
|
|
||||||
|
if(r->should_select() && x == reactor.cursor_x && y == reactor.cursor_y)
|
||||||
|
{
|
||||||
|
display::draw_text(px + 1, py + W - 5, "[ ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(r->is_selected())
|
||||||
|
{
|
||||||
|
display::draw_text(px + 1, py + W - 4, "#");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
|
int c = getch();
|
||||||
|
|
||||||
|
switch(c)
|
||||||
|
{
|
||||||
|
case KEY_LEFT:
|
||||||
|
reactor.move_cursor(-1);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
reactor.move_cursor(1);
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
reactor.update_selected(0.001);
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
reactor.update_selected(-0.001);
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
reactor.toggle_selected();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -47,3 +47,11 @@ void control_rod::update(double secs)
|
||||||
absorbed += r_fast + r_slow;
|
absorbed += r_fast + r_slow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void control_rod::update_selected(double a)
|
||||||
|
{
|
||||||
|
inserted += a;
|
||||||
|
|
||||||
|
if(inserted > 1) inserted = 1;
|
||||||
|
if(inserted < 0) inserted = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@ public:
|
||||||
|
|
||||||
virtual void update(double secs);
|
virtual void update(double secs);
|
||||||
void set_reactivity(double a);
|
void set_reactivity(double a);
|
||||||
|
|
||||||
|
virtual bool should_select() const { return true; }
|
||||||
|
virtual void update_selected(double a);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ void pipe::update(double secs)
|
||||||
{
|
{
|
||||||
update_rod();
|
update_rod();
|
||||||
|
|
||||||
double v = vals[val_t::N_FAST] * 0.25;
|
double v = vals[val_t::N_FAST];
|
||||||
vals[val_t::N_FAST] -= v;
|
vals[val_t::N_FAST] -= v;
|
||||||
vals[val_t::N_SLOW] += v;
|
vals[val_t::N_SLOW] += v;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,9 @@ struct reactor
|
||||||
|
|
||||||
std::array<std::array<rod*, H>, W> rods;
|
std::array<std::array<rod*, H>, W> rods;
|
||||||
|
|
||||||
|
int cursor_x = 0;
|
||||||
|
int cursor_y = 0;
|
||||||
|
|
||||||
reactor(std::array<rod*, W * H> rods)
|
reactor(std::array<rod*, W * H> rods)
|
||||||
{
|
{
|
||||||
for(int y = 0; y < H; y++)
|
for(int y = 0; y < H; y++)
|
||||||
|
@ -53,6 +56,56 @@ struct reactor
|
||||||
rods[x][y]->update(secs);
|
rods[x][y]->update(secs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void update_selected(double v)
|
||||||
|
{
|
||||||
|
for(int y = 0; y < H; y++)
|
||||||
|
for(int x = 0; x < W; x++)
|
||||||
|
if(rods[x][y]->is_selected())
|
||||||
|
{
|
||||||
|
rods[x][y]->update_selected(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void move_cursor(int d)
|
||||||
|
{
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
cursor_x += d;
|
||||||
|
|
||||||
|
while(cursor_x >= W)
|
||||||
|
{
|
||||||
|
cursor_x -= W;
|
||||||
|
cursor_y += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(cursor_x < 0)
|
||||||
|
{
|
||||||
|
cursor_x += W;
|
||||||
|
cursor_y -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor_y %= H;
|
||||||
|
|
||||||
|
if(cursor_y < 0)
|
||||||
|
{
|
||||||
|
cursor_y += H;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rods[cursor_x][cursor_y]->should_select())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggle_selected()
|
||||||
|
{
|
||||||
|
if(rods[cursor_x][cursor_y]->should_select())
|
||||||
|
{
|
||||||
|
rods[cursor_x][cursor_y]->toggle_selected();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,17 @@ public:
|
||||||
virtual double extract(val_t type, double k, double o);
|
virtual double extract(val_t type, double k, double o);
|
||||||
virtual double get(val_t type) const;
|
virtual double get(val_t type) const;
|
||||||
|
|
||||||
|
virtual bool should_select() const { return false; }
|
||||||
|
virtual void update_selected(double a) { }
|
||||||
|
|
||||||
|
constexpr void toggle_selected() { selected = !selected; }
|
||||||
|
constexpr bool is_selected() { return selected; }
|
||||||
|
|
||||||
friend std::ostream& operator<<(std::ostream& o, const rod& r)
|
friend std::ostream& operator<<(std::ostream& o, const rod& r)
|
||||||
{
|
{
|
||||||
if(!r.should_display()) return o;
|
if(!r.should_display()) return o;
|
||||||
|
|
||||||
o << "Name: " << r.get_name() << "\n";
|
o << r.get_name() << "\n";
|
||||||
r.display(o);
|
r.display(o);
|
||||||
o << "Heat: " << r.get(val_t::HEAT) << "\n";
|
o << "Heat: " << r.get(val_t::HEAT) << "\n";
|
||||||
o << "Fast: " << r.get(val_t::N_FAST) << "\n";
|
o << "Fast: " << r.get(val_t::N_FAST) << "\n";
|
||||||
|
@ -42,6 +48,7 @@ protected:
|
||||||
|
|
||||||
double vals_in[VAL_N] = {0};
|
double vals_in[VAL_N] = {0};
|
||||||
double vals[VAL_N] = {0};
|
double vals[VAL_N] = {0};
|
||||||
|
bool selected = false;
|
||||||
|
|
||||||
virtual void display(std::ostream& o) const { };
|
virtual void display(std::ostream& o) const { };
|
||||||
virtual double get_k(val_t type) const { return 0; }
|
virtual double get_k(val_t type) const { return 0; }
|
||||||
|
|
Loading…
Reference in New Issue