E aí pessoal, aqui é o AL. Bem-vindos ao primeiro olhar nos bastidores de Mortumus.
Enquanto o Fin está enterrado nas minas do servidor lutando com bancos de dados, assinaturas e toda aquela magia assustadora de sistemas distribuídos que mantém o mundo vivo, eu estou do outro lado garantindo que cada golpe de espada, cada passo, cada tremular de tocha e cada peça de armadura realmente pareça e sinta certa na sua tela.
Construir um MMO de dark fantasy não é o tipo de coisa que você monta arrastando e soltando coisas de um asset store. A sensação bruta e oldschool que estamos buscando (o peso do combate, o ranger da sua armadura, o pavor de ver outro jogador no horizonte) só aparece quando as ferramentas por baixo são construídas especificamente para isso. Então hoje eu estou puxando a cortina sobre alguns dos sistemas Unity personalizados que fomos montando no lado do cliente: os que ninguém nunca vai ver, mas que todo mundo vai sentir.
Vamos lá.
Visuais, Loot e Privacidade no PvP
Se existe uma verdade sobre jogadores de MMO, é esta: a gente ama equipamento. E num jogo full loot PvP como Mortumus, equipamento não é só uma dose de dopamina, é informação. O que alguém está vestindo te diz o que essa pessoa pode fazer com você.
Mantenha em segredo, mantenha seguro: Equipment Visualizer
Cedo percebemos que tínhamos um problema que muitos MMOs ignoram silenciosamente: se o cliente sabe o ID exato de cada peça de equipamento de cada jogador visível, um trapaceiro determinado pode extrair isso da memória e saber seus stats exatos antes de decidir te emboscar.
Então, nosso Equipment Visualizer faz algo um pouco paranoico. Para o seu próprio personagem, ele lê do serviço de equipamento completo: você vê tudo sobre seu equipamento. Mas para qualquer outro jogador, ele só lê um blob de "visuais" simplificado que o servidor publica. Você vê a espada, não a ficha de stats. Os IDs de itens de desconhecidos simplesmente nunca saem do servidor do Fin.
É uma coisa pequena. Também torna cheats de memory scraping bem menos úteis. Boa troca.
A Pilha de Animações
Combate baseado em habilidade vive ou morre pela animação. Se o windup não é legível, você não consegue reagir. Se o golpe não acerta, a luta parece sem peso. Se a morte parece o modelo simplesmente... desligando, você perde metade do clima.
Player Animation Coordinator
Começamos do jeito que a maioria começa: uma classe gigante de controlador de animação tentando gerenciar tudo. Movimento, feitiços, morte, impactos, idles, tudo no mesmo arquivo. Em umas duas semanas era uma bagunça.
Então dividimos. Agora o Player Animation Coordinator é um ponto de entrada minúsculo que levanta uma pilha de módulos pequenos e especializados: movimento, rotação, ataque, feitiço, reações a impacto, morte, idles. Cada um cuida de uma coisa. Cada um é legível por si só. Encontrar bugs leva minutos em vez de horas.
Código mais limpo para mim. Combate mais preciso para você.
Responsividade do combate: Attack Animator & Spell Animator
Eis o problema clássico dos MMOs: combate server-authoritative é a única forma de impedir trapaça, mas esperar o servidor confirmar cada cast parece melado.
Nosso Spell Animator trapaceia um pouco, mas de forma honesta. Quando você aperta a tecla de feitiço, a animação de cast roda imediatamente, prevista localmente, para parecer instantânea. Aí o servidor do Fin valida se o cast era realmente legal (cooldown zerado, mana suficiente, alvo válido, etc.). Se confirma, nada muda. Se rejeita, saímos da animação de forma limpa.
O Attack Animator faz a mesma dança para o corpo a corpo, e ainda escala a velocidade do swing para combinar com a cadência que o servidor diz para sua arma. Seus olhos veem combate responsivo. O servidor vê um mundo que não pode ser enganado.
Esse ponto ideal entre "sensação boa" e "jogo justo" é onde todo esse jogo vive.
Os Sons do Reino
Áudio é 50% do clima, e as pessoas sempre subestimam quanto trabalho dá.
Criando a atmosfera: Audio Manager & Music Region System
Jogos tradicionais costumam mudar a música com um corte seco quando você cruza uma linha invisível. É brusco. Nós fazemos com zonas poligonais 3D. O Music Region System nos permite pintar áreas de formato arbitrário no mundo (um bosque assombrado, uma capela amaldiçoada, a aproximação de um boss), e conforme você entra e sai, o Audio Manager faz crossfade da trilha sonora suavemente. Sem cortes. Sem reiniciar a mesma faixa se você pisar na fronteira.
E como tudo isso roda através de fontes de áudio em pool com roteamento por grupo de mixer, não custa praticamente nada no frame budget.
O Character Audio Manager
Cada passo em Mortumus é conectado à animação do seu personagem e à superfície sob seus pés: pedra soa como pedra, lama soa como lama. Sons de feitiço são ligados à habilidade, swings de arma à arma. O Character Audio Manager fica entre os eventos de animação e o Audio Manager para que possamos trocar packs de SFX por raça/classe sem tocar em código de gameplay.
Coisas pequenas. Muitas delas. Elas se acumulam.
A Beira da Água
Todo mundo de dark fantasy tem água. Pântanos, rios, ruínas inundadas, o mar na borda de um cabo amaldiçoado. E água é uma daquelas coisas que parece falsa muito fácil, especialmente onde encontra a terra. Aquela linha d'água poligonal feia onde o mesh cruza o terreno é a marca registrada de um jogo com visual barato.
Nossa base de água
Não construímos nossa água do zero. A Unity na verdade inclui um projeto demo fantástico chamado Boat Attack que traz um dos melhores sistemas de água URP que existem: reflexos reais, refrações, flutuabilidade, o pacote completo. Então começamos com a água do Boat Attack como fundação, porque reinventar a roda teria nos custado meses sem ganho real.
Mas o Boat Attack foi construído para, bom... barcos. Linhas costeiras oceânicas bonitas e limpas. O comportamento costeiro que fica ótimo numa praia de areia fica horrível ao redor dos cursos d'água lamacentos, cheios de junco e irregulares que realmente queremos em Mortumus. Então tivemos que ser cirúrgicos.
O shader personalizado: Water Shoreline
Em vez de editar o pacote da Unity diretamente (o que quebraria a cada atualização), escrevemos um shader personalizado fino "WaterShoreline" que troca apenas a parte do pipeline responsável pela costa. Todo o resto (reflexos, flow maps, caustics) vem direto do Boat Attack. Só sobrescrevemos o que precisamos.
As duas grandes mudanças:
O corte fixo de espuma de 2 metros sumiu. A faixa de espuma padrão do Boat Attack tem um corte de profundidade fixo, que dá aquele "anel branco" uniforme ao redor de cada costa. Substituímos por um falloff mais suave mais um campo de ruído que rola, então a espuma agora some gradualmente e se quebra em línguas e dedos orgânicos em vez de uma fita perfeita.
Alpha suave na costa. Aquele problema da linha d'água poligonal contra o terreno? Fazemos fade da própria água para transparente no último meio metro de profundidade. A linha d'água desaparece completamente. O terreno simplesmente escurece conforme vai para debaixo d'água, do jeito que uma costa molhada real faz.
Nosso sistema de rios
O lance da água do Boat Attack é o seguinte: de fábrica ela lida com oceanos lindamente, mas não sabe de verdade o que é um rio. A água pode ondular no lugar, mas não consegue fluir rio abaixo e contornar uma curva como um rio real faz. Isso é um problema quando metade do seu mundo de dark fantasy deveria ser pantanosa, fluvial e encharcada.
Então construímos um sistema de rios por cima.
Um rio em Mortumus é criado como um caminho de fluxo: uma polilinha simples de pontos que traça a espinha do rio da nascente à foz. Designers colocam os pontos onde querem que a água flua, e o shader faz o resto: para cada pixel da superfície da água, ele descobre qual segmento do caminho de fluxo está mais perto e usa a direção desse segmento como corrente local. Resultado: água perto de uma seção reta flui reto, água no interior de uma curva curva junto com a curva, e tudo transiciona suavemente entre os dois.
As texturas, normais e espuma rolam ao longo dessa direção de fluxo em vez de flutuar sem rumo. Você realmente consegue ver para onde o rio está indo.
Tudo é ajustável ao vivo pelo ShoreFoamTuner, um componente inspector pequeno que colocamos em qualquer cena com água. Sliders para suavidade da espuma, escala do ruído, intensidade do ruído, velocidade de drift, falloff de alpha. Mude o clima de um lago inteiro sem tocar num material.
Comunidade e trash talk: Chat & Social
Um MMO oldschool é tanto sobre as pessoas quanto sobre o jogo. Se as ferramentas sociais parecem ruins, o mundo parece vazio.
Overhead Chat System
Texto ancorado bem acima da cabeça de um personagem, seguindo conforme ele se move, sumindo com a distância: é um clássico absoluto do gênero, e algo que vamos defender até o fim.
Transforma grupos em conversas reais. Deixa você provocar alguém no meio de uma luta. Deixa as últimas palavras de um jogador morrendo serem algo idiota e engraçado em vez de uma linha de log do sistema. O Overhead Chat System cuida de pooling, culling por distância e rastreamento de âncora para que escale mesmo quando vinte pessoas estão gritando umas com as outras num calabouço apertado.
Aparência é tudo
Seja honesto: você vai gastar uma quantidade constrangedora de tempo na tela de personagem. Todos nós fazemos isso. É o espelho mais bonito do jogo.
O sistema de preview do personagem
Nosso paper doll não é um render 2D estático: é uma cena 3D ao vivo renderizada numa render texture de UI. Iluminação completa, geometria real, cada peça de equipamento em você em tempo real. Gire, dê zoom, fique encarando. É o tipo de feature que não muda nada no gameplay, e muda absolutamente como o jogo parece quando é seu.
Enchendo as bolsas: Icon Studio
Aqui vai um segredinho sujo do desenvolvimento de MMOs: ícones. Você precisa de centenas deles. Cada espada, cada poção, cada peça de loot lixo que você encontra num baú precisa do seu próprio quadradinho 64x64 que seja legível num inventário lotado. E todos precisam parecer que pertencem ao mesmo jogo.
Você não pode simplesmente dar um screenshot num modelo 3D e pronto. A iluminação precisa ser consistente. O ângulo da câmera precisa ser consistente. E (essa é a parte que todo mundo subestima) o enquadramento precisa combinar com o tamanho de grid que o item vai ocupar no inventário. Uma adaga 1x1 e um espadão 2x3 precisam de composições totalmente diferentes ou os dois ficam errados.
Nossa solução: Icon Studio
Icon Studio é uma janela de editor Unity personalizada que construímos para que uma pessoa (geralmente eu, resmungando) possa produzir cem ícones consistentes sem perder a sanidade.
O fluxo: jogue uma lista de prefabs de itens. Diga para a ferramenta qual tamanho de grid cada um ocupa no inventário: 1x1, 2x2, 2x3, 1x4, o que for. Enquadre a câmera uma vez. Salve o enquadramento como preset. Aperte Gerar.
A mágica é que o tamanho de grid não é cosmético: ele controla o render de verdade. Um item 2x3 é renderizado com 2x de largura e 3x de altura (de uma base de 512px), então quando está no seu inventário as proporções estão corretas, não esticadas. Uma espada longa genuinamente preenche um slot 1x4 na diagonal. Um frasco de poção genuinamente cabe em 1x1. O inventário parece que você está organizando objetos reais.
ALém disso, a ferramenta cuida de: fundos transparentes ou personalizados por item, captura de bone pose para que itens baseados em esqueleto possam salvar sua pose de exibição sem perturbar o rig de gameplay, e presets para categorias inteiras de itens: todos os machados renderizam com a mesma câmera, todas as poções com outra. Consistência de graça.
O resultado final é que cada ícone no jogo (os que ficam legíveis a 32 pixels num grid de inventário denso) foi renderizado a partir do modelo real do jogo, no formato real que o item ocupa na sua bolsa. Sem arte 2D terceirizada. Sem iluminação inconsistente. Sem adaga que de algum jeito parece maior que um espadão na UI.
É o tipo de ferramenta que ninguém vê. Também é a razão pela qual o inventário não parece uma sacola de stock art misturada.
Até a Próxima
Nenhum desses sistemas é um feature principal de Mortumus. Ninguém vai comprar o jogo porque os passos soam bem ou porque esqueletos explodem em pedaços com física. Mas esses são os ossos por baixo de tudo: o trabalho invisível que faz as coisas grandes parecerem certas quando se apoiam neles.
Com essa fundação pronta, Fin e eu podemos construir o verdadeiro mundo sombrio, brutal e full loot que estivemos rabiscando em cadernos por dois anos, num ritmo que não nos faça querer jogar nossos computadores num rio.
— AL