package com.me.missingwords.actors;
import java.util.ArrayList;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.SnapshotArray;
import com.badlogic.gdx.utils.Timer;
import com.badlogic.gdx.utils.Timer.Task;
import com.me.missingwords.MissingWords;
/**
*
* Representa al jugador controlado por el dispositivo (IA): NPC
*
*/
public class NPCPlayer extends Player {
private int wordCounter; // Contador usado para recorrer la palabra
private Timer npcTimer; // Temporizador
private boolean isTurnFinished; // Variable que indica si el turno ha terminado o no
public NPCPlayer(String name, MissingWords missingWords) {
super(name, missingWords);
this.missingWords = missingWords;
wordCounter = 0;
npcTimer = new Timer();
isTurnFinished = false;
}
@Override
public void act(float delta) {
super.act(delta);
/* Entrando al turno del NPC */
if (isTurnFinished()) { // �Ha terminad su turno?
if (isMyTurn()) { // Si no ha terminado y es su turno
/* Evitamos que entre hasta que no acabe su turno actual */
isTurnFinished = false;
/* Juega la m�quina */
playTurn(missingWords.getGameScreen().getSubmitBox(),
missingWords.getGameScreen().getOriginalTiles(),
missingWords.getGameScreen().getCopyTiles(),
missingWords.getGameScreen().getAdaptedWordNPC());
}
}
}
/* playTurn(): la m�quina juega su turno: confirma la palabra y juega al minijuego */
void playTurn(SubmitBox submitBox, ArrayList<Tile> original, ArrayList<Tile> copy,
ArrayList<Tile> word) {
missingWords.getGameScreen().getTurnControl().prepareTurn(); // Prepara el turno
missingWords.getGameScreen().getTurnControl().initialiseTurn(); // Inicializa el turno
}
/* createWord(): la m�quina crea una palabra */
public void createWord(final SubmitBox submitBox, final ArrayList<Tile> original,
final ArrayList<Tile> copy, final ArrayList<Tile> word) {
int repeatCount = word.size(); // Contador de letras de la palabra
/*
* Creamos una tarea con el temporizador. Va escogiendo las letras para formar
* una palabra.
*/
npcTimer.scheduleTask(new Task() {
@Override
public void run() {
int index = original.indexOf(word.get(wordCounter)); // Primera letra
/* Reproducimos el efecto de sonido si est� activo */
missingWords.getSoundFX().getTap().play(missingWords.getSoundFX().getVolume());
original.get(index).setVisible(false); // Oculta la ficha original
copy.get(index).setSmallSize(); // Cambia el tama�o de la ficha copia al enviarla al submitBox
submitBox.addActor(copy.get(index)); // A�ade la ficha al submitBox
submitBox.increaseNumActors();
missingWords.getGameScreen().getWordScore().increaseScore(original.get(index).getPoints());
if (wordCounter < word.size()) { // Si quedan letras por procesar
++wordCounter;
}
if (wordCounter == word.size()) { // No quedan mas letras que procesar
wordCounter = 0; // Restablecemos el contador
submitWord(submitBox); // Enviamos palabra
}
}
}, 2, 1, repeatCount - 1);
}
/* submitWord(): la m�quina confirma una palabra */
private void submitWord(final SubmitBox submitBox) {
/*
* Creamos una tarea con el temporizador. Confirma la palabra y asigna las tiradas
* correspondientes en base a los puntos.
*/
npcTimer.scheduleTask(new Task() {
@Override
public void run() {
SnapshotArray<Actor> array = new SnapshotArray<>();
int score = 0;
array = submitBox.getChildren(); // Obtenemos la palabra en un array de Tiles
/*
* Con la clase StringBuilder creamos un array de strings a partir del array de
* Tiles
*/
StringBuilder word = new StringBuilder();
for (int i = 0; i < array.size; ++i) {
Tile t = (Tile) array.get(i);
if (i == 0)
word.append(t.getLetter().toUpperCase());
else
word.append(t.getLetter().toUpperCase()); // a�adimos la letra al array de strings
score += t.getPoints(); // sumamos los puntos de la Tile
}
/* Reproducimos el efecto de sonido si est� activo */
missingWords.getSoundFX().getPositiveSound().play(missingWords.getSoundFX().getVolume());
/* Incrementamos el n�mero de palabras formadas */
missingWords.getGameScreen().increaseTotalWords();
/* Asignamos las tiradas correspondientes en base a la puntuaci�n */
calculateRolls(score);
/* La m�quina juega el minijuego */
playMinigame();
/* Restablecemos el score */
missingWords.getGameScreen().getWordScore().setScore(0);
/* Finaliza el turno de la m�quina */
setMyTurn(false);
}
}, 1);
/* Fin turno NPC */
}
/* -------------- Getters and Setters -------------- */
public boolean isTurnFinished() {
return isTurnFinished;
}
public void setTurnFinished(boolean isTurnFinished) {
this.isTurnFinished = isTurnFinished;
}
public Timer getNpcTimer() {
return npcTimer;
}
}