﻿// =====================================================================
// CENA H-mapa (18,95–22,30 s, ref 22,20) — mapa de satélite estilo jogo (agente w-google, 17/10). ES3.
// Mundo = quadro do original em 22,20 (o mapa já está inclinado em 3D nesse quadro; o resto projetivo da
// câmera medida vai no Corner Pin da CENA; inclinação chega a ~30° entre 19,5 e 20,6 s).
// Encaixe G: a página do Google encolhe dentro do marcador 1 (anel amarelo) = comp provisória "ENCAIXE G-google".
// Marcador 2 (@o.produtor) sobe ~180 px pelo mapa de 20,8 a 22,3 (medido no original) com a etiqueta branca.
// Fim: o mapa é recortado no retângulo da 1ª célula da grade de I (fundo = página de imagens de I) e a
// miniatura do céu nasce na etiqueta branca (22,04) e cresce até cobrir o mapa (22,55, já dentro de I).
// =====================================================================
(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 = "H-mapa", MG = 540, TS = 18.9583, TF = 22.2917;
  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 FE = "Anton-Regular", FN = "Roboto-Bold", FM = "Roboto-Medium";
  var recortaveis = [];
  function rec(L) { recortaveis.push(L); return L; }

  // ---------- fundo: página de imagens de I (aparece quando o mapa vira a 1ª célula)
  var dI = WG.CAMERA_lerJSON(WG.P + "camera/cena-I-imagens-ajustada.json");
  var cH = WG.camEm(cam, TF), cI = WG.camJSON(dI, TF);
  var fI = WG.nuloOutroMundo(M, cam, "FUNDO I (mundo da busca de imagens)", cH, cI);
  var pagI = WG.nulo(M, fI, "FUNDO I pagina grande", WG.I_PAG.anc, WG.I_PAG.pos, [WG.I_PAG.esc, WG.I_PAG.esc], WG.I_PAG.rot);
  var bgI = WG.forma(M, pagI, "FUNDO I fundo escuro", { x: -400, y: -200, w: 2200, h: 1600, cor: "#202228" });
  var cel = [WG.I_CEL.c2, WG.I_CEL.c3, WG.I_CEL.c4];
  for (var i = 0; i < 3; i++) {
    var cc = cel[i];
    var Lc = WG.imagem(M, pagI, "FUNDO I celula " + (i + 2), WG.I_IMGS[i + 1], { x: cc[0], y: cc[1], w: cc[2], h: cc[3], r: 4 });
    Lc.inPoint = 21.8;
  }
  bgI.inPoint = 21.8;

  // ---------- mapa: centro + 8 cópias espelhadas (só aparecem nas bordas com a inclinação forte)
  var itM = WG.footage("assets/H-mapa/mapa-satelite.png");
  var mw = itM.width * WG.H_MAPA.k, mh = itM.height * WG.H_MAPA.k;
  for (var ty = -1; ty <= 1; ty++) for (var tx = -1; tx <= 1; tx++) {
    var Lm = M.layers.add(itM); Lm.name = "mapa " + (tx == 0 && ty == 0 ? "centro" : ("espelho " + tx + "," + ty));
    Lm.parent = cam;
    var sx = (tx == 0 ? 1 : -1) * WG.H_MAPA.k * 100, sy = (ty == 0 ? 1 : -1) * WG.H_MAPA.k * 100;
    WG.pos(Lm, [itM.width / 2, itM.height / 2], [WG.H_MAPA.x + mw / 2 + tx * mw, WG.H_MAPA.y + mh / 2 + ty * mh], [sx, sy]);
    Lm.motionBlur = true; Lm.quality = LayerQuality.BEST;
    // tom de mapa de jogo: menos saturado, mais escuro e um pouco macio
    Lm.property("ADBE Effect Parade").addProperty("ADBE Color Balance (HLS)");
    Lm.property("ADBE Effect Parade").addProperty("ADBE Gaussian Blur 2");
    var cb = Lm.property("ADBE Effect Parade").property("ADBE Color Balance (HLS)");
    cb.property(2).setValue(-10); cb.property(3).setValue(-32);
    Lm.property("ADBE Effect Parade").property("ADBE Gaussian Blur 2").property(1).setValue(1.6);
    rec(Lm);
  }
  // leve escurecida para parecer o mapa do jogo (mais fechado que a foto gerada)
  var esc = rec(WG.forma(M, cam, "mapa tom (escurece)", { x: -1500, y: -1500, w: 4200, h: 4200, cor: "#0B1A0E", alfa: 22 }));

  // ---------- nomes no mapa (branco com contorno escuro)
  function nome(s, x, y, tam, rot, fonte, ital) {
    var L = rec(WG.texto(M, cam, "nome " + s, s, { x: x, y: y, fonte: fonte, tam: tam, cor: "#F2F2F2", traco: "#1C211C", tracoL: 3.2, italico: ital }));
    WG.tr(L).property("ADBE Rotate Z").setValue(rot);
    return L;
  }
  nome("Pine Village", 280, 316, 44, -2, FN, false);
  nome("Pine Hill", 825, 96, 30, -3, FM, false);
  nome("Ruins", 228, 42, 24, -3, "Roboto-MediumItalic", false);
  nome("Farm Ridge", 603, 866, 42, 2, FM, false);
  nome("Ridge Complex", 100, 995, 40, 4, FM, false);

  // ---------- etiqueta-seta (forma que cresce com o texto digitado)
  function etiqueta(nomeE, pai, cor, alt, ponta, ladoEsq, txtNome) {
    var L = M.layers.addShape(); L.name = nomeE; L.parent = pai;
    var root = L.property("ADBE Root Vectors Group"); root.addProperty("ADBE Vector Group");
    var v = root.property(1).property("ADBE Vectors Group");
    v.addProperty("ADBE Vector Shape - Group"); v.addProperty("ADBE Vector Graphic - Fill");
    v = L.property("ADBE Root Vectors Group").property(1).property("ADBE Vectors Group");
    v.property("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").setValue(WG.cor(cor));
    var H = alt / 2, T = ponta;
    var ex = 'var t = thisComp.layer("' + txtNome + '"); var W = Math.max(t.sourceRectAtTime(time, false).width, 0) + 34;\n';
    if (ladoEsq) ex += 'createPath([[0,0],[-' + T + ',-' + H + '],[-' + T + '-W,-' + H + '],[-2*' + T + '-W,0],[-' + T + '-W,' + H + '],[-' + T + ',' + H + ']], [], [], true);';
    else ex += 'createPath([[0,0],[' + T + ',-' + H + '],[' + T + '+W,-' + H + '],[2*' + T + '+W,0],[' + T + '+W,' + H + '],[' + T + ',' + H + ']], [], [], true);';
    v.property("ADBE Vector Shape - Group").property("ADBE Vector Shape").expression = ex;
    WG.pos(L, [0, 0], [0, 0]);
    L.motionBlur = true;
    var sh = L.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
    sh = L.property("ADBE Effect Parade").property("ADBE Drop Shadow");
    sh.property("ADBE Drop Shadow-0002").setValue(45); sh.property("ADBE Drop Shadow-0004").setValue(3); sh.property("ADBE Drop Shadow-0005").setValue(5);
    return L;
  }

  // ---------- marcador 1 (@mari.frames, anel amarelo) + encaixe G que encolhe dentro dele
  var c0 = WG.camEm(cam, TS);
  var provG = WG.provisoria("ENCAIXE G-google");
  var lado0 = 1080 / Math.pow(2, c0.z);
  var anel1 = rec(WG.forma(M, cam, "marcador 1 anel amarelo", { x: WG.H_M1[0] - 49.5, y: WG.H_M1[1] - 49.5, w: 99, h: 99, elipse: true, cor: WG.AMARELO }));
  var enc = WG.CAMERA_encaixe(M, cam, provG, [c0.mx, c0.my], lado0, -c0.g, "ENCAIXE G-google");
  enc.motionBlur = true; rec(enc);
  var et = WG.tr(enc);
  // a página de G ocupa ~80% do quadro do encaixe; o encaixe quase não muda de tamanho: a máscara é que
  // arredonda até virar o círculo do marcador (Ø 91 no mundo) enquanto a foto cresce por cima
  var ladoF = lado0 * 0.985, dC = 1080 * 92 / ladoF;
  WG.chaves(et.property("ADBE Position"), [[TS, [c0.mx, c0.my]], [19.17, WG.H_M1]], 70);
  WG.chaves(et.property("ADBE Scale"), [[TS, [100 * lado0 / 1080, 100 * lado0 / 1080]], [19.17, [100 * ladoF / 1080, 100 * ladoF / 1080]]], 70);
  WG.chaves(et.property("ADBE Rotate Z"), [[TS, -c0.g], [19.17, 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)], [19.02, WG.formaRet(60, 60, 960, 960, 110)],
    [19.15, WG.formaRet(100, 100, 880, 880, 200)], [19.22, WG.formaRet(140, 140, 800, 800, 250)]], 60);   // no original a página ainda é um quadrado arredondado em 19,21 e some atrás da foto
  enc.outPoint = 19.25;
  var itA = WG.footage("assets/comum/avatar-mari.png");
  var foto1 = rec(WG.imagem(M, cam, "marcador 1 foto (mari.frames)", "assets/comum/avatar-mari.png", { x: WG.H_M1[0] - 45.5, y: WG.H_M1[1] - 45.5, w: 91, h: 91, circulo: true, fy: 0.35 }));
  // diâmetro da foto no mundo, medido quadro a quadro no original
  var dF = [[TS, 15.4], [19.0, 19.5], [19.042, 28], [19.083, 42], [19.125, 56], [19.167, 69], [19.208, 82], [19.25, 91]];
  var kF = [];
  for (i = 0; i < dF.length; i++) { var sF = 100 * dF[i][1] / itA.width; kF.push([dF[i][0], [sF, sF]]); }
  WG.chaves(WG.tr(foto1).property("ADBE Scale"), kF, 33, true);
  var sh1 = anel1.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
  sh1 = anel1.property("ADBE Effect Parade").property("ADBE Drop Shadow");
  sh1.property("ADBE Drop Shadow-0002").setValue(50); sh1.property("ADBE Drop Shadow-0004").setValue(3); sh1.property("ADBE Drop Shadow-0005").setValue(6);

  // ---------- etiqueta amarela (ponta direita encostada no marcador 1), digitada 19,20–20,30
  var gA = WG.nulo(M, cam, "ETIQUETA AMARELA (grupo)", [0, 0], [414, 405], [100, 100], -4);
  var sH1 = WG.LETRA("H1");   // letra: etiqueta amarela
  var txA = rec(WG.texto(M, gA, "etiqueta amarela texto", sH1.texto, { x: -24, y: 14, fonte: FE, tam: 38, cor: "#111111", just: "D", italico: true, hscale: 84 }));
  WG.DIGITAR(txA, sH1.palavras, WG.tempoDig("H1", sH1), WG.DIG.H1.fim, { cursor: true, cursorFica: 0.25 });
  var shA = rec(etiqueta("etiqueta amarela forma", gA, WG.AMARELO, 40, 20, true, "etiqueta amarela texto"));
  shA.moveAfter(txA);
  WG.chave2(WG.tr(gA).property("ADBE Opacity"), 19.03, 0, 19.08, 100, 30, 30);
  WG.chave2(WG.tr(gA).property("ADBE Scale"), 19.03, [60, 60], 19.14, [100, 100], 30, 70);

  // ---------- marcador 2 (@o.produtor, anel branco) + etiqueta branca, sobe pelo mapa (trajetória medida)
  var g2 = WG.nulo(M, cam, "MARCADOR 2 (grupo, sobe)", [0, 0], [351, 566]);
  WG.chaves(WG.tr(g2).property("ADBE Position"), [[20.75, [246, 800]], [21.0, [236, 732]], [21.25, [230, 702]], [21.5, [246, 659]], [21.75, [290, 614]], [22.0, [330, 581]], [22.21, [351, 566]], [22.45, [360, 558]]], 33, true);
  WG.chave2(WG.tr(g2).property("ADBE Opacity"), 20.75, 0, 20.80, 100, 30, 30);
  var anel2 = rec(WG.forma(M, g2, "marcador 2 anel branco", { x: -52, y: -52, w: 104, h: 104, elipse: true, cor: "#F4F4F4" }));
  var foto2 = rec(WG.imagem(M, g2, "marcador 2 foto (o.produtor)", "assets/comum/avatar-produtor.png", { x: -47, y: -47, w: 94, h: 94, circulo: true, fy: 0.3 }));
  var sh2 = anel2.property("ADBE Effect Parade").addProperty("ADBE Drop Shadow");
  sh2 = anel2.property("ADBE Effect Parade").property("ADBE Drop Shadow");
  sh2.property("ADBE Drop Shadow-0002").setValue(50); sh2.property("ADBE Drop Shadow-0004").setValue(3); sh2.property("ADBE Drop Shadow-0005").setValue(6);
  var gB = WG.nulo(M, g2, "ETIQUETA BRANCA (grupo)", [0, 0], [67, -13]);
  var sH2 = WG.LETRA("H2");   // letra: etiqueta branca
  var txB = rec(WG.texto(M, gB, "etiqueta branca texto", sH2.texto, { x: 30, y: 18, fonte: FE, tam: 47, cor: "#111111", italico: true, hscale: 84 }));
  WG.DIGITAR(txB, sH2.palavras, WG.tempoDig("H2", sH2), WG.DIG.H2.fim, { cursor: true, cursorFica: 0.3 });
  var shB = rec(etiqueta("etiqueta branca forma", gB, "#F4F4F4", 56, 22, false, "etiqueta branca texto"));
  shB.moveAfter(txB);

  // ---------- miniatura do céu (imagem 1 de I): nasce na etiqueta branca e cobre o mapa
  var mini = rec(WG.imagem(M, cam, "miniatura ceu (vira a celula 1 de I)", WG.I_IMGS[0], { x: 0, y: 0, w: 100, h: 100, r: 0 }));
  var itC = WG.footage(WG.I_IMGS[0]);
  function sC(d) { var k = 100 * d / itC.width; return [k, k]; }
  // posição: acompanha a etiqueta (marcador 2 + (187,-49)) até 22,25, depois vai ao centro do recorte
  var pm = [[22.04, [330 + 187, 581 - 49]], [22.12, [337 + 187, 571 - 49]], [22.21, [351 + 187, 566 - 49]], [22.27, [354 + 187, 563 - 49]]];   // segue a etiqueta branca
  WG.chaves(WG.tr(mini).property("ADBE Position"), pm, 33, true);
  WG.chaves(WG.tr(mini).property("ADBE Scale"), [[22.04, sC(0)], [22.10, sC(14)], [22.15, sC(32)], [22.21, sC(87)], [22.27, sC(150)]], 33, true);
  mini.inPoint = 22.04;

  // ---------- recorte final no retângulo da célula 1 de I (matte), calculado pela câmera de I na troca
  var c1 = WG.I_CEL.c1, cantos = [[c1[0], c1[1]], [c1[0] + c1[2], c1[1]], [c1[0], c1[1] + c1[3]], [c1[0] + c1[2], c1[1] + c1[3]]];
  var xs = [], ys = [];
  for (i = 0; i < 4; i++) { var q = WG.mundoBparaA(WG.iLocalParaMundo(cantos[i]), cH, cI); xs.push(q[0]); ys.push(q[1]); }
  var rx0 = Math.min(xs[0], xs[2]), rx1 = Math.max(xs[1], xs[3]), ry0 = Math.min(ys[0], ys[1]), ry1 = Math.max(ys[2], ys[3]);
  var rot = Math.atan2(ys[1] - ys[0], xs[1] - xs[0]) * 180 / Math.PI;
  var matte = WG.forma(M, cam, "RECORTE celula 1 de I (matte)", { x: -2000, y: -2000, w: 5000, h: 5000, cor: "#FFFFFF" });
  var cx = (rx0 + rx1) / 2, cy = (ry0 + ry1) / 2;
  var mt = WG.tr(matte);
  WG.chaves(mt.property("ADBE Position"), [[21.90, [500, 500]], [22.06, [cx, cy]]], 70);
  WG.chaves(WG.rectProp(matte, "ADBE Vector Rect Size"), [[21.90, [5000, 5000]], [22.06, [rx1 - rx0, ry1 - ry0]]], 70);
  WG.chaves(mt.property("ADBE Rotate Z"), [[21.90, 0], [22.06, rot]], 70);
  // a miniatura termina cobrindo o recorte (já dentro de I)
  // já dentro de I: cresce devagar e só cobre a célula inteira por volta de 22,92 (medido na célula 1 do original)
  var lc = Math.max(rx1 - rx0, ry1 - ry0);
  WG.chaves(WG.tr(mini).property("ADBE Position"), [[22.333, [541, 514]], [22.92, [cx, cy]]], 50);
  WG.chaves(WG.tr(mini).property("ADBE Scale"), [[22.333, sC(185)], [22.417, sC(310)], [22.458, sC(455)], [22.542, sC(680)], [22.583, sC(770)], [22.75, sC(890)], [22.92, sC(lc * 1.08)]], 40, true);
  for (i = 0; i < recortaveis.length; i++) recortaveis[i].setTrackMatte(matte, TrackMatteType.ALPHA);
  matte.enabled = false;

  var cena = WG.cena(ID, M, C.d, pasta);
  WG.limparSolidos();
  return "ok H: " + M.numLayers + " camadas; encaixe lado " + lado0.toFixed(1) + "; recorte " + rx0.toFixed(0) + "," + ry0.toFixed(0) + " a " + rx1.toFixed(0) + "," + ry1.toFixed(0) + " rot " + rot.toFixed(2);
})();
