diff --git a/binaries/data/mods/public/gui/credits/credits.js b/binaries/data/mods/public/gui/credits/credits.js
new file mode 100644
index 0000000000..6235e3d6a8
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/credits.js
@@ -0,0 +1,74 @@
+var g_PanelNames = ["special", "programming", "art", "translators", "misc", "donators"];
+var g_PanelTexts = [];
+var g_ActivePanel = -1;
+
+function init()
+{
+ // Load credits list from the disk and parse them
+ for (let name of g_PanelNames)
+ g_PanelTexts.push(parseJSONCredits(name));
+
+ selectPanel(0);
+}
+
+// Run through a "Content" list and parse elements for formatting and translation
+function parseHelper(list)
+{
+ let result = "";
+
+ for (let object of list)
+ {
+ if (object.Title)
+ result += "[font=\"sans-bold-stroke-14\"]" + translate(object.Title) + "\n";
+
+ if (object.Subtitle)
+ result += "[font=\"sans-bold-14\"]" + translate(object.Subtitle) + "\n";
+
+ if (object.List)
+ {
+ for (let element of object.List)
+ {
+ if (element.nick && element.name)
+ result += "[font=\"sans-14\"]" + sprintf(translate("%(nick)s - %(name)s"), { "nick": element.nick, "name": element.name }) + "\n";
+ else if (element.nick)
+ result += "[font=\"sans-14\"]" + element.nick + "\n";
+ else if (element.name)
+ result += "[font=\"sans-14\"]" + element.name + "\n";
+ }
+ result += "\n";
+ }
+
+ if (object.Content)
+ result += "\n" + parseHelper(object.Content) + "\n";
+ }
+
+ return result;
+}
+
+function parseJSONCredits(panelName)
+{
+ let json = Engine.ReadJSONFile("gui/credits/texts/" + panelName + ".json");
+ if (!json || !json.Content)
+ {
+ error("Could not load credits for " + panelName + "!");
+ return "";
+ }
+
+ return parseHelper(json.Content);
+}
+
+function selectPanel(i)
+{
+ if (g_ActivePanel != -1)
+ {
+ let oldPanelButton = Engine.GetGUIObjectByName(g_PanelNames[g_ActivePanel] + "PanelButton");
+ oldPanelButton.sprite = "BackgroundBox";
+ }
+
+ g_ActivePanel = i;
+ let newPanelButton = Engine.GetGUIObjectByName(g_PanelNames[g_ActivePanel] + "PanelButton");
+ newPanelButton.sprite = "ForegroundBox";
+
+ let creditsText = Engine.GetGUIObjectByName("creditsText");
+ creditsText.caption = g_PanelTexts[i];
+}
diff --git a/binaries/data/mods/public/gui/credits/credits.xml b/binaries/data/mods/public/gui/credits/credits.xml
new file mode 100644
index 0000000000..055e5797ef
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/credits.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/gui/credits/sprites.xml b/binaries/data/mods/public/gui/credits/sprites.xml
new file mode 100644
index 0000000000..a9eda6f2b9
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/sprites.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/gui/credits/styles.xml b/binaries/data/mods/public/gui/credits/styles.xml
new file mode 100644
index 0000000000..a8d4be1a20
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/styles.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/binaries/data/mods/public/gui/credits/texts/art.json b/binaries/data/mods/public/gui/credits/texts/art.json
new file mode 100644
index 0000000000..a559cc206a
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/texts/art.json
@@ -0,0 +1,126 @@
+{
+ "Content": [
+ {
+ "Title": "Artistic managers",
+ "Content": [
+ {
+ "Subtitle": "Art lead",
+ "List": [
+ {"nick": "Wijitmaker", "name": "Jason Bishop"},
+ {"nick": "Mythos_Ruler", "name": "Michael D. Hafer"},
+ {"nick": "Enrique", "name": "Enrique Keykens"}
+ ]
+ },
+ {
+ "Subtitle": "Sound Manager",
+ "List": [{"nick": "lostchocolatelab", "name": "Damian Kastbauer"}]
+ },
+ {
+ "Subtitle": "Composer",
+ "List": [{"nick": "OmriLahav", "name": "Omri Lahav"}]
+ }
+ ]
+ },
+ {
+ "Title": "Mapping",
+ "List": [
+ {"nick": "Aeros (aka CheeZy)", "name": "Bobby Ognyanov"},
+ {"nick": "mmayfield45"},
+ {"nick": "Mythos_Ruler", "name": "Michael D. Hafer"},
+ {"nick": "niektb", "name": "Niek ten Brinke"},
+ {"nick": "Pureon"},
+ {"nick": "SMST"},
+ {"nick": "Yodaspirine"}
+ ]
+ },
+ {
+ "Title": "Random Map Scripts",
+ "List": [
+ {"nick": "Ben", "name": "Ben Vinegar"},
+ {"nick": "FeXoR", "name": "Florian Finke"},
+ {"nick": "howlingflute"},
+ {"nick": "Spahbod", "name": "Omid Davoodi"},
+ {"nick": "wraitii", "name": "Lancelot de Ferrière le Vayer"}
+ ]
+ },
+ {
+ "Title": "2D Art",
+ "List": [
+ {"nick": "Annatar", "name": "Kenneth Branch"},
+ {"nick": "b.w.keough", "name": "Brendan Keough"},
+ {"nick": "Brownboot", "name": "Allen White"},
+ {"nick": "Centurion_13", "name": "Shan Coster"},
+ {"nick": "Childhood Trauma", "name": "Praveen Pillai"},
+ {"nick": "dashinvaine", "name": "Gordon Napier"},
+ {"nick": "Dnas", "name": "David Benjamin"},
+ {"nick": "Fire Giant", "name": "Malte Schwarzkopf"},
+ {"nick": "Hyborian", "name": "Shan Sherrill"},
+ {"nick": "irishstag", "name": "Ryan Karsten"},
+ {"nick": "lanoocha", "name": "Lana"},
+ {"nick": "Lion.Kanzen", "name": "Marcio Duron"},
+ {"nick": "LordGood", "name": "Johnathan B. Good"},
+ {"nick": "Mythos_Ruler", "name": "Michael D. Hafer"},
+ {"nick": "Pureon"},
+ {"nick": "raulfabi"},
+ {"nick": "Scorpion Ra", "name": "Aaron Robinson"},
+ {"nick": "Shield Bearer", "name": "Amish Coelho"},
+ {"nick": "Wijitmaker", "name": "Jason Bishop"}
+ ]
+ },
+ {
+ "Title": "3D Art",
+ "List": [
+ {"nick": "Athos"},
+ {"nick": "Brightgalrs", "name": "Robert D. Schultz"},
+ {"nick": "Eggbird", "name": "Egbert Tigelaar"},
+ {"nick": "EmjeR", "name": "Matthijs de Rijk"},
+ {"nick": "Enrique", "name": "Enrique Keykens Espolio"},
+ {"nick": "Historicity", "name": "Shane"},
+ {"nick": "Gen.Kenobi", "name": "Daniel Schubert"},
+ {"nick": "LordGood", "name": "Johnathan B. Good"},
+ {"nick": "Micket"},
+ {"nick": "Mythos_Ruler", "name": "Michael D. Hafer"},
+ {"nick": "necro", "name": "Thomas Eichler"},
+ {"nick": "Pacman", "name": "Johannes(John) Saarniit"},
+ {"nick": "paperkat", "name": "William Pryn"},
+ {"nick": "privateer", "name": "Jeff Groves"},
+ {"nick": "Pureon"},
+ {"nick": "Quacker", "name": "Jordan Quackenbush"},
+ {"nick": "Saurabh", "name": "Saurabh Torne"},
+ {"nick": "Scorpion Ra", "name": "Aaron Robinson"},
+ {"nick": "Shield Bearer", "name": "Amish Coelho"},
+ {"nick": "stanislas69", "name": "Stanislas Dolcini"},
+ {"nick": "Strannik"},
+ {"nick": "Zaggy1024", "name": "Gregory Bertilson"},
+ {"nick": "Wijitmaker", "name": "Jason Bishop"}
+ ]
+ },
+ {
+ "Title": "Sound",
+ "List": [
+ {"nick": "carsten", "name": "Carsten Rojahn"},
+ {"nick": "dungeonsound615", "name": "Mike Stanton"},
+ {"nick": "DynamiteSoundBytes", "name": "Nolan, Tony, and Lucas"},
+ {"nick": "EvanBogunia", "name": "Evan Bogunia"},
+ {"nick": "khegarty", "name": "Kaitlynn Hegarty"},
+ {"nick": "LAVS"},
+ {"nick": "lostchocolatelab", "name": "Damian Kastbauer"},
+ {"nick": "MattSherman", "name": "Matt Sherman"},
+ {"nick": "mclellandp", "name": "Pat Mclelland"},
+ {"nick": "PhoenixDog", "name": "Shawn Anthony Poxleitner"},
+ {"nick": "Pureon"},
+ {"nick": "ryan827", "name": "Ryan Davies"},
+ {"nick": "Sam Assoum", "name": "Sam Assoum"},
+ {"nick": "Wyrmwood", "name": "Ron Lacy"}
+ ]
+ },
+ {
+ "Title": "Music",
+ "List": [
+ {"nick": "Dariusofwest", "name": "Allan Brown"},
+ {"nick": "OmriLahav", "name": "Omri Lahav"},
+ {"nick": "Vaevictis_Music", "name": "Boris Hansen"}
+ ]
+ }
+ ]
+}
diff --git a/binaries/data/mods/public/gui/credits/texts/donators.json b/binaries/data/mods/public/gui/credits/texts/donators.json
new file mode 100644
index 0000000000..d027d2a04b
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/texts/donators.json
@@ -0,0 +1,559 @@
+{
+ "Content" : [
+ {
+ "Title": "Pledgie Drive 1",
+ "List": [
+ {"name": "23 Anonymous Donators"},
+ {"name": "@bcrunos"},
+ {"name": "@CheDean"},
+ {"name": "@joshhsoj1902"},
+ {"name": "@kednar"},
+ {"name": "@NtynRuben"},
+ {"name": "@opengimox"},
+ {"name": "@scotthosking"},
+ {"name": "@takluyver"},
+ {"name": "@TubeShaped"},
+ {"name": "@unverbraucht"},
+ {"name": "@upurtwee"},
+ {"name": "@YannDinendal"},
+ {"name": "Alain Imbaud"},
+ {"name": "Alex McKee"},
+ {"name": "Alexander Kallenbach"},
+ {"name": "Alexander Opachev"},
+ {"name": "Alexander Wagner"},
+ {"name": "Alexey Sergin"},
+ {"name": "Andreas Hopfenblatt"},
+ {"name": "Andreas Hoppe"},
+ {"name": "Brent Houghton"},
+ {"name": "Bruno Sanchez-Huffenus"},
+ {"name": "Carl Olsson"},
+ {"name": "Cedric Heintz"},
+ {"name": "Chad Merkert"},
+ {"name": "Chad Peyton"},
+ {"name": "Christopher Tozzi"},
+ {"name": "Daniel Kuzmenko"},
+ {"name": "Daniel Scharrer"},
+ {"name": "danijelv"},
+ {"name": "Darrel Greenhill"},
+ {"name": "David Nielsen"},
+ {"name": "David Raich"},
+ {"name": "Duan Pavlík"},
+ {"name": "Emil Nicolaie Perhinschi"},
+ {"name": "Eric Winterling"},
+ {"name": "Étienne Bersac"},
+ {"name": "Evans Thomas"},
+ {"name": "Fabio Erculiani"},
+ {"name": "Felipe Torres González"},
+ {"name": "Fernando Martins"},
+ {"name": "Florian Ludwig"},
+ {"name": "Fredrik Eliasson"},
+ {"name": "Gabriel Diosan"},
+ {"name": "Gustav Schumann"},
+ {"name": "Ilya Makarov"},
+ {"name": "inglorion"},
+ {"name": "Jan Krautter"},
+ {"name": "Javier Alfonso"},
+ {"name": "Jií Jindra"},
+ {"name": "Jill Bishop"},
+ {"name": "Joakim Verona"},
+ {"name": "Jonathan Pritchard"},
+ {"name": "Jordan Taienao"},
+ {"name": "Jorge Vega Sánchez"},
+ {"name": "Juan Font Alonso"},
+ {"name": "Kaare Baastrup"},
+ {"name": "Kevin Faulkner"},
+ {"name": "Kieran P"},
+ {"name": "Klaas Waesberghe"},
+ {"name": "Korneel Guns"},
+ {"name": "Kristian Jagd"},
+ {"name": "Krzysztof Duchnowski"},
+ {"name": "Lasse Bigum"},
+ {"name": "Laurent Thermy"},
+ {"name": "lordofsoul"},
+ {"name": "Lorenzo Angeli"},
+ {"name": "Magne Djupvik"},
+ {"name": "Maxime Fradi"},
+ {"name": "Michael Stubbs"},
+ {"name": "Mikhail Lunkovskiy"},
+ {"name": "Neil Hancock"},
+ {"name": "Olivier Bordignon"},
+ {"name": "Olivier Coppin"},
+ {"name": "Oskar Maxa"},
+ {"name": "Panagiotis Tsakiris"},
+ {"name": "Patrice Sopel"},
+ {"name": "Paul Scott"},
+ {"name": "Pedro Veloso"},
+ {"name": "Séverin Lemaignan"},
+ {"name": "Scott C Lemon"},
+ {"name": "Shane Quigley"},
+ {"name": "Stanislav Kíž"},
+ {"name": "Steven Saric"},
+ {"name": "Thomas Hummel"},
+ {"name": "Thomas Mikkelsen"},
+ {"name": "Timothy McLaren"},
+ {"name": "Toni Helenius"},
+ {"name": "Valeryan_24"},
+ {"name": "Victor Lavaud"},
+ {"name": "Viktor Novak"},
+ {"name": "William Norris"}
+ ]
+ },
+ {
+ "Title": "Pledgie Drive 2",
+ "List": [
+ {"name": "87 Anonymous Donators"},
+ {"name": "@AvivSharon"},
+ {"name": "@mrfurieux"},
+ {"name": "@sciondev"},
+ {"name": "@upurtweet"},
+ {"name": "@waytoubuntu"},
+ {"name": "@YannDinendal"},
+ {"name": "AkylaQD"},
+ {"name": "Alexander Hunziker"},
+ {"name": "Anthony Lenton"},
+ {"name": "arakash"},
+ {"name": "azkanel"},
+ {"name": "Catalanoic"},
+ {"name": "charlycoste"},
+ {"name": "dadarek"},
+ {"name": "David Callé"},
+ {"name": "dbileck"},
+ {"name": "Erik Johansson"},
+ {"name": "Evans Thomas"},
+ {"name": "fireprog"},
+ {"name": "Foaly"},
+ {"name": "Francisco Jesús Martínez Murcia"},
+ {"name": "francofil66"},
+ {"name": "Frederic Laliberte"},
+ {"name": "Gabriel Ionescu"},
+ {"name": "gheesh"},
+ {"name": "harrytuttle"},
+ {"name": "Hatsen"},
+ {"name": "hyno111"},
+ {"name": "Italo Gonzalez"},
+ {"name": "Jaap Broekhuizen"},
+ {"name": "jeykey"},
+ {"name": "John2Ray"},
+ {"name": "JuliusColtranePille"},
+ {"name": "Jupiter Barrera"},
+ {"name": "Kieran P"},
+ {"name": "Kyle"},
+ {"name": "letsyl"},
+ {"name": "Ludovic Claude"},
+ {"name": "Martin Albisetti"},
+ {"name": "Matthew Frost"},
+ {"name": "Matthew Gillespie"},
+ {"name": "MCMic"},
+ {"name": "mikeo"},
+ {"name": "Mikhail Nedovodin"},
+ {"name": "Nathanael Barbettini"},
+ {"name": "orpharion"},
+ {"name": "p2snico"},
+ {"name": "Pablo Briones Bas"},
+ {"name": "Paolo Frattini"},
+ {"name": "ruano1983"},
+ {"name": "samtuke"},
+ {"name": "Strategist"},
+ {"name": "tallanddaft"},
+ {"name": "Tottel"},
+ {"name": "Troels Arvin"},
+ {"name": "Tungdil"},
+ {"name": "VforVincent"},
+ {"name": "Vladislav Gapchich"},
+ {"name": "Yves *"}
+ ]
+ },
+ {
+ "Title": "IndieGoGO 2013 campaign\nMore than 1000 donators (!), including:",
+ "List": [
+ {"name": "1lightsource"},
+ {"name": "@GuiAmbros"},
+ {"name": "ACH_Likey"},
+ {"name": "Adam Freeman"},
+ {"name": "Adam Glickman"},
+ {"name": "Adrián Chaves Fernández (Gallaecio)"},
+ {"name": "Adrian Rocha"},
+ {"name": "adventureloop"},
+ {"name": "Agostino Sturaro"},
+ {"name": "ahj"},
+ {"name": "Akita Noek"},
+ {"name": "Albert Astals Cid"},
+ {"name": "Alec Gorge"},
+ {"name": "Alessio Bolognini"},
+ {"name": "Alex Brem"},
+ {"name": "Alex Kapranoff"},
+ {"name": "Alex Melville"},
+ {"name": "Alex W."},
+ {"name": "Alexander A. (cicyractu)"},
+ {"name": "Alexandre Prokoudine"},
+ {"name": "Alexey Kreshchuk"},
+ {"name": "Alexey Vazhnov"},
+ {"name": "Alice Marks"},
+ {"name": "Alin Hanghiuc"},
+ {"name": "Alister Galpin"},
+ {"name": "Aljullu"},
+ {"name": "Altwazar"},
+ {"name": "Alun Lewis"},
+ {"name": "aluriak"},
+ {"name": "alxndr"},
+ {"name": "Ana Vazquez Alonso"},
+ {"name": "Anders Dahnielson"},
+ {"name": "andersonvom"},
+ {"name": "André Vitor de Lima Matos"},
+ {"name": "Andrea Panontin"},
+ {"name": "Andrew M. 'Leny' Lindley"},
+ {"name": "Andrew Mike"},
+ {"name": "Andrzej Kardas"},
+ {"name": "Andy Allan"},
+ {"name": "Anirudh Surendranath"},
+ {"name": "Anthony J. Bentley"},
+ {"name": "Anthony Ryan"},
+ {"name": "Anton Gushcha"},
+ {"name": "Antti Repo"},
+ {"name": "April Lee"},
+ {"name": "Ari Selseng"},
+ {"name": "Armin Seuchter"},
+ {"name": "Arnaud Gelly"},
+ {"name": "Artem Kavalerov"},
+ {"name": "AsavarTzeth"},
+ {"name": "Athaniar Silverbranch"},
+ {"name": "Atheox"},
+ {"name": "Aurag"},
+ {"name": "baosen"},
+ {"name": "Bart Noordervliet"},
+ {"name": "BCvery1"},
+ {"name": "BelaB"},
+ {"name": "Ben Golightly"},
+ {"name": "Ben Kennedy"},
+ {"name": "Ben-Jamin' Ziegelaar"},
+ {"name": "Benjamin Geese"},
+ {"name": "Benjamin Stauß"},
+ {"name": "Bernhard M."},
+ {"name": "Bert 'Cysion' Beeckman"},
+ {"name": "Betsy Lipes"},
+ {"name": "Bill O'Dwyer"},
+ {"name": "Bobby Ognyanov"},
+ {"name": "Boris Mindzak"},
+ {"name": "Boris Niclas-Tölle"},
+ {"name": "Boyd Stephen Smith Jr."},
+ {"name": "Brian Aichlmayr"},
+ {"name": "Brian Stempin"},
+ {"name": "Brice Gressent"},
+ {"name": "Bruno Girin"},
+ {"name": "Cédric de Launois"},
+ {"name": "c0l3slaw"},
+ {"name": "Cajetan Bouchard"},
+ {"name": "Calvin Rawlings"},
+ {"name": "Carl Sebastian Malm"},
+ {"name": "Cedric Bail"},
+ {"name": "Chad Peyton"},
+ {"name": "Chanakya"},
+ {"name": "Charles E. Lehner"},
+ {"name": "Che Dean"},
+ {"name": "Chris Dickerson"},
+ {"name": "Christian 'Roggan29' Budde"},
+ {"name": "Christoffer 'cjva' Andersson"},
+ {"name": "Christoffer Ingers"},
+ {"name": "Christoph Zürcher"},
+ {"name": "Christophe & Fabienne Hugon"},
+ {"name": "Christopher Morrison"},
+ {"name": "Chrysostomos Kolovos"},
+ {"name": "clauskj3r"},
+ {"name": "Cloei Bailey"},
+ {"name": "Craig Millett"},
+ {"name": "Cristiane Weber"},
+ {"name": "cyrxi"},
+ {"name": "Cyryl Plotnicki-Chudyk"},
+ {"name": "D. Can Celasun"},
+ {"name": "daJoe"},
+ {"name": "Damiano Dallatana"},
+ {"name": "Dan Seldow"},
+ {"name": "Daniel Draeger"},
+ {"name": "Daniel Melin"},
+ {"name": "Daniel Spronk"},
+ {"name": "Daniel Wee"},
+ {"name": "Daniele Canciani (aka croma25td)"},
+ {"name": "Daniil Bondarev"},
+ {"name": "Daniil Kulchenko"},
+ {"name": "Dave Peters"},
+ {"name": "David Abilleira"},
+ {"name": "David Ahmed"},
+ {"name": "David Hayes"},
+ {"name": "David Lawrence Evans"},
+ {"name": "David Page"},
+ {"name": "David Verelst"},
+ {"name": "David Zschille"},
+ {"name": "davyg"},
+ {"name": "Debcool"},
+ {"name": "Denis Fateyev"},
+ {"name": "Dennis Blok"},
+ {"name": "Desmond Talkington"},
+ {"name": "devland"},
+ {"name": "Diego Peinador"},
+ {"name": "Dmitry Pashkevich"},
+ {"name": "Doménique van Gennip"},
+ {"name": "Dr Martin Gray"},
+ {"name": "earendil02"},
+ {"name": "Edgar Klenske"},
+ {"name": "elel"},
+ {"name": "Elias K Gardner"},
+ {"name": "Emmanuel Florac"},
+ {"name": "en3r0"},
+ {"name": "Engry Baldwin"},
+ {"name": "Erik J"},
+ {"name": "Erin"},
+ {"name": "Ernst Vaarties"},
+ {"name": "Ethan Glasser-Camp"},
+ {"name": "Evans Thomas"},
+ {"name": "Fabio Pezzoni"},
+ {"name": "Fedor Podolyako"},
+ {"name": "Felix Schindler"},
+ {"name": "Fidel Ramos"},
+ {"name": "Flo S. MTP"},
+ {"name": "Florian R. A. Angermeier"},
+ {"name": "flowblok"},
+ {"name": "Francis Brunelle"},
+ {"name": "Fred G"},
+ {"name": "Fred Schuit"},
+ {"name": "Friedemann Leipold"},
+ {"name": "Fringale"},
+ {"name": "Gary Sparks"},
+ {"name": "Georg R. Zufall"},
+ {"name": "Gerol Petruzella"},
+ {"name": "Gert van Valkenhoef"},
+ {"name": "Glorforidor"},
+ {"name": "Goosefraba"},
+ {"name": "Gordon Macleod"},
+ {"name": "Gudo"},
+ {"name": "Guillaume Desjardins"},
+ {"name": "Guillaume Englert"},
+ {"name": "Guillaume GASNIER"},
+ {"name": "Gustav 'Gego/XAREN' Hartvigsson"},
+ {"name": "Gwilym Kuiper"},
+ {"name": "Harry Burrows"},
+ {"name": "Harshid Dattani"},
+ {"name": "Harteex"},
+ {"name": "Harvy"},
+ {"name": "Honza Brázdil"},
+ {"name": "Hunv"},
+ {"name": "Iain Hallam"},
+ {"name": "Ian Davis"},
+ {"name": "Ian R. Bennett"},
+ {"name": "Isaac Clerencia"},
+ {"name": "itoshkov"},
+ {"name": "Ján Nešcivera"},
+ {"name": "Jacek"},
+ {"name": "James Dearing"},
+ {"name": "James Gregory"},
+ {"name": "James Weeks (aka Chiptoxic)"},
+ {"name": "Jamie"},
+ {"name": "Jan Chochol"},
+ {"name": "Jan-Tore Velle"},
+ {"name": "Jarl Arntzen"},
+ {"name": "Jason moofang"},
+ {"name": "Jason Smith"},
+ {"name": "Javier Cantero"},
+ {"name": "JDSJ Hollandia"},
+ {"name": "Jean-Baptiste CAMPESATO"},
+ {"name": "Jeremy Rose"},
+ {"name": "Jesse 'Magic' Johnson"},
+ {"name": "jg1234"},
+ {"name": "Jim Baxter"},
+ {"name": "Jim Howard"},
+ {"name": "Jimmy Turgeon"},
+ {"name": "Jiri Stransky"},
+ {"name": "Joe Johaneman"},
+ {"name": "Joel A. Parisi"},
+ {"name": "Joel Edberg"},
+ {"name": "Joel Friedly"},
+ {"name": "John Eikenberry"},
+ {"name": "John Furcean"},
+ {"name": "John Paden"},
+ {"name": "John Tse"},
+ {"name": "Jon Gjengset"},
+ {"name": "Jonathan Biegert"},
+ {"name": "Jonny McCullagh"},
+ {"name": "Jordan White"},
+ {"name": "Jose A. Rivera"},
+ {"name": "Jose Lou Chang"},
+ {"name": "Jose M Andion"},
+ {"name": "Josef Pruša"},
+ {"name": "Josepf Haslam"},
+ {"name": "Joseph Livecchi"},
+ {"name": "Joseph Thompson"},
+ {"name": "Josh Gunderson"},
+ {"name": "Julie Barton"},
+ {"name": "Julius FreeGamer Blog"},
+ {"name": "Justin James"},
+ {"name": "K McFadden"},
+ {"name": "Kaloyan Todorov"},
+ {"name": "Kamereon"},
+ {"name": "kepinpin"},
+ {"name": "Kevin Krammer"},
+ {"name": "Kevin W. Rodewald"},
+ {"name": "kilobug"},
+ {"name": "Kirkor"},
+ {"name": "Konstantin Kitmanov"},
+ {"name": "Kshitij Sobti"},
+ {"name": "Kyle Leach"},
+ {"name": "LarsHuluk"},
+ {"name": "Lasse Bigum"},
+ {"name": "Lasse Hynninen"},
+ {"name": "Lauris BH"},
+ {"name": "lbilloret"},
+ {"name": "Lee Symes"},
+ {"name": "lepiota"},
+ {"name": "linux_eki"},
+ {"name": "Liothe"},
+ {"name": "liquidat"},
+ {"name": "Lukas Daniel Klausner"},
+ {"name": "Magne Djupvik"},
+ {"name": "MaMuS"},
+ {"name": "Marc Schneider-Woggon"},
+ {"name": "Marcel de Jong"},
+ {"name": "Marcel Stimberg"},
+ {"name": "Marcus Liebhardt"},
+ {"name": "Mardini"},
+ {"name": "Marián Polták"},
+ {"name": "Mark Lukens"},
+ {"name": "Markus Enzenberger"},
+ {"name": "Matías Guzmán Naranjo"},
+ {"name": "Matei Zaharia"},
+ {"name": "Matic Potocnik"},
+ {"name": "Matt Brenner"},
+ {"name": "Matt Williams"},
+ {"name": "Max Polun"},
+ {"name": "Max Tweddell"},
+ {"name": "mecatxis"},
+ {"name": "Michael Laporte"},
+ {"name": "Michael McCafferty"},
+ {"name": "Michael Patzer"},
+ {"name": "Michael Vincent"},
+ {"name": "Michal Sedlak"},
+ {"name": "Michele Brami"},
+ {"name": "Michele Olivo"},
+ {"name": "Miguel Vera Leon"},
+ {"name": "Mike Manfrin"},
+ {"name": "Milo Radunski"},
+ {"name": "Mindcloud"},
+ {"name": "Mitchell Kember"},
+ {"name": "MooseTheBrown"},
+ {"name": "Nate 'Gnate' Sigrist"},
+ {"name": "Nathan"},
+ {"name": "Nathanael Barbettini"},
+ {"name": "Nehar"},
+ {"name": "Neil"},
+ {"name": "Nelson Benitez Leon"},
+ {"name": "Nic Thiele"},
+ {"name": "Niklas Rosenqvist"},
+ {"name": "nineinchnick"},
+ {"name": "Noah Rusnock"},
+ {"name": "Ohad Stolarz"},
+ {"name": "ojdo"},
+ {"name": "Ollie Lowson"},
+ {"name": "Orwell"},
+ {"name": "Osledy Bazo"},
+ {"name": "Othman Almandhari"},
+ {"name": "Ørjan Hoem"},
+ {"name": "Pablo López (kednar)"},
+ {"name": "Patrick Glanz"},
+ {"name": "Patrick McDonough"},
+ {"name": "Patrick Plenefisch"},
+ {"name": "Paul Edward Tang"},
+ {"name": "Paul Schorfheide"},
+ {"name": "Paul4kant"},
+ {"name": "Pavy"},
+ {"name": "Peter Berg"},
+ {"name": "Peter Davoust"},
+ {"name": "Peter Ståhlberg"},
+ {"name": "Phalgun Guduthur"},
+ {"name": "Philip Tellis"},
+ {"name": "Philipp Pilhofer"},
+ {"name": "Pierce Lopez"},
+ {"name": "Pierre 'Eunostos' Cuvelier"},
+ {"name": "Pierre Donat-Bouillud"},
+ {"name": "psq"},
+ {"name": "Quarkslot"},
+ {"name": "Randolph aka Shieldwolf"},
+ {"name": "Rene Balser"},
+ {"name": "Rob Crowther"},
+ {"name": "Rob Parker"},
+ {"name": "Rob Snelders"},
+ {"name": "Robert Clark"},
+ {"name": "Robert Hill, MD"},
+ {"name": "Robert Walker"},
+ {"name": "rocandante"},
+ {"name": "Romain Naour"},
+ {"name": "Ronald Delval"},
+ {"name": "Rudolf J. Mueller"},
+ {"name": "Rustan Håkansson"},
+ {"name": "Sam Griffin"},
+ {"name": "seaxx"},
+ {"name": "Sebastian Spaeth"},
+ {"name": "Sergey Kashin"},
+ {"name": "Shaun McFall"},
+ {"name": "sHINOBI"},
+ {"name": "Shiv Manas"},
+ {"name": "Shrink"},
+ {"name": "Sigfrido"},
+ {"name": "Simon Barnes"},
+ {"name": "Simon Coe"},
+ {"name": "Simon Wenner"},
+ {"name": "Sinan Onur Altinuç"},
+ {"name": "snorpey"},
+ {"name": "Standa"},
+ {"name": "Stepan Salenikovich"},
+ {"name": "Stephan Spijkers"},
+ {"name": "Stephan Tietz"},
+ {"name": "Stephan Wiehr"},
+ {"name": "Stephen Rule"},
+ {"name": "Steven Fuchs"},
+ {"name": "Stijn Debrouwere"},
+ {"name": "Stokescomp"},
+ {"name": "Sze Howe Koh"},
+ {"name": "Tanel Mae"},
+ {"name": "Tapio Hansson"},
+ {"name": "Tassos Hourmouziadis"},
+ {"name": "tbug"},
+ {"name": "Theodore Brown"},
+ {"name": "Thero Layfer"},
+ {"name": "Thomas Glamsch"},
+ {"name": "Thomas Penin"},
+ {"name": "Thorbjørn Lindeijer"},
+ {"name": "Tim Koschützki"},
+ {"name": "TimseZ"},
+ {"name": "TingPing"},
+ {"name": "Titov Andrii"},
+ {"name": "Toby"},
+ {"name": "Toby Haynes"},
+ {"name": "Tom C"},
+ {"name": "tonyo112"},
+ {"name": "toyotis"},
+ {"name": "Tribalbeat"},
+ {"name": "Tuhin Sheikh"},
+ {"name": "Tyler Hall"},
+ {"name": "UA"},
+ {"name": "udan"},
+ {"name": "Vadim Peretokin"},
+ {"name": "Valentina Mukhamedzhanova"},
+ {"name": "Vegar Guldal"},
+ {"name": "vimja"},
+ {"name": "Vit Pelcak"},
+ {"name": "Vladimir Kalugin"},
+ {"name": "Vladimir Lettiev"},
+ {"name": "Volkmar Stein"},
+ {"name": "waspinator"},
+ {"name": "William Edwards"},
+ {"name": "wisemonkey"},
+ {"name": "XioNoX"},
+ {"name": "Yigal Duppen"},
+ {"name": "Yumi"},
+ {"name": "Yury Vidineev"},
+ {"name": "Yvonne R"},
+ {"name": "Zach Reed"},
+ {"name": "Zimes"},
+ {"name": "ZyoxNet"}
+ ]
+ }
+ ]
+}
diff --git a/binaries/data/mods/public/gui/credits/texts/misc.json b/binaries/data/mods/public/gui/credits/texts/misc.json
new file mode 100644
index 0000000000..f3e04924ea
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/texts/misc.json
@@ -0,0 +1,51 @@
+{
+ "Content": [
+ {
+ "Title": "History References",
+ "Content": [
+ {
+ "Subtitle": "Head",
+ "List": [{"nick": "Shogun 144", "name": "Joshua Gilbert"}]
+ },
+ {
+ "List": [
+ {"nick": "fede_histpop", "name": "Federico Odorizzi"},
+ {"nick": "I_Would_Say", "name": "Nathan Benjamin"},
+ {"nick": "Paul", "name": "Paul Withers"},
+ {"nick": "Paal_101", "name": "Paul Basar"},
+ {"nick": "Saqqara", "name": "Ashley King"},
+ {"nick": "Sting", "name": "Borislav Chernev"},
+ {"nick": "Thorfinn the Shallow Minded"}
+ ]
+ }
+ ]
+ },
+ {
+ "Title": "Community and Management",
+ "List": [
+ {"nick": "Black OP", "name": "Randy Sage"},
+ {"nick": "bstempi", "name": "Brian Stempin"},
+ {"nick": "chichigrande", "name": "Matthew Rogers"},
+ {"nick": "CodeOptimist", "name": "Nathanael Barbettini"},
+ {"name": "Danny Reese"},
+ {"nick": "DarkAngelBGE", "name": "Tim Koschuetzki"},
+ {"nick": "darkfires (aka lethalhunter)", "name": "Jonathan Wright"},
+ {"nick": "fabio", "name": "Fabio Pedretti"},
+ {"nick": "formlesstree4", "name": "Adam Sears"},
+ {"nick": "gudo"},
+ {"nick": "Jeru", "name": "Aviv Sharon"},
+ {"nick": "jshores", "name": "Jason Shores"},
+ {"nick": "Kimball", "name": "Rob Kimball"},
+ {"nick": "King Tutankhamun", "name": "Desmond Talkington"},
+ {"nick": "MishFTW", "name": "A. Mishra"},
+ {"nick": "Morgan", "name": "Morgan Ramsay"},
+ {"nick": "Red_08", "name": "Joshua Barker"},
+ {"nick": "ricotz", "name": "Rico Tzschichholz"},
+ {"nick": "Rodrigo", "name": "Klass Van Waesberghe"},
+ {"nick": "Sam (aka Ph4ntom)", "name": "Sam Carlton"},
+ {"nick": "Sunshine", "name": "Belle Green"},
+ {"nick": "Yiuel", "name": "Ugo Lachapelle"}
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/binaries/data/mods/public/gui/credits/texts/programming.json b/binaries/data/mods/public/gui/credits/texts/programming.json
new file mode 100644
index 0000000000..208fe0d38e
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/texts/programming.json
@@ -0,0 +1,195 @@
+{
+ "Content": [
+ {
+ "Title": "Programming managers",
+ "List": [
+ {"nick": "Acumen", "name": "Stuart Walpole"},
+ {"nick": "Dak Lozar", "name": "Dave Loeser"},
+ {"nick": "h20", "name": "Daniel Wilhelm"},
+ {"nick": "Janwas", "name": "Jan Wassenberg"},
+ {"nick": "Raj", "name": "Raj Sharma"}
+ ]
+ },
+ {
+ "Subtitle": "Special thanks to",
+ "List": [{"nick": "Ykkrosh", "name": "Philip Taylor"}]
+ },
+ {
+ "List": [
+ {"nick": "01d55"},
+ {"nick": "Acumen", "name": "Stuart Walpole"},
+ {"name": "Adrian Fatol"},
+ {"nick": "AI-Amsterdam"},
+ {"nick": "Alan", "name": "Alan Kemp"},
+ {"nick": "aBothe", "name": "Alexander Bothe"},
+ {"nick": "alpha123", "name": "Peter P. Cannici"},
+ {"nick": "Aurium", "name": "Aurélio Heckert"},
+ {"nick": "badmadblacksad", "name": "Martin F"},
+ {"name": "Mikołaj \"Bajter\" Korcz"},
+ {"nick": "bb", "name": "Bouke Jansen"},
+ {"nick": "Ben", "name": "Ben Vinegar"},
+ {"nick": "Bird"},
+ {"nick": "Blue", "name": "Richard Welsh"},
+ {"nick": "bmwiedemann"},
+ {"nick": "boeseRaupe", "name": "Michael Kluge"},
+ {"nick": "bog_dan_ro", "name": "BogDan Vatra"},
+ {"nick": "Bonk", "name": "Christopher Ebbert"},
+ {"nick": "Caius", "name": "Lars Kemmann"},
+ {"nick": "Calefaction", "name": "Matt Holmes"},
+ {"nick": "Calvinh", "name": "Carl-Johan Höiby"},
+ {"name": "Cédric Houbart"},
+ {"nick": "Chakakhan", "name": "Kenny Long"},
+ {"nick": "Cracker78", "name": "Chad Heim"},
+ {"nick": "Crynux", "name": "Stephen J. Fewer"},
+ {"nick": "cwprogger"},
+ {"nick": "Dak Lozar", "name": "Dave Loeser"},
+ {"nick": "dan", "name": "Dan Strandberg"},
+ {"name": "Daniel Trevitz"},
+ {"nick": "DanCar", "name": "Daniel Cardenas"},
+ {"nick": "Dave", "name": "David Protasowski"},
+ {"nick": "dax", "name": "Dacian Fiordean"},
+ {"nick": "deebee", "name": "Deepak Anthony"},
+ {"nick": "Deiz"},
+ {"nick": "Dietger", "name": "Dietger van Antwerpen"},
+ {"nick": "dumbo"},
+ {"nick": "dvangennip", "name": "Doménique"},
+ {"nick": "Echelon9", "name": "Rhys Kidd"},
+ {"nick": "eihrul", "name": "Lee Salzman"},
+ {"nick": "elexis", "name": "Alexander Heinsius"},
+ {"nick": "EmjeR", "name": "Matthijs de Rijk"},
+ {"nick": "EMontana"},
+ {"nick": "ericb"},
+ {"nick": "evanssthomas", "name": "Evans Thomas"},
+ {"nick": "Evulant", "name": "Alexander S."},
+ {"nick": "fabio", "name": "Fabio Pedretti"},
+ {"nick": "falsevision", "name": "Mahdi Khodadadifard"},
+ {"nick": "fcxSanya", "name": "Alexander Olkhovskiy"},
+ {"nick": "FeXoR", "name": "Florian Finke"},
+ {"nick": "Fire Giant", "name": "Malte Schwarzkopf"},
+ {"nick": "freenity", "name": "Anton Galitch"},
+ {"nick": "gbish (aka Iny)", "name": "Grant Bishop"},
+ {"nick": "Gee", "name": "Gustav Larsson"},
+ {"nick": "gerbilOFdoom"},
+ {"nick": "godlikeldh"},
+ {"nick": "greybeard", "name": "Joe Cocovich"},
+ {"nick": "grillaz"},
+ {"nick": "gudo"},
+ {"name": "Samuel Guarnieri"},
+ {"nick": "Haommin"},
+ {"nick": "h20", "name": "Daniel Wilhelm"},
+ {"nick": "historic_bruno", "name": "Ben Brian"},
+ {"nick": "idanwin"},
+ {"nick": "infyquest", "name": "Vijay Kiran Kamuju"},
+ {"nick": "IronNerd", "name": "Matthew McMullan"},
+ {"nick": "Itms", "name": "Nicolas Auvray"},
+ {"nick": "Jaison", "name": "Marco tom Suden"},
+ {"nick": "jammus", "name": "James Scott"},
+ {"nick": "Jgwman"},
+ {"nick": "Josh", "name": "Joshua J. Bakita"},
+ {"nick": "jP_wanN", "name": "Jonas Platte"},
+ {"nick": "Jubalbarca", "name": "James Baillie"},
+ {"nick": "JubJub", "name": "Sebastian Vetter"},
+ {"nick": "kabzerek", "name": "Grzegorz Kabza"},
+ {"nick": "Kai", "name": "Kai Chen"},
+ {"name": "Kareem Ergawy"},
+ {"nick": "kevmo", "name": "Kevin Caffrey"},
+ {"nick": "kezz", "name": "Graeme Kerry"},
+ {"nick": "kingadami", "name": "Adam Winsor"},
+ {"nick": "kingbasil", "name": "Giannis Fafalios"},
+ {"nick": "lafferjm", "name": "Justin Lafferty"},
+ {"nick": "leper", "name": "Georg Kilzer"},
+ {"nick": "livingaftermidnight", "name": "Will Dull"},
+ {"nick": "Louhike"},
+ {"nick": "lsdh"},
+ {"nick": "madmax", "name": "Abhijit Nandy"},
+ {"nick": "m0l0t0ph", "name": "Christoph Gielisch"},
+ {"nick": "markcho"},
+ {"nick": "MarkT", "name": "Mark Thompson"},
+ {"nick": "Markus"},
+ {"nick": "Matei", "name": "Matei Zaharia"},
+ {"nick": "MattDoerksen", "name": "Matt Doerksen"},
+ {"nick": "mattlott", "name": "Matt Lott"},
+ {"nick": "maveric", "name": "Anton Protko"},
+ {"nick": "Micnasty", "name": "Travis Gorkin"},
+ {"nick": "mimo"},
+ {"nick": "mk12", "name": "Mitchell Kember"},
+ {"nick": "Molotov", "name": "Dario Alvarez"},
+ {"nick": "mpmoreti", "name": "Marcos Paulo Moreti"},
+ {"nick": "mreiland", "name": "Michael Reiland"},
+ {"nick": "myconid"},
+ {"nick": "nd3c3nt", "name": "Gavin Fowler"},
+ {"nick": "niektb", "name": "Niek ten Brinke"},
+ {"nick": "njm"},
+ {"nick": "NoMonkey", "name": "John Mena"},
+ {"nick": "notpete", "name": "Rich Cross"},
+ {"nick": "Ols", "name": "Oliver Whiteman"},
+ {"nick": "olsner", "name": "Simon Brenner"},
+ {"nick": "otero"},
+ {"name": "Nick Owens"},
+ {"nick": "Palaxin", "name": "David A. Freitag"},
+ {"name": "Paul Withers"},
+ {"nick": "pcpa", "name": "Paulo Andrade"},
+ {"nick": "Pendingchaos"},
+ {"nick": "PeteVasi", "name": "Pete Vasiliauskas"},
+ {"nick": "Polakrity"},
+ {"nick": "Poya", "name": "Poya Manouchehri"},
+ {"name": "Quentin Pradet"},
+ {"nick": "prefect", "name": "Nicolai Hähnle"},
+ {"nick": "pstumpf", "name": "Pascal Stumpf"},
+ {"name": "André Puel"},
+ {"nick": "Prodigal Son"},
+ {"nick": "pyrolink", "name": "Andrew Decker"},
+ {"nick": "quantumstate", "name": "Jonathan Waller"},
+ {"nick": "QuickShot", "name": "Walter Krawec"},
+ {"nick": "quonter"},
+ {"nick": "qwertz"},
+ {"nick": "Radagast"},
+ {"nick": "Raj", "name": "Raj Sharma"},
+ {"nick": "RedFox", "name": "Jorma Rebane"},
+ {"nick": "RefinedCode"},
+ {"nick": "Riemer"},
+ {"name": "Rolf Sievers"},
+ {"nick": "s0600204", "name": "Matthew Norwood"},
+ {"nick": "SafaAlfulaij"},
+ {"nick": "sanderd17", "name": "Sander Deryckere"},
+ {"nick": "sathyam", "name": "Sathyam Vellal"},
+ {"nick": "sbte", "name": "Sven Baars"},
+ {"nick": "scroogie", "name": "André Gemünd"},
+ {"nick": "scythetwirler", "name": "Casey X."},
+ {"nick": "serveurix"},
+ {"nick": "Shane", "name": "Shane Grant"},
+ {"nick": "Silk", "name": "Josh Godsiff"},
+ {"nick": "silure"},
+ {"nick": "Simikolon", "name": "Yannick & Simon"},
+ {"nick": "Spahbod", "name": "Omid Davoodi"},
+ {"nick": "stanislas69", "name": "Stanislas Dolcini"},
+ {"nick": "Stefan"},
+ {"nick": "stilz", "name": "Sławomir Zborowski"},
+ {"nick": "stwf", "name": "Steven Fuchs"},
+ {"nick": "t4nk004"},
+ {"nick": "tbm", "name": "Martin Michlmayr"},
+ {"nick": "tau"},
+ {"nick": "Teiresias"},
+ {"nick": "thamlett", "name": "Timothy Hamlett"},
+ {"nick": "thedrunkyak", "name": "Dan Fuhr"},
+ {"nick": "TrinityDeath", "name": "Jethro Lu"},
+ {"nick": "triumvir", "name": "Corin Schedler"},
+ {"nick": "trompetin17", "name": "Juan Guillermo"},
+ {"nick": "vladislavbelov", "name": "Vladislav Belov"},
+ {"nick": "vts", "name": "Jeroen DR"},
+ {"nick": "WhiteTreePaladin", "name": "Brian Ashley"},
+ {"nick": "wraitii", "name": "Lancelot de Ferrière le Vayer"},
+ {"nick": "Xentelian", "name": "Mark Strawson"},
+ {"nick": "Xienen", "name": "Dayle Flowers"},
+ {"nick": "xtizer", "name": "Matt Green"},
+ {"nick": "yashi", "name": "Yasushi Shoji"},
+ {"nick": "Ykkrosh", "name": "Philip Taylor"},
+ {"nick": "Yves"},
+ {"nick": "Zeusthor", "name": "Jeffrey Tavares"},
+ {"nick": "zoot"},
+ {"nick": "zsol", "name": "Zsolt Dollenstein"},
+ {"nick": "Zyi", "name": "Charles De Meulenaer"}
+ ]
+ }
+ ]
+}
diff --git a/binaries/data/mods/public/gui/credits/texts/special.json b/binaries/data/mods/public/gui/credits/texts/special.json
new file mode 100644
index 0000000000..b06ec3fad8
--- /dev/null
+++ b/binaries/data/mods/public/gui/credits/texts/special.json
@@ -0,0 +1,40 @@
+{
+ "Content": [
+ {
+ "Title": "In Memoriam",
+ "List": [
+ {"nick": "Phoenix-TheRealDeal", "name": "Ken Wood"},
+ {"nick": "Dak Lozar", "name": "Dave Loeser"}
+ ]
+ },
+ {
+ "Title": "Special thanks to:",
+ "Content": [
+ {
+ "Subtitle": "0 A.D. Founder",
+ "List": [{"nick": "Wijitmaker", "name": "Jason Bishop"}]
+ },
+ {
+ "Subtitle": "Project Leaders",
+ "List": [
+ {"nick": "feneur", "name": "Erik Johansson"},
+ {"nick": "Mythos_Ruler", "name": "Michael D. Hafer"}
+ ]
+ },
+ {
+ "Subtitle": "Co-Lead Designers",
+ "List": [
+ {"nick": "Phoenix-TheRealDeal", "name": "Ken Wood"},
+ {"nick": "Acumen", "name": "Stuart Walpole"}
+ ]
+ }
+ ]
+ },
+ {
+ "Title": "And thanks to the entire community for making 0 A.D. possible."
+ },
+ {
+ "Title": "No historians were harmed during the development of this project."
+ }
+ ]
+}
diff --git a/binaries/data/mods/public/gui/page_credits.xml b/binaries/data/mods/public/gui/page_credits.xml
new file mode 100644
index 0000000000..83628e780e
--- /dev/null
+++ b/binaries/data/mods/public/gui/page_credits.xml
@@ -0,0 +1,12 @@
+
+
+ common/modern/setup.xml
+ common/modern/styles.xml
+ common/modern/sprites.xml
+
+ common/global.xml
+
+ credits/styles.xml
+ credits/sprites.xml
+ credits/credits.xml
+
diff --git a/binaries/data/mods/public/gui/pregame/mainmenu.xml b/binaries/data/mods/public/gui/pregame/mainmenu.xml
index d2089d3e0f..cd1917fc4a 100644
--- a/binaries/data/mods/public/gui/pregame/mainmenu.xml
+++ b/binaries/data/mods/public/gui/pregame/mainmenu.xml
@@ -535,28 +535,14 @@
Alpha XIX: Syllepsis
[/font]\n\n
WARNING: This is an early development version of the game. Many features have not been added yet.
- \n\n
- Get involved at: play0ad.com
-
+
- Help with the Translation!
- Click to open the 0 A.D. translate page in your browser.
-
-
-
-
Website
Click to open play0ad.com in your web browser.
@@ -568,7 +554,7 @@
Chat
Click to open the 0 A.D. IRC chat in your browser. (#0ad on webchat.quakenet.org)
@@ -580,7 +566,7 @@
Report a Bug
Click to visit 0 A.D. Trac to report a bug, crash, or error.
@@ -589,6 +575,30 @@
]]>
+
+ Translate the game
+ Click to open the 0 A.D. translate page in your browser.
+
+
+
+
+ Credits
+ Click to see the 0 A.D. credits.
+
+ Engine.PushGuiPage("page_credits.xml", {});
+
+
+
diff --git a/binaries/data/mods/public/gui/text/credits.txt b/binaries/data/mods/public/gui/text/credits.txt
deleted file mode 100644
index d5e369e4a4..0000000000
--- a/binaries/data/mods/public/gui/text/credits.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-"0 A.D."
-
-Cast of Characters
-Dude #768 Minion #392
-Dude #162 Minion #864
-Dude #794 Minion #894
-Dude #765 Minion #896
-Dude #668 Minion #331
-Dude #748 Minion #892
-Dude #963 Minion #870
-Dude #564 Minion #321
-Dude #731 Minion #891
-Polly Gonne Dudette
-
-and introducing
-Roastin' Staff Rooster as himself
-
-No historians were harmed during the development of this project.
-
-© 2002-2007 Wildfire Games. All rights reserved.
-
-This product is intended solely for private home use. Public performance or other use is expressly prohibited.
\ No newline at end of file
diff --git a/binaries/data/mods/public/l10n/messages.json b/binaries/data/mods/public/l10n/messages.json
index 030021bd95..4420ab14bb 100644
--- a/binaries/data/mods/public/l10n/messages.json
+++ b/binaries/data/mods/public/l10n/messages.json
@@ -236,6 +236,7 @@
"globalscripts/**.js",
"gui/civinfo/**.js",
"gui/common/**.js",
+ "gui/credits/**.js",
"gui/locale/**.js",
"gui/msgbox/**.js",
"gui/options/**.js",
@@ -268,6 +269,7 @@
"globalscripts/**.xml",
"gui/civinfo/**.xml",
"gui/common/**.xml",
+ "gui/credits/**.xml",
"gui/locale/**.xml",
"gui/msgbox/**.xml",
"gui/options/**.xml",
@@ -286,6 +288,18 @@
"translate": {}
}
}
+ },
+ {
+ "extractor": "json",
+ "filemasks": [
+ "gui/credits/texts/**.json"
+ ],
+ "options": {
+ "keywords": [
+ "Title",
+ "Subtitle",
+ ]
+ }
},
{
"extractor": "json",
diff --git a/source/tools/i18n/creditTranslators.py b/source/tools/i18n/creditTranslators.py
new file mode 100644
index 0000000000..69a108e954
--- /dev/null
+++ b/source/tools/i18n/creditTranslators.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python2
+# -*- coding:utf-8 -*-
+#
+# Copyright (C) 2016 Wildfire Games.
+# This file is part of 0 A.D.
+#
+# 0 A.D. is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# 0 A.D. is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with 0 A.D. If not, see .
+
+"""
+This file imports the translators credits located in the public mod GUI files and
+runs through .po files to add possible new translators to it.
+It only appends new people, so it is possible to manually add names in the credits
+file and they won't be overwritten by running this script.
+
+Translatable strings will be extracted from the generated file, so this should be ran
+before updateTemplates.py.
+"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import json, os, glob, re
+
+# Credited languages - Keep in sync with source/tools/dist/remove-incomplete-translations.sh
+langs = {
+ 'cs': 'Czech',
+ 'de': 'German',
+ 'en_GB': 'English (UK)',
+ 'es': 'Spanish',
+ 'fr': 'French',
+ 'gd': 'Gaelic',
+ 'gl': 'Galician',
+ 'id': 'Indonesian',
+ 'it': 'Italian',
+ 'nl': 'Dutch',
+ 'pl': 'Polish',
+ 'pt_PT': 'Portuguese (Portugal)',
+ 'pt_BR': 'Portuguese (Brazil)',
+ 'ru': 'Russian',
+ 'sk': 'Slovak',
+ 'tr': 'Turkish'}
+
+root = '../../../'
+
+poLocations = [
+ 'binaries/data/l10n/',
+ 'binaries/data/mods/public/l10n/',
+ 'binaries/data/mods/mod/l10n/']
+
+creditsLocation = 'binaries/data/mods/public/gui/credits/texts/translators.json'
+
+# Load JSON data
+creditsFile = open(root + creditsLocation)
+JSONData = json.load(creditsFile)
+creditsFile.close()
+
+# This dictionnary will hold creditors lists for each language, indexed by code
+langsLists = {}
+
+# Create the new JSON data
+newJSONData = {'Content': []}
+
+# First get the already existing lists. If they correspond with some of the credited languages,
+# add them to the new data after processing, else add them immediately.
+# NB: All of this is quite inefficient
+for element in JSONData['Content']:
+ if 'Title' not in element or element['Title'] not in langs.values():
+ newJSONData['Content'].append(element)
+ continue
+
+ for (langCode, langName) in langs.items():
+ if element['Title'] == langName:
+ langsLists[langCode] = element['List']
+ break
+
+# Now actually go through the list of languages and search the .po files for people
+
+# Prepare some regexes
+commentMatch = re.compile('#.*')
+translatorMatch = re.compile('# ([\w\s]*)(?: <.*>)?, [0-9-]', re.UNICODE)
+
+# Search
+for lang in langs.keys():
+ if lang not in langsLists.keys():
+ langsLists[lang] = []
+
+ for location in poLocations:
+ files = glob.glob(root + location + lang + '.*.po')
+ for file in files:
+ poFile = open(file.replace('\\', '/'))
+ reached = False
+ for line in poFile:
+ line = line.decode('utf8')
+ if reached:
+ if not commentMatch.match(line):
+ break
+ m = translatorMatch.match(line)
+ if m:
+ langsLists[lang].append(m.group(1))
+ if line.strip() == '# Translators:':
+ reached = True
+ poFile.close()
+
+ # Sort and remove duplicates
+ # Sorting should ignore case to have a neat credits list
+ langsLists[lang] = sorted(set(langsLists[lang]), cmp=lambda x,y: cmp(x.lower(), y.lower()))
+
+# Now insert the new data into the new JSON file
+for (langCode, langList) in sorted(langsLists.items()):
+ newJSONData['Content'].append({'Title': langs[langCode], 'List': []})
+ for name in langList:
+ newJSONData['Content'][-1]['List'].append({'name': name})
+
+# Save the JSON data to the credits file
+creditsFile = open(root + creditsLocation, 'w')
+json.dump(newJSONData, creditsFile, indent=4)
+creditsFile.close()