import java.awt.*;
import java.util.*;
import java.applet.*;
import java.awt.event.*;
import java.lang.*;
import java.math.*;
/*
Tekija: Pekka Laitinen 21.2.2001
Lahdekoodi vapaasti kaytettavissa ja muokattavissa taloudellista voittoa tavoittelemattomiin tarkoituksiin.
Edelleen lahdekoodin kaikkinainen kaytto kaikkia hierarkioita tukevaan toimintaan on kielletty.
Naita kommentti riveja ei saa poistaa uusistakaan versioista.

Written by Pekka Laitinen 21.2.2001
Feel free to use the source code for non-profitable purposes.
Any kind of use of the source code to support any kind of hierarchies is prohibited.
These comments must be maintained even in further versions.
*/

public class Jatsi extends java.applet.Applet implements ActionListener
{
	Button nappi[] = new Button[22];
	Panel napit = new Panel();
	Panel tekstit = new Panel();
	Panel nopat = new Panel();
	Panel control = new Panel();
	Panel alas = new Panel();
	TextField bonus;
	TextField sum;
	TextField total;
	TextField viesti;
	TextField tf[] = new TextField[25];
	boolean valiT; // onko valitulos jo laitettu -- is there already the sum or the bonus
	Random r = new Random();
	int lukittu[] = new int[5];
	int kierros;
	int summa; // nopanheiton tulos -- result of dice
	int valiBonus[] = new int[6];
	int varattuTulos[] = new int[15];
	int loppuTulos[] = new int[9];
	int[] taulu = new int[5];
	int joTulos; // tulos on talla kierroksella jo merkattu, joten estetaan toisen tuloksen merkkaus
							// a result is already marked up for this round and we want to prevent user from changing it
	
	public void init()
	{
		resize(270,520);
		kierros = 0;
		joTulos = 0;
		summa = 0;
		valiT = false;
		bonus = new TextField("Bonus");
		sum = new TextField("Sum");
		total = new TextField("Total");
		viesti = new TextField("");
		
		for (int i=0; i<25; i++) {
			tf[i] = (TextField) new TextField("", 3); 
			tf[i].setEditable(false);
			if (i<15) {
				varattuTulos[i] = 0;
			}
			if (i<6) {
				valiBonus[i] = 0;
			}
			if (i<5) {
				taulu[i] = 0;
			}
			if (i<9) {
				loppuTulos[i] = 0;
			}
		}

		nappi[0] = (Button) new Button("Ones");
		nappi[1] = (Button) new Button("Twos");
		nappi[2] = (Button) new Button("Threes");
		nappi[3] = (Button) new Button("Fours");
		nappi[4] = (Button) new Button("Fives");
		nappi[5] = (Button) new Button("Sixes");
		
		nappi[6] =(Button) new Button("Roll");
		nappi[7] = (Button) new Button("New game");
		
		nappi[8] = (Button) new Button("Pair");
		nappi[9] = (Button) new Button("Two pairs");
		nappi[10] = (Button) new Button("Three same");
		nappi[11] = (Button) new Button("Four same");
		nappi[12] = (Button) new Button("Small flush");
		nappi[13] = (Button) new Button("Big flush");
		nappi[14] = (Button) new Button("Full house");
		nappi[15] = (Button) new Button("Random");
		nappi[16] = (Button) new Button("Yatzy");
		
		nappi[17] = (Button) new Button("Hold 1");
		nappi[18] = (Button) new Button("Hold 2");
		nappi[19] = (Button) new Button("Hold 3");
		nappi[20] = (Button) new Button("Hold 4");
		nappi[21] = (Button) new Button("Hold 5");
		
		for(int i=0; i<22; i++) {
			nappi[i].addActionListener(this);
		}
		
		sum.setEditable(false);
		bonus.setEditable(false);
		total.setEditable(false);

		napit.setLayout(new GridLayout(18,1));
		for(int i=0; i<18; i++) {
			if (i == 6) {
				napit.add(sum);
			} else if (i == 7) {
				napit.add(bonus);
			} else if (i == 17) {
				napit.add(total);
			} else {
				napit.add(nappi[i]);
			}
		}
		
		tekstit.setLayout(new GridLayout(18,1));
		for(int i=0; i<18; i++) {
			tekstit.add(tf[i]);
		}
		
		nopat.setLayout(new GridLayout(2,5));
		for(int i=0; i<10; i++) {
			if (i<5) {
				nopat.add(tf[i+18]);
				lukittu[i] = 0;
			} else {
				nopat.add(nappi[i+12]);
			}
		}
		
		control.setLayout(new GridLayout(2,2));
		control.add(nappi[6]);
		control.add(nappi[7]);
		control.add(viesti);
		
		alas.setLayout(new GridLayout(2,1));
		alas.add(nopat);
		alas.add(control);
		
		add("Center", napit);
		add("East", tekstit);
		add("South", alas);
	}

	public void actionPerformed( ActionEvent e ) {
		String command = e.getActionCommand();
		if( command == "New game") {
			nappi[7].setLabel("Really?");
		} else if ( command == "Really?") {
			newGame();
			nappi[7].setLabel("New game");
		} else if ( command == "Ones") {
			if (varattuTulos[0] == 0 && joTulos == 0) {
				varattuTulos[0] = 1;
				summa = 0;
				for(int i=18; i<23; i++) {	// Tuloksen tarkastusalgoritmi tapauskohtainen					
																		// A validity of each result must be checked out
					if(Integer.parseInt( tf[i].getText() ) == 1) {
						summa += 1;
					}
				}
				tf[0].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[0] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}			
		} else if ( command == "Twos") {
			if (varattuTulos[1] == 0 && joTulos == 0) {
				varattuTulos[1] = 1;
				summa = 0;
				for(int i=18; i<23; i++) {	
					if(Integer.parseInt( tf[i].getText() ) == 2) {
						summa = summa + 2;
					}
				}
				tf[1].setText("" + summa);				
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[1] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}			
		} else if ( command == "Threes") {
			if (varattuTulos[2] == 0 && joTulos == 0) {
				varattuTulos[2] = 1;
				summa = 0;
				for(int i=18; i<23; i++) {	
					if(Integer.parseInt( tf[i].getText() ) == 3) {
						summa = summa + 3;
					}
				}
				tf[2].setText("" + summa);				
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[2] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}
		} else if ( command == "Fours") {
			if (varattuTulos[3] == 0 && joTulos == 0) {
				varattuTulos[3] = 1;
				int summa = 0;
				for(int i=18; i<23; i++) {	
					if(Integer.parseInt( tf[i].getText() ) == 4) {
						summa = summa + 4;
					}
				}
				tf[3].setText("" + summa);				
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[3] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}
		} else if ( command == "Fives") {
			if (varattuTulos[4] == 0 && joTulos == 0) {
				varattuTulos[4] = 1;
				summa = 0;
				for(int i=18; i<23; i++) {	
					if(Integer.parseInt( tf[i].getText() ) == 5) {
						summa = summa + 5;
					}
				}
				tf[4].setText("" + summa);				
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[4] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}
		} else if ( command == "Sixes") {
			if (varattuTulos[5] == 0 && joTulos == 0) {
				varattuTulos[5] = 1;
				summa = 0;				
				for(int i=18; i<23; i++) {	
					if(Integer.parseInt( tf[i].getText() ) == 6) {
						summa = summa + 6;
					}
				}
				tf[5].setText("" + summa);				
				nollaNopat();
				joTulos = 1;
				vapauta();
				kierros = 0;
				valiBonus[5] = 1;
				valiBonus();
			} else {
				viesti.setText("Result reserved");
			}
		} else if ( command == "Pair") {
			if (varattuTulos[6] == 0) {
				varattuTulos[6] = 1;
				lajittele();				
				summa = 0;
				for(int i=0; i<4; i++) {
					if(taulu[i] == taulu[i+1]) {
						summa = taulu[i] * 2;
					}
				}		
				tf[8].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[0] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Two pairs") {
			if (varattuTulos[7] == 0) {
				varattuTulos[7] = 1;
				lajittele();
				summa = 0;
				if(((taulu[0] == taulu[1]) && ((taulu[2] == taulu[3]) || (taulu[3] == taulu[4]))) || ((taulu[1] == taulu[2]) && (taulu[3] == taulu[4]))) {
					summa = 2 * taulu[1] + 2 * taulu[3];
				}
				tf[9].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[1] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Three same") {
			if (varattuTulos[8] == 0) {
				varattuTulos[8] = 1;
				lajittele();
				summa = 0;
				if(taulu[0] == taulu[2] || taulu[1] == taulu[3] || taulu[2] == taulu[4]) {
					summa = taulu[2] * 3;
				}
				tf[10].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[2] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Four same") {
			if (varattuTulos[9] == 0) {
				varattuTulos[9] = 1;
				lajittele();
				summa = 0;
				if(taulu[1] == taulu[4] || taulu[0] == taulu[3]) {
					summa = 4 * taulu[2];
				}
				tf[11].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[3] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
		} else if ( command == "Small flush") {
			if (varattuTulos[10] == 0) {
				varattuTulos[10] = 1;
				lajittele();
				summa = 0;
				int ok = 0;
				for(int i=0; i<4; i++) {
					if(taulu[i] == (taulu[i+1] - 1)) {
						ok += 1;
					}
				}
				if(ok == 4 && taulu[0] == 1) {
					tf[12].setText("15");
					nollaNopat();
				}	else {
					tf[12].setText("0");
					nollaNopat();
				}
				joTulos = 1;
				vapauta();
				loppuTulos[4] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Big flush") {
			if (varattuTulos[11] == 0) {
				varattuTulos[11] = 1;
				lajittele();
				summa = 0;
				int ok = 0;
				for(int i=0; i<4; i++) {
					if(taulu[i] == (taulu[i+1] - 1)) {
						ok += 1;
					}
				}
				if(ok == 4 && taulu[0] == 2) {
					tf[13].setText("20");
					nollaNopat();
				} else {
					tf[13].setText("0");
					nollaNopat();
				}
				joTulos = 1;
				vapauta();
				loppuTulos[5] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Full house") {
			if (varattuTulos[12] == 0) {
				varattuTulos[12] = 1;
				lajittele();
				summa = 0;
				if((taulu[0] == taulu[2]) && (taulu[3] == taulu[4])) {
					summa = taulu[1] * 3 + taulu[3] * 2;
				}
				else if((taulu[0] == taulu[1]) && (taulu[2] == taulu[4])) {
					summa = taulu[1] * 2 + taulu[3] * 3;
				}				
				tf[14].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[6] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Random") {
			if (varattuTulos[13] == 0) {
				varattuTulos[13] = 1;				
				summa = 0;
				for (int i=18; i < 23; i++) {
					summa = summa + Integer.parseInt( tf[i].getText() );
				}
				tf[15].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[7] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Yatzy") {
			if (varattuTulos[14] == 0) {
				varattuTulos[14] = 1;
				lajittele();
				summa = 0;
				if(taulu[0] == taulu[4]) {
					summa = 50;
				}
				tf[16].setText("" + summa);
				nollaNopat();
				joTulos = 1;
				vapauta();
				loppuTulos[8] = 1;
				loppuTulos();
				kierros = 0;
			} else {
				viesti.setText("Result reserved");
			}
			kierros = 0;
		} else if ( command == "Hold 1" ) {
			lukittu[0] = 1;
			nappi[17].setLabel("Lock 1");
		} else if ( command == "Hold 2" ) {
			lukittu[1] = 1;
			nappi[18].setLabel("Lock 2");
		} else if ( command == "Hold 3" ) {
			lukittu[2] = 1;
			nappi[19].setLabel("Lock 3");
		} else if ( command == "Hold 4" ) {
			lukittu[3] = 1;
			nappi[20].setLabel("Lock 4");
		} else if ( command == "Hold 5" ) {
			lukittu[4] = 1;	
			nappi[21].setLabel("Lock 5");
		} else if ( command == "Lock 1" ) {
			nappi[17].setLabel("Hold 1");
			lukittu[0] = 0;
		} else if ( command == "Lock 2" ) {
			nappi[18].setLabel("Hold 2");
			lukittu[1] = 0;
		} else if ( command == "Lock 3" ) {
			nappi[19].setLabel("Hold 3");
			lukittu[2] = 0;
		} else if ( command == "Lock 4" ) {
			nappi[20].setLabel("Hold 4");
			lukittu[3] = 0;
		} else if ( command == "Lock 5" ) {
			nappi[21].setLabel("Hold 5");
			lukittu[4] = 0;
		} else if ( command == "Roll") {
			if (kierros < 3) {
				for(int i=0; i<5; i++) {
					if (lukittu[i] == 0) { // noppien tulokset tekstikentissa 18-22
																	// results of dices can be found from textfields 18-22
						tf[i+18].setText(pyorita() + "");					
					}					
				}
				kierros += 1;
				joTulos = 0;
				viesti.setText("Round " + kierros);			
			} else {
				// liikaa kierroksia, laita tulos johonkin
				// too many rounds, you must put the result somewhere
				viesti.setText("Set result!");
			}			
		}
	}

	public int pyorita() {
		int arvo = (int)(r.nextDouble()*(double)6 + 1);
		return(arvo);
	}
	
	public void vapauta() {
		for (int i=0; i<5; i++) {
			lukittu[i] = 0;
		}
		nappi[17].setLabel("Hold 1");
		nappi[18].setLabel("Hold 2");
		nappi[19].setLabel("Hold 3");
		nappi[20].setLabel("Hold 4");
		nappi[21].setLabel("Hold 5");
	}
	
	public void valiBonus() {
		int joko = 0;
		int bonus = 0;
		int valiTulos = 0;
		for (int i=0; i<6; i++) {
			if (valiBonus[i] == 1) {
				joko = joko + 1;
			}
		}
		if (joko == 6) {			
			for (int i=0; i<6; i++) {
				valiTulos = valiTulos + Integer.parseInt( tf[i].getText() );
			}
			if (valiTulos > 62) {
				bonus = 50;
			}
			tf[6].setText("" + valiTulos);
			tf[7].setText("" + bonus);
			valiT = true;
		}
		loppuTulos();
	}
	
	public void loppuTulos() {
		int joko = 0;
		int totaali = 0;
		for (int i=0; i<9; i++) {
			if (loppuTulos[i] == 1) {
				joko = joko + 1;
			}
		}
		if ( (joko == 9) && (valiT == true) ) {
			for (int i=6; i<17; i++) {
				totaali = totaali + Integer.parseInt( tf[i].getText() );
			}
			tf[17].setText("" + totaali);
			if (totaali < 50) {
				viesti.setText("Better go to sleep..");
			}
			if (totaali >= 50 && totaali < 150) {
				viesti.setText("Too bad..");
			}
			if (totaali >= 150 && totaali < 200) {
				viesti.setText("Try again");
			}
			if (totaali >= 200 && totaali < 250) {
				viesti.setText("Pretty good");
			}
			if (totaali >= 250 && totaali < 300) {
				viesti.setText("You really got some talent");
			}
			if (totaali > 300) {
				viesti.setText("You're the god!");
			}
		}
	}
				
	public void lajittele() {		
		for (int i=0; i<5; i++) {			
			taulu[i] = Integer.parseInt( tf[i+18].getText() );
		}
		int i,j;
		for(i = 0; i < 4; i++)
    	{
			for(j = i+1; j < 5; j++)
    		{
				if(taulu[i] > taulu[j])
				{
					vaihda(i, j, taulu);
				}
			}
		}
	}
	
	public void nollaNopat() {
		for (int i=18; i<23; i++) {
			tf[i].setText("");
		}
	}

	public void vaihda(int i, int j, int taulu[])
	{
		int tmp = taulu[i];
 		taulu[i] = taulu[j];
 		taulu[j] = tmp;
	}
	
	public void newGame() {
		kierros = 0;
		joTulos = 0;
		summa = 0;
		valiT = false;
		
		nappi[17].setLabel("Hold 1");
		lukittu[0] = 0;
		nappi[18].setLabel("Hold 2");
		lukittu[1] = 0;
		nappi[19].setLabel("Hold 3");
		lukittu[2] = 0;
		nappi[20].setLabel("Hold 4");
		lukittu[3] = 0;
		nappi[21].setLabel("Hold 5");
		lukittu[4] = 0;
		
		for (int i=0; i<25; i++) {
			tf[i].setText("");
			if (i<15) {
				varattuTulos[i] = 0;
			}
			if (i<6) {
				valiBonus[i] = 0;
			}
			if (i<5) {
				taulu[i] = 0;
			}
			if (i<9) {
				loppuTulos[i] = 0;
			}
		}
	}
	
}

