-
Notifications
You must be signed in to change notification settings - Fork 0
/
timerTask.java
162 lines (139 loc) · 4.98 KB
/
timerTask.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package eraofbinary;
import javafx.concurrent.Task;
/**
* this class is extended from Task,
* purpose: create an upđatable timer to binded with ProgressIndicator
* timer can swap between 2 specific periods of time
* read function call() for more information
*/
public class timerTask extends Task<Void> {
private int rounds = 0, currentSeconds, second1, second2, chosenSecond = 1;
private final boolean is2PhasesMode;
private boolean isSendingPhase;
//constructors
public timerTask(int seconds){
this.chosenSecond = seconds;
this.is2PhasesMode = false;
if(Player.is3Players) {this.isSendingPhase = match3Controller.isSendingPhase;}
else { this.isSendingPhase = match2Controller.isSendingPhase;}
}
public timerTask(int second1, int second2){
this.second1 = second1;
this.second2 = second2;
this.chosenSecond = second2;
is2PhasesMode = true;
if(Player.is3Players) {this.isSendingPhase = match3Controller.isSendingPhase;}
else { this.isSendingPhase = match2Controller.isSendingPhase;}
}
private void swapSeconds(){
//toggle between 2 periods of time
if (chosenSecond == second1){
chosenSecond = second2;
} else {
chosenSecond = second1;
}
}
private void swapMode(){
//swap between SENDING mode and DECODING mode
this.isSendingPhase = chosenSecond == second1;
match2Controller.isSendingPhase = this.isSendingPhase;
match3Controller.isSendingPhase = this.isSendingPhase;
}
@Override protected Void call()throws Exception{
/** create Phase counter
* sending phase counter: second1 (currently set to 1 second)
* receiving phase counter: second2 (currently set to 3 seconds)
* Counter will switch between 2 phases by turn
* at the end of sending phase, data will be routed like ring topology
* at the end of decoding phase, counter checks if data is decoded and count point
* the cycle ends when the game has the winner, whose point reaches the winning point
*/
if(is2PhasesMode){
//swap between 2 periods of time so timer counts different each turn
swapSeconds();
//swap between 2 modes depending on the current chosen time
swapMode();
}
if(this.isSendingPhase) {this.rounds++;}
System.out.print("Round " + this.rounds + " - ");
currentSeconds = chosenSecond;
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis() + (currentSeconds * 1000);
long runningTime = startTime, totalTime = endTime - startTime;
long temp = startTime + 1000;
if(this.isSendingPhase) {
System.out.println("Sending phase");
} else {
System.out.println("Decoding phase");
}
System.out.print("remaining seconds: ");
System.out.print(currentSeconds + " ");
//count each second
while (runningTime < endTime ) {
if ( runningTime == temp ) {
currentSeconds--;
temp += 1000;
System.out.print(currentSeconds + " ");
}
updateProgress(runningTime-startTime, totalTime);
runningTime = System.currentTimeMillis();
}
//rout packages and count points
if(this.isSendingPhase) {
System.out.println("\nRouting");
Player.routeData();
Player.clearPlayerKeys();
} else{
System.out.println("\nCounting point");
Player.countPoint();
Player.clearPlayerReceived();
Player.clearPlayerKeys();
}
//Change Progress Indicator's color
if(Player.is3Players) { match3Controller.swapIndicatorColor(); }
else { match2Controller.swapIndicatorColor(); }
Player.updateUI();
//repeat the counter
if (runningTime>=endTime) {
System.out.println("-----run again-----------------");
if(!Player.hasWinner()) {
call();
} else {
Sound.playRandomWinning();
//load data
System.out.println("---loading");
Statistics.loadUserData();
System.out.println("---loading finished");
Statistics.compareStatistic();
//print out won Players list
System.out.print("Won Players: ");
for(WonPlayer checkingPlayer : WonPlayer.getList()) {
System.out.print(checkingPlayer.name + ", ");
}
System.out.println();
//save data
System.out.print("saving");
Statistics.saveUserData();
System.out.println(" finished");
while(Sound.winning.isPlaying()){
Thread.sleep(200);
Player.hasWinner();
}
//clear list after saving
try {
WonPlayer.clear();
System.out.println("Won players list has been cleared.");
} catch (ArrayStoreException e) {
System.err.println("Won players list can not be cleared.");
}
}
}
return null;
}
@Override protected void failed(){
System.out.println("Task failed");
}
@Override protected void succeeded(){
System.out.println("Task finished");
}
}