Index: src/gui.d ================================================================== --- src/gui.d +++ src/gui.d @@ -131,24 +131,30 @@ void setup_keyhandling() { noMessageFilter(); this.keyDown ~= &my_keydown; } + + void do_manual_command(char c) + { + solver.force(c); + fn(c); + } void my_keydown(Control c, KeyEventArgs ev) { switch(ev.keyCode) { - case Keys.DOWN: fn('D'); break; - case Keys.UP: fn('U'); break; - case Keys.LEFT: fn('L'); break; - case Keys.RIGHT: fn('R'); break; - case Keys.W: fn('W'); break; - case Keys.S: fn('S'); break; - case Keys.A: fn('A'); break; + case Keys.DOWN: do_manual_command('D'); break; + case Keys.UP: do_manual_command('U'); break; + case Keys.LEFT: do_manual_command('L'); break; + case Keys.RIGHT: do_manual_command('R'); break; + case Keys.W: do_manual_command('W'); break; + case Keys.S: do_manual_command('S'); break; + case Keys.A: do_manual_command('A'); break; case Keys.G: fn(solver.single_step()); break; default: break; } } Solver solver; } Index: src/solver.d ================================================================== --- src/solver.d +++ src/solver.d @@ -3,10 +3,11 @@ class Solver_0 { this(const(Game) g) {} char single_step() { return 'W'; } + void force(char c) {} } class Solver_1 { int wait_count = 0; @@ -24,10 +25,15 @@ Tuple!(string,int) de = death_move(g); char c = act(g, de[0], de[1]); g.command(c); return c; } + + void force(char c) + { + g.command(c); + } Tuple!(string,int) death_move(const(Game) g) { string death; int choice = 0;