O código que influência a rotação chama-se MaintainRotation e se encontra em Assets/V2/Scripts/Rotation aparecendo também em Container.cs para limpar a lista no release mencionado mais abaixo.
Apesar de estar funcional os únicos elementos que funcionam 100% é na faca, tablets, caixas e InkBrush sendo o código implementado no prefab de ambas as caixas + Carbon e em cada elemento que precisa da rotação. Em baixo podemos ver um exemplo na caixa:
Para funcionar corretamente é necessário colocar todos os elementos adicionados dentro da caixa (não sendo child) dentro da lista para correr direito pois eles irão se mover com o a sua própria rotação se não for o caso. Já para os átomos foi adicionado no prefab como mencionado anteriormente para afectar todos os átomos no jogo.
Está atualmente desativado pois ocorre um bug como podemos ver neste video nos 4 min e 55 sec mas a implementação está lá, tem é de evitar conflitos devido aos átomos serem adicionado às moléculas sendo necessário ver a integração do mesmo em MoleculeV2 (o que força também a rotação normal denovo pois eles não saem de molecule (clone) após ficarem sozinhos).
Como a faca, tablet e as tintas não são prefabs os únicos que estão completos com o código é o V2 e V2PT.
O código que faz a contagem dos tempos chama-se TimerManager e se encontra em Assets/V2/Scripts/PlayerTime sendo chamado em ContainerLock, AtomicManager e AtomicIdentifier.
É chamado em ContainerLock pois é aonde geralmente (modo normal e hard) que o jogador desbloqueia a caixa, da mesma forma que no AtomicIdentifier é chamado em IdentifyMolecules().
Em AtomicManager é que é feito maioria da lógica. Este foi inserido em restart() e mainMenu() para controlar quando o jogador reinicia o jogo (não troca de jogador) e quando volta ao Menu (Muda de jogador), em Start() irá criar o objeto que não será destruido (para garantir que mantém a ordem dos jogadores).
Devido à forma como o código foi implementado a forma de iniciar os tempos e contar são diferentes. Quando é tutorial o tempo é iniciado no Start() e parado até que a mensagem é mostrada completamente, isto é importante para não dar contar o tempo do tutorial além de haver um bug no tutorial que se for completo antes de todas as mensagens acabarem não será possivel passar para o próximo puzzle depois de abrir a caixa. Já para a versão normal, hard e livre é iniciado em IncreaseStep após o blindfold desaparecer
Como mencionado anteriormente, o modo normal e hard é contado quando o jogador desbloqueia as caixas em ContainerLock e no Livre quando faz o scan. Já para o tutorial é adicionado em cada case do CheckConnectionCreation(), CheckConnectionDestruction(), CheckMoleculeToggle() e CheckUnlockSucess() nos casos de sucesso.
Já para quando o jogo termina é atualizado no Update(). Um exemplo de teste + como está sendo guardado é possivel se ver neste video. No video não mostra voltar ao menu nem sair do jogo porque o controller estava batendo na parede e não ainda não tinha sido mudado para OnApplicationQuit(), respetivamente.
Esta mudança é vista melhor no commit build: changed way to access the dictionary onde o código mudado se encontra em Assets/V2/Scripts/AtomicIdentifier e o dicionário de moleculas em Assets/V2/Scripts/AtomDictionary/MoleculeDatabase.cs. Usando a imagem abaixo para explicar o dicionário:
MoleculeData é o struct que está no inicio do MoleculeDatabase onde o namePT e nameEN será o nome que irá aparecer quando o utilizador verificar a molecula dependendo se estiverem na versão em português e inglês, respetivamente. AtomCounts será o tipo de cada átomo e a quantidade de átomos irá aparecer na molécula e connectionRequirements será os tipos de conexões eixstentes para formar a molécula (AtomType.Nitrogen, AtomType.Nitrogen, 1, 2) indica que existirá 1 conexão dupla entre 2 nitrogénios enquanto que (AtomType.Nitrogen, AtomType.Oxygen, 2, 1) indica que existirá 2 conexões simples entre nitrogénio e Oxigénio.
descriptionPT e descriptionEN é a descrição que irá aparecer abaixo do namePT e nameEN mencionados anteriormente.
Devido a como o código está estruturado e feito moléculas circulares são impossiveis de ser criadas:
Uma solução de forma a não modificar a forma como está sendo criado os átomos seria criar algo semelhante à faca que, em vez de cortar, agarra nos eletrões livres e força a conexão entre os 2 eletrões livres.
De igual forma, moléculas como o Cloreto de amonia é impossivel de ser criada por 2 razões:
- Quando a molécula é adicionada para ser identificada, adicionar as 2 separadas é ter 2 mol's diferentes e o identifier só identifica 1 delas.
- O azoto (N) só tem 3 eletrões quando ele pode ter 4 dependendo de certas situações.
De igual forma podia ser possível a criação de 2 items. O primeiro selecionaria as 2 moléculas diferentes e faria com que elas fossem 1 só e o segundo aumentaria/diminuiria a quantitade de eletrões no átomo (ver AtomoV2, é possível ter de ser criado prefabs para este segundo caso).