//
//  ReactorGame.m
//  Gridlock
//
//  Created by Brian on Sun Feb 15 2004.
//  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
//

#import "ReactorGame.h"
#import "AnyDirectionUntilBlockedMoveRule.h"

@implementation ReactorGame

-(void)reset {
  [super reset];
  [self createGridFromConfiguration];

  [self fillRandomEmptyCellsWithValue:1  count:[[[self configurationInfo] objectForKey:@"p1pieces"] intValue]];
  [self fillRandomEmptyCellsWithValue:2  count:[[[self configurationInfo] objectForKey:@"p2pieces"] intValue]];
  [self fillRandomEmptyCellsWithValue:-1 count:[[[self configurationInfo] objectForKey:@"neutrons"] intValue]];
}

-(BOOL)prepareMoveSequence:(NSArray *)positions {
  id pos0 = [positions objectAtIndex:0];
  id pos1 = [positions objectAtIndex:1];
  id previousUnmoveable = [[self grid] positionWithValue:-2]; // inefficient to call this every time
  NSArray *neighbors = [[self grid] neighborsOfPosition:pos1 distance:1];
  NSEnumerator *ne = [neighbors objectEnumerator];
  id npos;
  
  [self resetFutureGrid];
  
  [[self futureGrid] setValue:0 atPosition:pos0];
  // remove all non-neutrons around destination
  while ((npos=[ne nextObject])) {
    if ([self valueAtPosition:npos]>0) {
      [[self futureGrid] setValue:0 atPosition:npos];
    }
  }
  // restore moving neutron, can't be moved on next turn
  [[self futureGrid] setValue:-2 atPosition:pos1];
  // neutron that couldn't be moved this turn can on next turn (inefficient to call -positionWithValue: every time)
  if (previousUnmoveable) [[self futureGrid] setValue:-1 atPosition:previousUnmoveable];
  return YES;
}

-(int)winningPlayer {
  int n1 = [[self grid] numberOfCellsWithValue:1];
  int n2 = [[self grid] numberOfCellsWithValue:2];
  if (n1>0 && n2==0) return 1;
  if (n2>0 && n1==0) return 2;
  // either both have no pieces, are tied at 1, or current player has no move
  return 0;
}

-(BOOL)isGameOver {
  // game over if either player has no pieces, or both have exactly 1, or current player can't move
  int n1 = [[self grid] numberOfCellsWithValue:1];
  int n2 = [[self grid] numberOfCellsWithValue:2];
  return (n1==0 || n2==0 || ![AnyDirectionUntilBlockedMoveRule gameHasAnyMoves:self fromPositionsWithValue:-1] || [self moveCount]>100);
}

-(NSArray *)allValidMoveSequences {
  return [AnyDirectionUntilBlockedMoveRule allValidMoveSequences:self fromPositionsWithValue:-1];
}

-(BOOL)showScores {
  return YES;
}

@end
