Adesivos de axolote
Tudo é Python puro (numpy + Pillow) mais ffmpeg; sem GPU, sem Blender. A raiz do repositório é a pasta que contém engine/, kit/ e out/.
pip install numpy pillow # ffmpeg deve estar no PATH
python engine/build.py 301 --force # renderizar uma especificação (por id)
python engine/build.py 12,40-45 --force # várias
python engine/build.py # tudo que ainda não foi renderizado (retomável)
python engine/sheet.py 301-310 # folha de revisão -> ref/sheet_sel_N.png (capa + 3 quadros cada)
python engine/manifest.py # atualizar out/stickers.json após adicionar adesivos
python engine/tornado.py 我没事 # o adesivo de tornado d'água ("-" = sem texto); precisa de engine/fetch_mc.py primeiro
Saída: out/NNN_texto.gif e a capa out/_封面/NNN_texto.png.
Adicionar um adesivo
Uma linha por adesivo em engine/specs.py (adicione no final da seção correta para que ids existentes fiquem estáveis):
S('摸鱼', 'flagwave', 'happy', [], hold='fish', s=0.7)
# texto movimento expressão fx extras
S('别催了', 'rage', 'angry', ['steam'], style='red', tmode='shake')
S('暴富', 'spin', 'money', ['coins', ('float', 'money', 3, 4)], style='gold')
Escolha o movimento que encena a frase, depois uma expressão, 0–2 efeitos e no máximo um adereço/chapéu. Mantenha o texto entre 2–5 caracteres (6+ quebra em duas linhas e fica pequeno). Use / para forçar uma quebra de linha.
- movimento (
engine/motions.py,engine/motions2.py, 75 no total): nod shake hop jump flip spin sink popup peek hide tremble rage tantrum dance wag bow kowtow doze flop melt dash slidein look lookup wave cheer clap belly flipover float zoom pounce approach tilt shrink puff grow drift buoy sway headbang headbob roll circle stare shy turnaway think boing wobble faint run launch stretch slosh petrify glitch squish hiccup shakeoff nuzzle rise recoil bonk, e ações de adereço swing flagwave offer chomp drink read typing scan umbrella (estes leemhold=). - expressão (
FACESem motions.py): normal smile happy joy love star shock surprise angry rage sad cry sob teary sleep sleepy tired meh dead dizzy smug wink focus struggle blep drool money awkward side cool eat shy tiny up grin catface blank pout sparkle determined worried xd — ou um dicionário como{'L': 'big', 'R': 'big', 'mouth': 'o'}. - fx (
engine/fx.py): hearts question exclaim shock anger sweat panic zzz notes tears stream rain bulb confetti fireworks stars steam gloom sparkles speed fire sun moon blush coins snow leaves check cross boom bubbles ghost dots loading bolt flash thumb plus1 flowers swirl skull twinkle brokenheart; os genéricos aceitam um nome de ícone:('float', 'diamond', n, size),('pop', 'pin', size, (dx, dy)),('stay', 'clock', size, (dx, dy)),('say', 'mail'),('orbit', 'star', n, (rx, ry), size),('fall', 'flower', n, size). - hold= (adereço voxel segurado): pickaxe sword wrench flag fish rod heart diamond emerald cookie apple melon carrot potion bulb book cup boba phone laptop gift cake tnt grass brick bowl popcorn torch rtorch magnifier mail key trophy controller bucket umbrella ...
- wear=[...] (chapéus/acessórios faciais): party crown nightcap shades glasses band helmet halo horns phones bow chef grad flowers mask towel ice
- style= cor do texto: pink (padrão) blue purple red green gold gray cyan — combine com o humor (triste azul, bravo vermelho, dinheiro dourado, feito verde, cansado cinza, noite roxo).
- tmode= animação do texto: stay (padrão) wave bounce shake shiver pulse droop swing zoom spin pop type slam.
Revise antes de entregar qualquer coisa
Renderize, depois abra a folha de revisão e olhe para ela. Verifique que:
- a capa (primeiro quadro) mostra o texto completo e o axolote;
- o adereço/efeito é legível no tamanho do adesivo e não está escondido atrás da faixa de texto (qualquer coisa acima da cabeça divide espaço com o texto);
- o fundo branco permaneceu branco (o exportador tenta novamente com uma paleta de quadro completo quando o ffmpeg o tinge);
- o arquivo tem ≤ 1000 KB (o exportador reduz automaticamente de 64 para 24 cores).
Armadilhas
- Movimentos que saem do quadro no meio do loop (launch, sink, dash, popup, slidein, glitch) não devem usar texto
pop/slam/type— a capa pegaria o axolote fora da tela. - Muitos adesivos com o mesmo movimento parecem repetitivos: limite qualquer movimento a cerca de 6 usos no conjunto (
python -c "import sys; sys.path.insert(0,'engine'); import specs, collections; print(collections.Counter(s['motion'] for s in specs.all_specs()).most_common(10))"). - As patas dianteiras são pequenas e ficam sob a cabeça; gestos só com as patas mal são legíveis — combine com um adereço ou efeito.
- Coordenadas de adereços são pixels do modelo local da cabeça: o rosto está em z = -10, o topo da cabeça em y = 9, +x é a esquerda do observador.
- O humor que funciona com este público é seco (难绷), não gritos exagerados.
O tornado d'água
engine/tornado.py desenha o funil como o mesmo corpo d'água do lago (um contorno, mesma cor, a linha d'água branca sobe pelas paredes), gira bandas espirais, lança gotas e faz o axolote tombar em 3D junto com itens vanilla do Minecraft tornados 3D (capacete de ferro/tartaruga, balde de axolote, TNT). Execute python engine/fetch_mc.py uma vez para copiar essas texturas do seu próprio cliente Minecraft (jar 1.21.2+) — elas nunca são versionadas.