#include "internal.h"
#include "bms.h"




extern int score[27];

void
KsetNewBoard(char a[][LENGTH])
 {
  t_move b[BOARD_X_SIZE][BOARD_Y_SIZE];
  int i,j;

  for (i = 0; i < BOARD_X_SIZE; i++)
    for (j = 0; j < BOARD_Y_SIZE; j++)
     {
      if (a[i][j] == ' ')
       {
        b[i][j].letter = '\0';
        b[i][j].move_base_value = BMS_INVALID;
       }
      else
       {
        b[i][j].letter = a[i][j];
        b[i][j].move_base_value = score[(int)(a[i][j]-97)];
       }
     }
  SetNewBoard(b);
 }

/*------------------------------------------------------*/

int
KAddBMove(KBMove temp)
 {
  t_move_list temp2;
  int i;
  int answer;

  temp2.num_moves = temp.numMoves;
  temp2.move_type = BMS_PLACE_MOVE;

  temp2.moves = (t_move *) malloc (temp2.num_moves * sizeof(t_move));


  for (i = 0; i < temp.numMoves; i++)
   {
    temp2.moves[i].letter = temp.moves[i].letter;
    temp2.moves[i].grid_ref.x = temp.moves[i].Pos.x;
    temp2.moves[i].grid_ref.y = temp.moves[i].Pos.y;
    if (temp.moves[i].fromBlank == 1)
      temp2.moves[i].move_base_value = 0;
    else
      temp2.moves[i].move_base_value = score[(int)(temp.moves[i].letter-97)];
   }



  answer = AddBMove(temp2);

  free(temp2.moves);
  return(answer);
 }

/*------------------------------------------------------*/

void
KInitializeBoard()
 {
  InitialiseBoard();
 }

/*------------------------------------------------------*/

KScoreMultiplier
KSquareScore(KGridRef a)
 {
  t_grid_loc b;
  e_score_mults answer;

  b.x = a.x;
  b.y = a.y;

  answer = SquareScore(b);

  return((KScoreMultiplier)answer);
 }

/*------------------------------------------------------*/

int
KRemoveTile(KGridRef a)
 {
  t_grid_loc b;

  b.x = a.x;
  b.y = a.y;

  return(RemoveTile(b));
 }

/*------------------------------------------------------*/
void
KsetLastMoveNULL()
 {
  setLastMoveNULL();
 }
/*------------------------------------------------------*/

void
KsetLastMove(KBMove *temp)
 {
  t_move_list *temp2;
  int i;

  temp2 = (t_move_list *)malloc(sizeof(t_move_list));


  temp2->moves = (t_move *)malloc(sizeof(t_move)*7);

  temp2->num_moves = temp->numMoves;


  for (i = 0; i < temp2->num_moves; i++)
   {
    temp2->moves[i].letter = temp->moves[i].letter;
	temp2->moves[i].grid_ref.x = temp->moves[i].Pos.x;
	temp2->moves[i].grid_ref.y = temp->moves[i].Pos.y;
	if (temp->moves[i].fromBlank == 1)
	  temp2->moves[i].move_base_value = 0;
	else
	  temp2->moves[i].move_base_value = score[(int)(temp->moves[i].letter-97)]; 
   }

   setLastMove(temp2);
 }



/*------------------------------------------------------*/
int
KCheckBMove(KBMove temp)
 {
  t_move_list temp2;
  int i;
  int answer;

  temp2.num_moves = temp.numMoves;
  temp2.move_type = BMS_PLACE_MOVE;


  temp2.moves = (t_move *) malloc (temp2.num_moves * sizeof(t_move));


  for (i = 0; i < temp.numMoves; i++)
   {
    temp2.moves[i].letter = temp.moves[i].letter;
    temp2.moves[i].grid_ref.x = temp.moves[i].Pos.x;
    temp2.moves[i].grid_ref.y = temp.moves[i].Pos.y;
    if (temp.moves[i].fromBlank == 1)
      temp2.moves[i].move_base_value = 0;
    else
      temp2.moves[i].move_base_value = score[(int)(temp.moves[i].letter-97)];
   }

  answer = CheckBMove(temp2);

  free(temp2.moves);

  return(answer);
 }

/*------------------------------------------------------*/

int
KScoreBMove(KBMove temp)
 {
  t_move_list temp2;
  int i;
  int answer;

  temp2.num_moves = temp.numMoves;
  temp2.move_type = BMS_PLACE_MOVE;

  temp2.moves = (t_move *) malloc (temp2.num_moves * sizeof(t_move));

  for (i = 0; i < temp.numMoves; i++)
   {
    temp2.moves[i].letter = temp.moves[i].letter;
    temp2.moves[i].grid_ref.x = temp.moves[i].Pos.x;
    temp2.moves[i].grid_ref.y = temp.moves[i].Pos.y;
    if (temp.moves[i].fromBlank == 1)
      temp2.moves[i].move_base_value = 0;
    else
      temp2.moves[i].move_base_value = score[(int)(temp.moves[i].letter-97)];
   }

  answer = ScoreBMove(temp2);

  free(temp2.moves);

  return(answer);
 }

/*------------------------------------------------------*/

KWordList *
KNewWords(KBMove temp)
 {
  KWordList *newW=(KWordList *)malloc(sizeof(KWordList));
  t_word_list newW2;

  t_move_list temp2;
  int i;

  temp2.num_moves = temp.numMoves;
  temp2.move_type = BMS_PLACE_MOVE;

  temp2.moves = (t_move *) malloc (temp2.num_moves * sizeof(t_move));

  for (i = 0; i < temp.numMoves; i++)
   {
    temp2.moves[i].letter = temp.moves[i].letter;
    temp2.moves[i].grid_ref.x = temp.moves[i].Pos.x;
    temp2.moves[i].grid_ref.y = temp.moves[i].Pos.y;
    if (temp.moves[i].fromBlank == 1)
      temp2.moves[i].move_base_value = 0;
    else
      temp2.moves[i].move_base_value = score[(int)(temp.moves[i].letter-97)];
   }

  newW2 = NewWords(temp2);

  newW->num_words = newW2.num_words;

  for (i = 0; i < newW2.num_words; i++)
    newW->words[i] = (char *)malloc(15*sizeof(char));

  for (i = 0; i < newW2.num_words; i++)
   {
    strcpy(newW->words[i],newW2.words[i]);
   }

  free(temp2.moves);

  return(newW);
 }

/*------------------------------------------------------*/

int
KEmptySquare(KGridRef a)
 {
  t_grid_loc b;

  b.x = a.x;
  b.y = a.y;

  return(EmptySquare(b));
 }

/*------------------------------------------------------*/

char
KTileSquare(KGridRef a)
 {
  t_grid_loc b;

  b.x = a.x;
  b.y = a.y;

  return(TileSquare(b));
 }

/*------------------------------------------------------*/

KBMove *
KLastMove(void)
 {
  KBMove *temp;
  t_move_list temp2;
  int i;

  temp2 = LastMove();

  temp = (KBMove *)malloc(sizeof(KBMove));


  temp->numMoves = temp2.num_moves;
  temp->type = PLACE;

  for (i = 0; i < temp2.num_moves; i++)
   {
    temp->moves[i].letter = temp2.moves[i].letter;
    temp->moves[i].Pos.x = temp2.moves[i].grid_ref.x;
    temp->moves[i].Pos.y = temp2.moves[i].grid_ref.y;
    if (temp2.moves[i].move_base_value == 0)
      temp->moves[i].fromBlank = 1;
    else
      temp->moves[i].fromBlank = 0;
   }

  return(temp);

 }











