Xonotic
credits.qc
Go to the documentation of this file.
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(Marvin "Mirio" Beck) \
8  PERSON(Merlijn Hofstra) \
9  PERSON(Ruszkai "CuBe0wL" Ákos) \
10  PERSON(Tyler "-z-" Mulligan) \
11  PERSON(Zac "Mario" Jardine) \
12  NL() \
13  TITLE(_("Extended Team")) \
14  PERSON(Antonio "terencehill" Piu) \
15  PERSON(bones_was_here) \
16  PERSON(David "Cloudwalk" Knapp) \
17  PERSON(Freddy) \
18  PERSON(Halogene) \
19  PERSON(Jan "zykure" Behrens) \
20  PERSON(Morosophos) \
21  PERSON(MrBougo) \
22  PERSON(nilyt/nyov) \
23  PERSON(Nitroxis) \
24  PERSON(packer) \
25  PERSON(Severin "sev" Meyer) \
26  PERSON(SpiKe) \
27  PERSON(Thomas "illwieckz" Debesse) \
28  PERSON(Victor "LegendGuard" Jaume) \
29  PERSON(z411) \
30  NL() \
31  NL() \
32  FUNCTION(_("Website")) \
33  PERSON(Ant "Antibody" Zucaro (web)) \
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(_("Level Design")) \
54  PERSON(Amadeusz "amade/proraide" Sławiński) \
55  PERSON(Ben "MooKow" Banker) \
56  PERSON(Cortez) \
57  PERSON(Cuinn "Cuinnton" Herrick) \
58  PERSON(Debugger) \
59  PERSON(Hugo "Calinou" Locurcio) \
60  PERSON(Jakob "tZork" Markström Gröhn) \
61  PERSON(Konrad "Justin" Slawinski) \
62  PERSON(Maddin) \
63  PERSON(L0) \
64  PERSON(Łukasz "kuniu the frogg" Polek) \
65  PERSON(Maik "SavageX" Merten) \
66  PERSON(Marvin "Mirio" Beck) \
67  PERSON(MintOX) \
68  PERSON(packer) \
69  PERSON(Pearce "theShadow" Michal) \
70  PERSON(Rasmus "FruitieX" Eskola) \
71  PERSON(Ruszkai "CuBe0wL" Ákos) \
72  PERSON(Severin "sev" Meyer) \
73  PERSON(ShadoW) \
74  PERSON(t0uYK8Ne) \
75  NL() \
76  FUNCTION(_("Music / Sound FX")) \
77  PERSON(AquaNova (Archer)) \
78  PERSON(blkrbt) \
79  PERSON(chooksta) \
80  PERSON(Independent.nu) \
81  PERSON(Lea "TheAudioMonkey" Edwards) \
82  PERSON([master]mind) \
83  PERSON(Merlijn Hofstra) \
84  PERSON(Mick Rippon) \
85  PERSON(Nick "bitbomb" Lucca) \
86  PERSON(remaxim) \
87  PERSON(Saulo "mand1nga" Gil) \
88  PERSON({SC0RP} - Ian "ID" Dorrell) \
89  PERSON(Stephan) \
90  PERSON(unfa) \
91  NL() \
92  FUNCTION(_("Game Code")) \
93  PERSON(Antonio "terencehill" Piu) \
94  PERSON(Jakob "tZork" Markström Gröhn) \
95  PERSON(martin-t) \
96  PERSON(Mattia "Melanosuchus" Basaglia) \
97  PERSON(Matthias "matthiaskrgr" Krüger) \
98  PERSON(Rasmus "FruitieX" Eskola) \
99  PERSON(Rudolf "divVerent" Polzer) \
100  PERSON(Samual "Ares" Lenks) \
101  PERSON(TimePath) \
102  PERSON(Victor "LegendGuard" Jaume) \
103  PERSON(z411) \
104  PERSON(Zac "Mario" Jardine) \
105  NL() \
106  FUNCTION(_("Marketing / PR")) \
107  PERSON(Tyler "-z-" Mulligan) \
108  PERSON(Ruszkai "CuBe0wL" Ákos) \
109  PERSON(Samual "Ares" Lenks) \
110  PERSON(Saulo "mand1nga" Gil) \
111  NL() \
112  FUNCTION(_("Legal")) \
113  PERSON(Rudolf "divVerent" Polzer) \
114  PERSON(Merlijn Hofstra) \
115  NL() \
116  NL() \
117  TITLE(_("Game Engine")) \
118  FUNCTION("DarkPlaces") \
119  PERSON(Ashley Rose "LadyHavoc" Hale) \
120  NL() \
121  FUNCTION(_("Engine Additions")) \
122  PERSON(David "Cloudwalk" Knapp) \
123  PERSON(Rudolf "divVerent" Polzer) \
124  PERSON(Samual "Ares" Lenks) \
125  NL() \
126  NL() \
127  TITLE(_("Compiler")) \
128  FUNCTION("GMQCC") \
129  PERSON(Wolfgang "Blub\0" Bumiller) \
130  PERSON(Dale "graphitemaster" Weiler) \
131  NL() \
132  NL() \
133  TITLE(_("Other Active Contributors")) \
134  PERSON(Jeff) \
135  PERSON(Mircea "Taoki" Kitsune) \
136  PERSON(Penguinum) \
137  PERSON(slava) \
138  PERSON(Victor "LegendGuard" Jaume) \
139  NL() \
140  NL() \
141  TITLE(_("Translators")) \
142  NL() \
143  FUNCTION(_("Asturian")) \
144  PERSON(Llumex03) \
145  PERSON(Tornes "Tornes.Llume" Ḷḷume) \
146  PERSON(Ximielga) \
147  NL() \
148  FUNCTION(_("Belarusian")) \
149  PERSON(Mihail "meequz" Varantsou) \
150  NL() \
151  FUNCTION(_("Bulgarian")) \
152  PERSON(Alexander "alex4o" Bonin) \
153  PERSON(ifohancroft) \
154  PERSON(lokster) \
155  PERSON(set_killer) \
156  PERSON(ubone) \
157  NL() \
158  FUNCTION(_("Chinese (China)")) \
159  PERSON(Antonidas) \
160  PERSON(Armcoon) \
161  PERSON(kalawore) \
162  PERSON(sapphireliu) \
163  NL() \
164  FUNCTION(_("Chinese (Taiwan)")) \
165  PERSON(Alisha) \
166  PERSON(Armcoon) \
167  PERSON(Jeff "s8321414" Huang) \
168  NL() \
169  FUNCTION(_("Cornish")) \
170  PERSON(Nicky "nrowe" Rowe) \
171  NL() \
172  FUNCTION(_("Czech")) \
173  PERSON(shogun assassin/woky) \
174  PERSON(Superovoce) \
175  PERSON(Tomáš "CZHeron" Volavka) \
176  NL() \
177  FUNCTION(_("Dutch")) \
178  PERSON(Alexander "freefang" van Dam) \
179  PERSON(Joeke "Mappack" de Graaf) \
180  PERSON(Jonathan "Jonakeys" van der Steege) \
181  PERSON(PinkRobot) \
182  PERSON(vegiburger) \
183  NL() \
184  FUNCTION(_("English (Australia)")) \
185  PERSON(Laurene "sunflowers" Albrand) \
186  PERSON(Stuart "Cefiar" Young) \
187  PERSON(Zac "Mario" Jardine) \
188  NL() \
189  FUNCTION(_("Finnish")) \
190  PERSON(Jonas "PowaTree" Sahlberg) \
191  PERSON(Henry "Exitium" Sanmark) \
192  PERSON(Rasmus "FruitieX" Eskola) \
193  NL() \
194  FUNCTION(_("French")) \
195  PERSON(Hugo "Calinou" Locurcio) \
196  PERSON(Kim "coughingmouse" Lee) \
197  PERSON(Maxime "Taximus" Paradis) \
198  PERSON(RedGuff) \
199  PERSON(Thomas "illwieckz" Debesse) \
200  PERSON(Yannick "SpiKe" Le Guen) \
201  NL() \
202  FUNCTION(_("German")) \
203  PERSON(Brot) \
204  PERSON(cvcxc) \
205  PERSON(Erik "Ablu" Schilling) \
206  PERSON(Jope "Sless" Withers) \
207  PERSON(Marvin "Mirio" Beck) \
208  PERSON(Paul "Snapper") \
209  PERSON(Rudolf "divVerent" Polzer) \
210  PERSON(Wuzzy) \
211  PERSON(Yepoleb) \
212  NL() \
213  FUNCTION(_("Greek")) \
214  PERSON_("Γιάννης \"Evropi\" Ανθυμίδης") \
215  PERSON(Konstantinos "LDinos" Mihalenas) \
216  PERSON(Savoritias) \
217  PERSON(Vindex) \
218  NL() \
219  FUNCTION(_("Hungarian")) \
220  PERSON(Ruszkai "CuBe0wL" Ákos) \
221  PERSON(xaN1C4n3) \
222  NL() \
223  FUNCTION(_("Irish")) \
224  PERSON(Kevin "kscanne" Scannell) \
225  NL() \
226  FUNCTION(_("Italian")) \
227  PERSON(Antonio "terencehill" Piu) \
228  PERSON(Felice "MaidenBeast" Sallustio) \
229  PERSON(stdi) \
230  PERSON(XCostaX) \
231  NL() \
232  FUNCTION(_("Japanese")) \
233  PERSON(Victor "LegendGuard" Jaume) \
234  NL() \
235  FUNCTION(_("Kazakh")) \
236  PERSON(Артем "bystrov.arterm" Быстров) \
237  NL() \
238  FUNCTION(_("Korean")) \
239  PERSON(Jisoo "s6e9x" Lim) \
240  PERSON(Kim "coughingmouse" Lee) \
241  NL() \
242  FUNCTION(_("Polish")) \
243  PERSON(4m) \
244  PERSON(Alex "tiprogrammierer.alex" Progger) \
245  PERSON(Amadeusz "amade/proraide" Sławiński) \
246  PERSON(Artur "artur9010" Motyka) \
247  PERSON(Jakub "KubeQ11" Pędziszewski) \
248  PERSON(Kriss7475) \
249  NL() \
250  FUNCTION(_("Portuguese")) \
251  PERSON(Ivan Paulos "greylica" Tomé) \
252  PERSON(Jean Trindade "Muleke_Trairao" Pereira) \
253  PERSON(Ricardo Manuel "Hellgardia" da Cruz Coelho da Silva) \
254  PERSON(xXxCHAOTICxXx) \
255  NL() \
256  FUNCTION(_("Romanian")) \
257  PERSON(Adrian-Ciprian "adrian.tinjala" Tînjală) \
258  PERSON(BusterDBK) \
259  PERSON(Mircea "Taoki" Kitsune) \
260  PERSON(Sorin "unic_sorin" Botirla) \
261  PERSON(Tudor "TropiKo" Ionel) \
262  NL() \
263  FUNCTION(_("Russian")) \
264  PERSON(Alex "alextalker7" Talker) \
265  PERSON(Alexandr "zrg") \
266  PERSON(Andrei "adem4ik" Stepanov) \
267  PERSON(Andrey "dekrY" P.) \
268  PERSON(gravicappa) \
269  PERSON(Hot Dog) \
270  PERSON(Lord Canistra) \
271  PERSON(Nikoli) \
272  PERSON(Sergej "Clearness High" Lutsyk) \
273  NL() \
274  FUNCTION(_("Scottish Gaelic")) \
275  PERSON_("GunChleoc") \
276  NL() \
277  FUNCTION(_("Serbian")) \
278  PERSON_("Саша \"salepetronije\" Петровић") \
279  PERSON(Marko M. Kostić) \
280  PERSON(Pendulla) \
281  PERSON(Rafael "Ristovski") \
282  NL() \
283  FUNCTION(_("Spanish")) \
284  PERSON_("0000simon") \
285  PERSON(Alan "aagp" Garcia) \
286  PERSON(Ari_tent) \
287  PERSON(brunodeleo) \
288  PERSON(Kammy) \
289  PERSON(roader_gentoo) \
290  PERSON(Rodrigo Mouton Laudin) \
291  PERSON(SouL) \
292  PERSON(Starfire24680) \
293  PERSON(Victor "LegendGuard" Jaume) \
294  NL() \
295  FUNCTION(_("Swedish")) \
296  PERSON(Karl-Oskar "machine" Rikås) \
297  PERSON(marcus256) \
298  NL() \
299  FUNCTION(_("Ukrainian")) \
300  PERSON(Dmitro "Gamebot" Sokhin) \
301  PERSON(Oleh "BlaXpirit" Prypin) \
302  PERSON(Vasyl "Harmata" Melnyk) \
303  PERSON(Yuriy "herrniemand" Ackermann) \
304  NL() \
305  NL() \
306  TITLE(_("Past Contributors")) \
307  PERSON(Akari) \
308  PERSON(Alexander "naryl" Suhoverhov) \
309  PERSON(Alexander "motorsep" Zubov) \
310  PERSON(Amos "torus" Dudley) \
311  PERSON(Andreas "Black" Kirsch) \
312  PERSON(Attila "WW3" Houtkooper) \
313  PERSON(BigMac) \
314  PERSON(Braden "meoblast001" Walters) \
315  PERSON(Brain Younds) \
316  PERSON(BuddyFriendGuy) \
317  PERSON(Chris "amethyst7" Matz) \
318  PERSON(Christian Ice) \
319  PERSON(Clinton "Kaziganthe" Freeman) \
320  PERSON(Dan "Digger" Korostelev) \
321  PERSON(Dan "Wazat" Hale) \
322  PERSON(Diomedes) \
323  PERSON(Dokujisan) \
324  PERSON(Donkey) \
325  PERSON(dstrek) \
326  PERSON(Dustin Geeraert) \
327  PERSON(Edgenetwork) \
328  PERSON(Edward "Ed" Holness) \
329  PERSON(Eric "Munyul Verminard" Sambach) \
330  PERSON(Erik "Ablu" Schilling) \
331  PERSON(Fabien "H. Reaper" Tschirhart) \
332  PERSON(Florian Paul "lda17h" Schmidt) \
333  PERSON(FrikaC) \
334  PERSON(Garth "Zombie" Hendy) \
335  PERSON(GATTS) \
336  PERSON(Gerd "Elysis" Raudenbusch) \
337  PERSON(Gottfried "Toddd" Hofmann) \
338  PERSON(Henning "Tymo" Janssen) \
339  PERSON(Innovati) \
340  PERSON(JH0nny) \
341  PERSON(Jitspoe) \
342  PERSON(Jody Gallagher) \
343  PERSON(Jope "Sless" Withers) \
344  PERSON(Jubilant) \
345  PERSON(Juergen "LowDragon" Timm) \
346  PERSON(KadaverJack) \
347  PERSON(Kevin "Tyrann" Shanahan) \
348  PERSON(Kristian "morfar" Johansson) \
349  PERSON(Kurt Dereli) \
350  PERSON(lcatlnx) \
351  PERSON(Lee David Ash) \
352  PERSON(Lee Vermeulen) \
353  PERSON(leileilol) \
354  PERSON(Lyberta) \
355  PERSON(magorian) \
356  PERSON(Marius "GreEn`mArine" Shekow) \
357  PERSON(Marko "Urre" Permanto) \
358  PERSON(Mathieu "Elric" Olivier) \
359  PERSON(Mattrew "Tronyn" Rye) \
360  PERSON(MauveBib) \
361  PERSON(Mephisto) \
362  PERSON(michaelb) \
363  PERSON(Michael "Tenshihan" Quinn) \
364  PERSON(Mepper) \
365  PERSON(Munyul) \
366  PERSON(Netzwerg) \
367  PERSON(NoelCower) \
368  PERSON(Parapraxis) \
369  PERSON(parasti) \
370  PERSON(Paul "Strahlemann" Evers) \
371  PERSON(Paul Scott) \
372  PERSON(Petithomme) \
373  PERSON(PlasmaSheep) \
374  PERSON(Przemysław "atheros" Grzywacz) \
375  PERSON(Q1 Retexturing Project) \
376  PERSON(Qantourisc) \
377  PERSON(Oleh "BlaXpirit" Prypin) \
378  PERSON(Rick "Rat" Kelley) \
379  PERSON(Robert "ai" Kuroto) \
380  PERSON(Ronan) \
381  PERSON(Sajt) \
382  PERSON(Samual "Ares" Lenks) \
383  PERSON(Saulo "mand1nga" Gil) \
384  PERSON(Shaggy) \
385  PERSON(Shank) \
386  PERSON(s1lence) \
387  PERSON(Simon O’Callaghan) \
388  PERSON(Soelen) \
389  PERSON(SomeGuy) \
390  PERSON(SoulKeeper_p) \
391  PERSON(Spike) \
392  PERSON(Spirit) \
393  PERSON(Stephan "esteel" Stahl) \
394  PERSON(Steve Vermeulen) \
395  PERSON(Supajoe) \
396  PERSON(Sydes) \
397  PERSON(Tei) \
398  PERSON(The player with the unnecessarily long name) \
399  PERSON(Tomaz) \
400  PERSON(Ulrich Galbraith) \
401  PERSON(Vortex) \
402  PERSON(William Libert) \
403  PERSON(William "Willis" Weilep) \
404  PERSON(Yves "EviLair" Allaire) \
405  PERSON(Zenex) \
406  PERSON(... and a goat) \
407 
408 
409 
414 void credits_add_line(int fh, int n, int type, string line)
415 {
416  if (type == CREDITS_TYPE_TITLE)
417  line = strcat("**", line);
418  else if (type == CREDITS_TYPE_FUNCTION)
419  line = strcat("*", line);
420 
421  if (fh >= 0)
422  fputs(fh, strcat(line, "\n"));
423  if (n >= 0)
424  bufstr_add(n, line, 0);
425 }
426 
427 void credits_build(int fh, int n)
428 {
429  #define CREDITS_TITLE(t) credits_add_line(fh, n, CREDITS_TYPE_TITLE, t);
430  #define CREDITS_FUNCTION(f) credits_add_line(fh, n, CREDITS_TYPE_FUNCTION, f);
431  #define CREDITS_PERSON(p) credits_add_line(fh, n, CREDITS_TYPE_PERSON, p);
432  #define _CREDITS_PERSON(p) CREDITS_PERSON(#p)
433  #define CREDITS_NL() credits_add_line(fh, n, CREDITS_TYPE_NL, "");
435  #undef CREDITS_TITLE
436  #undef CREDITS_FUNCTION
437  #undef CREDITS_PERSON
438  #undef _CREDITS_PERSON
439  #undef CREDITS_NL
440 }
441 
443 {
444  int n = buf_create();
445  credits_build(-1, n);
446  return n;
447 }
448 
450 {
451  int fh = fopen("credits.txt", FILE_WRITE);
452  if(fh < 0)
453  return;
454  credits_build(fh, -1);
455 }
456 
457 #undef CREDITS
458 
460 {
461  entity me;
462  me = NEW(XonoticCreditsList);
463  me.configureXonoticCreditsList(me);
464  return me;
465 }
467 {
468  me.configureXonoticListBox(me);
469  me.bufferIndex = credits_get();
470  me.nItems = buf_getsize(me.bufferIndex);
471  if (cvar("_menu_credits_export")) // set by the menu_credits_export alias
472  {
473  credits_export();
474  cvar_set("_menu_credits_export", "0");
475  }
476 }
478 {
479  buf_del(me.bufferIndex);
480 }
482 {
483  if(me.scrolling)
484  {
485  me.scrollPos = bound(0, (time - me.scrolling) * me.itemHeight, me.nItems * me.itemHeight - 1);
486  me.scrollPosTarget = me.scrollPos;
487  }
488  SUPER(XonoticCreditsList).draw(me);
489 }
490 void XonoticCreditsList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
491 {
492  SUPER(XonoticCreditsList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
493 
494  me.realFontSize_y = me.fontSize / (absSize.y * me.itemHeight);
495  me.realFontSize_x = me.fontSize / (absSize.x * (1 - me.controlWidth));
496  me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
497 }
498 void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
499 {
500  string s;
501  float theAlpha;
502  vector theColor;
503 
504  s = bufstr_get(me.bufferIndex, i);
505 
506  if(substring(s, 0, 2) == "**")
507  {
508  s = substring(s, 2, strlen(s) - 2);
509  theColor = SKINCOLOR_CREDITS_TITLE;
510  theAlpha = SKINALPHA_CREDITS_TITLE;
511  }
512  else if(substring(s, 0, 1) == "*")
513  {
514  s = substring(s, 1, strlen(s) - 1);
515  theColor = SKINCOLOR_CREDITS_FUNCTION;
516  theAlpha = SKINALPHA_CREDITS_FUNCTION;
517  }
518  else
519  {
520  theColor = SKINCOLOR_CREDITS_PERSON;
521  theAlpha = SKINALPHA_CREDITS_PERSON;
522  }
523 
524  draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, theColor, theAlpha, 0);
525 }
526 
527 float XonoticCreditsList_keyDown(entity me, float key, float ascii, float shift)
528 {
529  me.scrolling = 0;
530  return SUPER(XonoticCreditsList).keyDown(me, key, ascii, shift);
531 }
int CREDITS_TYPE_NL
Definition: credits.qc:413
void XonoticCreditsList_draw(entity me)
Definition: credits.qc:481
const vector eY
Definition: vector.qh:45
#define NEW(cname,...)
Definition: oo.qh:105
int credits_get()
Definition: credits.qc:442
int CREDITS_TYPE_PERSON
Definition: credits.qc:412
entity() spawn
#define CREDITS(TITLE, FUNCTION, PERSON, PERSON_, NL)
Definition: credits.qc:3
void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
Definition: credits.qc:498
void XonoticCreditsList_configureXonoticCreditsList(entity me)
Definition: credits.qc:466
void credits_export()
Definition: credits.qc:449
void credits_build(int fh, int n)
Definition: credits.qc:427
#define CREDITS_TITLE(t)
#define SUPER(cname)
Definition: oo.qh:219
#define buf_create
Definition: dpextensions.qh:63
#define _CREDITS_PERSON(p)
float XonoticCreditsList_keyDown(entity me, float key, float ascii, float shift)
Definition: credits.qc:527
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
#define CREDITS_PERSON(p)
entity makeXonoticCreditsList()
Definition: credits.qc:459
int CREDITS_TYPE_TITLE
Definition: credits.qc:410
#define CREDITS_NL()
void XonoticCreditsList_destroy(entity me)
Definition: credits.qc:477
vector(float skel, float bonenum) _skel_get_boneabs_hidden
const float FILE_WRITE
Definition: csprogsdefs.qc:233
const vector eX
Definition: vector.qh:44
#define CREDITS_FUNCTION(f)
void credits_add_line(int fh, int n, int type, string line)
Definition: credits.qc:414
float time
Definition: csprogsdefs.qc:16
int CREDITS_TYPE_FUNCTION
Definition: credits.qc:411
void XonoticCreditsList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
Definition: credits.qc:490