]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/xonotic/credits.qc
Update credits
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / credits.qc
1 #include "credits.qh"
2
3 #define CREDITS(TITLE, FUNCTION, PERSON, PERSON_, NL) \
4         TITLE(_("Core Team")) \
5                 PERSON(Rudolf "divVerent" Polzer) \
6                 PERSON(Ant "Antibody" Zucaro) \
7                 PERSON(Antonio "terencehill" Piu) \
8                 PERSON(Marvin "Mirio" Beck) \
9                 PERSON(Merlijn Hofstra) \
10                 PERSON(Ruszkai "CuBe0wL" Ákos) \
11                 PERSON(Tyler "-z-" Mulligan) \
12         NL() \
13         TITLE(_("Extended Team")) \
14                 PERSON(bones_was_here) \
15                 PERSON(David "Cloudwalk" Knapp) \
16                 PERSON(Freddy) \
17                 PERSON(Halogene) \
18                 PERSON(Jan "zykure" Behrens) \
19                 PERSON(Morosophos) \
20                 PERSON(MrBougo) \
21                 PERSON(nilyt/nyov) \
22                 PERSON(Nitroxis) \
23                 PERSON(packer) \
24                 PERSON(Severin "sev" Meyer) \
25                 PERSON(Thomas "illwieckz" Debesse) \
26                 PERSON(Victor "LegendGuard" Jaume) \
27                 PERSON(Yannick "SpiKe" Le Guen) \
28                 PERSON(z411) \
29         NL() \
30         NL() \
31         FUNCTION(_("Website")) \
32                 PERSON(Ant "Antibody" Zucaro (web)) \
33                 PERSON(Freddy) \
34                 PERSON(Merlijn Hofstra) \
35                 PERSON(Tyler "-z-" Mulligan (web / game)) \
36         NL() \
37         FUNCTION(_("Stats")) \
38                 PERSON(Ant "Antibody" Zucaro) \
39                 PERSON(Jan "zykure" Behrens) \
40         NL() \
41         FUNCTION(_("Art")) \
42                 PERSON(Severin "sev" Meyer) \
43                 PERSON(Sahil "DiaboliK" Singhal) \
44                 PERSON(Peter "Morphed" Pielak) \
45                 PERSON(Sam "LJFHutch" Hutchinson) \
46                 PERSON(Pearce "theShadow" Michal) \
47                 PERSON(KingPimpCommander) \
48         NL() \
49         FUNCTION(_("Animation")) \
50                 PERSON(Sahil "DiaboliK" Singhal) \
51                 PERSON(nifrek) \
52         NL() \
53         FUNCTION(_("Campaign")) \
54                 PERSON(Marvin "Mirio" Beck) \
55         NL() \
56         FUNCTION(_("Level Design")) \
57                 PERSON(Amadeusz "amade/proraide" Sławiński) \
58                 PERSON(Ben "MooKow" Banker) \
59                 PERSON(cityy) \
60                 PERSON(Cortez) \
61                 PERSON(Cuinn "Cuinnton" Herrick) \
62                 PERSON(Debugger) \
63                 PERSON(Hugo "Calinou" Locurcio) \
64                 PERSON(Jakob "tZork" Markström Gröhn) \
65                 PERSON(Konrad "Justin" Slawinski) \
66                 PERSON(Maddin) \
67                 PERSON(L0) \
68                 PERSON(Łukasz "kuniu the frogg" Polek) \
69                 PERSON(Maik "SavageX" Merten) \
70                 PERSON(Marvin "Mirio" Beck) \
71                 PERSON(MintOX) \
72                 PERSON(packer) \
73                 PERSON(Pearce "theShadow" Michal) \
74                 PERSON(Rasmus "FruitieX" Eskola) \
75                 PERSON(Ruszkai "CuBe0wL" Ákos) \
76                 PERSON(Severin "sev" Meyer) \
77                 PERSON(ShadoW) \
78                 PERSON(t0uYK8Ne) \
79                 PERSON(Yannick "SpiKe" Le Guen) \
80         NL() \
81         FUNCTION(_("Music / Sound FX")) \
82                 PERSON(AquaNova (Archer)) \
83                 PERSON(blkrbt) \
84                 PERSON(chooksta) \
85                 PERSON(Independent.nu) \
86                 PERSON(Lea "TheAudioMonkey" Edwards) \
87                 PERSON([master]mind) \
88                 PERSON(Merlijn Hofstra) \
89                 PERSON(Mick Rippon) \
90                 PERSON(Nick "bitbomb" Lucca) \
91                 PERSON(remaxim) \
92                 PERSON(Saulo "mand1nga" Gil) \
93                 PERSON({SC0RP} - Ian "ID" Dorrell) \
94                 PERSON(Stephan) \
95                 PERSON(unfa) \
96         NL() \
97         FUNCTION(_("Game Code")) \
98                 PERSON(Antonio "terencehill" Piu) \
99                 PERSON(bones_was_here) \
100                 PERSON(Dr. Jaska) \
101                 PERSON(Jakob "tZork" Markström Gröhn) \
102                 PERSON(martin-t) \
103                 PERSON(Mattia "Melanosuchus" Basaglia) \
104                 PERSON(Matthias "matthiaskrgr" Krüger) \
105                 PERSON(Rasmus "FruitieX" Eskola) \
106                 PERSON(Rudolf "divVerent" Polzer) \
107                 PERSON(Samual "Ares" Lenks) \
108                 PERSON(TimePath) \
109                 PERSON(Victor "LegendGuard" Jaume) \
110                 PERSON(z411) \
111                 PERSON(Zac "Mario" Jardine) \
112         NL() \
113         FUNCTION(_("Marketing / PR")) \
114                 PERSON(Tyler "-z-" Mulligan) \
115                 PERSON(Ruszkai "CuBe0wL" Ákos) \
116                 PERSON(Samual "Ares" Lenks) \
117                 PERSON(Saulo "mand1nga" Gil) \
118         NL() \
119         FUNCTION(_("Legal")) \
120                 PERSON(Rudolf "divVerent" Polzer) \
121                 PERSON(Merlijn Hofstra) \
122         NL() \
123         NL() \
124         TITLE(_("Game Engine")) \
125                 FUNCTION("DarkPlaces") \
126                         PERSON(Ashley Rose "LadyHavoc" Hale) \
127                 NL() \
128                 FUNCTION(_("Engine Additions")) \
129                         PERSON(David "Cloudwalk" Knapp) \
130                         PERSON(Rudolf "divVerent" Polzer) \
131                         PERSON(Samual "Ares" Lenks) \
132                 NL() \
133         NL() \
134         TITLE(_("Compiler")) \
135                 FUNCTION("GMQCC") \
136                         PERSON(Wolfgang "Blub\0" Bumiller) \
137                         PERSON(Dale "graphitemaster" Weiler) \
138                 NL() \
139         NL() \
140         TITLE(_("Other Active Contributors")) \
141                 PERSON(Jeff) \
142                 PERSON(Mircea "Taoki" Kitsune) \
143                 PERSON(Penguinum) \
144                 PERSON(slava) \
145         NL() \
146         NL() \
147         TITLE(_("Translators")) \
148                 NL() \
149                 FUNCTION(_("Asturian")) \
150                         PERSON(Llumex03) \
151                         PERSON(Tornes "Tornes.Llume" Ḷḷume) \
152                         PERSON(Ximielga) \
153                 NL() \
154                 FUNCTION(_("Belarusian")) \
155                         PERSON(Mihail "meequz" Varantsou) \
156                 NL() \
157                 FUNCTION(_("Bulgarian")) \
158                         PERSON(Alexander "alex4o" Bonin) \
159                         PERSON(ifohancroft) \
160                         PERSON(lokster) \
161                         PERSON(Nik "cozmo" Dim) \
162                         PERSON(set_killer) \
163                         PERSON(ubone) \
164                 NL() \
165                 FUNCTION(_("Chinese (China)")) \
166                         PERSON(Antonidas) \
167                         PERSON(Armcoon) \
168                         PERSON(CodingJellyfish) \
169                         PERSON(gee "Largee" Lar) \
170                         PERSON(jiegushijia) \
171                         PERSON(kalawore) \
172                         PERSON(Liang "dxkliu" Liu) \
173                         PERSON(Losier "losierb" Blackheath) \
174                         PERSON(Matthew "wjjmatthew" Wu) \
175                         PERSON(moetale) \
176                         PERSON(sapphireliu) \
177                 NL() \
178                 FUNCTION(_("Chinese (Taiwan)")) \
179                         PERSON(Alisha) \
180                         PERSON(Armcoon) \
181                         PERSON(Jeff "s8321414" Huang) \
182                         PERSON(msn1018927464) \
183                 NL() \
184                 FUNCTION(_("Cornish")) \
185                         PERSON(Nicky "nrowe" Rowe) \
186                 NL() \
187                 FUNCTION(_("Czech")) \
188                         PERSON(Adam "Admi335" Říha) \
189                         PERSON(fasdasd " kitfildom" sdasd) \
190                         PERSON(gamingforyou875) \
191                         PERSON(Jan "kockahonza" Kocka) \
192                         PERSON(Jiří "Havro" Vrána) \
193                         PERSON(shogun assassin/woky) \
194                         PERSON(Superovoce) \
195                         PERSON(Tomáš "CZHeron" Volavka) \
196                 NL() \
197                 FUNCTION(_("Dutch")) \
198                         PERSON(Alexander "freefang" van Dam) \
199                         PERSON(Contijn "Sojiro84" Buijs) \
200                         PERSON(Joeke "Mappack" de Graaf) \
201                         PERSON(Jonathan "Jonakeys" van der Steege) \
202                         PERSON(PinkRobot) \
203                         PERSON(vegiburger) \
204                 NL() \
205                 FUNCTION(_("English (Australia)")) \
206                         PERSON(Matthew "matthewwu2003" Wu) \
207                         PERSON(Laurene "sunflowers" Albrand) \
208                         PERSON(Stuart "Cefiar" Young) \
209                         PERSON(Zac "Mario" Jardine) \
210                 NL() \
211                 FUNCTION(_("Finnish")) \
212                         PERSON(Dr. Jaska) \
213                         PERSON(Heidi Wenger) \
214                         PERSON(Henry "Exitium" Sanmark) \
215                         PERSON(Jaakko Saarikko) \
216                         PERSON(Jonas "PowaTree" Sahlberg) \
217                         PERSON(Oi Suomi On!) \
218                         PERSON(Rasmus "FruitieX" Eskola) \
219                 NL() \
220                 FUNCTION(_("French")) \
221                         PERSON(Gwlanbzh) \
222                         PERSON(Hugo "Calinou" Locurcio) \
223                         PERSON(Kim "coughingmouse" Lee) \
224                         PERSON(Maxime "Taximus" Paradis) \
225                         PERSON(Nicolas "signed" Formichella) \
226                         PERSON(RedGuff) \
227                         PERSON(Thomas "illwieckz" Debesse) \
228                         PERSON(Yannick "SpiKe" Le Guen) \
229                 NL() \
230                 FUNCTION(_("German")) \
231                         PERSON(cvcxc) \
232                         PERSON(Erik "Ablu" Schilling) \
233                         PERSON(Jope "Sless" Withers) \
234                         PERSON(Larson "skps" März) \
235                         PERSON(Marvin "Mirio" Beck) \
236                         PERSON(Paul "Snapper") \
237                         PERSON(Robert "HbmMods" Katzinsky) \
238                         PERSON(Rudolf "divVerent" Polzer) \
239                         PERSON(TheTrueBrot) \
240                         PERSON(Wuzzy) \
241                         PERSON(Yepoleb) \
242                 NL() \
243                 FUNCTION(_("Greek")) \
244                         PERSON_("Γιώργος Καρδάμης") \
245                         PERSON(Hector "The_Smasher_1992" Champipis) \
246                         PERSON(Konstantinos "LDinos" Mihalenas) \
247                         PERSON(MasterWord) \
248                         PERSON(Mensious Mensious) \
249                         PERSON(Savoritias) \
250                         PERSON(Vindex) \
251                         PERSON(Yannis "Evropi" Anthymidis) \
252                 NL() \
253                 FUNCTION(_("Hungarian")) \
254                         PERSON(Ács "acszoltan111" Zoltán) \
255                         PERSON(MmAaXx500) \
256                         PERSON(Peter "fpeterhu" Ferenczy) \
257                         PERSON(Ruszkai "CuBe0wL" Ákos) \
258                         PERSON(xaN1C4n3) \
259                 NL() \
260                 FUNCTION(_("Irish")) \
261                         PERSON(Kevin "kscanne" Scannell) \
262                 NL() \
263                 FUNCTION(_("Italian")) \
264                         PERSON(Antonio "terencehill" Piu) \
265                         PERSON(Felice "MaidenBeast" Sallustio) \
266                         PERSON(Jessica Amoruso) \
267                         PERSON(stdi) \
268                         PERSON(XCostaX) \
269                 NL() \
270                 FUNCTION(_("Japanese")) \
271                         PERSON(Antoni Das) \
272                         PERSON(Lento) \
273                         PERSON(Space Ace) \
274                         PERSON(RYU "ryusho2523" N.) \
275                         PERSON(Victor "LegendGuard" Jaume) \
276                         PERSON(z411) \
277                 NL() \
278                 FUNCTION(_("Kazakh")) \
279                         PERSON(Артем "bystrov.arterm" Быстров) \
280                 NL() \
281                 FUNCTION(_("Korean")) \
282                         PERSON(BYEONGJIN "ahnkoon" AN) \
283                         PERSON(Jisoo "LimJiSoo0719" Lim) \
284                         PERSON(Kim "coughingmouse" Lee) \
285                 NL() \
286                 FUNCTION(_("Polish")) \
287                         PERSON(4m) \
288                         PERSON(Alex "tiprogrammierer.alex" Progger) \
289                         PERSON(Amadeusz "amade/proraide" Sławiński) \
290                         PERSON(Artur "artur9010" Motyka) \
291                         PERSON(Cris "Kshyso" Sus) \
292                         PERSON(Jakub "_Mpcs" Niklas) \
293                         PERSON(Jakub "KubeQ11" Pędziszewski) \
294                         PERSON(John "Myran" Smith) \
295                         PERSON(Karol "kRkk" Kosek) \
296                         PERSON(Kriss "Kriss7475" Chr) \
297                         PERSON(Piotr "vipkoza" Kozica) \
298                         PERSON(Rafał "Okava" Szymański) \
299                         PERSON(Robert "Szkodnix" Wolniak) \
300                         PERSON(Saikuru "saikuru0" Zero) \
301                         PERSON(Sertomas) \
302                         PERSON(SFS Atlas) \
303                 NL() \
304                 FUNCTION(_("Portuguese")) \
305                         PERSON(Ivan Paulos "greylica" Tomé) \
306                         PERSON(Jean Trindade "Muleke_Trairao" Pereira) \
307                         PERSON(lecalam) \
308                         PERSON(NotThatPrivate) \
309                         PERSON(Ricardo Manuel "hellgardia" da Cruz Coelho da Silva) \
310                         PERSON(Rui "xendez") \
311                         PERSON(xXxCHAOTICxXx) \
312                 NL() \
313                 FUNCTION(_("Portuguese (Brazil)")) \
314                         PERSON(Jean Trindade "Muleke_Trairao" Pereira) \
315                         PERSON(Rui "xendez") \
316                         PERSON(yy0zz) \
317                         PERSON(zerowhy) \
318                 NL() \
319                 FUNCTION(_("Romanian")) \
320                         PERSON(Adrian-Ciprian "adrian.tinjala" Tînjală) \
321                         PERSON(busterdbk) \
322                         PERSON(Cuzenco "andonis1616" Andrei Robert) \
323                         PERSON(Iulian "ElektroBoom" Oancea) \
324                         PERSON(Mircea "Taoki" Kitsune) \
325                         PERSON(Sorin "unic_sorin" Botirla) \
326                         PERSON(Tudor "TropiKo" Ionel) \
327                 NL() \
328                 FUNCTION(_("Russian")) \
329                         PERSON(Alex "alextalker7" Talker) \
330                         PERSON(Alexandr "zrg") \
331                         PERSON(Andrei "adem4ik" Stepanov) \
332                         PERSON(Andrey "dekrY" P.) \
333                         PERSON(Artem Vorotnikov) \
334                         PERSON(Blueberryy) \
335                         PERSON(gravicappa) \
336                         PERSON(Hot Dog) \
337                         PERSON(Lord Canistra) \
338                         PERSON(Morosophos) \
339                         PERSON(Nikoli) \
340                         PERSON(Sergej "Clearness High" Lutsyk) \
341                         PERSON(Simple88) \
342                 NL() \
343                 FUNCTION(_("Scottish Gaelic")) \
344                         PERSON_("GunChleoc") \
345                 NL() \
346                 FUNCTION(_("Serbian")) \
347                         PERSON_("Саша \"salepetronije\" Петровић") \
348                         PERSON(Marko M. Kostić) \
349                         PERSON(Pendulla) \
350                         PERSON(Rafael "Ristovski") \
351                 NL() \
352                 FUNCTION(_("Spanish")) \
353                         PERSON_("0000simon") \
354                         PERSON(Alan "aagp" Garcia) \
355                         PERSON(Antonio "Antoniosirc" Sirera) \
356                         PERSON(Ari_tent) \
357                         PERSON(brunodeleo) \
358                         PERSON(Damian "starfire24680" Kurek) \
359                         PERSON(Excruciatus "crucesignatus" X) \
360                         PERSON(Kammy) \
361                         PERSON(roader_gentoo) \
362                         PERSON(Rodrigo Mouton Laudin) \
363                         PERSON(SouL) \
364                         PERSON(Starfire24680) \
365                         PERSON(Victor "LegendGuard" Jaume) \
366                         PERSON(Vitama Piru Leta) \
367                         PERSON(Yllelder) \
368                         PERSON(z411) \
369                 NL() \
370                 FUNCTION(_("Swedish")) \
371                         PERSON(Gustaf "Hanicef" Alhäll) \
372                         PERSON(Karl-Oskar "machine" Rikås) \
373                         PERSON(marcus256) \
374                 NL() \
375                 FUNCTION(_("Turkish")) \
376                         PERSON(Abdurrahman "akkus12345" AKKUŞ) \
377                         PERSON(Ahmet "ahmetlii") \
378                         PERSON(Çağlar "caglarturali" Turalı) \
379                         PERSON(Demiray "tulliana" Muhterem) \
380                         PERSON(Gokdeniz.Kucukali) \
381                         PERSON(ibra kap) \
382                         PERSON(yutyocraft) \
383                 NL() \
384                 FUNCTION(_("Ukrainian")) \
385                         PERSON(Dmitro "Gamebot" Sokhin) \
386                         PERSON(Ihor "uandreew" Andreev) \
387                         PERSON(Oleh "BlaXpirit" Prypin) \
388                         PERSON(Vasyl "Harmata" Melnyk) \
389                         PERSON(Yuriy "herrniemand" Ackermann) \
390                 NL() \
391         NL() \
392         TITLE(_("Past Contributors")) \
393                 PERSON(Akari) \
394                 PERSON(Alexander "naryl" Suhoverhov) \
395                 PERSON(Alexander "motorsep" Zubov) \
396                 PERSON(Amos "torus" Dudley) \
397                 PERSON(Andreas "Black" Kirsch) \
398                 PERSON(Attila "WW3" Houtkooper) \
399                 PERSON(BigMac) \
400                 PERSON(Braden "meoblast001" Walters) \
401                 PERSON(Brain Younds) \
402                 PERSON(BuddyFriendGuy) \
403                 PERSON(Chris "amethyst7" Matz) \
404                 PERSON(Christian Ice) \
405                 PERSON(Clinton "Kaziganthe" Freeman) \
406                 PERSON(Dan "Digger" Korostelev) \
407                 PERSON(Dan "Wazat" Hale) \
408                 PERSON(Diomedes) \
409                 PERSON(Dokujisan) \
410                 PERSON(Donkey) \
411                 PERSON(dstrek) \
412                 PERSON(Dustin Geeraert) \
413                 PERSON(Edgenetwork) \
414                 PERSON(Edward "Ed" Holness) \
415                 PERSON(Eric "Munyul Verminard" Sambach) \
416                 PERSON(Erik "Ablu" Schilling) \
417                 PERSON(Fabien "H. Reaper" Tschirhart) \
418                 PERSON(Florian Paul "lda17h" Schmidt) \
419                 PERSON(FrikaC) \
420                 PERSON(Garth "Zombie" Hendy) \
421                 PERSON(GATTS) \
422                 PERSON(Gerd "Elysis" Raudenbusch) \
423                 PERSON(Gottfried "Toddd" Hofmann) \
424                 PERSON(Henning "Tymo" Janssen) \
425                 PERSON(Innovati) \
426                 PERSON(JH0nny) \
427                 PERSON(Jitspoe) \
428                 PERSON(Jody Gallagher) \
429                 PERSON(Jope "Sless" Withers) \
430                 PERSON(Jubilant) \
431                 PERSON(Juergen "LowDragon" Timm) \
432                 PERSON(KadaverJack) \
433                 PERSON(Kevin "Tyrann" Shanahan) \
434                 PERSON(Kristian "morfar" Johansson) \
435                 PERSON(Kurt Dereli) \
436                 PERSON(lcatlnx) \
437                 PERSON(Lee David Ash) \
438                 PERSON(Lee Vermeulen) \
439                 PERSON(leileilol) \
440                 PERSON(Lyberta) \
441                 PERSON(magorian) \
442                 PERSON(Marius "GreEn`mArine" Shekow) \
443                 PERSON(Marko "Urre" Permanto) \
444                 PERSON(Mathieu "Elric" Olivier) \
445                 PERSON(Mattrew "Tronyn" Rye) \
446                 PERSON(MauveBib) \
447                 PERSON(Mephisto) \
448                 PERSON(michaelb) \
449                 PERSON(Michael "Tenshihan" Quinn) \
450                 PERSON(Mepper) \
451                 PERSON(Munyul) \
452                 PERSON(Netzwerg) \
453                 PERSON(NoelCower) \
454                 PERSON(Parapraxis) \
455                 PERSON(parasti) \
456                 PERSON(Paul "Strahlemann" Evers) \
457                 PERSON(Paul Scott) \
458                 PERSON(Petithomme) \
459                 PERSON(PlasmaSheep) \
460                 PERSON(Przemysław "atheros" Grzywacz) \
461                 PERSON(Q1 Retexturing Project) \
462                 PERSON(Qantourisc) \
463                 PERSON(Oleh "BlaXpirit" Prypin) \
464                 PERSON(Rick "Rat" Kelley) \
465                 PERSON(Robert "ai" Kuroto) \
466                 PERSON(Ronan) \
467                 PERSON(Sajt) \
468                 PERSON(Samual "Ares" Lenks) \
469                 PERSON(Saulo "mand1nga" Gil) \
470                 PERSON(Shaggy) \
471                 PERSON(Shank) \
472                 PERSON(s1lence) \
473                 PERSON(Simon O’Callaghan) \
474                 PERSON(Soelen) \
475                 PERSON(SomeGuy) \
476                 PERSON(SoulKeeper_p) \
477                 PERSON(Spike) \
478                 PERSON(Spirit) \
479                 PERSON(Stephan "esteel" Stahl) \
480                 PERSON(Steve Vermeulen) \
481                 PERSON(Supajoe) \
482                 PERSON(Sydes) \
483                 PERSON(Tei) \
484                 PERSON(The player with the unnecessarily long name) \
485                 PERSON(Tomaz) \
486                 PERSON(Ulrich Galbraith) \
487                 PERSON(Vortex) \
488                 PERSON(William Libert) \
489                 PERSON(William "Willis" Weilep) \
490                 PERSON(Yves "EviLair" Allaire) \
491                 PERSON(Zac "Mario" Jardine) \
492                 PERSON(Zenex) \
493                 PERSON(... and a goat) \
494                 /**/
495
496
497 int CREDITS_TYPE_TITLE = 2;
498 int CREDITS_TYPE_FUNCTION = 1;
499 int CREDITS_TYPE_PERSON = 0;
500 int CREDITS_TYPE_NL = -1;
501 void credits_add_line(int fh, int n, int type, string line)
502 {
503         if (type == CREDITS_TYPE_TITLE)
504                 line = strcat("**", line);
505         else if (type == CREDITS_TYPE_FUNCTION)
506                 line = strcat("*", line);
507
508         if (fh >= 0)
509                 fputs(fh, strcat(line, "\n"));
510         if (n >= 0)
511                 bufstr_add(n, line, 0);
512 }
513
514 void credits_build(int fh, int n)
515 {
516         #define CREDITS_TITLE(t) credits_add_line(fh, n, CREDITS_TYPE_TITLE, t);
517         #define CREDITS_FUNCTION(f) credits_add_line(fh, n, CREDITS_TYPE_FUNCTION, f);
518         #define CREDITS_PERSON(p) credits_add_line(fh, n, CREDITS_TYPE_PERSON, p);
519         #define _CREDITS_PERSON(p) CREDITS_PERSON(#p)
520         #define CREDITS_NL() credits_add_line(fh, n, CREDITS_TYPE_NL, "");
521         CREDITS(CREDITS_TITLE, CREDITS_FUNCTION, _CREDITS_PERSON, CREDITS_PERSON, CREDITS_NL)
522         #undef CREDITS_TITLE
523         #undef CREDITS_FUNCTION
524         #undef CREDITS_PERSON
525         #undef _CREDITS_PERSON
526         #undef CREDITS_NL
527 }
528
529 int credits_get()
530 {
531         int n = buf_create();
532         credits_build(-1, n);
533         return n;
534 }
535
536 void credits_export()
537 {
538         int fh = fopen("credits.txt", FILE_WRITE);
539         if(fh < 0)
540                 return;
541         credits_build(fh, -1);
542 }
543
544 #undef CREDITS
545
546 entity makeXonoticCreditsList()
547 {
548         entity me;
549         me = NEW(XonoticCreditsList);
550         me.configureXonoticCreditsList(me);
551         return me;
552 }
553 void XonoticCreditsList_configureXonoticCreditsList(entity me)
554 {
555         me.configureXonoticListBox(me);
556         me.bufferIndex = credits_get();
557         me.nItems = buf_getsize(me.bufferIndex);
558         if (cvar("_menu_credits_export")) // set by the menu_credits_export alias
559         {
560                 credits_export();
561                 cvar_set("_menu_credits_export", "0");
562         }
563 }
564 void XonoticCreditsList_destroy(entity me)
565 {
566         buf_del(me.bufferIndex);
567 }
568 void XonoticCreditsList_draw(entity me)
569 {
570         if(me.scrolling)
571         {
572                 me.scrollPos = bound(0, (time - me.scrolling) * me.itemHeight, me.nItems * me.itemHeight - 1);
573                 me.scrollPosTarget = me.scrollPos;
574         }
575         SUPER(XonoticCreditsList).draw(me);
576 }
577 void XonoticCreditsList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
578 {
579         SUPER(XonoticCreditsList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
580
581         me.realFontSize_y = me.fontSize / (absSize.y * me.itemHeight);
582         me.realFontSize_x = me.fontSize / (absSize.x * (1 - me.controlWidth));
583         me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
584 }
585 void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
586 {
587         string s;
588         float theAlpha;
589         vector theColor;
590
591         s = bufstr_get(me.bufferIndex, i);
592
593         if(substring(s, 0, 2) == "**")
594         {
595                 s = substring(s, 2, strlen(s) - 2);
596                 theColor = SKINCOLOR_CREDITS_TITLE;
597                 theAlpha = SKINALPHA_CREDITS_TITLE;
598         }
599         else if(substring(s, 0, 1) == "*")
600         {
601                 s = substring(s, 1, strlen(s) - 1);
602                 theColor = SKINCOLOR_CREDITS_FUNCTION;
603                 theAlpha = SKINALPHA_CREDITS_FUNCTION;
604         }
605         else
606         {
607                 theColor = SKINCOLOR_CREDITS_PERSON;
608                 theAlpha = SKINALPHA_CREDITS_PERSON;
609         }
610
611         draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, theColor, theAlpha, 0);
612 }
613
614 float XonoticCreditsList_keyDown(entity me, float key, float ascii, float shift)
615 {
616         me.scrolling = 0;
617         return SUPER(XonoticCreditsList).keyDown(me, key, ascii, shift);
618 }