1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6
7 #include "globals.h"
8 #include "sizes.h"
9 #include "sound.h"
10 #include "netvariables.h"
11 #include "thread.h"
12 #include "object.h"
13 #include "ship.h"
14 #include "screen.h"
15
16
17 void SetStatus(char *GameStatus);
18
19
20 /*
21 Function to read the data from the server and update the game variables as
22 necessary.
23 */
ReadServerThread(void * sockfd)24 void *ReadServerThread(void *sockfd)
25 {
26 int n, i;
27 char type;
28 char readdata[MAX_PACKET_SIZE];
29 char GameStatus[MAX_OBJECTS+MAX_PLAYERS+1];
30 SoundStruct SoundData;
31 char *ptr;
32 struct ObjectDesc ObjData;
33 struct ShipDesc ShipData;
34 struct Point tmpPoint;
35
36 while (!GameStop) {
37 if ((n=recvfrom(svrsock, (char *)readdata,
38 MAX_PACKET_SIZE, 0, NULL, NULL)) < 0) {
39 printf("Network error\n");
40 } else {
41 ptr=readdata;
42
43 pthread_mutex_lock(&ClientLock);
44 #ifdef DEBUG
45 printf("Read Server Thread Awake\n");
46 #endif
47 // Parse through server packet for game data
48 while (n) {
49 type=*ptr;
50 ptr++;
51 n--;
52 if (type==SOUND_SEND_TYPE) {
53 if (n>=sizeof(SoundStruct)) {
54 memcpy(&SoundData, ptr, sizeof(SoundStruct));
55 CalcPoint(&SoundData.Position, &tmpPoint);
56 playsound(SoundData.type, &tmpPoint);
57 ptr+=sizeof(SoundStruct);
58 n-=sizeof(SoundStruct);
59 }
60 } else if (type==STATUS_SEND_TYPE) {
61 if (n>=MAX_OBJECTS+MAX_PLAYERS+1) {
62 memcpy(GameStatus, ptr, MAX_OBJECTS+MAX_PLAYERS+1);
63 SetStatus(GameStatus);
64 ptr+=MAX_OBJECTS+MAX_PLAYERS+1;
65 n-=MAX_OBJECTS+MAX_PLAYERS+1;
66 } else {
67 break;
68 }
69 } else if (type==OBJ_SEND_TYPE) {
70 memcpy(&ObjData, ptr, sizeof(struct ObjectDesc));
71 ptr+=sizeof(struct ObjectDesc);
72 n-=sizeof(struct ObjectDesc);
73 if (!Objects[ObjData.Number]) {
74 Objects[ObjData.Number]=new Object();
75 Objects[ObjData.Number]->Age=0.0;
76 }
77 memcpy(&Objects[ObjData.Number]->Position, &ObjData.Position,
78 sizeof(struct Point));
79 memcpy(&Objects[ObjData.Number]->RotationMatrix,
80 &ObjData.RotationMatrix, sizeof(float[3][3]));
81 Objects[ObjData.Number]->Type=ObjData.Type;
82 Objects[ObjData.Number]->Size=ObjData.Size;
83 if (Objects[ObjData.Number]->Type==ASTEROID_TYPE) {
84 Objects[ObjData.Number]->ObjModel=AsteroidModels[ObjData.Number];
85 } else if (Models[Objects[ObjData.Number]->Type]) {
86 Objects[ObjData.Number]->ObjModel=Models[Objects[ObjData.Number]->Type];
87 }
88 } else if (type==SHIP_SEND_TYPE) {
89 memcpy(&ShipData, ptr, sizeof(struct ShipDesc));
90 ptr+=sizeof(struct ShipDesc);
91 n-=sizeof(struct ShipDesc);
92 if (!Ships[ShipData.Number]) {
93 Ships[ShipData.Number]=new Ship();
94 Ships[ShipData.Number]->ObjModel=Models[0];
95 }
96 memcpy(&Ships[ShipData.Number]->Position,
97 &ShipData.Position, sizeof(struct Point));
98 Ships[ShipData.Number]->Score=ShipData.Score;
99 Ships[ShipData.Number]->Lives=ShipData.Lives;
100 Ships[ShipData.Number]->Size=ShipData.Size;
101 Ships[ShipData.Number]->ShieldOn=ShipData.ShieldOn;
102 Ships[ShipData.Number]->Shield=ShipData.Shield;
103 Ships[ShipData.Number]->Armor=ShipData.Armor;
104 Ships[ShipData.Number]->Shaking=ShipData.Shaking;
105 Ships[ShipData.Number]->Alive=ShipData.Alive;
106 Ships[ShipData.Number]->Warps=ShipData.Warps;
107 Ships[ShipData.Number]->Nukes=ShipData.Nukes;
108 strcpy(Ships[ShipData.Number]->PlayerName, ShipData.PlayerName);
109 if (ShipData.Number==myShip) {
110 memcpy(&Ships[ShipData.Number]->CameraMatrix,
111 &ShipData.RotationMatrix, sizeof(float[3][3]));
112 if (ShipData.Warping) {
113 if (WarpSoundNum==-1) {
114 WarpSoundNum=playsoundinloop(WarpSound);
115 }
116 } else {
117 if (WarpSoundNum!=-1) {
118 stopsoundinloop(WarpSoundNum);
119 WarpSoundNum=-1;
120 }
121 }
122 } else {
123 memcpy(&Ships[ShipData.Number]->RotationMatrix,
124 &ShipData.RotationMatrix, sizeof(float[3][3]));
125 }
126 } else {
127 break;
128 }
129 }
130 #ifdef DEBUG
131 printf("Read Server Thread Sleeping\n");
132 #endif
133 pthread_mutex_unlock(&ClientLock);
134 }
135 }
136
137 close(svrsock);
138
139 printf("Exiting Read Server Thread\n");
140 pthread_exit(NULL);
141 }
142
143
SetStatus(char * GameStatus)144 void SetStatus(char *GameStatus)
145 {
146 int i;
147
148 for (i=0; i<MAX_OBJECTS; i++) {
149 if (GameStatus[i]==0 && Objects[i]) {
150 delete Objects[i];
151 Objects[i]=NULL;
152 }
153 }
154 for (i=0; i<MAX_PLAYERS; i++) {
155 if (GameStatus[i+MAX_OBJECTS]==0 && Ships[i] && i!=myShip) {
156 delete Ships[i];
157 Ships[i]=NULL;
158 }
159 }
160
161 GameRunning=GameStatus[MAX_OBJECTS+MAX_PLAYERS];
162 }
163