Eu tenho trabalhado em uma arquitetura P2P para jogos seguros e dividi o problema em cinco subproblemas:
- Modificação ilegal do estado do jogo enviado
- Solte trapaceiros com precisão
- Concordando em um estado de jogo
- Evitando fraudes do tipo "olhar à frente"
- Ocultando informações confidenciais dos oponentes
Os quatro primeiros que eu praticamente resolvi, mas é o último com o qual estou tendo problemas.
Antes de entrar em detalhes, só quero perguntar se há algo que eu tenha perdido na minha lista de criação de uma rede p2p "à prova de trapaças". Não estou interessado em truques, como usar aimbots, apenas em tornar a rede p2p tão segura quanto um servidor centralizado.
Portanto, em meu esforço até agora em ocultar informações confidenciais, concentrei-me na posição dos jogadores em um jogo em que a posição do seu oponente nem sempre deve ser conhecida. O problema passa a ser como determinar se você deve enviar sua posição ao seu oponente sem saber a posição do seu oponente.
Eu descartei métodos como o oponente enviando várias posições falsas para você comparar a sua também, pois seu oponente pode facilmente abusar de um sistema desse tipo, pois ele conseguirá sua posição se uma dessas posições falsas for "visível" da sua posição.
O método que eu tenho focado em um em que você recebe um "campo visual" do seu oponente e pode assim determinar se você deve enviar sua posição ou não. No entanto, isso é um problema em jogos como League of Legends, onde o campo visual do seu oponente também é uma informação altamente sensível. Tentei resolver isso transformando o campo visual usando uma matriz singular, o que significa que você não pode passar da versão transformada do campo visual para a versão original, mas, como é uma transformação linear, ainda é possível descobrir se sua posição está dentro o campo visual ou não.
No entanto, isso não funciona perfeitamente, o campo visual exato não pode ser restaurado após a transformação, mas as informações sobre as "inclinações" no campo visual (o campo visual é construído por várias linhas e a inclinação de cada linha pode ser determinada) pode ser restaurado e isso pode ser usado para reconstruir relativamente barato o campo visual original.
Em essência, o que eu preciso é de uma função que possa determinar se uma posição é "visível" ou não, e a reconstrução dessa função / campo visual deve ser tão exigente em termos computacionais que, quando você terminar de reconstruir o campo visual, não será mais relevante para o jogo em ação. Existe alguma pessoa super inteligente por aí que conhece esse método?
Editar Pessoas costura tipo de confuso sobre todo o "campo de visão", então eu como objectivo dar uma explicação mais detalhada aqui. O campo de visão consiste em grupos de um conjunto de linhas. Você pode verificar facilmente se uma posição está dentro de um desses grupos apenas verificando qual lado da linha está sua posição, se está do mesmo lado para todas as linhas desse grupo que você conhece. está dentro desse grupo e, portanto, dentro do campo de visão.
As informações enviadas, no entanto, não são essa linha, mas uma transformação da linha e da transformação (matriz 2 por 2 no singular), você ainda pode verificar em qual lado da linha sua posição está, transformando-a primeiro usando a transformação que você recebeu e comparando esse valor com a linha transformada. A chave aqui é que a transformação é singular, o que significa que é impossível encontrar um inverso para voltar à linha original. No entanto, é possível determinar a inclinação da linha que torna a reconstrução da linha apenas verificando em que lado da linha transformada muitos pontos se encontram até que você identifique a origem da linha muito mais computacionalmente mais barata do que se você não soubesse a inclinação da linha.
O que estou procurando é um método para determinar se um ponto está dentro de uma área, onde a reconstrução da área a partir do método é impossível (o que duvido que exista, já que você sempre pode fazer força bruta) ou muito computacionalmente pesada.