Skip to content

Latest commit

 

History

History
628 lines (492 loc) · 30.5 KB

PERSONAGEM.md

File metadata and controls

628 lines (492 loc) · 30.5 KB

O personagem: modelos e animação

Documento de decisão. DECIDIDO foi escolhido; PROPOSTA é o plano de execução; ABERTO ainda depende de uma resposta. As regras de combate e skills estão em COMBATE.md e SKILLS.md.

O que já está decidido

DECIDIDO — proporção estilizada 1:5. Cabeça em ~1/5 da altura, mãos e arma um pouco maiores que o real. A câmera olha de 27° a 75° e o alvo é celular: no realista 1:7 a cabeça e a arma somem de cima, e no chibi 1:3 o corpo fica pequeno demais pra armadura aparecer. O 1:5 é o meio que lê de cima e ainda tem corpo.

DECIDIDO — a aparência é SKIN comprada, não o item equipado. O que o jogador veste por número (arma, armadura, tier, peso) não muda o visual; o visual vem de skins compradas com TP (Tempest Points), a moeda premium — de armadura (a roupa inteira) e de arma (uma por conjunto). A skin fica no PERSONAGEM, não na conta: comprar pra um não libera pros outros. O peso da armadura continua POR CONJUNTO, mas como regra de jogo (COMBATE.md), não como silhueta.

O que a skin não pode esconder: o CONJUNTO de arma. A animação sai do conjunto — quem usa pistola saca pistola. Então a skin de arma é sempre de UM conjunto: espada e escudo com outra cara, nunca uma katana que atira.

DECIDIDO — um corpo só; a customização é a cabeça. Rosto, cabelo e tom de pele. A armadura cobre o resto. Um rig, uma tabela de poses, e toda armadura serve em todo mundo.

DECIDIDO — a arte é feita por GERADOR. Cada modelo é um script em tools/voxrender/ que escreve o .vox no formato da ficha — como o piratinha (pirata.py). Refazer é rodar de novo, e o arquivo continua abrindo no MagicaVoxel pra quem quiser retocar à mão.

DECIDIDO — mob é criatura E humanoide. Criaturas no mundo aberto; humanoides em áreas específicas (não necessariamente chefe).

JÁ É — o corpo tem 1,68 u de altura e 0,35 de raio. O player.vox atual tem 42 voxels de altura: 1 voxel ≈ 4 cm. O corpo novo mantém essa escala.

12 skills, 5 formas e 12 gestos próprios. As formas são círculo, linha, cone, projétil e em si. O desbloqueio acontece nos níveis 1, 5 e 10.

JÁ É — hoje o personagem é UMA peça em pose T. Braços esticados, nada se move. E os 8 tipos de mob são o mesmo lobo pequeno com escala e tinta diferentes.

O corpo

Proporção, em voxels

            ┌─────┐
            │     │   cabeça      8   (1/5)
            └──┬──┘   pescoço     1
          ┌────┴────┐
          │         │  torso      13   (com a bacia)
      ┌─┐ │         │ ┌─┐
      │ │ └──┬───┬──┘ │ │  braços 17  (ombro → ponta da mão)
      │ │    │   │    │ │
      └─┘    │   │    └─┘
             │   │        pernas  20
             │   │
             └┘ └┘        ────────────
                          total   42 voxels = 1,68 u
   ombros: 18 voxels — o diâmetro de colisão (0,70 u)

Pose de repouso: braços retos pra baixo, colados ao torso — não a pose T de hoje. Numa peça rígida a pose de repouso é a pose parada: com os braços para baixo, o jogo parado não precisa girar nada, e o corte entre braço e torso fica limpo.

DECIDIDO — dez peças rígidas: o membro é dividido

cabeça · torso · braço-D · antebraço-D · braço-E · antebraço-E
                 coxa-D  · canela-D    · coxa-E  · canela-E

Voxel não se deforma: anima girando peça inteira em volta de um pivô (pescoço, ombros, cotovelos, quadris, joelhos). A mão faz parte do antebraço; o pé, da canela.

Por que dividido e não inteiro: o que o código consegue animar sozinho. Um bloco do terreno tem 0,5 u — ~12 voxels do personagem, uns 60% da perna — e o movimento sobe degrau de um bloco o tempo todo. Com perna inteira o pé do degrau de cima entra no bloco ou flutua; com joelho, o código dobra a perna e planta cada pé no seu degrau (IK de dois ossos, conta pura, nenhum animador). O mesmo joelho dá o agachamento do pouso e a perna dobrada de quem está montado; o cotovelo deixa o código apontar as pistolas pro alvo em qualquer direção, sem uma pose por ângulo.

O custo, declarado: dez transformações por corpo em vez de seis (desprezível pra ~400 triângulos), cada skin de armadura cortada em dez peças em vez de seis, e a tampa das juntas — ver docs/ARTE_DO_PERSONAGEM.md.

Considerado e descartado — mãos e pés flutuantes (o estilo dos bichos do zone14: sem braço nem perna, mão e bota soltas). Ele é mais fácil de animar — o pé pousa direto no degrau sem dobrar joelho, não há tampa nem manga dobrando, e cada pose vira quatro pontos soltos em vez de dez rotações encadeadas. Ficou de fora, comparado lado a lado no ângulo da câmera, por três razões que não se pagam depois:

  • personalidade — a 65° os dois quase se igualam, mas a 40° o flutuante perde manga, calça e largura de ombro e vira tronco com peças soltas;
  • espaço de skin — skin é o produto da TP, e braço e perna são onde entram manga, calça e ombreira;
  • contraste com os bichos — gente com membros, bicho com pata solta: de longe dá pra separar jogador e humanoide de criatura.

A dificuldade a mais é de código e acontece uma vez só; a personalidade e o espaço de skin ficam pra sempre.

As medidas exatas, os nomes e o molde pra esculpir estão em docs/ARTE_DO_PERSONAGEM.md e tools/moldes/corpo_molde.vox.

PROPOSTA — os encaixes

Não são peças do corpo: são pontos onde outra coisa se prende e segue a peça.

encaixe preso em quem usa
mão-D antebraço-D espada, katana, pistola, anel
mão-E antebraço-E escudo, pistola
cintura torso bainha, coldre
costas torso manto do guerreiro, manto do mago

O que isso dá por conjunto:

conjunto mão-D mão-E cintura costas
espada e escudo espada escudo — manto do guerreiro
katana cabo junto à guarda cabo junto ao pomo bainha —
duas pistolas pistola pistola coldre —
anel mágico anel — — manto do mago

O manto é uma peça rígida que balança com a velocidade (procedural, custo zero) — capa de tecido de verdade não existe em voxel sem física, e não precisa.

DECIDIDO — fora de combate, a arma é GUARDADA

conjunto em combate guardada
espada e escudo espada na mão-D, escudo na mão-E espada pendurada no quadril esquerdo, escudo nas costas por cima do manto
katana nas duas mãos dentro da bainha
duas pistolas uma em cada mão nos coldres
anel mágico no dedo no dedo — o círculo só aparece atacando

Guardar não pede arte: é a MESMA malha da arma presa em outro encaixe, com outra posição — uma tabela no código. Pede duas coisas:

  • sacar e guardar — duas poses por conjunto (8 no total);
  • o servidor dizer quem está em combate — um estado novo no byte acao. Critério proposto: atacou, conjurou ou tomou dano nos últimos 8 s.

DECIDIDO — o anel aparece como um CÍRCULO no braço

O anel em si não se modela: de 27°–75° de altura ele é um voxel. O que aparece é um círculo em volta do antebraço quando o personagem ataca, como se o golpe fosse projetado através dele. É efeito de código — um anel emissivo na cor do tier do anel equipado —, zero arte.

Skins de armadura

Uma skin de armadura é a roupa inteira, no formato do corpo: os mesmos dez objetos, cada um SUBSTITUINDO a peça do corpo — não é casca por cima, então não há geometria escondida desenhada à toa nem face de corpo brigando com face de armadura. O piratinha (corpo.vox) é a roupa padrão: quem não comprou nada anda de pirata.

Isso muda o tamanho do trabalho de arte a favor do playtest: nenhuma skin é pré-requisito de jogo. Antes eram 30 peças (três pesos × dez) que tinham que existir pra armadura aparecer; agora o jogo inteiro roda com o pirata, e cada skin nova é conteúdo de loja, feita quando for vendida.

Skins de arma

Uma por conjunto: espada e escudo, katana, pistolas, anel. A skin troca a CARA, não o conjunto. Cada conjunto tem uma skin padrão — é ela que entra no playtest.

DECIDIDO — o que a skin não esconde

Aparência comprada tem um custo pro combate: de longe, ninguém mais lê o que o outro está usando. Três coisas continuam legíveis, e nenhuma custa modelo:

o quê como aparece por quê
o conjunto de arma pela própria skin (sempre do conjunto certo) e pelo gesto diz o que ele vai fazer
o tier do item a cor dos frisos (faixa 241–244) sai do item EQUIPADO, não da skin diz o quanto ele é forte
o peso da armadura ícone na placa de nome diz o quanto ele aguenta

O friso separa FORMA de PODER: a skin decide o desenho, o item equipado decide a cor. A mesma skin numa arma cinza brilha cinza; numa roxa, brilha roxo. As quatro cores são as do cristal da pedra (cristal_do_tier) — quem aprendeu a ler a pedra lê a arma do mesmo jeito — e custam quatro cópias da malha em memória, geradas no carregamento: zero modelo a mais.

índices da paleta o que são quem decide
241–244 frisos, gemas, detalhes o tier do item equipado
245–248 cabelo a cor escolhida
249–252 pele o tom escolhido
resto material a skin

A cabeça

variações no playtest como
rosto 3 modelo
cabelo 3 modelo; capuz e elmo o escondem
pele 6 tons paleta

DECIDIDO — 3 de cada. O piratinha é o primeiro rosto; o tricórnio, o primeiro cabelo.

Acessórios

Brinco, amuleto, bracelete e cinto não aparecem no corpo no playtest. De 27°–75° de altura e numa tela de celular, um brinco é um pixel. Eles existem como item e como número, não como modelo.

A animação

Três fontes, em ordem de custo:

1. Procedural — código, zero arte

Sai da velocidade e das bandeiras que o servidor já manda. Nunca dessincroniza do movimento — que é o defeito clássico de clipe gravado — e vale pra todo modelo com as dez peças, inclusive humanoide de mob.

estado de onde vem o que mexe
parado velocidade ~0 torso sobe e desce 1 voxel (respiração)
andar velocidade pernas e braços em seno, fase pela distância andada
correr SPRINT + velocidade o mesmo ciclo, passo mais longo e tronco inclinado pra frente
no ar PULANDO + arco que o cliente já desenha o instante de uma corrida CONGELADO: uma perna na frente, a outra atrás com o joelho dobrado, SEM trocar de lado (perna que troca lê como andar no ar); só a abertura balança um pouco; braços abertos balançando leve — o jogo não tem pulo atlético, o que tira o pé do chão é vencer degrau de 2–3 blocos ou cair de uma borda; a pose entra e sai suavizada
pouso fim do arco agacha dobrando os joelhos, 0,1 s
degrau altura do chão sob cada pé cada pé plantado no seu bloco, joelho dobrado (IK de dois ossos)
tomar dano vida caiu tranco do torso pra trás, 0,12 s
caído DOWNED corpo inteiro deitado
morte vida 0 cai pra trás e fica
manto velocidade ângulo da capa acompanha
montado MONTADO (novo) pose sentada; tronco acompanha o trote

2. Pose-chave — tabela, não quadro

O que o corpo faz por INTENÇÃO: ataque e skill. Uma pose é uma rotação por peça (dez rotações); o cliente interpola entre elas. Não se desenha quadro nenhum.

Ataque básico: um combo de três golpes por conjunto, três poses por golpe (preparo, impacto, volta).

Skills: as 12, cada uma com seu gesto. O plano anterior juntava por FORMA, mas os quatro conjuntos são temas diferentes demais pra isso: o "círculo" da katana é um giro, o das pistolas é arremessar um barril e o do anel é abrir as mãos. Com só doze skills, gesto próprio custa pouco.

conjunto skill forma gesto
espada e escudo Investida linha avança com o escudo à frente
Golpe Largo cone corte horizontal de ombro a ombro
Muralha em si escudo erguido, pé no chão
katana Saque linha tira da bainha e corta no mesmo movimento
Dança círculo giro completo com a lâmina aberta
Vento Cortante projétil corte de cima pra baixo que solta a onda
duas pistolas Tiro Certeiro projétil as duas mãos juntas, mira
Rajada cone braços abrindo em leque, disparando
Barril círculo arremesso por cima do ombro
anel mágico Bênção em si mão do anel erguida
Aura círculo as duas mãos abertas pra fora
Julgamento círculo mão erguida e descida de uma vez
poses
combos: 4 conjuntos × 3 golpes × 3 36
skills: 12 × 3 36
coleta (agachado tocando a pedra, em laço) 2
sacar e guardar: 4 conjuntos × 2 8
total 82

O tempo de cada pose sai do servidor: espera_s e conjuracao_s da skill, a cadência do ataque. A animação nunca decide nada — ela só mostra o que o servidor decidiu.

3. Criaturas — procedural também

Os quadrúpedes do zone14 já vêm em peças: corpo, pescoço, cabeça, quatro patas, cauda, cada peça num arquivo, todas no mesmo quadro de 128³. É o rig pronto. A marcha de quatro patas é o mesmo seno das duas pernas com quatro fases (pares diagonais); cabeça e cauda balançam com a velocidade; o ataque é um bote do corpo pra frente. Custo de arte zero de novo.

Golem e ent são bípedes em peças: usam o procedural do humanoide.

Os mobs

de onde vem anima com
criatura estoque do zone14, simplificado (voxsimplify.py) procedural de criatura
humanoide o corpo do jogador + roupa de mob + arma procedural + o combo do conjunto da arma

Humanoide de mob não tem skill: o mob só tem ataque corpo a corpo ou à distância. Então ele reaproveita o golpe 1 do combo de um conjunto — de espada se for corpo a corpo, de pistola se for à distância — e não precisa de uma pose sequer.

O estoque do zone14 em peças: lobo, urso, tigre, cervo, porco, dragão, hipogrifo, hidra, owlbear, golem de pedra, golem de terra, ent, escaravelho, morsa, e um punhado de aves. Sem peças: esqueleto-lorde, colosso, árvores.

DECIDIDO — os oito mobs: quem morde é bicho, quem atira é gente. Os oito são os da tabela enemy_kinds, nomes herdados com atributos.

Atirador não foge. Pistoleiro, mago e arqueiro andam até o alcance do tiro deles e atiram dali — nunca dão um passo para trás. Antes eles paravam no kite_dist (5 a 8, bem mais perto do que o tiro exigia) e recuavam quando o jogador colava: o bicho andava de ré pelo mapa e quem perseguia nunca alcançava. O kite_dist continua na tabela, mas só como marca de "é atirador"; quem manda na parada é o attack_range.

tipo no banco vira por quê
Grunt 50 de vida, corpo a corpo lobo o mob comum; já existe
Tank 120 de vida, lento, defesa 8 urso massa e lentidão
Ninja 40 de vida, o mais rápido (4,2) tigre o bote
Berserker 200 de vida, 28 de dano owlbear fúria
Ranger 35 de vida, à distância, foge humanoide pistoleiro reusa a pistola
Mago 45 de vida, à distância (12), foge humanoide com anel reusa o círculo no braço
Arqueiro 45 de vida, à distância (9), foge humanoide com arco um arco só de mob
Chefe 700 de vida, 5 projéteis lobo grande já existe (lobo.vox)

Bicho não segura arma, então tudo que atira vira humanoide — e o humanoide reaproveita o corpo e as poses do jogador.

Os tipos antigos (Grunt, Tank, Ranger, Ninja, Berserker) saíram do jogo: a tabela enemy_kinds guarda os mesmos números de antes com os bichos novos, e o chefe passou a MORDER — alcance de corpo a corpo, sem fugir, sem os cinco projéteis que ele atirava.

Onde cada um aparece sai do nível, não de área marcada: o sorteio libera um tipo novo a cada três níveis, na ordem da tabela, e o chefe fica de fora.

a partir do nível entra
1 lobo
3 urso
6 pistoleiro
9 tigre
12 mago
15 owlbear
18 arqueiro

A ilha inicial vai do nível 1 ao 15: nela o arqueiro não aparece, e o owlbear só na ponta mais longe do desembarque.

Montaria e pet

DECIDIDO — os dois são itens da loja de cash, comprados com TP, cada um com livro de habilidade próprio (também TP).

FEITO — o pet. O modelo está em docs/PETS.md: item de bolsa, cinco graus pela cor, coleta o saque do chão e dá ponto de atributo pela espécie.

DEPOIS — o modelo da montaria. De onde vêm e como são fica pra quando essa parte começar. O que já está pronto e não depende disso: a pose do personagem montado, que é procedural — ver a tabela da animação.

O que o fio precisa

Os códigos de ataque de hoje (SLASH, SHOOT, PARRY_FLASH, TOOL_SWING…) apontam pra páginas de sprite do Mana Seed. Morrem junto com o cliente 2D.

FEITO — um byte acao no EntityState (shared::components::acao, protocolo 74): 2 bits de conjunto, 1 de "em combate" (arma sacada), 3 de gesto (nada, golpe, skill) e 2 de variante (passo do combo 0–2, ordem da skill). O conjunto foi pro tick e não pra aparência porque trocar de arma no meio do jogo não reenvia a meta — e um byte que quase nunca muda não pesa no delta. "Em combate" é atacou, conjurou ou apanhou nos últimos 8 s. O gesto fica aceso 0,2 s depois do golpe; o cliente toca na borda de subida ou quando o passo muda.

FEITO — espada e escudo (crates/client/src/rig.rs, seção COMBATE): em guarda, sacar e guardar (o mesmo gesto de ida e volta, a arma troca de lugar no meio), os três golpes do combo — horizontal da direita pra esquerda, de volta subindo, de cima com o passo à frente —, cada um partindo de onde o anterior parou, e o tranco de quem apanha. Braço e lâmina se descrevem por guinada e elevação, e a lâmina aponta pra onde a chave manda: o giro na mão sai da conta. FEITO — os outros três conjuntos, na mesma tabela (rig::Estilo: guarda, sacar e três golpes por conjunto):

conjunto guarda golpes guardada
katana duas mãos no cabo, lâmina erguida na diagonal diagonal descendo do ombro, diagonal subindo, estocada com passo longo na bainha do quadril esquerdo, cabo pra fora
duas pistolas os dois braços à frente, canos baixos tiro da direita, da esquerda, das duas — cada um com o coice subindo o cano nos coldres, dos dois lados
anel mágico mãos abertas à frente do peito palma empurrando, as duas mãos, mão erguida descendo — (o círculo só aparece atacando)

O tiro da pistola acende um clarão na boca do cano; o anel acende o círculo no pulso e, no impacto, projeta um segundo círculo pra frente. O projétil deixa de ser um cubo: bala é um ponto quente com risco, magia é um orbe com halo (o tipo vai no kind da meta do projétil). As 12 skills têm barra de uso, gestos próprios e efeitos de início e impacto; ver SKILLS.md.

Humanoides animados. Pistoleiro, mago e arqueiro carregam as dez peças de assets/vox/humanoides/ no mesmo esqueleto. O arqueiro segura um arco e puxa a corda; pistoleiro e mago usam os gestos das respectivas armas. MobAttackFx leva alvo, direção e tempo do disparo/impacto ao cliente. O corpo olha para esse alvo durante o ataque, mesmo que estivesse andando de lado antes. O servidor segura o movimento na preparação e usa o alcance do próprio mob para resolver o golpe.

FEITO — o que tira o duro. Por cima da pose-chave roda uma MOLA por junta (rig::Molas): a pose do quadro vira alvo e cada peça chega nele com a própria inércia — o antebraço depois do braço, a lâmina depois do antebraço, e com amortecimento abaixo de 1 elas passam um pouco e voltam. As pernas não têm mola: pé plantado tem que cair exatamente onde a conta manda. O corte acelera e passa do ponto; o peso do corpo desce no impacto dobrando os dois joelhos na mesma conta do degrau (o pé não afunda); a guarda respira, a ponta da espada balança e, andando, os braços acompanham o passo. A lâmina deixa uma fita de rastro enquanto corta.

FEITO — apanhar. O servidor manda os acertos do tick no snapshot (WorldSnapshot::acertos: alvo, dano real, crítico, de onde veio) — e não a queda de vida, que no modo imortal e no golpe absorvido não acontece. Quem apanha dá o tranco pra LONGE do atacante (tronco, cabeça, braços abrindo, joelhos cedendo), amassa e volta balançando (rig::esmagamento) e pisca: branco no bicho, vermelho em gente. O bicho empina, escorrega pra trás e a cabeça dá o tranco. Por cima, em 2D (efeitos.rs): o número do dano pula e sobe, a faísca estoura no peito e, quando é você, a borda da tela fica vermelha.

PROPOSTA — aparência na META, não no tick. Skin de armadura, skin de arma do conjunto atual, conjunto, tier da arma e da armadura (pros frisos), peso (pro ícone), rosto, cabelo, pele: ~10 bytes, vai no nascimento da entidade e quando algo muda. Substitui a VisualConfig, que descrevia o paper doll 2D e morreu com ele.

O formato da arte

JÁ É — o leitor de .vox só entende uma peça por arquivo, e fica com a maior. O rig precisa de mais que isso.

JÁ É — e ele ESPELHA o modelo. A malha manda o voxel (x, y, z) pro mundo (x, z, y): trocar dois eixos é reflexo, não rotação. Tudo que foi modelado na mão direita aparece na esquerda. O importador de peças usa o mapa certo ((−x, z, y), que é rotação) — assim a regra pra quem modela fica a natural: a direita do personagem é o lado de X maior. E ele também não recentraliza cada peça: a malha de hoje centra cada modelo na própria caixa, o que desmontaria o corpo.

PROPOSTA — um arquivo por conjunto de peças, com os objetos NOMEADOS no MagicaVoxel. O artista vê o personagem inteiro e move as peças juntas; o cliente lê o grafo de cena (nTRN/nSHP) e separa por nome:

arquivo objetos dentro
corpo.vox cabeca, torso, braco_d, braco_e, perna_d, perna_e
skins/armadura/<nome>.vox os mesmos dez objetos do corpo, cada um substituindo a peça
rosto_01.vox … · cabelo_01.vox … um objeto cada
skins/arma/<conjunto>/<nome>.vox um objeto; o marcador magenta é o ponto de pega

Tudo modelado no mesmo quadro do corpo, pra encaixar sem ajuste. Os pivôs (pescoço, ombros, quadris) ficam numa tabela no código — só existe um corpo, então só existe uma tabela.

A frente continua sendo +Y do voxel, e o teste todo_modelo_olha_pra_frente continua valendo.

A ordem

Cada etapa é jogável sozinha, e toda etapa que mexe no jogador sobe com os bots na ilha.

etapa entrega arte nova?
1. rig leitor de cena do .vox (sem espelhar, sem recentralizar); corpo nas dez peças; desenho por peça; locomoção procedural; pé no degrau não — o molde já está no formato final
2. fio + primeiro ataque byte acao; aparência na meta; combo da espada; visualizador de pose que recarrega a tabela a quente não
3. os quatro conjuntos as 8 armas; os 4 combos; as 12 skills armas
4. skins e cabeça troca de skin; frisos pelo tier do item; rosto, cabelo, pele; criação de personagem cabeça — skin é loja, não pré-requisito
5. mobs criaturas simplificadas com marcha procedural; humanoides nas áreas criaturas vêm do estoque
6. montaria e pet depois — o modelo ainda não foi decidido —

O molde (tools/moldes/corpo_molde.vox, gerado por tools/voxrender/molde_corpo.py) é o que destrava as etapas 1–3 sem esperar arte: o corpo em caixas, já cortado, nomeado e com as tampas das juntas. A arte de verdade entra depois, substituindo o arquivo — nenhuma linha de código muda quando ela chega.

O que ainda depende de você

  1. Área de humanoide. Hoje o humanoide entra pela progressão de nível, como os bichos. Se ele tiver que aparecer só em áreas marcadas (acampamento, forte), é uma regra nova no sorteio.

Poses de coleta

Coletando, a arma sai da mão (guardada) e a ferramenta do tipo vai nas duas mãos: machado na madeira, picareta com a cabeça na cor da pedra. A esquerda fica no marcador da pega, perto da ponta do cabo, e a direita 6 voxels acima, perto da cabeça (rig::MAOS_NA_FERRAMENTA). As duas seguem o cabo o golpe inteiro por IK de dois ossos (rig::segura_duas_maos, a mesma da katana): o cabo é trazido pro alcance dos dois ombros e cada cotovelo sai da lei dos cossenos, aberto pro lado e pra baixo. O teste coleta_segura_o_cabo_com_as_duas_maos confere as duas mãos a ≤ 0,06 do cabo, sem esticar braço nem antebraço, na preparação, no impacto e no recuo. Um golpe dura 1,3 s (rig::PERIODO_DA_COLETA):

  • picareta: 0–45% sobe acima da cabeça (elevação ~2,9), 45–58% desce de uma vez até abaixo do começo com o tronco inclinando 0,4 e o corpo descendo 1,4 voxel, quica até 66% e volta;
  • machado: 0–40% arma de lado (guinada −1,3, tronco torce −0,5), 40–55% varre até +0,7 torcendo o tronco, recua até 63% e volta ao meio.

A pose é por código, como o resto do rig; acao diz o tipo, então quem está de fora vê o mesmo gesto e a mesma ferramenta.

Impacto: no quadro em que a fase do golpe cruza rig::fase_do_impacto sai UMA rajada na cabeça da ferramenta (rig::cabeca_da_ferramenta), client/src/lascas.rs: machado solta 8 lascas marrons em arco que caem em ~0,5 s; picareta solta 4 faíscas claras e curtas (~0,2 s) e 6 pedrinhas/pó na cor do tier da pedra (shared::items::tier_color_hex), com gravidade. O pool é fixo (192 vagas, sem alocar por quadro) e é avançado e desenhado uma vez por quadro no fim de render3d::draw_entities.


A customização, como ficou (21/09/2026)

Implementada. O que estava escrito acima como PROPOSTA virou código; o que segue é o que existe.

O que o jogador escolhe

onde quanto custa
Rosto (3) criação e guarda-roupa grátis
Cabelo (3 + "sem cabelo") idem grátis
Cor do cabelo (6) idem grátis
Tom de pele (4) idem grátis
Chapéu (8 formas) guarda-roupa grátis
Roupa (3 + 1) guarda-roupa as três primeiras grátis; a quarta, 300 TP

Um corpo só, como decidido: a roupa é uma skin que substitui as nove peças do tronco e dos membros, e a cabeça vem do rosto. Toda roupa é feita uma vez e serve em todo mundo.

As três coisas que fazem isso ser barato

1. A cor não é geometria. Tom de pele e cor de cabelo são tingidos no SHADER, por faixa de paleta (vox::faixa_de, gpu_estatica::Faixas). O vértice leva a faixa em normal.yzw — três componentes que o shader sólido não usava —, e as cores vão por uniforme. Custo: zero byte por vértice, zero draw call, zero mudança de pipeline.

Sem isso, cada tom seria uma cópia da malha. E a conta não era 4×: a peça cabeca carrega as DUAS faixas, então seriam 4 tons × 6 cores = 24 cópias de cada rosto. Foi medido antes de decidir.

2. A aparência cabe num u32. Ela viaja na EntityMeta, que sai uma vez por entidade na entrada da AOI. Medido: a meta foi de 26 para 27 bytes, e o custo por tick não mudou — que é o que pesa. Zero é o corpo padrão, então mob, saque e projétil não pagam nada.

O kind não servia: no Player ele já carrega o item da montaria.

3. Só a roupa carrega preguiçosa. Rostos, cabelos e chapéus são 14 arquivos pequenos e vão no boot, junto dos 19 rigs que já iam. A roupa é o eixo que cresce com o catálogo, então ela é pedida quando alguém à vista a usa (VoxCache::rig_ou_pede) e o laço principal atende um por quadro — até chegar, aparece o corpo padrão.

E nunca descarrega. O cache de buffer da GPU é chaveado pelo PONTEIRO dos vértices, e duas variantes da mesma peça têm contagem de vértices idêntica por construção: liberar uma e alocar outra no mesmo endereço devolveria o buffer velho, e o jogador apareceria com a roupa errada sem erro nenhum.

Como a skin vira posse

Pelo caminho do TOMO, e não por slot de equipamento: o item é consumido e o direito fica no guarda-roupa (aparencia::GuardaRoupa::desbloqueadas).

Slot de equipamento foi descartado depois de olhar quem percorre EquipSlot::TODOS — effective_stats, craft e forja_ui não filtram slot cosmético, tanto que pet e montaria já entram na lista da forja hoje. Dois slots novos herdariam isso e daria para "refinar um chapéu".

Consumir na hora de usar também fecha o furo de vestir a skin e revendê-la.

O que o servidor não deixa passar

O cliente pede o que quiser; o servidor corta. Rosto, cabelo, cor e tom contra a tabela (Aparencia::saneada); roupa e chapéu contra o que foi destravado. Sem isso bastaria mandar o número da skin paga para vesti-la.

O chapéu ocupa o campo cabelo — os dois são a mesma junta da cabeça — então ele passa pela mesma regra.

Onde a arte nasce

tools/voxrender/personagem.py, que importa npcs.py e molde_corpo.py sem reescrever nada. O npcs.py já tinha os 4 tons, as 6 cores e as 8 formas de chapéu; o que faltava era separar: lá, rosto, cabelo e chapéu saem fundidos dentro da peça cabeca.

A regra que faz os arquivos empilharem: o rosto é pele, olhos, nariz, boca, orelha e (no máximo) barba — o couro cabeludo inteiro mora no arquivo de cabelo. Se o rosto trouxesse cabeleira, escolher um cabelo poria dois na cabeça. Há teste conferindo isso nos arquivos.

A rede de proteção

A carga preguiçosa tira do boot a conferência que acontecia lá: um arquivo mal salvo deixa de aparecer quando o jogo abre e passa a aparecer quando um estranho entra na sua tela. Então os testes abrem os .vox de verdade:

  • toda_peca_de_personagem_cumpre_o_contrato — objeto com nome, nome no rig, tela 32×24×48, e teto de 500 quads por peça (acima disso malha parte em duas e dobra o passe de render daquela peça; passe é o teto real no celular, não memória).
  • o_rosto_nao_traz_cabelo_e_o_cabelo_nao_traz_pele.
  • toda_peca_de_personagem_tem_pivo — rig::pivo devolvia a RAIZ para nome desconhecido e desenha_rig percorre PECAS, então uma peça mal-nomeada virava malha em volta do chão que ninguém desenhava. Duas falhas caladas, uma escondendo a outra. Hoje pivo devolve Option e load_rig reclama.