// EndCreditsPro — End Credits Template (Essential) — After Effects
// Run: File > Scripts > Run Script File...  Then replace each [ ENTER NAME ].
// Type: Helvetica / Helvetica-Bold, same colour, centered. Scroll speed 65 px/s (editable).
(function () {
  app.beginUndoGroup("Build End Credits");
  var W = 1920, H = 1080, FPS = 24, SPEED = 65, DUR = 144;
  var comp = app.project.items.addComp("End Credits \u2014 Essential", W, H, 1.0, DUR, FPS);
  comp.openInViewer();
  comp.layers.addSolid([0, 0, 0], "BG", W, H, 1.0, DUR);
  function addCredit(str, fontSize, yCenter, isRole) {
    var t = comp.layers.addText(str);
    var td = t.property("Source Text").value;
    td.resetCharStyle(); td.fontSize = fontSize;
    try { td.font = isRole ? "Helvetica" : "Helvetica-Bold"; } catch (e) {}
    td.applyFill = true; td.applyStroke = false; td.fillColor = [1, 1, 1];
    if (isRole) { try { td.tracking = 160; } catch (e) {} }
    td.justification = ParagraphJustification.CENTER_JUSTIFY;
    t.property("Source Text").setValue(td);
    var r = t.sourceRectAtTime(0, false);
    t.property("Transform").property("Anchor Point").setValue([r.left + r.width / 2, r.top + r.height / 2]);
    t.property("Transform").property("Position").expression =
      "[" + (W / 2) + ", " + yCenter + " + " + H + " - time*" + SPEED + "]";
  }
  addCredit("DIRECTED BY", 30, 0, true);
  addCredit("[ ENTER NAME ]", 46, 50, false);
  addCredit("WRITTEN BY", 30, 170, true);
  addCredit("[ ENTER NAME ]", 46, 220, false);
  addCredit("PRODUCED BY", 30, 340, true);
  addCredit("[ ENTER NAME ]", 46, 390, false);
  addCredit("LEAD CAST (1-5)", 30, 510, true);
  addCredit("[ ENTER NAME ]", 46, 560, false);
  addCredit("EXECUTIVE PRODUCERS", 30, 680, true);
  addCredit("[ ENTER NAME ]", 46, 730, false);
  addCredit("EDITED BY", 30, 850, true);
  addCredit("[ ENTER NAME ]", 46, 900, false);
  addCredit("DIRECTOR OF PHOTOGRAPHY", 30, 1020, true);
  addCredit("[ ENTER NAME ]", 46, 1070, false);
  addCredit("CASTING BY", 30, 1190, true);
  addCredit("[ ENTER NAME ]", 46, 1240, false);
  addCredit("SOUND DESIGNER", 30, 1360, true);
  addCredit("[ ENTER NAME ]", 46, 1410, false);
  addCredit("SUPERVISING SOUND EDITOR", 30, 1530, true);
  addCredit("[ ENTER NAME ]", 46, 1580, false);
  addCredit("MUSIC BY", 30, 1700, true);
  addCredit("[ ENTER NAME ]", 46, 1750, false);
  addCredit("MUSIC SUPERVISOR", 30, 1870, true);
  addCredit("[ ENTER NAME ]", 46, 1920, false);
  addCredit("PRODUCTION DESIGNER", 30, 2040, true);
  addCredit("[ ENTER NAME ]", 46, 2090, false);
  addCredit("COSTUME DESIGNER", 30, 2210, true);
  addCredit("[ ENTER NAME ]", 46, 2260, false);
  addCredit("VISUAL EFFECTS SUPERVISOR", 30, 2380, true);
  addCredit("[ ENTER NAME ]", 46, 2430, false);
  addCredit("UNIT PRODUCTION MANAGER", 30, 2550, true);
  addCredit("[ ENTER NAME ]", 46, 2600, false);
  addCredit("FIRST ASSISTANT DIRECTOR", 30, 2720, true);
  addCredit("[ ENTER NAME ]", 46, 2770, false);
  addCredit("SECOND ASSISTANT DIRECTOR", 30, 2890, true);
  addCredit("[ ENTER NAME ]", 46, 2940, false);
  addCredit("CAMERA OPERATOR", 30, 3060, true);
  addCredit("[ ENTER NAME ]", 46, 3110, false);
  addCredit("FIRST ASSISTANT CAMERA", 30, 3230, true);
  addCredit("[ ENTER NAME ]", 46, 3280, false);
  addCredit("SECOND ASSISTANT CAMERA", 30, 3400, true);
  addCredit("[ ENTER NAME ]", 46, 3450, false);
  addCredit("DIGITAL IMAGING TECHNICIAN", 30, 3570, true);
  addCredit("[ ENTER NAME ]", 46, 3620, false);
  addCredit("PRODUCTION SOUND MIXER", 30, 3740, true);
  addCredit("[ ENTER NAME ]", 46, 3790, false);
  addCredit("BOOM OPERATOR", 30, 3910, true);
  addCredit("[ ENTER NAME ]", 46, 3960, false);
  addCredit("PRODUCTION DESIGNER", 30, 4080, true);
  addCredit("[ ENTER NAME ]", 46, 4130, false);
  addCredit("ART DIRECTOR", 30, 4250, true);
  addCredit("[ ENTER NAME ]", 46, 4300, false);
  addCredit("SET DECORATOR", 30, 4420, true);
  addCredit("[ ENTER NAME ]", 46, 4470, false);
  addCredit("PROPERTY MASTER", 30, 4590, true);
  addCredit("[ ENTER NAME ]", 46, 4640, false);
  addCredit("CASTING BY", 30, 4760, true);
  addCredit("[ ENTER NAME ]", 46, 4810, false);
  addCredit("COSTUME SUPERVISOR", 30, 4930, true);
  addCredit("[ ENTER NAME ]", 46, 4980, false);
  addCredit("HAIR DEPARTMENT HEAD", 30, 5100, true);
  addCredit("[ ENTER NAME ]", 46, 5150, false);
  addCredit("MAKEUP DEPARTMENT HEAD", 30, 5270, true);
  addCredit("[ ENTER NAME ]", 46, 5320, false);
  addCredit("KEY GRIP", 30, 5440, true);
  addCredit("[ ENTER NAME ]", 46, 5490, false);
  addCredit("BEST GRIP", 30, 5610, true);
  addCredit("[ ENTER NAME ]", 46, 5660, false);
  addCredit("GAFFER", 30, 5780, true);
  addCredit("[ ENTER NAME ]", 46, 5830, false);
  addCredit("BEST ELECTRIC", 30, 5950, true);
  addCredit("[ ENTER NAME ]", 46, 6000, false);
  addCredit("LOCATION MANAGER", 30, 6120, true);
  addCredit("[ ENTER NAME ]", 46, 6170, false);
  addCredit("ASSISTANT EDITOR", 30, 6290, true);
  addCredit("[ ENTER NAME ]", 46, 6340, false);
  addCredit("MUSIC EDITOR", 30, 6460, true);
  addCredit("[ ENTER NAME ]", 46, 6510, false);
  addCredit("SOUND DESIGNER", 30, 6630, true);
  addCredit("[ ENTER NAME ]", 46, 6680, false);
  addCredit("SUPERVISING SOUND EDITOR", 30, 6800, true);
  addCredit("[ ENTER NAME ]", 46, 6850, false);
  addCredit("DIALOGUE EDITOR", 30, 6970, true);
  addCredit("[ ENTER NAME ]", 46, 7020, false);
  addCredit("RE-RECORDING MIXER", 30, 7140, true);
  addCredit("[ ENTER NAME ]", 46, 7190, false);
  addCredit("MUSIC SUPERVISOR", 30, 7310, true);
  addCredit("[ ENTER NAME ]", 46, 7360, false);
  addCredit("VISUAL EFFECTS SUPERVISOR", 30, 7480, true);
  addCredit("[ ENTER NAME ]", 46, 7530, false);
  addCredit("MAIN TITLE DESIGN", 30, 7650, true);
  addCredit("[ ENTER NAME ]", 46, 7700, false);
  addCredit("END TITLE DESIGN", 30, 7820, true);
  addCredit("[ ENTER NAME ]", 46, 7870, false);
  addCredit("SPECIAL THANKS", 30, 7990, true);
  addCredit("[ ENTER NAME ]", 46, 8040, false);
  app.endUndoGroup();
  alert("Built '" + comp.name + "' \u2014 48 credits, " + DUR + "s. Replace each [ ENTER NAME ].");
})();
