]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/counting.qh
Merge branch 'Mario/teams_bitflag' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / counting.qh
1 #pragma once
2
3 #include "i18n.qh"
4
5 // ===============================================
6 //  Time processing and counting functions/macros
7 // ===============================================
8
9 #define count_years_decs(time, decs) sprintf(CTX(_("CI_DEC^%s years")), ftos_decimals(time, decs))
10 #define count_years(time) \
11         count_fill(time, \
12         _("CI_ZER^%d years"), /* zeroth */ \
13         _("CI_FIR^%d year"),  /* first */ \
14         _("CI_SEC^%d years"), /* year */ \
15         _("CI_THI^%d years"), /* third */ \
16         _("CI_MUL^%d years")) /* multi */
17
18 #define count_weeks_decs(time, decs) sprintf(CTX(_("CI_DEC^%s weeks")), ftos_decimals(time, decs))
19 #define count_weeks(time) \
20         count_fill(time, \
21         _("CI_ZER^%d weeks"), /* zeroth */ \
22         _("CI_FIR^%d week"),  /* first */ \
23         _("CI_SEC^%d weeks"), /* week */ \
24         _("CI_THI^%d weeks"), /* third */ \
25         _("CI_MUL^%d weeks")) /* multi */
26
27 #define count_days_decs(time, decs) sprintf(CTX(_("CI_DEC^%s days")), ftos_decimals(time, decs))
28 #define count_days(time) \
29         count_fill(time, \
30         _("CI_ZER^%d days"), /* zeroth */ \
31         _("CI_FIR^%d day"),  /* first */ \
32         _("CI_SEC^%d days"), /* day */ \
33         _("CI_THI^%d days"), /* third */ \
34         _("CI_MUL^%d days")) /* multi */
35
36 #define count_hours_decs(time, decs) sprintf(CTX(_("CI_DEC^%s hours")), ftos_decimals(time, decs))
37 #define count_hours(time) \
38         count_fill(time, \
39         _("CI_ZER^%d hours"), /* zeroth */ \
40         _("CI_FIR^%d hour"),  /* first */ \
41         _("CI_SEC^%d hours"), /* hour */ \
42         _("CI_THI^%d hours"), /* third */ \
43         _("CI_MUL^%d hours")) /* multi */
44
45
46 #define count_minutes_decs(time, decs) sprintf(CTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs))
47 #define count_minutes(time) \
48         count_fill(time, \
49         _("CI_ZER^%d minutes"), /* zeroth */ \
50         _("CI_FIR^%d minute"),  /* first */ \
51         _("CI_SEC^%d minutes"), /* minute */ \
52         _("CI_THI^%d minutes"), /* third */ \
53         _("CI_MUL^%d minutes")) /* multi */
54
55 #define count_seconds_decs(time, decs) sprintf(CTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs))
56 #define count_seconds(time) \
57         count_fill(time, \
58         _("CI_ZER^%d seconds"), /* zeroth */ \
59         _("CI_FIR^%d second"),  /* first */ \
60         _("CI_SEC^%d seconds"), /* second */ \
61         _("CI_THI^%d seconds"), /* third */ \
62         _("CI_MUL^%d seconds")) /* multi */
63
64 string count_ordinal(int interval)
65 {
66         // This function is designed primarily for the English language, it's impossible
67         // to accomodate all languages unless we do a specific function for each one...
68         // and since that's not technically feasible/practical, this is all we've got folks.
69
70         // Basically, it just allows you to represent a number or count in different ways
71         // depending on the number... like, with count_ordinal you can provide integers
72         // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way.
73         if (floor((interval % 100) / 10) * 10 != 10)  // examples: 12th, 111th, 213th will not execute this block
74         {
75                 // otherwise, check normally for 1st,2nd,3rd insertions
76                 switch (interval % 10)
77                 {
78                         case 1: return sprintf(_("%dst"), interval);
79                         case 2: return sprintf(_("%dnd"), interval);
80                         case 3: return sprintf(_("%drd"), interval);
81                         default: return sprintf(_("%dth"), interval);
82                 }
83         }
84         else { return sprintf(_("%dth"), interval); }
85
86         return "";
87 }
88
89 string count_fill(float interval, string zeroth, string first, string second, string third, string multi)
90 {
91         // This function is designed primarily for the English language, it's impossible
92         // to accomodate all languages unless we do a specific function for each one...
93         // and since that's not technically feasible/practical, this is all we've got folks.
94
95         // Here you can insert specific strings based on the interval number, so you could do
96         // i.e. count_seconds which outputs like this:
97         //   0 seconds
98         //   1 second
99         //   2 seconds
100         //   3 seconds
101         //   etc... minutes, hours, days, etc.
102
103         switch (floor(interval))
104         {
105                 case 0: return sprintf(CTX(zeroth), interval);
106                 case 1:
107                 {
108                         if (interval == 1)  // EXACTLY value of 1
109                                 return sprintf(CTX(first), interval);
110                         else return sprintf(CTX(multi), interval);
111                 }
112                 case 2: return sprintf(CTX(second), interval);
113                 case 3: return sprintf(CTX(third), interval);
114                 default: return sprintf(CTX(multi), interval);
115         }
116         return "";
117 }
118
119 string process_time(float outputtype, float seconds)
120 {
121         float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0;
122         float tmp_years = 0, tmp_weeks = 0, tmp_days = 0;
123
124         tmp_seconds = floor(seconds);
125
126         if (tmp_seconds)
127         {
128                 tmp_minutes = floor(tmp_seconds / 60);
129
130                 if (tmp_minutes)
131                 {
132                         tmp_seconds -= (tmp_minutes * 60);
133                         tmp_hours = floor(tmp_minutes / 60);
134
135                         if (tmp_hours)
136                         {
137                                 tmp_minutes -= (tmp_hours * 60);
138                                 tmp_days = floor(tmp_hours / 24);
139
140                                 if (tmp_days)
141                                 {
142                                         tmp_hours -= (tmp_days * 24);
143                                         tmp_weeks = floor(tmp_days / 7);
144
145                                         if (tmp_weeks)
146                                         {
147                                                 tmp_days -= (tmp_weeks * 7);
148                                                 tmp_years = floor(tmp_weeks / 52);
149                                         }
150                                 }
151                         }
152                 }
153         }
154
155         switch (outputtype)
156         {
157                 case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds);
158                 case 2:
159                 {
160                         string output = "";
161
162                         output = count_seconds(tmp_seconds);
163
164                         if (tmp_minutes)
165                         {
166                                 output = sprintf(
167                                         "%s%s",
168                                         count_minutes(tmp_minutes),
169                                         ((output != "") ? sprintf(", %s", output) : ""));
170                         }
171
172                         if (tmp_hours)
173                         {
174                                 output = sprintf(
175                                         "%s%s",
176                                         count_hours(tmp_hours),
177                                         ((output != "") ? sprintf(", %s", output) : ""));
178                         }
179
180                         if (tmp_days)
181                         {
182                                 output = sprintf(
183                                         "%s%s",
184                                         count_days(tmp_days),
185                                         ((output != "") ? sprintf(", %s", output) : ""));
186                         }
187
188                         if (tmp_weeks)
189                         {
190                                 output = sprintf(
191                                         "%s%s",
192                                         count_weeks(tmp_weeks),
193                                         ((output != "") ? sprintf(", %s", output) : ""));
194                         }
195
196                         if (tmp_years)
197                         {
198                                 output = sprintf(
199                                         "%s%s",
200                                         count_years(tmp_years),
201                                         ((output != "") ? sprintf(", %s", output) : ""));
202                         }
203
204                         return output;
205                 }
206                 case 3:
207                 {
208                         string output = "";
209
210                         output = count_hours(tmp_hours);
211
212                         if (tmp_weeks) tmp_days += (tmp_weeks * 7);
213                         if (tmp_years) tmp_days += (tmp_years * 365);
214                         if (tmp_days)
215                         {
216                                 output = sprintf(
217                                         "%s%s",
218                                         count_days(tmp_days),
219                                         ((output != "") ? sprintf(", %s", output) : ""));
220                         }
221
222                         return output;
223                 }
224         }
225         return "";
226 }