Rename t_items.qc to items.qc
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / campaign_file.qc
1 #include "campaign_file.qh"
2 #if defined(CSQC)
3 #elif defined(MENUQC)
4 #elif defined(SVQC)
5     #include "util.qh"
6     #include "campaign_common.qh"
7 #endif
8
9 // CampaignFileLoad(offset, n)
10 // - Loads campaign level data (up to n entries starting at offset)
11 //   into the globals
12 // - Returns the number of entries successfully read
13 float CampaignFile_Load(int offset, float n)
14 {
15         float fh;
16         float lineno;
17         float entlen;
18         float i;
19         string l, a;
20         string fn;
21
22         if(n > CAMPAIGN_MAX_ENTRIES)
23                 n = CAMPAIGN_MAX_ENTRIES;
24
25         campaign_offset = offset;
26         campaign_entries = 0;
27         campaign_title = string_null;
28
29         fn = language_filename(strcat("maps/campaign", campaign_name, ".txt"));
30         fh = fopen(fn, FILE_READ);
31         if(fh >= 0)
32         {
33                 for(lineno = 0; (l = fgets(fh)); )
34                 {
35                         if(strlen(l) == 0)
36                                 continue; // empty line
37                         if(substring(l, 0, 11) == "//campaign:")
38                                 campaign_title = substring(l, 11, strlen(l) - 11);
39                         if(substring(l, 0, 2) == "//")
40                                 continue; // comment
41                         if(substring(l, 0, 12) == "\"//campaign:")
42                                 campaign_title = substring(l, 12, strlen(l) - 13);
43                         if(substring(l, 0, 3) == "\"//")
44                                 continue; // comment
45                         if(lineno >= offset)
46                         {
47                                 entlen = tokenize(l); // using insane tokenizer for CSV
48
49 #define CAMPAIGN_GETARG \
50         a = argv(++i); \
51         if(a == ",") \
52                 a = ""; \
53         else \
54                 ++i
55
56                                 i = -1; // starts at -1 so I don't need postincrement; that is, i points to BEFORE the current arg!
57                                 CAMPAIGN_GETARG; campaign_gametype[campaign_entries] = strzone(a);
58                                 CAMPAIGN_GETARG; campaign_mapname[campaign_entries] = strzone(a);
59                                 CAMPAIGN_GETARG; campaign_bots[campaign_entries] = stof(a);
60                                 CAMPAIGN_GETARG; campaign_botskill[campaign_entries] = stof(a);
61                                 CAMPAIGN_GETARG; campaign_fraglimit[campaign_entries] = strzone(a);
62                                 CAMPAIGN_GETARG; campaign_timelimit[campaign_entries] = strzone(a);
63                                 CAMPAIGN_GETARG; campaign_mutators[campaign_entries] = strzone(a);
64                                 CAMPAIGN_GETARG; campaign_shortdesc[campaign_entries] = strzone(a);
65                                 CAMPAIGN_GETARG; campaign_longdesc[campaign_entries] = strzone(strreplace("\\n", "\n", a));
66
67                                 if(i > entlen)
68                                         error("syntax error in campaign file: line has not enough fields");
69
70                                 campaign_entries = campaign_entries + 1;
71
72                                 if(campaign_entries >= n)
73                                         break;
74                         }
75                         lineno = lineno + 1;
76                 }
77                 fclose(fh);
78         }
79
80         campaign_title = strzone(campaign_title);
81
82         return campaign_entries;
83 }
84
85 void CampaignFile_Unload()
86 {
87         if(campaign_title)
88         {
89                 strfree(campaign_title);
90                 for(int i = 0; i < campaign_entries; ++i)
91                 {
92                         strfree(campaign_gametype[i]);
93                         strfree(campaign_mapname[i]);
94                         strfree(campaign_fraglimit[i]);
95                         strfree(campaign_timelimit[i]);
96                         strfree(campaign_mutators[i]);
97                         strfree(campaign_shortdesc[i]);
98                         strfree(campaign_longdesc[i]);
99                 }
100                 campaign_entries = 0;
101         }
102 }