5 #define CREDITS(TITLE, FUNCTION, PERSON, PERSON_, NL) \
6 TITLE(_("Core Team")) \
7 PERSON(Rudolf "divVerent" Polzer) \
8 PERSON(Ant "Antibody" Zucaro) \
9 PERSON(Marvin "Mirio" Beck) \
10 PERSON(Merlijn Hofstra) \
11 PERSON(Peter "Morphed" Pielak) \
12 PERSON(Ruszkai "CuBe0wL" Ákos) \
13 PERSON(Samual "Ares" Lenks) \
15 PERSON(Tyler "-z-" Mulligan) \
16 PERSON(Zac "Mario" Jardine) \
18 TITLE(_("Extended Team")) \
19 PERSON(Antonio "terencehill" Piu) \
21 PERSON(BuddyFriendGuy) \
26 PERSON(Jan "zykure" Behrens) \
29 PERSON(Łukasz "kuniu the frogg" Polek) \
30 PERSON(Matthias "matthiaskrgr" Krüger) \
31 PERSON(Mattia "Melanosuchus" Basaglia) \
33 PERSON(Nick "bitbomb" Lucca) \
37 PERSON(Pearce "theShadow" Michal) \
38 PERSON(Rasmus "FruitieX" Eskola) \
40 PERSON(Severin "sev" Meyer) \
46 FUNCTION(_("Website")) \
47 PERSON(Ant "Antibody" Zucaro (web)) \
48 PERSON(Merlijn Hofstra) \
49 PERSON(Tyler "-z-" Mulligan (web / game)) \
51 FUNCTION(_("Stats")) \
52 PERSON(Ant "Antibody" Zucaro) \
53 PERSON(Jan "zykure" Behrens) \
56 PERSON(Severin "sev" Meyer) \
57 PERSON(Sahil "DiaboliK" Singhal) \
58 PERSON(Peter "Morphed" Pielak) \
59 PERSON(Sam "LJFHutch" Hutchinson) \
60 PERSON(Pearce "theShadow" Michal) \
62 FUNCTION(_("Animation")) \
63 PERSON(Sahil "DiaboliK" Singhal) \
66 FUNCTION(_("Level Design")) \
67 PERSON(Amadeusz "amade/proraide" Sławiński) \
68 PERSON(Ben "MooKow" Banker) \
71 PERSON(Cuinn "Cuinnton" Herrick) \
73 PERSON(Jakob "tZork" Markström Gröhn) \
74 PERSON(Konrad "Justin" Slawinski) \
77 PERSON(Łukasz "kuniu the frogg" Polek) \
78 PERSON(Maik "SavageX" Merten) \
79 PERSON(Marvin "Mirio" Beck) \
82 PERSON(Pearce "theShadow" Michal) \
83 PERSON(Rasmus "FruitieX" Eskola) \
84 PERSON(Ruszkai "CuBe0wL" Ákos) \
85 PERSON(Severin "sev" Meyer) \
88 FUNCTION(_("Music / Sound FX")) \
89 PERSON(AquaNova (Archer)) \
92 PERSON(Independent.nu) \
93 PERSON([master]mind) \
94 PERSON(Merlijn Hofstra) \
96 PERSON(Nick "bitbomb" Lucca) \
98 PERSON(Saulo "mand1nga" Gil) \
99 PERSON({SC0RP} - Ian "ID" Dorrell) \
103 FUNCTION(_("Game Code")) \
104 PERSON(Samual "Ares" Lenks) \
105 PERSON(Rudolf "divVerent" Polzer) \
106 PERSON(Jakob "tZork" Markström Gröhn) \
107 PERSON(Rasmus "FruitieX" Eskola) \
109 PERSON(Zac "Mario" Jardine) \
111 FUNCTION(_("Marketing / PR")) \
112 PERSON(Tyler "-z-" Mulligan) \
113 PERSON(Ruszkai "CuBe0wL" Ákos) \
114 PERSON(Samual "Ares" Lenks) \
115 PERSON(Saulo "mand1nga" Gil) \
117 FUNCTION(_("Legal")) \
118 PERSON(Rudolf "divVerent" Polzer) \
119 PERSON(Merlijn Hofstra) \
122 TITLE(_("Game Engine")) \
123 FUNCTION("DarkPlaces") \
124 PERSON(Forest "LordHavoc" Hale) \
126 FUNCTION(_("Engine Additions")) \
127 PERSON(Rudolf "divVerent" Polzer) \
128 PERSON(Samual "Ares" Lenks) \
131 TITLE(_("Compiler")) \
133 PERSON(Wolfgang "Blub\0" Bumiller) \
134 PERSON(Dale "graphitemaster" Weiler) \
137 TITLE(_("Other Active Contributors")) \
138 PERSON(Erik "Ablu" Schilling) \
139 PERSON(Mircea "Taoki" Kitsune) \
143 TITLE(_("Translators")) \
145 FUNCTION(_("Asturian")) \
147 PERSON(Tornes "Tornes.Llume" Ḷḷume) \
150 FUNCTION(_("Belarusian")) \
151 PERSON(Mihail "meequz" Varantsou) \
153 FUNCTION(_("Bulgarian")) \
157 FUNCTION(_("Chinese (China)")) \
160 PERSON(sapphireliu) \
162 FUNCTION(_("Czech")) \
163 PERSON(shogun assassin/woky) \
165 PERSON(Tomáš "CZHeron" Volavka) \
167 FUNCTION(_("Dutch")) \
168 PERSON(Alexander "freefang" van Dam) \
172 FUNCTION(_("English (Australia)")) \
173 PERSON(Laurene "sunflowers" Albrand) \
174 PERSON(Zac "Mario" Jardine) \
176 FUNCTION(_("Finnish")) \
177 PERSON(Henry "Exitium" Sanmark) \
178 PERSON(Rasmus "FruitieX" Eskola) \
180 FUNCTION(_("French")) \
182 PERSON(Maxime "Taximus" Paradis) \
184 PERSON(Yannick "SpiKe" Le Guen) \
186 FUNCTION(_("German")) \
189 PERSON(Erik "Ablu" Schilling) \
190 PERSON(Jope "Sless" Withers) \
191 PERSON(Marvin "Mirio" Beck) \
192 PERSON(Rudolf "divVerent" Polzer) \
195 FUNCTION(_("Greek")) \
196 PERSON_("Γιάννης \"Evropi\" Ανθυμίδης") \
197 PERSON(Konstantinos "LDinos" Mihalenas) \
201 FUNCTION(_("Hungarian")) \
202 PERSON(Ruszkai "CuBe0wL" Ákos) \
205 FUNCTION(_("Italian")) \
206 PERSON(Antonio "terencehill" Piu) \
207 PERSON(Felice "MaidenBeast" Sallustio) \
211 FUNCTION(_("Polish")) \
213 PERSON(Alex "tiprogrammierer.alex" Progger) \
214 PERSON(Amadeusz "amade/proraide" Sławiński) \
216 FUNCTION(_("Portuguese")) \
217 PERSON(Ricardo Manuel "Hellgardia" da Cruz Coelho da Silva) \
218 PERSON(xXxCHAOTICxXx) \
220 FUNCTION(_("Romanian")) \
221 PERSON(Adrian-Ciprian "adrian.tinjala" Tînjală) \
223 PERSON(Mircea "Taoki" Kitsune) \
224 PERSON(Tudor "TropiKo" Ionel) \
226 FUNCTION(_("Russian")) \
227 PERSON(Alex "alextalker7" Talker) \
228 PERSON(Alexandr "zrg") \
229 PERSON(Andrei "adem4ik" Stepanov) \
232 PERSON(Lord Canistra) \
234 PERSON(Sergej "Clearness High" Lutsyk) \
236 FUNCTION(_("Serbian")) \
237 PERSON_("Саша \"salepetronije\" Петровић") \
239 PERSON(Rafael "Ristovski") \
241 FUNCTION(_("Spanish")) \
242 PERSON_("0000simon") \
243 PERSON(Alan "aagp" Garcia) \
247 PERSON(roader_gentoo) \
248 PERSON(Rodrigo Mouton Laudin) \
251 FUNCTION(_("Swedish")) \
252 PERSON(Karl-Oskar "machine" Rikås) \
255 FUNCTION(_("Ukrainian")) \
256 PERSON(Oleh "BlaXpirit" Prypin) \
257 PERSON(Vasyl "Harmata" Melnyk) \
258 PERSON(Yuriy "herrniemand" Ackermann) \
261 TITLE(_("Past Contributors")) \
263 PERSON(Alexander "naryl" Suhoverhov) \
264 PERSON(Alexander "motorsep" Zubov) \
265 PERSON(Amos "torus" Dudley) \
266 PERSON(Andreas "Black" Kirsch) \
267 PERSON(Attila "WW3" Houtkooper) \
269 PERSON(Braden "meoblast001" Walters) \
270 PERSON(Brain Younds) \
271 PERSON(Chris "amethyst7" Matz) \
272 PERSON(Christian Ice) \
273 PERSON(Clinton "Kaziganthe" Freeman) \
274 PERSON(Dan "Digger" Korostelev) \
275 PERSON(Dan "Wazat" Hale) \
279 PERSON(Dustin Geeraert) \
280 PERSON(Edgenetwork) \
281 PERSON(Edward "Ed" Holness) \
282 PERSON(Eric "Munyul Verminard" Sambach) \
283 PERSON(Fabien "H. Reaper" Tschirhart) \
284 PERSON(Florian Paul "lda17h" Schmidt) \
286 PERSON(Garth "Zombie" Hendy) \
287 PERSON(Gerd "Elysis" Raudenbusch) \
288 PERSON(Gottfried "Toddd" Hofmann) \
289 PERSON(Henning "Tymo" Janssen) \
292 PERSON(Jody Gallagher) \
293 PERSON(Jope "Sless" Withers) \
294 PERSON(Juergen "LowDragon" Timm) \
295 PERSON(KadaverJack) \
296 PERSON(Kevin "Tyrann" Shanahan) \
297 PERSON(Kristian "morfar" Johansson) \
298 PERSON(Kurt Dereli) \
300 PERSON(Lee David Ash) \
301 PERSON(Lee Vermeulen) \
304 PERSON(Marius "GreEn`mArine" Shekow) \
305 PERSON(Marko "Urre" Permanto) \
306 PERSON(Mathieu "Elric" Olivier) \
307 PERSON(Mattrew "Tronyn" Rye) \
311 PERSON(Michael "Tenshihan" Quinn) \
318 PERSON(Paul "Strahlemann" Evers) \
321 PERSON(PlasmaSheep) \
322 PERSON(Przemysław "atheros" Grzywacz) \
323 PERSON(Q1 Retexturing Project) \
325 PERSON(Oleh "BlaXpirit" Prypin) \
326 PERSON(Rick "Rat" Kelley) \
327 PERSON(Robert "ai" Kuroto) \
330 PERSON(Saulo "mand1nga" Gil) \
333 PERSON(Simon O’Callaghan) \
335 PERSON(SoulKeeper_p) \
338 PERSON(Stephan "esteel" Stahl) \
339 PERSON(Steve Vermeulen) \
342 PERSON(The player with the unnecessarily long name) \
344 PERSON(Ulrich Galbraith) \
346 PERSON(William Libert) \
347 PERSON(William "Willis" Weilep) \
348 PERSON(Yves "EviLair" Allaire) \
354 int n = buf_create();
355 #define CREDITS_TITLE(t) bufstr_add(n, strcat("**", t), 0);
356 #define CREDITS_FUNCTION(f) bufstr_add(n, strcat("*", f), 0);
357 #define CREDITS_PERSON(p) bufstr_add(n, p, 0);
358 #define _CREDITS_PERSON(p) CREDITS_PERSON(#p)
359 #define CREDITS_NL() bufstr_add(n, "", 0);
360 CREDITS(CREDITS_TITLE, CREDITS_FUNCTION, _CREDITS_PERSON, CREDITS_PERSON, CREDITS_NL)
362 #undef CREDITS_FUNCTION
363 #undef CREDITS_PERSON
364 #undef _CREDITS_PERSON
371 #include "listbox.qc"
372 CLASS(XonoticCreditsList, XonoticListBox)
373 METHOD(XonoticCreditsList, configureXonoticCreditsList, void(entity));
374 ATTRIB(XonoticCreditsList, rowsPerItem, float, 1)
375 METHOD(XonoticCreditsList, draw, void(entity));
376 METHOD(XonoticCreditsList, drawListBoxItem, void(entity, int, vector, bool, bool));
377 METHOD(XonoticCreditsList, resizeNotify, void(entity, vector, vector, vector, vector));
378 METHOD(XonoticCreditsList, keyDown, float(entity, float, float, float));
379 METHOD(XonoticCreditsList, destroy, void(entity));
380 ATTRIB(XonoticCreditsList, selectionDoesntMatter, bool, true)
382 ATTRIB(XonoticCreditsList, realFontSize, vector, '0 0 0')
383 ATTRIB(XonoticCreditsList, realUpperMargin, float, 0)
384 ATTRIB(XonoticCreditsList, bufferIndex, float, 0)
385 ATTRIB(XonoticCreditsList, scrolling, float, 0)
387 ATTRIB(XonoticCreditsList, alphaBG, float, 0)
388 ENDCLASS(XonoticCreditsList)
389 entity makeXonoticCreditsList();
392 #ifdef IMPLEMENTATION
393 entity makeXonoticCreditsList()
396 me = NEW(XonoticCreditsList);
397 me.configureXonoticCreditsList(me);
400 void XonoticCreditsList_configureXonoticCreditsList(entity me)
402 me.configureXonoticListBox(me);
403 me.bufferIndex = credits_get();
404 me.nItems = buf_getsize(me.bufferIndex);
406 void XonoticCreditsList_destroy(entity me)
408 buf_del(me.bufferIndex);
410 void XonoticCreditsList_draw(entity me)
414 me.scrollPos = bound(0, (time - me.scrolling) * me.itemHeight, me.nItems * me.itemHeight - 1);
415 me.scrollPosTarget = me.scrollPos;
417 SUPER(XonoticCreditsList).draw(me);
419 void XonoticCreditsList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
421 SUPER(XonoticCreditsList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
423 me.realFontSize_y = me.fontSize / (absSize.y * me.itemHeight);
424 me.realFontSize_x = me.fontSize / (absSize.x * (1 - me.controlWidth));
425 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
427 void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
429 // layout: Ping, Credits name, Map name, NP, TP, MP
434 s = bufstr_get(me.bufferIndex, i);
436 if(substring(s, 0, 2) == "**")
438 s = substring(s, 2, strlen(s) - 2);
439 theColor = SKINCOLOR_CREDITS_TITLE;
440 theAlpha = SKINALPHA_CREDITS_TITLE;
442 else if(substring(s, 0, 1) == "*")
444 s = substring(s, 1, strlen(s) - 1);
445 theColor = SKINCOLOR_CREDITS_FUNCTION;
446 theAlpha = SKINALPHA_CREDITS_FUNCTION;
450 theColor = SKINCOLOR_CREDITS_PERSON;
451 theAlpha = SKINALPHA_CREDITS_PERSON;
454 draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, theColor, theAlpha, 0);
457 float XonoticCreditsList_keyDown(entity me, float key, float ascii, float shift)
460 return SUPER(XonoticCreditsList).keyDown(me, key, ascii, shift);