4b825dc642cb6eb9a060e54bf8d69288fbee4904ebd360ec63ec976c05699f3180e866b3f69e5472
 
 
1
#include "files.h"
 
 
2
#include "net.h"
 
 
3
#include <string.h>
 
 
4
#include <stdlib.h>
 
 
5
 
 
 
6
#define MP_CONFIG_DIR "mp_config"
 
 
7
#define MP_CONFIG_WILDCARD "*.cfg"
 
 
8
#define SKIRMISH_CONFIG_WILDCARD "*.skirmish_cfg"
 
 
9
#define IP_ADDRESS_DIR "ip_address/"
 
 
10
#define IP_ADDRESS_WILDCARD "*.IP Address"
 
 
11
 
 
 
12
extern char MP_SessionName[];
 
 
13
extern char MP_Config_Description[];
 
 
14
extern int CloseGameDirectory(void *dir);
 
 
15
extern int CreateGameDirectory(const char *dirname);
 
 
16
 
 
 
17
extern const struct Map MultiplayerMaps[];
 
 
18
extern const struct Map CoopMaps[];
 
 
19
 
 
 
20
static int custom_multiplayer_levels = 0;
 
 
21
static int custom_coop_skirmish_levels = 0;
 
 
22
int NumMultiplayerLevels = 0;
 
 
23
int NumCoopLevels = MAX_NO_OF_COOPERATIVE_EPISODES;
 
 
24
const char** MultiplayerLevelNames = NULL;
 
 
25
const char** CoopLevelNames = NULL;
 
 
26
char *LastDescriptionFile = NULL;
 
 
27
char* LastDescriptionText = NULL;
 
 
28
 
 
 
29
void SetDefaultNetStruct()
 
 
30
{
 
 
31
    int i;
 
 
32
    netGameData.myCharacterSubType = NGSCT_General;
 
 
33
    netGameData.myCharacterType = NGCT_Marine;
 
 
34
    netGameData.myNextCharacterType= NGCT_Marine;
 
 
35
    netGameData.gameType = NGT_Coop;
 
 
36
    netGameData.myGameState = NGS_StartUp;
 
 
37
    netGameData.LMS_AlienIndex = -1;
 
 
38
    netGameData.LMS_RestartTimer = 0;
 
 
39
    netGameData.myLastScream = -1;
 
 
40
    netGameData.GameTimeElapsed = 0;
 
 
41
    netGameData.myStartFlag = 0;
 
 
42
    netGameData.levelNumber = 0;
 
 
43
    netGameData.sendDecals = 1;
 
 
44
    netGameData.sendTimer = 0;
 
 
45
    netGameData.sendFrequency = 0;
 
 
46
    netGameData.pointsForRespawn = 0;
 
 
47
    netGameData.lastPointsBasedRespawn = 0;
 
 
48
    netGameData.gameDescriptionTimeDelay = 0;
 
 
49
    netGameData.needGameDescription = 0;
 
 
50
    netGameData.stateCheckTimeDelay = 0;
 
 
51
    netGameData.myStrategyCheckSum = 0;
 
 
52
    netGameData.joiningGameStatus = 0;
 
 
53
    netGameData.teamScores[0] = 0;
 
 
54
    netGameData.teamScores[1] = 0;
 
 
55
    netGameData.teamScores[2] = 0;
 
 
56
    netGameData.numDeaths[0] = 0;
 
 
57
    netGameData.numDeaths[1] = 0;
 
 
58
    netGameData.numDeaths[2] = 0;
 
 
59
    netGameData.landingNoise = 0;
 
 
60
 
 
 
61
    for(i=0; i < NET_MAXPLAYERS; i++)
 
 
62
    {
 
 
63
        int j;
 
 
64
        netGameData.playerData[i].playerId = 0;        
 
 
65
 
 
 
66
        for(j=0; j < NET_PLAYERNAMELENGTH; j++)
 
 
67
            netGameData.playerData[i].name[j] = '\0';
 
 
68
 
 
 
69
        netGameData.playerData[i].characterType = NGCT_Marine;
 
 
70
        netGameData.playerData[i].characterSubType = NGSCT_General;
 
 
71
 
 
 
72
        for(j=0; j < NET_MAXPLAYERS; j++)
 
 
73
            netGameData.playerData[i].playerFrags[j] = 0;
 
 
74
 
 
 
75
        netGameData.playerData[i].aliensKilled[0] = 0;
 
 
76
        netGameData.playerData[i].aliensKilled[1] = 0;
 
 
77
        netGameData.playerData[i].aliensKilled[2] = 0;
 
 
78
        netGameData.playerData[i].deathsFromAI = 0;
 
 
79
        netGameData.playerData[i].playerScore = 0;
 
 
80
        netGameData.playerData[i].playerScoreAgainst = 0;
 
 
81
        netGameData.playerData[i].lastKnownPosition.vx = 0;
 
 
82
        netGameData.playerData[i].lastKnownPosition.vy = 0;
 
 
83
        netGameData.playerData[i].lastKnownPosition.vz = 0;
 
 
84
        netGameData.playerData[i].timer = 0;
 
 
85
        netGameData.playerData[i].startFlag = 0;
 
 
86
        netGameData.playerData[i].playerAlive = 1;
 
 
87
        netGameData.playerData[i].playerHasLives = 1;
 
 
88
    }
 
 
89
}
 
 
90
 
 
 
91
void SetDefaultMultiplayerConfig()
 
 
92
{
 
 
93
    netGameData.timeForRespawn = 40;
 
 
94
    netGameData.invulnerableTime = 5;
 
 
95
    netGameData.useSharedLives = 0;
 
 
96
    netGameData.maxLives = 0;
 
 
97
    netGameData.scoreLimit = 1000000;    
 
 
98
    netGameData.timeLimit = 255;
 
 
99
    netGameData.invulnerableTime = 5;
 
 
100
    netGameData.characterKillValues[0] = 100;
 
 
101
    netGameData.characterKillValues[1] = 150;
 
 
102
    netGameData.characterKillValues[2] = 75;
 
 
103
 
 
 
104
    netGameData.baseKillValue = 100;
 
 
105
    netGameData.useDynamicScoring = 1;
 
 
106
    netGameData.useCharacterKillValues = 1;
 
 
107
 
 
 
108
    netGameData.aiKillValues[0] = 75;
 
 
109
    netGameData.aiKillValues[1] = 100;
 
 
110
    netGameData.aiKillValues[2] = 150;
 
 
111
 
 
 
112
    netGameData.maxPredator = 8;
 
 
113
    netGameData.maxAlien = 8;
 
 
114
    netGameData.maxMarine = 8;
 
 
115
    netGameData.maxMarineGeneral = 8;
 
 
116
    netGameData.maxMarinePulseRifle = 8;
 
 
117
    netGameData.maxMarineSmartgun = 8;
 
 
118
    netGameData.maxMarineFlamer = 8;
 
 
119
    netGameData.maxMarineSadar = 8;
 
 
120
    netGameData.maxMarineGrenade = 8;
 
 
121
    netGameData.maxMarineMinigun = 8;
 
 
122
    netGameData.maxMarineSmartDisc = 8;
 
 
123
    netGameData.maxMarinePistols = 8;
 
 
124
 
 
 
125
    netGameData.allowSmartgun = 1;
 
 
126
    netGameData.allowFlamer = 1;
 
 
127
    netGameData.allowSadar = 1;
 
 
128
    netGameData.allowGrenadeLauncher = 1;
 
 
129
    netGameData.allowMinigun = 1;
 
 
130
    netGameData.allowDisc = 1;
 
 
131
    netGameData.allowPistol = 1;
 
 
132
    netGameData.allowPlasmaCaster = 1;
 
 
133
    netGameData.allowSpeargun = 1;
 
 
134
    netGameData.allowMedicomp = 1;
 
 
135
    netGameData.allowSmartDisc = 1;
 
 
136
    netGameData.allowPistols = 1;
 
 
137
    netGameData.preDestroyLights = 0;
 
 
138
    netGameData.disableFriendlyFire = 0;
 
 
139
    netGameData.fallingDamage = 1;
 
 
140
    netGameData.pistolInfiniteAmmo = 1;
 
 
141
    netGameData.specialistPistols = 1;
 
 
142
 
 
 
143
    netGameData.maxLives = 0;
 
 
144
    netGameData.useSharedLives = 0;
 
 
145
    netGameData.pointsForRespawn = 0;
 
 
146
    netGameData.timeForRespawn = 40;
 
 
147
    netGameData.gameSpeed = NETGAMESPEED_100PERCENT;
 
 
148
}
 
 
149
 
 
 
150
void LoadMultiplayerConfiguration(const char* name)
 
 
151
{
 
 
152
    char filename[200];
 
 
153
    SetDefaultMultiplayerConfig(); //set defaults first , in case there are entries not set by this file
 
 
154
 
 
 
155
    sprintf(filename,"%s%c%s.%scfg", MP_CONFIG_DIR, DIR_SEPARATOR, name, ((Skirmish == AvP.PlayMode) ? "skirmish_" : "" ));
 
 
156
 
 
 
157
    FILE* file = OpenGameFile(filename, 1, FILETYPE_CONFIG);
 
 
158
 
 
 
159
    if(NULL != file)
 
 
160
    {
 
 
161
        int i, length;
 
 
162
        fread(&netGameData, sizeof(netGameData), 1, file);
 
 
163
        fread(&MP_SessionName[0], sizeof(char), 13, file);
 
 
164
 
 
 
165
        length = 0;
 
 
166
        fread(&length, sizeof(int), 1, file);
 
 
167
        fread(MP_Config_Description, 1, length, file);
 
 
168
 
 
 
169
        length = 0;
 
 
170
        fread(&length, sizeof(int), 1, file);
 
 
171
 
 
 
172
        fread(AvP.LevelName, 1, (length < 40 ? length : 39), file);
 
 
173
 
 
 
174
        netGameData.levelNumber = -1;
 
 
175
 
 
 
176
        if(NGT_Coop == netGameData.gameType)
 
 
177
        {
 
 
178
            for(i=0; i < MAX_NO_OF_COOPERATIVE_EPISODES; i++)
 
 
179
            {
 
 
180
                if(!strcmp(AvP.LevelName, CoopMaps[i].filename))
 
 
181
                {
 
 
182
                    netGameData.levelNumber = i;
 
 
183
                    break;
 
 
184
                }
 
 
185
            }
 
 
186
 
 
 
187
            for(; (-1 == netGameData.levelNumber) && (i < NumCoopLevels); i++)
 
 
188
            {
 
 
189
                if(!strcmp(AvP.LevelName + 7, CoopLevelNames[i])) // +7 = remove 'custom/'
 
 
190
                {
 
 
191
                    netGameData.levelNumber = i;
 
 
192
                }
 
 
193
            }
 
 
194
        }
 
 
195
        else
 
 
196
        {
 
 
197
            for(i=0; i < MAX_NO_OF_MULTIPLAYER_EPISODES; i++)
 
 
198
            {
 
 
199
                if(!strcmp(AvP.LevelName, MultiplayerMaps[i].filename))
 
 
200
                {
 
 
201
                    netGameData.levelNumber = i;
 
 
202
                    break;
 
 
203
                }
 
 
204
            }
 
 
205
 
 
 
206
            for(; (-1 == netGameData.levelNumber) && (i < NumMultiplayerLevels); i++)
 
 
207
            {
 
 
208
                if(!strcmp(AvP.LevelName + 7, MultiplayerLevelNames[i]))
 
 
209
                {
 
 
210
                    netGameData.levelNumber = i;
 
 
211
                    break;
 
 
212
                }
 
 
213
            }
 
 
214
        }
 
 
215
 
 
 
216
        if(netGameData.levelNumber < 0)
 
 
217
            netGameData.levelNumber = 0; //we don't have the level
 
 
218
 
 
 
219
        AvP.level = netGameData.levelNumber;
 
 
220
 
 
 
221
        fclose(file);
 
 
222
    }
 
 
223
}
 
 
224
 
 
 
225
void SaveMultiplayerConfiguration(const char* name)
 
 
226
{
 
 
227
    char filename[200];
 
 
228
 
 
 
229
    sprintf(filename,"%s%c%s.%scfg", MP_CONFIG_DIR, DIR_SEPARATOR, name, ((Skirmish == AvP.PlayMode) ? "skirmish_" : "" ));
 
 
230
 
 
 
231
    FILE* file = OpenGameFile(filename, 0, FILETYPE_CONFIG);
 
 
232
 
 
 
233
    if (file == NULL)
 
 
234
    {
 
 
235
        CreateGameDirectory(MP_CONFIG_DIR); /* try again */
 
 
236
 
 
 
237
        file = OpenGameFile(filename, 0, FILETYPE_CONFIG);
 
 
238
 
 
 
239
        if (file == NULL)
 
 
240
            return;
 
 
241
    }
 
 
242
 
 
 
243
    fwrite(&netGameData, sizeof(netGameData), 1, file);
 
 
244
    fwrite(&MP_SessionName[0], sizeof(char), 13, file);
 
 
245
 
 
 
246
    //write the description of the config
 
 
247
    int length = strlen(MP_Config_Description)+1;
 
 
248
    fwrite(&length, sizeof(int), 1, file);
 
 
249
    fwrite(MP_Config_Description, 1, length, file);
 
 
250
 
 
 
251
    length = strlen(AvP.LevelName) + 1;
 
 
252
    fwrite(&length, sizeof(int), 1, file);
 
 
253
    fwrite(AvP.LevelName, 1, length, file);
 
 
254
 
 
 
255
    fclose(file);
 
 
256
 
 
 
257
    //clear the last description stuff
 
 
258
    free(LastDescriptionFile);
 
 
259
    LastDescriptionFile = NULL;
 
 
260
    free(LastDescriptionText);
 
 
261
    LastDescriptionText = NULL;
 
 
262
}
 
 
263
 
 
 
264
void SaveIPAddress(const char* name, const char* address)
 
 
265
{
 
 
266
    if(!name || !address || !strlen(name) || !strlen(address))
 
 
267
        return;
 
 
268
 
 
 
269
    char filename[200];
 
 
270
    sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
 
 
271
 
 
 
272
    FILE* file = OpenGameFile(filename, 0, FILETYPE_CONFIG);
 
 
273
 
 
 
274
    if (file == NULL)
 
 
275
    {
 
 
276
        CreateGameDirectory(IP_ADDRESS_DIR); /* try again */
 
 
277
 
 
 
278
        file = OpenGameFile(filename, 0, FILETYPE_CONFIG);
 
 
279
 
 
 
280
        if (file == NULL)
 
 
281
             return;
 
 
282
    }
 
 
283
 
 
 
284
    fwrite(address,1,strlen(address)+1,file);
 
 
285
 
 
 
286
    fclose(file);
 
 
287
}
 
 
288
 
 
 
289
void LoadIPAddress(const char* name)
 
 
290
{
 
 
291
    extern char IPAddressString[]; 
 
 
292
 
 
 
293
    if(!name)
 
 
294
        return;
 
 
295
 
 
 
296
    FILE* file;
 
 
297
    char filename[200];
 
 
298
    sprintf(filename,"%s/%s.IP Address",IP_ADDRESS_DIR,name);
 
 
299
 
 
 
300
    file = OpenGameFile(filename, 1, FILETYPE_CONFIG);
 
 
301
 
 
 
302
    if(!file)
 
 
303
        return;
 
 
304
 
 
 
305
    fread(IPAddressString,1,16,file);
 
 
306
    IPAddressString[15]=0;
 
 
307
 
 
 
308
    fclose(file);
 
 
309
}
 
 
310
 
 
 
311
void cleanup_strings()
 
 
312
{
 
 
313
    int i;
 
 
314
 
 
 
315
    for(i=0; i < custom_coop_skirmish_levels; i++)
 
 
316
        free((void*)CoopLevelNames[MAX_NO_OF_COOPERATIVE_EPISODES + i]);
 
 
317
 
 
 
318
    for(i=0; i < custom_multiplayer_levels; i++)
 
 
319
        free((void*)MultiplayerLevelNames[MAX_NO_OF_MULTIPLAYER_EPISODES + i]);
 
 
320
 
 
 
321
    free(MultiplayerLevelNames);
 
 
322
    free(CoopLevelNames);
 
 
323
}
 
 
324
 
 
 
325
extern void *OpenGameDirectory(const char *dirname, const char *pattern, int type);
 
 
326
extern GameDirectoryFile *ScanGameDirectory(void *dir);
 
 
327
 
 
 
328
void BuildMultiplayerLevelNameArray()
 
 
329
{
 
 
330
    //first do a search for custom level rifs
 
 
331
    // allow a wildcard search
 
 
332
    void *gd;
 
 
333
 
 
 
334
    char ** CustomCoopSkirmishLevelNameList = malloc(sizeof(char*)* 14); // 14 = all avp gold map packs installed
 
 
335
    char ** CustomMultiPlayerLevelNameList = malloc(sizeof(char*)* 14); // 14 = all avp gold map packs installed
 
 
336
 
 
 
337
    /* TODO: Have to use PERM until the load_rif code can handle CONFIG */
 
 
338
    if ((gd = OpenGameDirectory("avp_rifs/custom/", "*.rif", FILETYPE_GAMEDATA)) != NULL)
 
 
339
    {
 
 
340
        GameDirectoryFile *gdf;
 
 
341
 
 
 
342
        while ((gdf = ScanGameDirectory(gd)) != NULL)
 
 
343
        {
 
 
344
            if ((gdf->attr & FILEATTR_DIRECTORY) || !(gdf->attr & FILEATTR_READABLE))
 
 
345
                continue;
 
 
346
 
 
 
347
            char * level_rif = strstr(gdf->filename, ".rif");
 
 
348
 
 
 
349
            if(NULL != level_rif)
 
 
350
            {
 
 
351
                int custom_filename_len = strlen(gdf->filename);
 
 
352
 
 
 
353
                char *custom_map = malloc(custom_filename_len + 1);
 
 
354
 
 
 
355
                if(NULL == custom_map)
 
 
356
                    break;
 
 
357
 
 
 
358
                strncpy(custom_map, gdf->filename, custom_filename_len + 1);
 
 
359
 
 
 
360
                if(NULL != strstr(gdf->filename, "(c)"))
 
 
361
                {
 
 
362
                    if(custom_coop_skirmish_levels > 13)
 
 
363
                    {
 
 
364
                        char **ptr = (char**)realloc(CustomCoopSkirmishLevelNameList,(sizeof(char**) * (14 + custom_coop_skirmish_levels + 1)));
 
 
365
 
 
 
366
                        if(NULL != ptr)
 
 
367
                        {
 
 
368
                            CustomCoopSkirmishLevelNameList = ptr;
 
 
369
                        }
 
 
370
                        else
 
 
371
                        break;
 
 
372
                    }
 
 
373
 
 
 
374
                    CustomCoopSkirmishLevelNameList[custom_coop_skirmish_levels++] = custom_map;
 
 
375
                }
 
 
376
                else
 
 
377
                {
 
 
378
                    if(custom_multiplayer_levels > 13)
 
 
379
                    {
 
 
380
                        char **ptr= (char**)realloc(CustomMultiPlayerLevelNameList, (sizeof(char**) * (14 + custom_multiplayer_levels + 1)));
 
 
381
 
 
 
382
                        if(NULL != ptr)
 
 
383
                        {
 
 
384
                            CustomMultiPlayerLevelNameList = ptr;
 
 
385
                        }
 
 
386
                        else
 
 
387
                        break;
 
 
388
                    }
 
 
389
 
 
 
390
                    CustomMultiPlayerLevelNameList[custom_multiplayer_levels++] = custom_map;
 
 
391
                }
 
 
392
            }
 
 
393
        }
 
 
394
 
 
 
395
        CloseGameDirectory(gd);
 
 
396
    }
 
 
397
    else
 
 
398
    {
 
 
399
        CreateGameDirectory("custom"); // maybe it didn't exist..
 
 
400
    }
 
 
401
 
 
 
402
    NumMultiplayerLevels = MAX_NO_OF_MULTIPLAYER_EPISODES + custom_multiplayer_levels;
 
 
403
    NumCoopLevels += custom_coop_skirmish_levels;
 
 
404
 
 
 
405
    MultiplayerLevelNames = malloc(sizeof(char*) * NumMultiplayerLevels);
 
 
406
 
 
 
407
    int i=0;
 
 
408
    //first the standard multiplayer levels
 
 
409
    for(i=0; i < MAX_NO_OF_MULTIPLAYER_EPISODES; i++)
 
 
410
        MultiplayerLevelNames[i] = MultiplayerMaps[i].pretty_name;
 
 
411
 
 
 
412
    CoopLevelNames = malloc(sizeof(char*) * NumCoopLevels);
 
 
413
 
 
 
414
    //and the standard coop levels
 
 
415
    for(i=0; i < MAX_NO_OF_COOPERATIVE_EPISODES; i++)
 
 
416
        CoopLevelNames[i] = CoopMaps[i].pretty_name;
 
 
417
 
 
 
418
    for(i=0; i < custom_coop_skirmish_levels; i++)
 
 
419
        CoopLevelNames[MAX_NO_OF_COOPERATIVE_EPISODES + i] = CustomCoopSkirmishLevelNameList[i];
 
 
420
 
 
 
421
    for(i=0; i < custom_multiplayer_levels; i++)
 
 
422
        MultiplayerLevelNames[MAX_NO_OF_MULTIPLAYER_EPISODES + i] = CustomMultiPlayerLevelNameList[i];
 
 
423
 
 
 
424
    free(CustomCoopSkirmishLevelNameList);
 
 
425
    free(CustomMultiPlayerLevelNameList);
 
 
426
}