@@ -545,8 +545,16 @@ @property const { int H() { return H_; } int W() { return W_; } char trampoline(char c) { return (c in trampoline_ ? trampoline_[c] : 0); } + const(Pos)[] trampoline_rev(char c) { + const(Pos)[] pp; + if(c in trampoline_rev_) { + foreach(ch; trampoline_rev_[c]) + pp ~= trampoline_pos_[ch]; + } + return pp; + } int water_level() { return water_pace_ ? water_base_ + turn_/water_pace_ : water_base_; } int water_until_rise() { @@ -562,8 +570,29 @@ int num_razor() { return num_razor_; } bool cleared() { return cleared_; } bool dead() { return dead_; } long score() { return num_lambda_*(dead_ ? 25L : cleared_ ? 75L : 50L) - turn_; } + const(Pos) robot() { return robot_pos_; } + const(Pos) lift() { return lift_pos_; } + Pos[] lambdas() { + Pos[] pp; + foreach(p; lambda_pos_) + pp ~= p.clone(); + return pp; + } + Pos[] razors() { + Pos[] pp; + foreach(p; razor_pos_) + pp ~= p.clone(); + return pp; + } + const(Pos)[] higes() { + const(Pos)[] pp; + foreach(p,c; dynamic_objects_) + if(c=='W') + pp ~= p; + return pp; + } } const { char opIndex(in Pos p) { return opIndex(p.y, p.x); } char opIndex(int y, int x) { return map_get(y, x); } @@ -581,13 +610,13 @@ if(c == 'R') command_move(0, +1); if(c == 'S') use_razor(); if(c == 'W') {} - if(cleared) - return; - - map_update(); - water_update(); + if(!cleared) + { + map_update(); + water_update(); + } turn_ ++; } void command_move(int dy, int dx) @@ -790,8 +819,42 @@ if( y<1 || H