0

I'm making a turn-based fighting game that uses javafx for its GUI, but it keeps freezing when I run the fight menu. When I run the fight, I want to run through a list of all the characters that are in play and, while the player or the computer still have a living character, loop the fight. The fight is a check for whether or not the player is the character in that position of the list of all the characters (and also checks to make sure the player doesn't move multiple times in a row if the character is a repeat) if it is, then the GUI should wait for user input, and if not then the computer moves. However, no matter what I try to do, the GUI just ends up freezing once the menu loads. I'm using a separate class to switch scenes around and all of the menus are in classes of their own.

Here is the driver, the main class that switches around all of the scenes (keep in mind this is not fully done so there are some cases that are just empty)

package runner;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import menus.*;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

import Misc.Character;
import Misc.Menu;
import Misc.Move;

public class Driver extends Application implements EventHandler<ActionEvent>{
    public static Stage stg;
    public Stage fightStg;
    private Menu currMenu;
    public MainMenu home;
    public SinglePlayerMenu sp;
    public MultiplayerMenu1 mpm1;
    public MultiplayerMenu2 mpm2;
    public AchievementsMenu am;
    public EditRosterMenu er;
    public ChooseOpponentMenu cp;
    public FightMenuPVC fmpvc;
    public FightMenuPVP fmpvp;

    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage stage){
        stg = stage;
        stg.setTitle("Faction Fighters");
        stg.setResizable(false);
        stg.setWidth(1000);
        stg.setHeight(750);
        home = new MainMenu(this);
        stg.setScene(home.getScene());
        currMenu = home;
        stg.show();
    }

    //Used to switch between scenes
    @Override
    public void handle(ActionEvent event){
        Button button = (Button)event.getSource();
        switch(button.getText()){
        case "Single Player":
            if(sp == null) {
                sp = new SinglePlayerMenu(this);
            }
            stg.setScene(sp.getScene());
            currMenu = sp;
            break;
        case "Multiplayer":
            if(mpm1 == null) {
                mpm1 = new MultiplayerMenu1(this);
            }
            stg.setScene(mpm1.getScene());
            currMenu = mpm1;
            break;
        case "Finish":
            if(mpm2 == null) {
                mpm2 = new MultiplayerMenu2(this);
            }
            stg.setScene(mpm2.getScene());
            currMenu = mpm2;
            break;
        case "Achievements":
            if(am == null) {
                am = new AchievementsMenu(this);
            }
            stg.setScene(am.getScene());
            currMenu = am;
            break;
        case "Edit Roster":
            if(er == null){
                er = new EditRosterMenu(this);
            }
            stg.setScene(er.getScene());
            currMenu = er;
            break;
        case "Choose Opponent":
            if(cp == null){
                cp = new ChooseOpponentMenu(this);
            }
            stg.setScene(cp.getScene());
            currMenu = cp;
            break;
        case "Fight!": //PvC fight menu 
            if(fmpvc == null){
                fmpvc = new FightMenuPVC(this);
            }
            break;
        case "FIGHT": //PvP fight menu
            if(fmpvp == null){
                fmpvp = new FightMenuPVP(this);
            }
            stg.setScene(fmpvp.getScene());
            currMenu = fmpvp;
            break;
        case "Continue":
            currMenu = currMenu.getParent();
            stg.setScene(currMenu.getScene());
            stg.show();
            break;
        case "Claim Rewards":
            break;
        case "Back to Main Menu":
            stg.setScene(home.getScene());
            currMenu = home;
            break;
        case "Back":
            currMenu = currMenu.getParent();
            stg.setScene(currMenu.getScene());
            break;
        case "Quit":
            stg.close();
            break;
        }
    }

    public Menu getCurrMenu() {
        return currMenu;
    }
}

And this is the code for the menu I'm having trouble with:

package menus;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;
import java.util.Scanner;

import Misc.Character;
import Misc.Menu;
import Misc.Move;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import runner.Driver;

public class FightMenuPVC implements Menu {
    public Scene sc;
    public Menu par;
    public static EventHandler<ActionEvent> handler;
    public GridPane men;
    public VBox everything;
    public ScrollPane battleLog;
    public TextArea bLog;
    public static Text pTeamLab;
    public static Text cpuLab;
    public static HBox plyrBar;
    public static HBox cpuBar;
    public static Text moveLab;
    public static TextField moveInput;
    public static Button mInput;
    public static GridPane UI;
    public static ImageView f1;
    public static ImageView f2;
    public static ImageView f3;
    public static ImageView f4;
    public static ArrayList<ImageView> f = new ArrayList<>();
    public static HBox fTeam;
    public static ImageView e1;
    public static ImageView e2;
    public static ImageView e3;
    public static ImageView e4;
    public static ArrayList<ImageView> e = new ArrayList<>();
    public static HBox eTeam;
    public static ArrayList<String> pTeam = new ArrayList<>();
    public static ArrayList<Character> playerTeam = new ArrayList<>();
    public static ArrayList<String> cTeam = new ArrayList<>();
    public static ArrayList<Character> cpuTeam = new ArrayList<>();
    public static File doc = new File("res/curTeam.txt");
    public static ArrayList<Character> roster = new ArrayList<>();
    public static ArrayList<Move> allMoves = new ArrayList<>();
    public static ArrayList<Move> burstMoves = new ArrayList<>();
    public static ArrayList<Move> hitzeldMoves = new ArrayList<>();
    public static ArrayList<Move> ignisMoves = new ArrayList<>();
    public static ArrayList<Move> erholenMoves = new ArrayList<>();
    public static ArrayList<Move> aquilusMoves = new ArrayList<>();
    public static ArrayList<Move> douseMoves = new ArrayList<>();
    public static ArrayList<Move> glacieaMoves = new ArrayList<>();
    public static ArrayList<Move> dropMoves = new ArrayList<>();
    public static ArrayList<Move> roseMoves = new ArrayList<>();
    public static ArrayList<Move> fillipaMoves = new ArrayList<>();
    public static ArrayList<Move> demetraMoves = new ArrayList<>();
    public static ArrayList<Move> floraMoves = new ArrayList<>();
    public static ArrayList<Move> raitoMoves = new ArrayList<>();
    public static ArrayList<Move> borutoMoves = new ArrayList<>();
    public static ArrayList<Move> thunderMoves = new ArrayList<>();
    public static ArrayList<Move> shockMoves = new ArrayList<>();
    public static Button forfeit;
    public static HBox moveStuff;
    public Character gettingMove;
    public static Stage finScreen;
    public static Scene finScn;
    public static GridPane fin;
    public Text winLab;
    public static Button rematch;
    public static Button cont;
    public Stage fightStg;

    public Scene getScene() {
        return sc;
    }

    public Menu getParent() {
        return par;
    }

    public FightMenuPVC(Driver d) {
        // Establishes parent
        par = d.getCurrMenu();

        handler = d;

        // Creates all of the moves
        allMoves.add(new Move("Fire Strike", 50, 90, "Fire"));
        allMoves.add(new Move("Wisp Whip", 60, 80, "Fire"));
        allMoves.add(new Move("Ignite", 0, 90, "Normal")); // 10HP DoT
        allMoves.add(new Move("Tackle", 50, 85, "Normal"));
        allMoves.add(new Move("Erupt", 90, 70, "Fire")); // takes 40% to self if it works
        allMoves.add(new Move("Heat Up", 0, 90, "Normal")); // increase self speed by 20
        allMoves.add(new Move("Body Slam", 50, 80, "Normal"));
        allMoves.add(new Move("Explosion", 70, 70, "Fire"));
        allMoves.add(new Move("Flame Shield", 0, 90, "Normal")); // buff team defense by 30%
        allMoves.add(new Move("Spirit Strike", 60, 85, "Normal"));
        allMoves.add(new Move("Fireball", 50, 90, "Fire"));
        allMoves.add(new Move("Invigorate", 0, 90, "Normal")); // heal team 20% and buff speed by 10
        allMoves.add(new Move("Water Strike", 50, 90, "Water"));
        allMoves.add(new Move("Geyser", 70, 80, "Water"));
        allMoves.add(new Move("Flash Freeze", 0, 90, "Normal")); // debuff enemy speed by 10
        allMoves.add(new Move("Power Punch", 50, 90, "Normal"));
        allMoves.add(new Move("Hydro Gun", 70, 85, "Water"));
        allMoves.add(new Move("Cool Down", 0, 90, "Normal")); // 10% heal for team
        allMoves.add(new Move("Shoulder Charge", 60, 85, "Normal"));
        allMoves.add(new Move("Ice Spike", 70, 80, "Water"));
        allMoves.add(new Move("Ice Wall", 0, 90, "Normal")); // buff team defense by 15
        allMoves.add(new Move("Icicle Shower", 55, 85, "Water"));
        allMoves.add(new Move("Health Drop", 0, 90, "Normal")); // heal 25% health of target
        allMoves.add(new Move("Healing Rain", 0, 90, "Normal")); // heal team for 20% health
        allMoves.add(new Move("Thorn Whip", 50, 90, "Plant"));
        allMoves.add(new Move("Petal Strike", 70, 80, "Plant"));
        allMoves.add(new Move("Photosynthesis", 0, 90, "Normal")); // buff team speed by 10
        allMoves.add(new Move("Thump", 50, 90, "Normal"));
        allMoves.add(new Move("Leaf Charge", 75, 80, "Plant"));
        allMoves.add(new Move("Ingrain", 50, 90, "Plant")); // heal 35 health if it works
        allMoves.add(new Move("Clobber", 60, 90, "Normal"));
        allMoves.add(new Move("Earth Power", 80, 80, "Plant"));
        allMoves.add(new Move("Earth Barrier", 0, 90, "Normal")); // buff team defense by 5
        allMoves.add(new Move("Stem Whack", 50, 90, "Plant"));
        allMoves.add(new Move("Convalesce", 0, 90, "Normal")); // heal 25% of someone
        allMoves.add(new Move("Earth's Blessing", 0, 90, "Normal")); // heal 20% and buff speed by 5 for team
        allMoves.add(new Move("Zap", 50, 90, "Electric"));
        allMoves.add(new Move("Thunder Strike", 70, 80, "Electric"));
        allMoves.add(new Move("Charge Up", 0, 90, "Normal")); // buff team speed by 5
        allMoves.add(new Move("Quick Chop", 50, 90, "Normal"));
        allMoves.add(new Move("Lightning Chop", 70, 85, "Electric"));
        allMoves.add(new Move("Reenergize", 0, 90, "Normal")); // heal self for 20%
        allMoves.add(new Move("Battle Ram", 60, 90, "Normal"));
        allMoves.add(new Move("Lightning Charge", 80, 85, "Electric"));
        allMoves.add(new Move("Thunder Storm", 0, 25, "Normal")); // instakill if it works
        allMoves.add(new Move("Strike Rune", 70, 85, "Normal"));
        allMoves.add(new Move("Health Rune", 0, 90, "Normal")); // heal 30% health of target
        allMoves.add(new Move("Revive Rune", 0, 70, "Normal")); // rez target

        // Movesets for all characters
        makeMoveSet("Fire Strike", "Wisp Whip", "Ignite", burstMoves);
        makeMoveSet("Tackle", "Erupt", "Heat Up", hitzeldMoves);
        makeMoveSet("Body Slam", "Time Bomb", "Flame Shield", ignisMoves);
        makeMoveSet("Spirit Strike", "Fireball", "Invigorate", erholenMoves);
        makeMoveSet("Water Strike", "Geyser", "Flash Freeze", aquilusMoves);
        makeMoveSet("Power Punch", "Hydro Gun", "Cool Down", douseMoves);
        makeMoveSet("Shoulder Charge", "Ice Spike", "Ice Wall", glacieaMoves);
        makeMoveSet("Icicle Shower", "Health Drop", "Healing Rain", dropMoves);
        makeMoveSet("Thorn Whip", "Petal Strike", "Photosynthesis", roseMoves);
        makeMoveSet("Thump", "Leaf Charge", "Ingain", fillipaMoves);
        makeMoveSet("Clobber", "Earth Power", "Earth Barrier", demetraMoves);
        makeMoveSet("Stem Whack", "Convalesce", "Earth's Blessing", floraMoves);
        makeMoveSet("Zap", "Thunder Strike", "Charge Up", raitoMoves);
        makeMoveSet("Quick Chop", "Lightning Chop", "Reenergize", borutoMoves);
        makeMoveSet("Battle Ram", "Lightning Charge", "Thunder Storm", thunderMoves);
        makeMoveSet("Strike Rune", "Health Rune", "Revive Rune", shockMoves);

        // Adds all of the roster
        roster.add(new Character("Burst", 1, 250, 250, 90, 45, 70, 0, "Fire", burstMoves));
        roster.add(new Character("Hitzeld", 1, 350, 350, 50, 60, 50, 0, "Fire", hitzeldMoves));
        roster.add(new Character("Ignis", 1, 450, 450, 60, 80, 35, 0, "Fire", ignisMoves));
        roster.add(new Character("Erholen", 1, 300, 300, 65, 50, 65, 0, "Fire", erholenMoves));
        roster.add(new Character("Aquilus", 1, 300, 300, 80, 60, 65, 0, "Water", aquilusMoves));
        roster.add(new Character("Douse", 1, 375, 375, 50, 60, 40, 0, "Water", douseMoves));
        roster.add(new Character("Glaciea", 1, 400, 400, 40, 90, 30, 0, "Water", glacieaMoves));
        roster.add(new Character("Drop", 1, 350, 350, 50, 70, 60, 0, "Water", dropMoves));
        roster.add(new Character("Rose", 1, 200, 200, 80, 40, 80, 0, "Plant", roseMoves));
        roster.add(new Character("Fillipa", 1, 350, 350, 50, 70, 60, 0, "Plant", fillipaMoves));
        roster.add(new Character("Demetra", 1, 500, 500, 30, 75, 45, 0, "Plant", demetraMoves));
        roster.add(new Character("Flora", 1, 300, 300, 60, 50, 70, 0, "Plant", floraMoves));
        roster.add(new Character("Raito", 1, 350, 350, 75, 30, 75, 0, "Electric", raitoMoves));
        roster.add(new Character("Boruto", 1, 400, 400, 60, 55, 55, 0, "Electric", borutoMoves));
        roster.add(new Character("Thunder", 1, 500, 500, 40, 75, 20, 0, "Electric", thunderMoves));
        roster.add(new Character("Shock", 1, 400, 400, 50, 60, 50, 0, "Electric", shockMoves));

        // Creates the Player's team
        try {
            String line = "";
            BufferedReader teamGet = new BufferedReader(new FileReader(doc));
            while ((line = teamGet.readLine()) != null) {
                pTeam.add(line);
            }
            teamGet.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Cannot open file: " + doc.getName());
        } catch (IOException ex) {
            System.out.println("Error reading file: " + doc.getName());
        }
        for (int i = 0; i < pTeam.size(); i++) {
            for (int j = 0; j < roster.size(); j++) {
                if (pTeam.get(i).equalsIgnoreCase(roster.get(j).getName())) {
                    playerTeam.add(roster.get(j));
                }
            }
        }

        // Creates the Opponent's Team
        File dct = new File("res/opponent.txt");
        try {
            String line = "";
            BufferedReader teamGet = new BufferedReader(new FileReader(dct));
            while ((line = teamGet.readLine()) != null) {
                cTeam.add(line);
            }
            teamGet.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Cannot open file: " + dct.getName());
        } catch (IOException ex) {
            System.out.println("Error reading file: " + dct.getName());
        }
        for (int i = 0; i < cTeam.size(); i++) {
            for (int j = 0; j < roster.size(); j++) {
                if (cTeam.get(i).equalsIgnoreCase(roster.get(j).getName())) {
                    cpuTeam.add(roster.get(j));
                }
            }
        }

        // Creates GUI
        // Sets up menu
        men = new GridPane();
        men.setAlignment(Pos.CENTER);
        men.setStyle("-fx-background-color: maroon");
        // Gets player's sprites
        for (String s : pTeam) {
            f.add(new ImageView(new Image("file:res/" + s + ".png")));
        }
        f1 = f.get(0);
        f1.setFitWidth(100);
        f1.setPreserveRatio(true);
        f2 = f.get(1);
        f2.setFitWidth(100);
        f2.setPreserveRatio(true);
        f3 = f.get(2);
        f3.setFitWidth(100);
        f3.setPreserveRatio(true);
        f4 = f.get(3);
        f4.setFitWidth(100);
        f4.setPreserveRatio(true);
        fTeam = new HBox(10);
        fTeam.getChildren().add(f1);
        fTeam.getChildren().add(f2);
        fTeam.getChildren().add(f3);
        fTeam.getChildren().add(f4);
        // Player bar
        pTeamLab = new Text("Player: ");
        pTeamLab.setFont(Font.font("Times New Roman", FontWeight.NORMAL, 20));
        pTeamLab.setFill(Color.GOLD);
        plyrBar = new HBox(10);
        plyrBar.getChildren().add(pTeamLab);
        plyrBar.getChildren().add(fTeam);
        // Gets enemy sprites
        for (String s : cTeam) {
            e.add(new ImageView(new Image("file:res/" + s + ".png")));
        }
        e1 = e.get(0);
        e1.setFitWidth(100);
        e1.setPreserveRatio(true);
        e2 = e.get(1);
        e2.setFitWidth(100);
        e2.setPreserveRatio(true);
        e3 = e.get(2);
        e3.setFitWidth(100);
        e3.setPreserveRatio(true);
        e4 = e.get(3);
        e4.setFitWidth(100);
        e4.setPreserveRatio(true);
        eTeam = new HBox(10);
        eTeam.getChildren().add(e1);
        eTeam.getChildren().add(e2);
        eTeam.getChildren().add(e3);
        eTeam.getChildren().add(e4);
        // Computer bar
        cpuLab = new Text("Computer: ");
        cpuLab.setFont(Font.font("Times New Roman", FontWeight.NORMAL, 20));
        cpuLab.setFill(Color.GOLD);
        cpuBar = new HBox(10);
        cpuBar.getChildren().add(cpuLab);
        cpuBar.getChildren().add(eTeam);
        // Creates the battle log
        bLog = new TextArea();
        bLog.setEditable(false);
        bLog.setPrefSize(545, 345);
        battleLog = new ScrollPane(bLog);
        battleLog.setStyle("-fx-background-color: maroon");
        battleLog.setPrefSize(550, 350);
        // Sets up UI
        UI = new GridPane();
        UI.setAlignment(Pos.CENTER);
        UI.setStyle("-fx-background-color: maroon");
        //Stuff for move input
        moveLab = new Text("Enter the move you want here: ");
        moveLab.setFill(Color.GOLD);
        moveLab.setFont(Font.font("Times New Roman", FontWeight.NORMAL, 16));
        moveInput = new TextField();
        mInput = new Button("Submit");
        mInput.setPrefSize(125, 50);
        // Grid for anything move related
        moveStuff = new HBox(20);
        moveStuff.setAlignment(Pos.CENTER);
        moveStuff.getChildren().add(moveLab);
        moveStuff.getChildren().add(moveInput);
        moveStuff.getChildren().add(mInput);
        // Add UI elements into UI
        UI.add(moveStuff, 0, 0);
        UI.add(plyrBar, 0, 1);
        UI.add(cpuBar, 0, 2);
        // Forfeit button
        forfeit = new Button("Forfeit");
        forfeit.setPrefSize(100, 50);
        forfeit.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                endScreen("You Lose!");
            }
        });

        // Adds everything into VBox
        everything = new VBox(20);
        everything.setAlignment(Pos.CENTER);
        everything.getChildren().add(battleLog);
        everything.getChildren().add(UI);
        everything.getChildren().add(forfeit);

        // Adds VBox into menu pane
        men.add(everything, 0, 0);

        // Adds menu into scene
        sc = new Scene(men);

        //Shows stage
        fightStg = new Stage();
        fightStg.setResizable(false);
        fightStg.setWidth(1250);
        fightStg.setHeight(1000);

        //Fight after showing
        pvcFight();
    }

    // Fight Related Methods
    private int damage(int attack, int defense, int power) {
        int num = (attack) + ((attack) * (power / 100)) - (defense);
        return num;
    }

    private void makeMoveSet(String x, String y, String z, ArrayList<Move> moves) {
        for (Move m : allMoves) {
            if (m.getName().equals(x) || m.getName().equals(y) || m.getName().equals(z)) {
                moves.add(m);
            }
        }
    }

    private void setFightOrder(ArrayList<Character> chars) {
        boolean loop = true;
        Character temp;

        while (loop) {
            loop = false;
            for (int i = 0; i < chars.size() - 1; i++) {
                if (chars.get(i).getSpeed() < chars.get(i + 1).getSpeed()) {
                    temp = chars.get(i);
                    chars.set(i, chars.get(i + 1));
                    chars.set(i + 1, temp);
                    loop = true;
                }
            }
        }
    }

    private boolean isPlyr(Character c) {
        boolean val = false;
        for (Character cht : playerTeam) {
            if (cht.equals(c)) {
                val = true;
            }
        }
        return val;
    }

    private boolean pLive() {
        boolean val = true;
        int cnt = 0;
        for (Character c : playerTeam) {
            if (c.getHealth() <= 0) {
                cnt++;
            }
        }
        if (cnt != playerTeam.size()) {

            val = true;
        } else {
            val = false;
        }
        return val;
    }

    private boolean cpuLive() {
        boolean val = true;
        int cnt = 0;
        for (Character c : cpuTeam) {
            if (c.getHealth() <= 0) {
                cnt++;
            }
        }
        if (cnt != cpuTeam.size()) {
            val = true;
        } else {
            val = false;
        }
        return val;
    }

    private String getCharMove(Character c, int mNum) {
        ArrayList<Move> charMoves = c.getMoves();
        return charMoves.get(mNum).getName();
    }

    private boolean isWeak(Character c, String type) {
        String cType = c.getType();
        boolean weak = false;

        if (cType.equalsIgnoreCase("Fire") && type.equalsIgnoreCase("Water")) {
            weak = true;
        }
        if (cType.equalsIgnoreCase("Water") && type.equalsIgnoreCase("Electricity")) {
            weak = true;
        }
        if (cType.equalsIgnoreCase("Electricity") && type.equalsIgnoreCase("Plant")) {
            weak = true;
        }
        if (cType.equalsIgnoreCase("Plant") && type.equalsIgnoreCase("Fire")) {
            weak = true;
        }
        return weak;
    }

    private int round(double d) {
        double result = d - (int) (d);
        if (result < .5) {
            return (int) (d);
        } else {
            return (int) (d + 1);
        }
    }

    private void makeGenericMove(Character acting, Character receive, Move m) {
        int rando = 0;
        Random randy = new Random();
        double dmg = 0;

        rando = randy.nextInt(101);
        if (rando <= allMoves.get(0).getAccuracy()) {
            dmg = damage(acting.getAttack(), receive.getDefense(), allMoves.get(0).getPower());
            if (isWeak(receive, allMoves.get(0).getType())) {
                dmg = dmg * 1.5;
            }
            receive.setHealth(receive.getHealth() - round(dmg));
            bLog.appendText("\n" + receive.getName() + " lost " + round(dmg) + " health!");
        } else {
            bLog.appendText("\n" + acting.getName() + " missed!");
        }
    }

    private void doMove(Character acting, Character receive, String moveName) {
        //Performs move on person
    }

    /*
     * Make it wait for player input
     * 
     * Make player wait for input from text field http://stackoverflow.com/questions/7229788/how-to-wait-for-input-in-a-text-field
     * 
     */
    Object waiting = new Object();
    public String input;
    public void pvcFight() {
        Driver.stg.hide();
        fightStg = new Stage();
        fightStg.setTitle("Fight!");
        fightStg.setResizable(false);
        fightStg.setWidth(1000);
        fightStg.setHeight(750);

        ArrayList<Character> allChars = new ArrayList<>();
        int randoMve = 0;
        int randoChr = 0;
        Random randy = new Random();
        int i = 0;
        bLog.appendText("START FIGHT!");

        // Puts all characters in play in an array list
        for (Character c : playerTeam) {
            allChars.add(c);
        }
        for (Character c : cpuTeam) {
            allChars.add(c);
        }

        // Sets fight order
        setFightOrder(allChars);

        synchronized(waiting){
            while ((pLive() && cpuLive())){
                fightStg.setScene(sc);
                fightStg.show();
                // Checks each character
                if (isPlyr(allChars.get(i)) && allChars.get(i) != allChars.get((i + 1) % allChars.size())) { // check player's character
                    gettingMove = null;
                    bLog.appendText("\nYour " + allChars.get(i).getName() + "'s turn.");
                    bLog.appendText("\nWhat move will you perform:");
                    for(int j = 0; j < allChars.get(i).getMoves().size(); j++){ // prints out the list of moves that can be performed
                        bLog.appendText("\n\n" + allChars.get(i).getMoves().get(j).getName());
                    }
                    mInput.setOnAction(new EventHandler<ActionEvent>(){
                        @Override public void handle(ActionEvent e){
                            input = moveInput.getText();
                            synchronized(waiting){
                                waiting.notify();
                            }
                        }
                    });
                    try {
                        synchronized(waiting){
                            waiting.wait();
                        }
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                } else { // cpu moves
                    randoMve = randy.nextInt(3);
                    randoChr = randy.nextInt(4);
                    bLog.appendText("\nEnemy " + allChars.get(i).getName() + "'s Turn");
                    bLog.appendText("\nEnemy " + allChars.get(i).getName() + " performed " + getCharMove(allChars.get(i), randoMve));
                    doMove(allChars.get(i), playerTeam.get(randoChr), getCharMove(allChars.get(i), randoMve));
                    fightStg.setScene(sc);
                    fightStg.show();
                }
                i++;
                if (i == allChars.size()) {
                    i = 0;
                }
            } 

            // Displays screen when someone loses
            if (pLive() == false) {
                endScreen("You Lose!");
            }
            if (cpuLive() == false) {
                endScreen("You Win!");
            }
            fightStg.setScene(sc);
            fightStg.show();
        }
    }

    public void endScreen(String txt) {
        finScreen = new Stage();
        finScreen.setTitle("");
        finScreen.setResizable(false);
        finScreen.setWidth(500);
        finScreen.setHeight(325);
        fin = new GridPane();
        fin.setStyle("-fx-background-color: maroon");
        fin.setAlignment(Pos.CENTER);
        winLab = new Text(txt);
        winLab.setFont(Font.font("Times New Roman", FontWeight.NORMAL, 20));
        winLab.setFill(Color.GOLD);
        rematch = new Button("Rematch");
        rematch.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                bLog.setText(null);
                pvcFight();
            }
        });
        cont = new Button("Continue");
        cont.setOnAction(handler);
        fin.add(winLab, 0, 0);
        fin.add(rematch, 0, 1);
        fin.add(cont, 0, 2);
        finScn = new Scene(fin);
        finScreen.setScene(finScn);
        finScreen.show();
    }
}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • [You use an observer](http://docs.oracle.com/javafx/2/events/handlers.htm) - This is basic JavaFX 101 and you should consult a tutorial on the subject. Also Java != Javascript – MadProgrammer Feb 10 '17 at 02:40
  • 1
    So, what I suspect you need is, when the button is clicked, you run an iteration of your fight loop, this includes the user's and the computers acts, you then update the state of play and UI and make a decision over whether someone won or you need another iteration. If you would like to have some kind animation or delay within the fight cycle, then you need to off load the logic to a background thread which is capable of safely updating the UI, again, there are [countless tutorials on the subject](http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm) – MadProgrammer Feb 10 '17 at 02:48
  • Thank you so much, you have no idea how long I've been stuck with this. I know, I'm not exactly a "good" coder, but your help is really appreciated – AnotherUser Feb 10 '17 at 03:39
  • 1
    I'm not a good coder, I'm just good at google ;) – MadProgrammer Feb 10 '17 at 03:41

0 Answers0