Diff
Not logged in

Differences From Artifact [06258bf9d419d24b]:

To Artifact [de7a471045510ac0]:


234 234 for(int y=1; y<=H; ++y) 235 235 for(int x=1; x<=W; ++x) 236 236 if(this[y,x] == 'L' || this[y,x] == 'O') 237 237 return false; 238 238 return true; 239 239 } 240 240 241 - Tuple!(int,bool) command(char c) 241 + Tuple!(int,bool) command(char c, int turn) 242 242 { 243 - if(c=='R') return move( 0, +1); 244 - if(c=='L') return move( 0, -1); 245 - if(c=='U') return move(+1, 0); 246 - if(c=='D') return move(-1, 0); 247 - if(c=='W') return move( 0, 0); 243 + if(c=='R') return move( 0, +1, turn); 244 + if(c=='L') return move( 0, -1, turn); 245 + if(c=='U') return move(+1, 0, turn); 246 + if(c=='D') return move(-1, 0, turn); 247 + if(c=='W') return move( 0, 0, turn); 248 248 assert(false); 249 249 } 250 250 251 - Tuple!(int, bool) move(int dy, int dx) 251 + Tuple!(int, bool) move(int dy, int dx, int turn) 252 252 { 253 253 int y = robot.y; 254 254 int x = robot.x; 255 255 assert( this[robot] == 'R' ); 256 256 int lambda = 0; 257 257 bool dead = false; 258 258 if( '\\' == this[y+dy,x+dx] ) ................................................................................ 270 270 this[y,x]=' '; 271 271 Pos tp = tr_target[this[y+dy,x+dx]]; 272 272 foreach(p; tr_source[this[tp]]) 273 273 this[p] = ' '; 274 274 this[tp] = 'R'; 275 275 robot = tp; 276 276 } 277 - if( update() ) 277 + if( update(turn) ) 278 278 dead = true; 279 279 return tuple(lambda,dead); 280 280 } 281 281 282 - bool update() 282 + bool update(int turn) 283 283 { 284 284 bool dead = false; 285 285 286 286 char[][] next; 287 287 foreach(y,s; data) 288 288 next ~= s.dup; 289 289 ................................................................................ 317 317 dead=true; 318 318 } 319 319 } 320 320 else if(this[p]=='L') { 321 321 if(!lambda) 322 322 access(p) = 'O'; 323 323 } 324 + else if(this[p]=='W') { 325 + if( hige.is_growing_turn(turn) ) 326 + for(int dy=-1; dy<=+1; ++dy) 327 + for(int dx=-1; dx<=+1; ++dx) 328 + if(this[p.y+dy,p.x+dx] == ' ') 329 + access(new Pos(p.y+dy,p.x+dx)) = 'W'; 330 + } 324 331 } 325 332 data = next; 326 333 return dead; 327 334 } 328 335 } 329 336 330 337 //////////////////////////////////////////////////////////////////////////////// ................................................................................ 385 392 if(c == 'A') 386 393 { 387 394 exit_bonus = 1; 388 395 return; 389 396 } 390 397 391 398 // TODO: clarify the event order 392 - Tuple!(int,bool) ld = map.command(c); 399 + Tuple!(int,bool) ld = map.command(c, turn); 393 400 if( map.cleared() ) { 394 401 exit_bonus = 2; 395 402 } 396 403 else { 397 404 lambda += ld[0]; 398 405 if( ld[1] ) { 399 406 dead = true;