Index: src/solver.d ================================================================== --- src/solver.d +++ src/solver.d @@ -303,10 +303,11 @@ } class Solver_2(Solver) { string plan; + bool plan_broken = true; Game g; this(in Game g) { this.g = g.clone(); @@ -327,10 +328,11 @@ log.length--; return tuple(s, log); } void make_plan(in Game g) { + plan_broken = false; Tuple!(Solver,string) x = run_sub_solver(g); plan = x[1]; if(x[0].g.cleared) return; modify_plan(g, x[0].g.score); @@ -362,10 +364,12 @@ Tuple!(Solver, string) x = run_sub_solver(gg); return tuple(x[1], x[0].g.score); } char single_step() { + if(plan_broken) + make_plan(g); if(plan.empty) return 'A'; char c = plan[0]; plan = plan[1..$]; g.command(c); @@ -372,11 +376,16 @@ return c; } void force(char c) { g.command(c); - make_plan(g); + if(plan.length==0 || plan[0]!=c) { + plan = ""; + plan_broken = true; + } + else + plan = plan[1..$]; } } alias Solver_2!(Solver_1) MainSolver; //alias Solver_1 MainSolver;