Newer
Older
#include <nameserver.h>
#include <rps.h>
#include <syscall.h>
#include <td.h>
extern Buffer*** TotalSendQ;
void GamePlay(RPSChoice Client1Move, RPSChoice Client2Move,RPSMsg* reply, int Client1, int Client2){
if (Diff == 0) {
reply->Msg = Draw;
bwprintf(COM2, "We have a Draw.");
Reply(Client1, (void *)reply, sizeof(RPSMsg));
Reply(Client2, (void *)reply, sizeof(RPSMsg));
}
else if (Diff == 1 || Diff == -2) {
bwprintf(COM2, "Client1 Wins.");
reply->Msg = Win;
}
else {
bwprintf(COM2, "Client2 Wins.");
reply->Msg = Lose;
bwprintf(COM2,"%s: Before Register\n\r",Name);
int Result = RegisterAs(Name);
Buffer SendQ;
int QStorage[MAX_NUM_TD];
SendQ.Storage = (void *)QStorage;
//bwprintf(COM2,"%s: MyIndex %d\n\r",Name,MyIndex);
//bwprintf(COM2,"%s: SendQ Addr %d\n\r",Name,&SendQ);
int TaskID, Client1, Client2;
RPSMsg ReceiveMsg, ReplyMsg;
FOREVER {
Result = BufferFIFO(&SendQ,(void *)&TaskID);
bwprintf(COM2,"%s: Got Task %d from SendQ\n\r",Name,TaskID);
if(TaskID != NULL){
bwprintf(COM2,"%s: Got into If\n\r",Name);
Result = Receive(TaskID, &ReceiveMsg, sizeof(ReceiveMsg));
if(bOtherQuit != 0){
ReplyMsg.Msg = OtherQuit;
Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg));
}else{
switch (ReceiveMsg.Msg) {
case Quit:
ReplyMsg.Msg = Bye;
Reply(TaskID,&ReplyMsg,sizeof(ReplyMsg));
// xor Client1 with TaskID, if same, result 0, then set to 0
Client1 = (Client1 ^ TaskID)? Client1: 0;
Client2 = (Client2 ^ TaskID)? Client2: 0;
break;
case SignUp:
if (Client1 == 0 && Client2 != Client1) Client1 = TaskID;
else Client2 = TaskID;
ReplyMsg.Msg = LetsPlay;
Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg));
break;
case Play:
// only one player
if (Client1 == 0 || Client2 == 0) {
ReplyMsg.Msg = OnePlayer;
Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg));
break;
}
if (Client1 == TaskID) Client1Move = ReceiveMsg.Choice;
else Client2Move = ReceiveMsg.Choice;
GamePlay(Client1Move, Client2Move, &ReplyMsg, Client1, Client2);
Client1Move = Client2Move = None;
break;
default:
break;
int Player(int ID){
char Name[] = "RPSClient0";
Name[9] = ID;
//bwprintf(COM2, "%s: Cannot register %s\n\r",Name);
return FAILURE;
}
char Input = 'U'; // for Undefined
bwprintf(COM2, "%s: Got server tid, %d\n\r",Name,ServerTID);
Result = Send(ServerTID, &SendMsg, sizeof(RPSMsg), &ReplyMsg, sizeof(RPSMsg));
//bwprintf(COM2, "Sign Up Request to Server did not go through.");
return Result;
}
//if (ReplyMsg.MsgType == ServerFull) //TODOTODOTODOTODO
bwprintf(COM2, "%s with TaskID(%d) is about to Play\n\r", Name, MyTID);
FOREVER {
bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r");
while (Input = bwgetc(COM2)) {
bwputc(COM2,Input);
if (Input == 'r' || Input == 'R') {
else if (Input == 'p' || Input == 'P') {
SendMsg.Choice = Paper;
break;
else if (Input == 's' || Input == 'S') {
SendMsg.Choice = Scissors;
break;
}else if(Input == 'q' || Input == 'Q'){
SendMsg.Msg = Quit;
else {
Input = 'U';
bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r");
}
SendMsg.Msg = Play;
Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg));
if (Result != sizeof(ReplyMsg)) {
if(SendMsg.Msg == Quit){
bwprintf(COM2, "Request for QUIT from %s did not go through gracefully.", Name);
}else{
bwprintf(COM2, "%s: Game obstructed!",Name);
return FAILURE;
}else{
if(SendMsg.Msg == Quit){
bwprintf(COM2, "%s exitting...",Name);