#include "ui/ui_extensions.lua" Credits = {} Credits.startTime = 0.0 Credits.prepared = false Credits.finished = false Credits.fade = 0 Credits.prepare = function(startTime) Credits.startTime = startTime or GetTime() Credits.prepared = true Credits.finished = false end Credits.headerType = { p = "p", s1 = "s1", s2 = "s2" } Credits.blockType = { header = "header", group = "group" } Credits.createHeader = function(type, txt) local h = { blockType = Credits.blockType.header, blockData = { headerType = type, text = txt } } return h end Credits.createGroup = function(label, names) local g = { blockType = Credits.blockType.group, blockData = { groupLabel = label, names = names } } return g end Credits.data = { Credits.createHeader(Credits.headerType.p, "SABER INTERACTIVE"), Credits.createHeader(Credits.headerType.s1, "SABER DEVELOPMENT"), Credits.createHeader(Credits.headerType.s2, "ENGINEERING"), Credits.createGroup("Technical Director", { "Andrei Kilvein" }), Credits.createGroup("Technical Director", { "Roman Lebedev" }), Credits.createGroup("Lead Developer", { "Dmitrii Nazarov" }), Credits.createGroup("Senior Developers", { "Adam Korkmazov" ,"Maksim Krylosov" }), Credits.createGroup("Developers", { "Kirill Zheronkin", "Vladimir Parusov", "Karim Kirillov", "Dmitrii Smirnov", "Pavel Rodionov", "Vladimir Kuskov", "Vladimir Kazakov", "Denis Koveshnikov", "Georgii Chubov" }), Credits.createGroup("Lead Render Developers", { "Ruslan Kutdusov", "Anton Vasilev" }), Credits.createGroup("Render Developers", { "Aleksandr Galkin", "Kirill Kuksenko", "Viktor Kolesnik" }), Credits.createHeader(Credits.headerType.s2, "PRODUCTION"), Credits.createGroup("Production Director", { "Sergey Rakhmanov" }), Credits.createGroup("Lead Producer", { "Arkadi Zaitsev" }), Credits.createGroup("Lead Producer", { "Aleksei Provorotov" }), Credits.createGroup("Project Manager", { "Alexandr Lavrishko" }), Credits.createGroup("Producers", { "Dmitrii Ivanov", "Denis Bichin", "Maria Pankratova", "Vladimir Vorontsov" }), Credits.createHeader(Credits.headerType.s2, "GAME DESIGN"), Credits.createGroup("Lead Game Designer", { "Evgeniy Sorokin" }), Credits.createGroup("Game Designers", { "Igor Nereto", "Aleksandr Chaikin" }), Credits.createGroup("Level Designers", { "Vasilii Nikulov", "Andrei Rybolovlev" }), Credits.createHeader(Credits.headerType.s2, "UX/UI DESIGN"), Credits.createGroup("UI Developer", { "Yury Alkevich" }), Credits.createGroup("UX/UI Designer", { "Maksim Bragin" }), Credits.createHeader(Credits.headerType.s2, "ART AND VISUALS"), Credits.createGroup("Lead artist", { "Kseniia Goretova" }), Credits.createGroup("Artist", { "Mariia Stepanova" }), Credits.createHeader(Credits.headerType.s2, "SABER QUALITY ASSURANCE"), Credits.createGroup("Quality Assurance Director", { "Viktor Glyanenko" }), Credits.createGroup("Quality Assurance Manager", { "Maxim Filippov" }), Credits.createGroup("Quality Assurance Project Lead", { "Victoria Bagdasaeva" }), Credits.createGroup("Quality Assurance Team", { "Ruslan Borzenko", "Andrei Ilin", "Yakov Krasnov", "Denis Smorodnikov", "Alexandr Mikheev", "Irina Mort", "Aleksei Siniaev" }), Credits.createHeader(Credits.headerType.s2, "BYTEX QUALITY ASSURANCE"), Credits.createGroup("CEO", { "Aleksandr Torgovkin" }), Credits.createGroup("Quality Assurance Coordinator", { "Maxim Nikolaev" }), Credits.createGroup("Quality Assurance Manager", { "Artem Stukalov" }), Credits.createGroup("Quality Assurance Team Lead", { "Aleksandr Pronkin" }), Credits.createGroup("Quality Assurance Team", { "Kseniia Anoshkina", "Armen Revunts", "Aleksandr Kozlov", "Nikolay Afanasev", "Mihail Yakushkin", "Yaroslav Makarov", "Vladislav Lapshinov" }), Credits.createHeader(Credits.headerType.s2, "SABER PUBLISHING"), Credits.createGroup("CEO", { "Andrey Iones" }), Credits.createGroup("CCO", { "Tim Willits" }), Credits.createGroup("CFO", { "Gary Levin" }), Credits.createGroup("CTO", { "Anton Krupkin" }), Credits.createGroup("General Counsel", { "Jeff Oshinsky" }), Credits.createGroup("Head of Publishing", { "Todd Hollenshead" }), Credits.createGroup("Head of Production", { "Brad Doan" }), Credits.createGroup("Head of Marketing & Communications", { "Shaun Norton" }), Credits.createGroup("Head of Product", { "Chris Martin" }), Credits.createGroup("Director of Business Development", { "Corey Wade" }), Credits.createGroup("Chief Narrative Officer", { "Craig Sherman" }), Credits.createGroup("Publishing Director", { "James Gresko" }), Credits.createGroup("Marketing Director", { "Nick Chester" }), Credits.createGroup("Art Director", { "Dmitry Kholodov" }), Credits.createGroup("Head of UI/UX Department", { "Alexey Melnikov" }), Credits.createGroup("Director of Community", { "Astrid Rosemarin" }), Credits.createGroup("Senior Community Manager", { "Zach Carr" }), Credits.createGroup("Director of Marketing", { "Jerome Ortmann" }), Credits.createGroup("Creative Director", { "Jason O'Connell" }), Credits.createGroup("Assistant Creative Director", { "Chad Eanes" }), Credits.createGroup("Production Director", { "Andrew Dutra" }), Credits.createGroup("Publishing Producer", { "Phuc Van Dinh" }), Credits.createGroup("IT Director", { "Victor Stupko" }), Credits.createGroup("Lead Release Manager", { "Tatiana Koretskaia" }), Credits.createGroup("Release Manager", { "Ekaterina Kachalkova" }), Credits.createGroup("Release Manager", { "Nora Mordkovich" }), Credits.createGroup("Release Manager", { "Anton Shelevakho" }), Credits.createGroup("QA Coordinator", { "Maxim Nikolaev" }), Credits.createHeader(Credits.headerType.s2, "SABER PROMO TEAM"), Credits.createGroup("Production Artists", { "Timofei Timofeev" }), Credits.createGroup("Production Artists", { "Egor Murza" }), Credits.createGroup("Production Artists", { "Stepan Diedrich" }), Credits.createGroup("Production Artists", { "Igor Kolomiets" }), Credits.createGroup("VFX Artists", { "Gennady Dobrynin" }), Credits.createGroup("VFX Artists", { "Aleksandr Dneprovskii" }), Credits.createGroup("VFX Artists", { "Renat Salimgareev" }), Credits.createGroup("VFX Artists", { "Maxim Tarasevich" }), Credits.createGroup("2D Artists", { "Anna Taran" }), Credits.createGroup("2D Artists", { "Irina Matveeva" }), Credits.createGroup("2D Artists", { "Yaroslav Minchenko" }), Credits.createGroup("Sound Artist", { "Alexey M. Evlanov" }), Credits.createGroup("Producers", { "Ivan Taran" }), Credits.createGroup("Producers", { "Alexey Goncharow" }), Credits.createGroup("Executive", { "Sasha V. Astakhov" }), Credits.createHeader(Credits.headerType.p, "SANDBOX STRATEGIES - PUBLIC & INFLUENCER RELATIONS TEAM"), Credits.createGroup("Vice President", { "Rob Fleischer" }), Credits.createGroup("Director of Influencer Relations", { "Santos Echevarria" }), Credits.createGroup("Influencer Relations Manager", { "Sam Stephenson" }), Credits.createHeader(Credits.headerType.p, "HOTKEY"), Credits.createGroup("Marketing Lead", { "Ryan Clark" }), Credits.createHeader(Credits.headerType.p, "TRAILERFARM"), Credits.createGroup("Executive Producer", { "Alys Elwick" }), Credits.createGroup("Producer", { "Zoey Wood" }), Credits.createGroup("Creative Lead & Editor", { "Tom Cotton" }), Credits.createGroup("Capture Coordinator", { "Jack Cotton" }), Credits.createGroup("Motion Graphics Designer", { "Sam Wall" }), Credits.createGroup("Sound Mixer", { "Steve Emney" }), Credits.createGroup("Editor", { "Matt Pickles" }), Credits.createGroup("Studio Head", { "Ben Lavery" }), Credits.createGroup("Production Director", { "Katie Reid" }), Credits.createGroup("Creative Services Director", { "Joe Kelly" }), Credits.createGroup("Operations Director", { "Teresa Dearn" }), Credits.createGroup("Commercial Director", { "Devon Pearce" }), Credits.createGroup("Creative Director", { "Moog Gravett" }), Credits.createGroup("Creative Lead", { "Katie Lowndes" }), Credits.createGroup("Technical Lead", { "Jack Roach" }), Credits.createGroup("Cinematics Artists", { "Dan Greenway", "Ansh Kanchan" }), Credits.createGroup("CG Supervisor", { "Genco Üney" }), Credits.createGroup("Creative Coordinator", { "Jack Myers" }), Credits.createGroup("Previz & Layout Artists", { "Will Wardle", "Luke Campion" }), Credits.createGroup("Production Team", { "Jasmine Redfern", "Jack Hall", "Carla Wellings", "Kayung Lai", "Mat Keller", "Nicole Houseman", }), Credits.createGroup("Commercial Team", { "Moira Scarlett", "Lucy Lucas", "Sarah Nutt", }), Credits.createGroup("Talent & Recruitment Senior", { "Matt Dunford" }), Credits.createGroup("Studio & Culture Assistant", { "Jen Sandell" }), Credits.createGroup("Production Intern", { "Alexis Obue" }), Credits.createGroup("Tech Intern", { "Tom Passmore" }), Credits.createGroup("IT Manager", { "Richard Harlaar" }), Credits.createHeader(Credits.headerType.p, "Special Thanks"), Credits.createHeader(Credits.headerType.s2, "PlayerXP"), } Credits.linesCount = function(txt) local _, dh = UiGetTextSize("test") local _, h = UiGetTextSize(txt) local n = math.floor(h / dh) return n == 0 and 1 or n end Credits.drawText = function(txt, move) move = move or false local w,h = UiGetTextSize(txt) if not UiIsRectFullyClipped(w, h) then UiText(txt, move) end return w, h end Credits.nextBlock = nil Credits.drawBlock = function(block) local indent = 0 UiPush() if block.blockType == Credits.blockType.header then UiTranslateToScreenCenter() UiWordWrap(1580) UiTextAlignment("center") UiAlign("top center") if block.blockData.headerType == Credits.headerType.p then UiFont("bold.ttf", 85) indent = 100 + 85 * Credits.linesCount(block.blockData.text) elseif block.blockData.headerType == Credits.headerType.s1 then UiFont("bold.ttf", 60) indent = 100 + 60 * Credits.linesCount(block.blockData.text) elseif block.blockData.headerType == Credits.headerType.s2 then UiFont("bold.ttf", 50) indent = 60 + 50 * Credits.linesCount(block.blockData.text) end Credits.drawText(block.blockData.text) elseif block.blockType == Credits.blockType.group then local lineHeight = 50 UiTranslate(0, lineHeight / 2) UiAlign("middle left") UiTranslateToScreenCenter() UiFont("bold.ttf", 50) Credits.drawText(block.blockData.names[1]) UiPush() UiFont("medium.ttf", 37) UiGetTextSize(block.blockData.groupLabel) UiTranslate(-50, 0) UiAlign("middle right") Credits.drawText(block.blockData.groupLabel) UiPop() indent = lineHeight for i=2,#block.blockData.names do indent = indent + lineHeight + 30 UiTranslate(0, 30 + lineHeight) Credits.drawText(block.blockData.names[i]) end if Credits.nextBlock ~= nil and Credits.nextBlock.blockType == Credits.blockType.header then if Credits.nextBlock.blockData.headerType == Credits.headerType.p then indent = indent + 150 else indent = indent + 100 end else indent = indent + 60 end end UiPop() return indent end Credits.drawHint = function() UiPush() UiTranslateToScreenBottomEdge(0, -60) UiTranslateToScreenLeftEdge(40, 0) if LastInputDevice() == UI_DEVICE_MOUSE then UiAlign("left middle") UiFont("regular.ttf", 27) UiColor(1, 1, 1, 1) UiColorFilter(1, 1, 1, 0.7) local w, _ = UiText("loc@ESC_UPPERCASE") UiTranslate(w + 10, 0) UiText("loc@UI_BUTTON_BACK") else UiColor(1, 1, 1, 1) UiDrawGamepadHintsLeftAlign({{ico = "[[menu:menu_cancel;iconsize=42,42]]", txt="loc@UI_BUTTON_BACK"}}) end UiPop() end Credits.draw = function(timeSinceStart) if not Credits.prepared then return end local timePassed = timeSinceStart or (GetTime() - Credits.startTime) UiPush() UiColor(1, 1, 1, 1 - Credits.fade) UiTranslateToScreenBottomEdge(0, -timePassed * 100) for i=1, #Credits.data do Credits.nextBlock = Credits.data[i + 1] local indent = Credits.drawBlock(Credits.data[i]) UiTranslate(0, indent) end UiTranslateToScreenCenter() UiPush() UiTranslate(0, 140) UiFont("bold.ttf", 60) UiAlign("top center") Credits.drawText("A GAME BY") UiPop() UiTranslate(0, 250) UiFont("bold.ttf", 100) UiAlign("top center") Credits.drawText("Tuxedo Labs") local _,y = UiGetCursorPos() if y < UiHeight() / 2 and Credits.fade == 0 then SetValueInTable(Credits, "fade", 1, "linear", 5) end if not Credits.finished and Credits.fade == 1 then Credits.finished = true end UiPop() end