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; } }