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