Fiquei muito feliz por ter criado um conceito viável para um inventário modal, bem como por ter produzido um massa de maquetes com soluções comprovadas para todos os obstáculos potenciais no caminho para eliminar 15 linhas da interface do Cogmind. Ou assim eu pensava.
De repente, no remaining desse processo, uma revisão dos sistemas de interface de usuário restantes revelou um obstáculo inesperado: animações finais.
O Cogmind tem muitos finais diferentes (atualmente nove, com mais por vir), e todos eles apresentam animações ASCII em tela cheia. Enquanto alguns deles são flexíveis o suficiente para se encaixar dinamicamente em quaisquer dimensões de terminal, muitos foram projetados para assumir uma altura de 60 linhas. A única maneira de encaixá-los em 45 linhas seria um redesenho completo…
Eu investi muito tempo nas animações existentes, e elas fazem bom uso do espaço, então seria de se esperar que houvesse outra maneira…
Troca de terminais
E se… o terminal ainda tivesse 60 linhas durante as animações finais?
Afinal, não há uma forte necessidade de que os finais sejam limitados a apenas 45 linhas – você está essencialmente assistindo a essas animações para o efeito visible geral, em vez de precisar interpretar cada pequeno detalhe para fins de jogabilidade. Conforme descrito no começo desta sérieo motivo para reduzir as dimensões do terminal base é permitir fontes maiores em todos os aspectos, mas a intenção é facilitar a leitura e a interpretação de detalhes, o que não precisamos neste caso.
Então, a teoria é que usamos um terminal de 45 linhas para o jogo regular, mas quando precisamos fazer uma animação remaining, basta alternar para um terminal de 60 linhas para exibi-la e, então, voltar quando terminar.
Isso me lembra de jogos que mudam para um modo de exibição diferente especificamente para lower scenes, especialmente comum (e perceptível) nos primeiros videogames, e depois se tornou um grande negócio quando esse tipo de coisa pôde ser feito “no motor”, o que é a norma hoje em dia. A Cogmind sempre foi consistente sobre sua exibição, mas neste caso eu poderia idealmente continuar a fazer uso de todo o trabalho que já foi feito nas animações.
Agora vêm as perguntas importantes: a arquitetura do mecanismo é capaz de tal recurso e quais outros obstáculos podem estar no caminho?
Tecnicamente, a ideia imediatamente se mostrou promissora com base no fato de que o Cogmind já usa o que chamo de “troca de terminais”, mas apenas entre quadros e nos bastidores, especificamente para fins especiais de captura de tela.
O uso principal é para saída de mapa, ou criação de um PNG composto contendo todo o mapa atual conhecido. Isso é útil para compartilhar layouts interessantes com outros jogadores, ou pedir conselhos sobre onde explorar.

Saída do mapa compartilhada por Terminus, mostrando uma rota tortuosa através da Pesquisa enquanto se busca uma saída específica (que acabou sendo perto da entrada :P). (abrir para tamanho completo)
Também o usei para produzir uma imagem marcando o lançamento das conquistas da Cogmind, para as quais eu queria que o fundo fosse uma matriz de muitos ícones de conquistas.

Uma imagem celebrando o primeiro lote de conquistas da Cogmind, adicionadas em 2018. Um dia esse número vai ficar muito maior.
Ambos os casos de uso exigiam a geração de uma imagem maior que a tela, então uma captura de tela regular não seria suficiente.
Já equipado com uma maneira integrada de fazer uma “captura de tela” do conteúdo do terminal (ignorando completamente a tela em si), se construirmos um terminal maior do que a tela, podemos facilmente executar o processo de “captura de tela” nele para produzir uma imagem ainda maior.
Com apenas um pequeno pedaço de código isolado, é bem fácil substituir temporariamente o terminal do mecanismo por um de tamanho diferente desejado, escrever nele, gerar a imagem e então restaurar o terminal unique como se nada tivesse acontecido. Na verdade, não estamos renderizando para a tela em si, então a resolução não importa, não precisamos mudar o modo de vídeo, nada disso é exibido, nem ocorre nenhuma interação externa.
Este foi um ponto de partida promissor, fornecendo pelo menos uma abordagem teórica para nosso gerenciamento de animação remaining.
REX, de novo
Os exemplos iniciais acima de troca básica de terminais são praticamente todos do lado do Cogmind. Como isso acontece entre quadros com o único propósito de criar uma imagem usando o sistema regular, o mecanismo não precisa saber ou se importar com o que está acontecendo. Tudo o que period necessário period uma função simples permitindo que o terminal raiz fosse trocado por outro.
Dar o próximo passo e trocar o terminal por um novo que existiria por mais tempo, e até envolveria algum nível de interação do jogador, seria um processo muito mais complicado, o que significa que é hora de revisitar o mecanismo para expandir suas principais capacidades, como eu fiz. não faz muito tempo com os quads e octs alimentando o sistema de zoom do mapa.
Além disso, mais uma vez, como um recurso do mecanismo, faz mais sentido retornar ao ambiente de teste do mecanismo mais simples para construí-lo e depurá-lo, em vez de usar o próprio Cogmind.
Fiquei satisfeito e surpreso ao descobrir que a troca de terminais de natureza estendida realmente não period uma operação incrivelmente complexa com muitas repercussões. No que diz respeito ao mecanismo, ele só exigia a alteração de um punhado de variáveis principais, embora, além disso, eu tivesse que resolver alguns problemas relacionados ao cursor, como travamentos relacionados à posição da tela e dados de foco, e o standing do cursor de software program soiled rect.

Uma visão simplificada do código-fonte para o processo de troca de terminais do REX. Trocar de volta é essencialmente apenas reverter esse procedimento (normalmente tratado por esse mesmo método, mas cortei tudo isso no interesse da legibilidade).
Levou cerca de um dia para implementar a troca de terminais e resolver todos os problemas.

A primeira troca de raiz bem-sucedida no REX, substituindo temporariamente o terminal de demonstração padrão 80×60 por um terminal 120×90, enquanto troca o tamanho da fonte de 6×12 para 4×8, para que o tamanho da janela permaneça consistente. Esse comportamento simula o que seria necessário para executar as animações do Cogmind usando uma fonte menor, mantendo a mesma resolução.
O próximo estágio na construção desse recurso seria importá-lo para o Cogmind enquanto altera o mínimo de variáveis possível. Não precisa ser especificamente para finais, e nem precisamos começar por na verdade alterando as dimensões do terminal–simplesmente trocando do terminal padrão de 60 linhas para outro terminal de 60 linhas e vice-versa seria suficiente para eliminar quaisquer problemas com relação à entrada ou outra funcionalidade básica. Um passo mais perto de um cenário de caso de uso actual. Isso também foi bem!
Quando e onde
Tendo passado por um teste mais simples, period hora da coisa actual, mas exatamente onde está a melhor oportunidade para uma troca acontecer? Trocar é um corte bem significativo, afinal, formando uma barreira clara entre o que é antes e depois, e não deveria haver muita conversa entre os dois lados, pelo menos não em um nível de interface.
Conforme declarado no início, o objetivo aqui period permitir que finais animados usassem 60 linhas em vez de 45. Dada a simplicidade da troca de terminais no nível do mecanismo, parece fácil o suficiente…
Como acontece com muitas coisas, de perto já não parecia tão fácil.
Originalmente, imaginei apenas ter o segmento de animação do remaining em um terminal diferente e tentei isso por um tempo, mas os finais (há tantos xD) são uma coleção relativamente complexa de lessons e processos, pois eles misturam e combinam componentes diferentes, e foi muito difícil desembaraçar o que precisava ser desembaraçado. Mesmo antes de considerar as necessidades de troca, acontece que, em muitos casos, o processo envolve várias janelas em estados variados de visibilidade e sobreposição. Embora a troca emblem antes de uma animação seja possível, provavelmente seria muito difícil de implementar e depurar.
Então surgiu uma nova ideia: que tal em vez de focar tanto nas animações, avançarmos um nível e lidarmos com o processo completo de fim de jogo em sua própria interface de terminal separada? Isso incluiria a tela padrão de fim de jogo (perdas também), estatísticas e menu de reinício, and many others. Esta é uma pausa muito mais limpa, muito mais fácil de fazer sem se preocupar com complicações sérias.

O rescaldo da primeira troca de raiz (na maior parte) bem-sucedida no Cogmind, tendo passado por um remaining e iniciado uma nova execução. Alguns de vocês reconhecerão o que está acontecendo lá… Claramente, alguns bugs a serem resolvidos, mas não travou e estamos de volta à ação para uma nova execução
A única desvantagem é que a tela de estatísticas estaria na interface do terminal de 60 linhas usando o tamanho de fonte unique. Em outras palavras, de volta à fonte menor. Ainda assim, isso pode ser bom, pois é 1) apenas texto, 2) não muito texto, 3) apenas naquele ponto, embora se quiséssemos, talvez pudéssemos usar o novo ampliar texto tamanho da fonte para exibi-lo. Fazer isso exigiria reduzir o número de estatísticas listadas para caber no espaço disponível, pelo menos se tentar manter o design vertical. Elas são apenas um pequeno subconjunto daquelas encontradas no dados massivos de planilha de pontuaçãode qualquer forma, mas não gosto da ideia de reduzir ainda mais a já curta lista representativa, então é aceitar um tamanho de fonte menor para aquela tela em explicit, ou eventualmente ir tão longe quanto um redesenho mais significativo que faça mais uso do espaço horizontal. Tentei alguns mockups, mas não gostei de nenhum deles, então provavelmente nada mudará com isso no começo.
Enquanto trabalhava em todo esse negócio de troca de terminais, também descobri que se você conseguir fechar a janela do jogo durante uma animação de finalização (incluindo a animação de perda), não sobreporia a animação de fechamento do programa separado que adicionei algumas versões anteriores. Esta não é uma ocorrência incomum, inadvertidamente descobrindo bugs obscuros em versões antigas ou, em alguns casos muito antigas, partes da fonte que simplesmente nunca foram encontradas ou notadas antes. Sempre uma boa oportunidade para ficar alerta e consertar as coisas

Uma imagem de como fica ao fechar o Cogmind durante a animação de perda, incluindo a nova fonte de zoom usada para a faixa adicionada no Beta 13. Tecnicamente, neste ponto, o terminal também é trocado.
Uma observação remaining: para um artigo sobre novas tecnologias para dar suporte a animações finais, há uma curiosa ausência de exemplos demonstrando o caso de uso principal, mas achei que deveria deixá-los de fora
Esta é a terceira parte de uma série de várias partes sobre a construção do structure de interface semimodal totalmente ampliado do Cogmind: