-
Notifications
You must be signed in to change notification settings - Fork 0
/
BroadcastSystem.java
151 lines (136 loc) · 4.91 KB
/
BroadcastSystem.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
package team122;
import battlecode.common.*;
import java.util.Random;
/**
* System used to send messages
* the int[] of messages are reserved as follows:
* 0: reserved for checksum
* 1: round sent
* 2: message type
* 3: TTL - a TTL greater than zero will be rebroadcast if able
* last: reserved for checksum
* @author bovard
*/
public class BroadcastSystem {
protected RobotController robotControl;
protected BroadcastController broadcastControl;
protected Random rand = new Random();
public BroadcastSystem(RobotController robotControl, BroadcastController broadcastControl) {
this.robotControl = robotControl;
this.broadcastControl = broadcastControl;
}
/**
* //TODO: Implement this, see it's corresponding decrypt method in CommunicationsSystem
* @param toEncrypt
* @return
*/
private Message encrypt(Message toEncrypt) {
//takes the structure and encrypts it
if(PlayerConstants.ENCRYPTION) {
}
return toEncrypt;
}
/**
* adds a checksum to the first and last positions of the int array in any message
* @param message the message to add checksums to
* @return the checked message
*/
private Message addCheckSums(Message message) {
//takes a message and adds checks
//add a random assurance bit in position 0
switch(rand.nextInt(3)) {
case 0:
message.ints[0] = PlayerConstants.ASSURANCE_BIT_0;
break;
case 1:
message.ints[0] = PlayerConstants.ASSURANCE_BIT_1;
break;
case 2:
message.ints[0] = PlayerConstants.ASSURANCE_BIT_2;
break;
}
//calculate the positional sum
int sum = 0;
for (int i=0; i<message.ints.length-1; i++) {
sum += message.ints[i] * (i+1);
//note: adding a multiplication of the place of the number prevents swapping array elements
}
//set the last int place equal to the positional sum
message.ints[message.ints.length-1] = sum * PlayerConstants.ASSURANCE_FACTOR;
return message;
}
/**
* Encrypts and sends a message
* @param ints the int array to send
* @param locs the location array to send
* @param strings the string array to send
* @return if the message was sent successfully
*/
private boolean setSendMessage(Message message) {
if(broadcastControl.isActive()) {
return false;
}
else {
try {
broadcastControl.broadcast(message);
return true;
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
return false;
}
}
}
/**
* takes a message and rebroadcasts it, mutating it first (used to trick/confuse the enemy)
* //TODO: implement this
* @param message the message to mutate
* @return if it was sent successfully
*/
public boolean mutateAndRebroadcast(Message message) {
//change some stuff in the message
return setSendMessage(message);
}
/**
* takes one of our messages and rebroadcasts it, making adjustments to it as necessary
* //TODO: Implement this
* @param message The message to send
* @return if it was rebroadcast sucessfully
*/
public boolean rebraodcast(Message message) {
//note: this assumes that we've already checked to makes sure it's our message
//and that message is not encrypted
//deincrement ttl, etc...
return setSendMessage(message);
}
/**
* sends a build directive, receiving units should build a structure specified by
* buildOrderID at MapLocation location
* Note: zeroeth and last positions are reserved for the addCheckSums function, the first position
* is always the round number, the second is the message type, third is the time to live (TTL)
* @param buildOrderID teh BuildOrderID from RobotBuildOrder of the thing to make
* @param location the location to build
* @return if the message was sent successfully
*/
public boolean setSendBuildDirective(int buildOrderID, MapLocation location) {
Message toSend = new Message();
int[] intArray = {0, Clock.getRoundNum(), PlayerConstants.MESSAGE_BUILD_DIRECTIVE, 0,
buildOrderID, location.x, location.y, 0};
toSend.ints = intArray;
return setSendMessage(encrypt(addCheckSums(toSend)));
}
/**
* sends a fight directive, receiving units should move to engage enemies at location
* Note: zeroeth and last positions are reserved for the addCheckSums function, the first position
* is always the round number, the second is the message type, third is the time to live (TTL)
* @param location the location to move to attack
* @return if the message was sent successfully
*/
public boolean setSendFightDirective(MapLocation location) {
Message toSend = new Message();
int[] intArray = {0, Clock.getRoundNum(), PlayerConstants.MESSAGE_FIGHT_DIRECTIVE, 0,
location.x, location.y, 0};
toSend.ints = intArray;
return setSendMessage(encrypt(addCheckSums(toSend)));
}
}