﻿// =====================================================================
// CENA K-maps (28,00–33,875 s, ref 30,90) — Google Maps claro (agente w-google, 17/10). ES3.
// Mapa vetorial nosso desenhado sobre o mosaico do original (coordenadas do mundo = quadro de 30,90).
// Câmera: camera/cena-K-maps-ajustada.json — a medida tinha 3 trechos que não fechavam entre si (o original usa
// prints do Maps em zooms diferentes): 28,0–29,0 corrigido por pontos fixos (avatar 1, D152, D607, pino verde),
// 29,4–30,9 por cadeia ECC ancorada em 30,5, e o fim pelo ECC 30,5→33,5 conferido no avatar 1.
// Encaixe J: o pino-avatar 1 (comp provisória "ENCAIXE J-jornal2"). Para em 33,3 (único descanso).
// Textos de letra: K1 (rótulo do pino 1), K2 (busca), K3 (rótulo do pino verde perto do avatar 2), K4 (texto azul).
// =====================================================================
(function () {
  var P0 = File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/");
  $.evalFile(P0 + "ae/wg-util.jsx");
  var ID = "K-maps", MG = 60, TS = 28.0;
  var pasta = WG.pasta("CENA " + ID + " (w-google)");
  var M = WG.comp("MUNDO " + ID, 1080 + 2 * MG, 1080 + 2 * MG, pasta);
  var C = WG.camera(M, ID), cam = C.cam;
  var FR = "Roboto-Regular", FRM = "Roboto-Medium", FRB = "Roboto-Bold", FG = "GoogleSansFlex120pt-Regular", FI = "SegoeMDL2Assets";
  var VERDE = "#CFF2DC", VERDE2 = "#A9E5C2", URB = "#EEEEF0", ESTR = "#8DA4C1", AGUA = "#8DD7EB", TRILHA = "#9ED8B6";
  var i;
  function rotulo(s, x, y, tam, cor, o) {
    o = o || {};
    var L = WG.texto(M, cam, "rotulo " + s, s, { x: x, y: y, fonte: o.fonte || FRM, tam: tam, cor: cor, traco: "#FFFFFF", tracoL: o.halo || 4, just: o.just });
    if (o.rot) WG.tr(L).property("ADBE Rotate Z").setValue(o.rot);
    return L;
  }
  function pino(nome, x, y, d, cor, icone, corIcone) {
    var g = WG.nulo(M, cam, "pino " + nome, [0, 0], [x, y]);
    WG.forma(M, g, "pino " + nome + " sombra", { x: -d * 0.18, y: d * 0.42, w: d * 0.36, h: d * 0.16, elipse: true, cor: "#000000", alfa: 18 });
    WG.forma(M, g, "pino " + nome + " borda", { x: -d / 2 - 2, y: -d / 2 - 2, w: d + 4, h: d + 4, elipse: true, cor: "#FFFFFF" });
    WG.forma(M, g, "pino " + nome + " cor", { x: -d / 2, y: -d / 2, w: d, h: d, elipse: true, cor: cor });
    if (icone) WG.texto(M, g, "pino " + nome + " icone", icone, { x: 0, y: d * 0.22, fonte: FI, tam: d * 0.55, cor: corIcone || "#FFFFFF", just: "C" });
    return g;
  }
  function badge(s, cx, cy) {
    var g = WG.nulo(M, cam, "placa " + s, [0, 0], [cx, cy]);
    WG.forma(M, g, "placa " + s + " borda", { x: -33, y: -17, w: 66, h: 34, r: 7, cor: "#C9A62C" });
    WG.forma(M, g, "placa " + s + " fundo", { x: -31, y: -15, w: 62, h: 30, r: 6, cor: "#FBD54B" });
    WG.texto(M, g, "placa " + s + " texto", s, { x: 0, y: 7.5, fonte: FRM, tam: 20, cor: "#3C4043", just: "C" });
    return g;
  }

  // =================== base do mapa ===================
  WG.forma(M, cam, "mapa base (parque claro)", { x: -800, y: -700, w: 2800, h: 2300, cor: VERDE });
  WG.caminho(M, cam, "area urbana", [[148, -700], [1900, -700], [1900, 250], [1300, 300], [1100, 262], [900, 325], [760, 300], [700, 322], [600, 430], [505, 585], [468, 606], [425, 590], [300, 505], [172, 335], [148, 140]], { fechado: true, cor: URB, reto: false });
  WG.caminho(M, cam, "parque escuro (campo de esportes)", [[-330, -110], [128, -110], [134, 400], [-330, 412]], { fechado: true, cor: VERDE2, reto: true });
  WG.caminho(M, cam, "lago", [[800, 505], [788, 420], [840, 350], [950, 300], [1100, 268], [1192, 292], [1182, 380], [1100, 440], [1000, 482], [900, 507]], { fechado: true, cor: AGUA });
  WG.caminho(M, cam, "riacho", [[588, 575], [629, 533], [695, 440], [760, 410], [805, 418]], { traco: AGUA, tracoL: 4 });
  // trilhas tracejadas dos parques
  var trilhas = [[[-250, 520], [-60, 470], [120, 600], [300, 760]], [[-200, 760], [0, 700], [180, 860], [240, 1100]], [[560, 470], [640, 560], [760, 540], [900, 600], [1100, 560]],
                 [[700, 760], [900, 820], [1100, 900], [1300, 960]], [[520, 900], [700, 1000], [900, 1050]], [[1000, 600], [1150, 640], [1350, 600], [1500, 640]], [[-120, 120], [0, 260], [80, 380]]];
  for (i = 0; i < trilhas.length; i++) WG.caminho(M, cam, "trilha " + (i + 1), trilhas[i], { traco: TRILHA, tracoL: 1.6, tracejado: [7, 6] });
  // ruas finas do bairro
  var ruas = [[[300, -60], [520, 40], [700, 120], [900, 240]], [[180, 200], [300, 230], [430, 262]], [[250, -300], [262, 120], [270, 450]], [[520, -400], [540, 0], [562, 300]],
              [[160, 60], [420, 52], [690, 62]], [[700, -150], [850, -60], [1000, 40], [1200, 140]], [[640, -380], [700, -150]], [[900, -400], [960, -200], [1020, 30]], [[1100, -100], [1300, 0], [1500, 120]]];
  for (i = 0; i < ruas.length; i++) { WG.caminho(M, cam, "rua fina borda " + (i + 1), ruas[i], { traco: "#DCDCE2", tracoL: 6 }); WG.caminho(M, cam, "rua fina " + (i + 1), ruas[i], { traco: "#FFFFFF", tracoL: 3.6 }); }
  // vias claras
  var claras = [[[485, 602], [598, 424], [711, 295], [824, 182], [921, 85], [1010, -20], [1100, -150]], [[480, 642], [800, 850], [1163, 1069], [1500, 1260]]];
  for (i = 0; i < claras.length; i++) { WG.caminho(M, cam, "via clara borda " + (i + 1), claras[i], { traco: "#D5DBE3", tracoL: 12 }); WG.caminho(M, cam, "via clara " + (i + 1), claras[i], { traco: "#F7F9FC", tracoL: 9 }); }
  // vias principais (azul-acinzentado) + rotatória
  var principais = [[[139, -700], [139, 134], [163, 327], [292, 521], [440, 610]],
                    [[450, 640], [240, 760], [34, 876], [-420, 1120], [-800, 1320]],
                    [[458, 650], [430, 880], [395, 1150], [380, 1400]],
                    [[470, 625], [540, 652], [650, 657], [756, 664], [890, 690], [1000, 704], [1190, 707], [1400, 703], [1700, 699], [2000, 696]]];
  for (i = 0; i < principais.length; i++) WG.caminho(M, cam, "via principal " + (i + 1), principais[i], { traco: ESTR, tracoL: 15 });
  WG.forma(M, cam, "rotatoria", { x: 438, y: 596, w: 52, h: 52, elipse: true, cor: ESTR });

  // =================== rótulos e placas ===================
  rotulo("Clock Square", 436, 628, 27, "#8E44D9", { just: "D" });
  rotulo("Riverside College", -289, 543, 26, "#5F6368");
  rotulo("Sports Field", -268, 32, 25, "#188038");
  rotulo("Clock Tower Hotel", 284, -76, 26, "#C2185B");
  rotulo("Royal Street", 470, 40, 21, "#5F6368", { rot: 26 });
  rotulo("Constance Blvd", 131, 90, 19, "#5F6368", { rot: 86 });
  rotulo("Magenta Blvd", 615, 450, 19, "#5F6368", { rot: -55 });
  rotulo("Westfield", 824, -2, 34, "#3C4043", { fonte: FRB });
  rotulo("Market Street", 744, -100, 21, "#5F6368", { rot: 25 });
  rotulo("Equestrian Club", 1098, 466, 26, "#5F6368");
  rotulo("of Westfield", 1098, 500, 26, "#5F6368");
  rotulo("White Stone", 1342, 892, 32, "#8E44D9");
  rotulo("Cave", 1342, 936, 32, "#8E44D9");
  badge("D152", 363, 695); badge("D607", 429, 756); badge("D58", 982, 932); badge("D606", 1316, 711);
  // pinos de lugar
  var pf = pino("parque flor", 679, 470, 36, "#2E9E6E", null);
  for (i = 0; i < 5; i++) { var an = i * 72 * Math.PI / 180; WG.forma(M, pf, "flor petala " + (i + 1), { x: Math.sin(an) * 6.5 - 4.5, y: -Math.cos(an) * 6.5 - 4.5, w: 9, h: 9, elipse: true, cor: "#FFFFFF" }); }
  WG.forma(M, pf, "flor miolo", { x: -2.5, y: -2.5, w: 5, h: 5, elipse: true, cor: "#2E9E6E" });
  pino("roxo 1", 860, 495, 32, "#A55CF5", "\uE80F");
  pino("roxo 2", 932, 120, 32, "#A55CF5", "\uE80F");
  pino("cinza clube", 990, 522, 32, "#8D9399", "\uE91F");
  pino("hotel 1", -87, -112, 30, "#E3428B", "\uE80F");
  pino("hotel 2", 232, -104, 30, "#E3428B", "\uE80F");
  pino("hotel 3", 405, 342, 30, "#E3428B", "\uE80F");
  pino("parque 1", 34, -58, 30, "#2E9E6E", "\uE91F");
  pino("parque esportes", -92, 12, 30, "#2E9E6E", "\uE91F");
  pino("golfe", -216, 834, 30, "#2E9E6E", "\uE7C1");
  pino("faculdade", 130, 530, 30, "#8D9399", "\uE7BE");

  // =================== barra lateral + caixa de busca ===================
  WG.forma(M, cam, "lateral fundo", { x: -430, y: -320, w: 140, h: 1500, cor: "#F6FAFB" });
  WG.texto(M, cam, "lateral menu", "\uE700", { x: -382, y: -136, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
  WG.texto(M, cam, "lateral salvos icone", "\uE8A4", { x: -382, y: 8, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
  WG.texto(M, cam, "lateral salvos", "Saved", { x: -382, y: 48, fonte: FR, tam: 21, cor: "#3C4043", just: "C" });
  WG.texto(M, cam, "lateral recentes icone", "\uE81C", { x: -382, y: 210, fonte: FI, tam: 30, cor: "#3C4043", just: "C" });
  WG.texto(M, cam, "lateral recentes", "Recents", { x: -382, y: 250, fonte: FR, tam: 21, cor: "#3C4043", just: "C" });
  WG.imagem(M, cam, "lateral foto 1", "assets/I-imagens/ceu-4.png", { x: -410, y: 424, w: 60, h: 60, r: 10 });
  WG.texto(M, cam, "lateral foto 1 nome", "Westfi...", { x: -382, y: 512, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
  WG.imagem(M, cam, "lateral foto 2", "assets/I-imagens/ceu-3.png", { x: -410, y: 610, w: 60, h: 60, r: 10 });
  WG.texto(M, cam, "lateral foto 2 nome 1", "Pine", { x: -382, y: 696, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
  WG.texto(M, cam, "lateral foto 2 nome 2", "Lodge", { x: -382, y: 720, fonte: FR, tam: 19, cor: "#3C4043", just: "C" });
  var caixa = WG.forma(M, cam, "busca caixa branca", { x: -238, y: -235, w: 974, h: 132, r: 66, cor: "#FFFFFF" });
  caixa.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
  var dsC = caixa.property("ADBE Effect Parade").property("ADBE Drop Shadow");
  dsC.property("ADBE Drop Shadow-0002").setValue(40); dsC.property("ADBE Drop Shadow-0003").setValue(180); dsC.property("ADBE Drop Shadow-0004").setValue(4); dsC.property("ADBE Drop Shadow-0005").setValue(14);
  WG.texto(M, cam, "busca lupa", "\uE721", { x: 518, y: -158, fonte: FI, tam: 36, cor: "#3C4043", just: "C" });
  WG.forma(M, cam, "busca rotas fundo", { x: 637, y: -215, w: 48, h: 48, r: 10, cor: "#0F8C7C" });
  WG.tr(M.layer("busca rotas fundo")).property("ADBE Rotate Z").setValue(45);
  WG.texto(M, cam, "busca rotas seta", "\uE72A", { x: 661, y: -181, fonte: FI, tam: 22, cor: "#FFFFFF", just: "C" });
  var sK2 = WG.LETRA("K2");
  var busca = WG.texto(M, cam, "busca digitada (letra K2)", sK2.texto, { x: -172, y: -152, fonte: FG, tam: 36, cor: "#202124" });
  WG.DIGITAR(busca, sK2.palavras, WG.tempoDig("K2", sK2), WG.DIG.K2.fim, { cursor: true, cursorFica: 0.6 });

  // =================== pino verde perto do avatar 2 (rótulo K3) ===================
  pino("parque pessoa", 1147, 800, 40, "#2E9E6E", "\uE805");
  var sK3 = WG.LETRA("K3");
  var tK3 = WG.texto(M, cam, "rotulo verde K3 (letra)", sK3.texto, { x: 1185, y: 832, fonte: FRB, tam: 42, cor: "#1E8E55", traco: "#FFFFFF", tracoL: 5 });
  WG.DIGITAR(tK3, sK3.palavras, WG.tempoDig("K3", sK3), WG.DIG.K3.fim, { cursor: false });

  // =================== pino 1 (avatar @mari.frames) + encaixe J ===================
  var c0 = WG.camEm(cam, TS), provJ = WG.provisoria("ENCAIXE J-jornal2");
  var lado0 = 1080 / Math.pow(2, c0.z);
  var D1 = 74;   // diâmetro do pino 1 (anel branco) com escala 100
  var g1 = WG.nulo(M, cam, "PINO 1 (grupo; tamanho como no original)", [0, 0], [464, 619]);
  WG.forma(M, g1, "pino 1 base", { x: -D1 * 0.26, y: D1 * 0.42, w: D1 * 0.52, h: D1 * 0.3, elipse: true, cor: "#FFFFFF" });
  WG.forma(M, g1, "pino 1 sombra", { x: -D1 * 0.53, y: -D1 * 0.47, w: D1 * 1.06, h: D1 * 1.06, elipse: true, cor: "#000000", alfa: 16 });
  WG.forma(M, g1, "pino 1 anel branco", { x: -D1 / 2, y: -D1 / 2, w: D1, h: D1, elipse: true, cor: "#FFFFFF" });
  var foto1 = WG.imagem(M, g1, "pino 1 foto (mari.frames)", "assets/comum/avatar-mari.png", { x: -D1 / 2 + 4, y: -D1 / 2 + 4, w: D1 - 8, h: D1 - 8, circulo: true, fy: 0.35 });
  // tamanho do pino no mundo (o original troca de print do Maps; medido: 26 px em 28,5 → 74 px no fim)
  // medido no original: anel ~58 px de mundo em 28,5, ~66 em 28,75-29,0, ~60 em 30,5 e 74 no fim
  var esc1 = [[28.00, 125], [28.20, 100], [28.33, 76], [28.75, 89], [29.00, 89], [30.50, 81], [30.90, 83], [32.60, 100]];
  var k1 = []; for (i = 0; i < esc1.length; i++) k1.push([esc1[i][0], [esc1[i][1], esc1[i][1]]]);
  WG.chaves(WG.tr(g1).property("ADBE Scale"), k1, 50);
  WG.chave2(WG.tr(foto1).property("ADBE Opacity"), 28.22, 0, 28.33, 100, 30, 50);
  var enc = WG.CAMERA_encaixe(M, cam, provJ, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE J-jornal2");
  enc.motionBlur = true;
  enc.moveBefore(foto1);
  var et = WG.tr(enc);
  WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [28.33, [464, 619]]], 70);
  var sF = 100 * 58 / 1080;
  WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [28.33, [sF, sF]]], 70);
  WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [28.33, 0]], 70);
  var mk = WG.mascara(enc, WG.formaRet(0, 0, 1080, 1080, 0), "arredonda");
  WG.chaves(mk.property("ADBE Mask Shape"), [[TS, WG.formaRet(0, 0, 1080, 1080, 0)], [28.10, WG.formaRet(40, 40, 1000, 1000, 170)], [28.30, WG.formaRet(0, 0, 1080, 1080, 540)]], 60);
  enc.outPoint = 28.40;
  // rótulo verde do pino 1 (K1)
  var sK1 = WG.LETRA("K1");
  var gL1 = WG.nulo(M, cam, "ROTULO PINO 1 (grupo)", [0, 0], [500, 646]);
  var tK1 = WG.texto(M, gL1, "rotulo verde K1 (letra)", sK1.texto, { x: 0, y: 0, fonte: FRB, tam: 40, cor: "#1E8E55", traco: "#FFFFFF", tracoL: 5 });
  WG.DIGITAR(tK1, sK1.palavras, WG.tempoDig("K1", sK1), WG.DIG.K1.fim, { cursor: false });
  WG.chaves(WG.tr(gL1).property("ADBE Scale"), [[28.33, [86, 86]], [30.50, [77, 77]], [32.60, [100, 100]]], 50);
  WG.tr(gL1).property("ADBE Position").setValue([512, 641]);

  // =================== avatar 2 (@o.produtor, anel azul) anda pela estrada até o avatar 1 ===================
  var g2 = WG.nulo(M, cam, "AVATAR 2 (grupo, anda)", [0, 0], [1400, 690]);
  var cam2 = [[30.90, [1405, 690]], [31.125, [1363, 692]], [31.25, [1310, 700]], [31.5, [1192, 705]], [31.75, [1088, 706]], [32.0, [996, 706]], [32.25, [890, 692]], [32.5, [756, 663]], [32.75, [650, 657]], [33.0, [580, 655]], [33.25, [541, 652]], [33.30, [538, 652]]];
  WG.chaves(WG.tr(g2).property("ADBE Position"), cam2, 33, true);
  var k2 = WG.tr(g2).property("ADBE Position");
  for (i = 2; i < k2.numKeys; i++) {   // passo contínuo (sem tranco nas chaves medidas)
    k2.setInterpolationTypeAtKey(i, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
    k2.setTemporalContinuousAtKey(i, true); k2.setTemporalAutoBezierAtKey(i, true);
    try { k2.setSpatialContinuousAtKey(i, true); k2.setSpatialAutoBezierAtKey(i, true); } catch (e) {}
  }
  k2.setInterpolationTypeAtKey(k2.numKeys, KeyframeInterpolationType.BEZIER, KeyframeInterpolationType.BEZIER);
  WG.ease(k2, k2.numKeys, 85, 33);   // pousa devagar e fica parado até o fim
  WG.forma(M, g2, "avatar 2 sombra", { x: -40, y: -36, w: 80, h: 80, elipse: true, cor: "#000000", alfa: 16 });
  WG.forma(M, g2, "avatar 2 anel azul", { x: -37.5, y: -37.5, w: 75, h: 75, elipse: true, cor: "#166FE7" });
  WG.imagem(M, g2, "avatar 2 foto (o.produtor)", "assets/comum/avatar-produtor.png", { x: -33, y: -33, w: 66, h: 66, circulo: true, fy: 0.3 });
  var sK4 = WG.LETRA("K4");
  var tK4 = WG.texto(M, g2, "texto azul K4 (letra)", sK4.texto, { x: 52, y: 10, fonte: FRM, tam: 21, cor: "#1A73E8", traco: "#FFFFFF", tracoL: 3 });
  WG.DIGITAR(tK4, sK4.palavras, WG.tempoDig("K4", sK4), WG.DIG.K4.fim, { cursor: false });
  g2.inPoint = 30.85;

  var cena = WG.cena(ID, M, C.d, pasta);
  WG.limparSolidos();
  return "ok K: " + M.numLayers + " camadas; encaixe J lado " + lado0.toFixed(1) + " centro " + c0.mx.toFixed(1) + "," + c0.my.toFixed(1) + " giro " + (-c0.g).toFixed(2);
})();
