Conhecendo a gladCode

Na gladCode existe uma arena onde gladiadores virtuais batalham entre si até somente restar um vivo. Cada jogador, chamado mestre, possui a tarefa de programar o comportamento dos seus gladiadores, de modo que ele aja de maneira autônoma durante a batalha.

Os gladiadores são os representantes dos mestres dentro da arena. E como tal, irão obedecer sua programação fielmente com o objetivo de derrotar os gladiadores dos adversários. Eles possuem características que determinam suas forças e fraquezas. Estas características são chamadas de atributos do gladiador. Eles também possuem um nível. Este nível indica o quão experiente este gladiador já se tornou dentro da arena.

Todos gladiadores iniciam em nível 1. Cada nível adicional concede a eles poder adicional na forma de melhorias de atributos. Os gladiadores possui três atributos principais, descritos a seguir:

  • Força (STR): Força física e resistência do gladiador. Afeta o dano corpo-a-corpo que o gladiador causa e sua quantidade de pontos de vida.
  • Agilidade (AGI): Agilidade, rapidez e destreza do gladiador. Afeta a precisão dos ataques à distância, o deslocamento do gladiador dentro da arena e a velocidade dos ataques dele.
  • Inteligência (INT): Rapidez de raciocínio e Capacidade intelectual do gladiador. Afeta a velocidade do gladiador para executar uma habilidade e a quantidade de vezes que ele consegue executar uma habilidade até se esgotar mentalmente.

Cada um destes três atributos principais são responsáveis por atributos secundários, descritos a seguir:

  • Dano físico (baseado em STR): Dano causado pelo gladiador ao realizar um ataque corpo-a-corpo. Representa a força bruta do gladiador.
  • Pontos de vida, ou hp (baseado em STR): Dano que o gladiador suporta levar antes de morrer. Representa a resiliência física do gladiador.
  • Precisão (baseado em AGI): Dano causado pelo gladiador ao realizar um ataque à distância. Representa a precisão do disparo do gladiador.
  • Velocidade de ataque (baseado em AGI): Quantidade de ataques que o gladiador consegue executar por segundo. Representa a agilidade do gladiador em combate
  • Velocidade de movimento (baseado em AGI): Distância que o gladiador consegue percorrer por segundo, medida em passos. Representa a rapidez com que o gladiador caminha.
  • Velocidade de rotação (baseado em AGI): Quantos graus o gladiador consegue rotacionar por segundo.
  • Poder mágico (baseado em INT): Dano causado pelo gladiador ao realizar um ataque usando uma habilidade mágica. Representa o nível de conhecimento que o gladiador possui a respeito das artes arcanas.
  • Pontos de habilidade, ou ap (baseado em INT): Recurso gasto ao executar uma habilidade. Representa a resiliência mental do gladiador.
  • Regeneração de ap (baseado em INT): Quantidade de pontos de habilidade regenerados por segundo. Representa a capacidade do gladiador de atuar sob pressão.
  • Velocidade de habilidade (baseado em INT): Quantidade de habilidades que o gladiador consegue executar por segundo. Representa a rapidez de raciocínio do gladiador.

Ao criar um gladiador, os competidores precisam definir a distribuição inicial dos atributos básicos. Cada gladiador precisa receber atributos básicos que somados custam 50 pontos. O custo de cada ponto de atributo é variável, conforme a tabela abaixo:

Valor1234567891011121314151617181920
Custo11111122222233333344
Soma123456810121416182124273033364044

Não se preocupe, você não precisa memorizar estes custos, pois o editor de gladiadores cuida disto para você.

Os efeitos dos atributos básicos sobre os secundários estão descritos a seguir:

  • Força (STR)
    • Dano físico(mdmg): 5 mdmg + 0.75 mdmg por ponto de STR
    • Pontos de Vida (hp): 100 hp + 10 hp por ponto de STR
  • Agilidade (AGI)
    • Precisão(rdmg): 5 rdmg + 0.4 rdmg por ponto de AGI
    • Velocidade de Ataque (as): 0.5 as + 0.05 as por ponto de AGI
    • Velocidade de Movimento (ms): 1 ms + 0.05 ms por ponto de AGI
    • Velocidade de Rotação (ts): 90 ts + 9 ts por ponto de AGI
  • Inteligência (INT)
    • Poder mágico(sdmg): 0.5 sdmg por ponto de INT
    • Pontos de Habilidade (ap): 100 ap + 10 ap por ponto de INT
    • Recuperação de ap (reg): 5 ap + 0.25 ap por ponto de INT
    • Velocidade de uso de Habilidade (cs): 0.5 cs + 0.05 cs por ponto de INT

Existem também alguns atributos fixos dos gladiadores, que não sofrem mudanças em seus valores ao longo da simulação:

  • Raio de visão: 120 graus - Arco de visão do gladiador
  • Distância de visão: 9 passos - Distância máxima que o gladiador enxerga

A página onde você personaliza a aparência, distribui os atributos e programa o comportamento de seu gladiador chama-se editor de gladiadores. Nela você começa com uma interface que lhe permite escolher entre diversas opções de itens que configuram a aparência de seu gladiador.

Após isso você passa para a distribuição dos pontos de atributos do gladiador, onde você possui 25 pontos para distribuir entre os atributos força, agilidade e inteligência do gladiador. Conforme explicado anteriormente, estes atributos irão influenciar o quão bom seu gladiador é em determinadas ações.

Por último você deve programar seu gladiador usando o editor da página. Para tal você possui a disposição dezenas de funções que permitem o gladiador interagir e perceber o ambiente. Mais sobre a programação dos gladiadores será explicado adiante.

Ao construir um gladiador, os competidores usarão as funções da API gladCode para fazer o gladiador interagir com o ambiente. O ambiente representa uma arena, que possui dimensões 25x25 passos. As funções que lidam com distância usam a unidade Passos (p), que é uma unidade de medida específica da GladCode. Ela é um número float que representa 1/25 do comprimento total da arena, ou seja, isto quer dizer que a arena mede 25p.

Dentro da arena utilizamos um sistema de coordenadas cartesianas, isto quer dizer que um ponto dentro da arena é definido por um par de valores X e Y, onde X significa a distância em relação ao eixo vertical (aumentando da esquerda para a direita) e o Y a distância em relação ao eixo horizontal (aumentando de cima para baixo).

A simulação transcorre em intervalos de tempo de 0.1 segundos.

As funções que lidam com ângulo usam graus (g) como unidade de referência, e tomam por base uma circunferência de 360g que começa no topo e aumenta no sentido horário, conforme a figura ao lado.

Os gladiadores irão batalhar dentro da arena utilizando sua própria programação, de forma autônoma até que somente um saia vivo. Caso uma batalha já esteja acontecendo por 45 segundos, das bordas da arena surgirá um gás tóxico. Esta nuvem mortal lentamente se espalha pela arena em direção ao seu centro, com velocidade 0.1 p/s. Todos gladiadores que estiverem dentro desta nuvem levam dano continuamente. Esta é uma maneira de garantir que a rodada não irá durar para sempre, além de incentivar que os gladiadores se direcionem para o centro da arena após certo tempo, aumentando as chances de um confronto direto.

Cada vez que algum gladiador causar dano a outro, ele ganhará pontos de experiência (xp) relativos a porcentagem do hp total que foi removido do gladiador atacado. Quando o gladiador atacante atingir uma quantidade de xp determinada (veja tabela ao lado), ele avançará de nível, concedendo a ele poder adicional.

O poder adicional recebido será 5 pontos de melhoria em qualquer atributo principal (STR, AGI ou INT), lembrando que ao melhorar os atributos principais, outros atributos secundários também serão melhorados, conforme explicado anteriormente. Além disso, o gladiador que subir de nível instantaneamente recuperará (35 + lvl * 5) hp e ap. Para realizar a melhoria dos atributos, o gladiador precisa chamar as funções de melhoria. Mais detalhes sobre a programação dos galdiadores será discutido adiante.

A tabela ao lado relaciona a quantidade de xp necessária para evoluir cada nível, bem como o xp total que será necessário para chegar no nível. Note que a cada nível, o xp necessário para passar para o próximo nível é acrescido de 20%. Embora a tabela só demonstre os valores até o nível 15, não há limite para o nível dos gladiadores.

NívelXp necessárioXp total
1--
22525
33055
43691
543134
652186
762248
875323
990412
10107520
11129649
12155804
13186990
142231212
152671480

Durante os confrontos, os gladiadores além de se movimentar, e utilizar ataques de curto e longo alcance, podem usar habilidades especiais. Cada habilidade possui um custo em pontos de habilidade (ap) ao ser executada, e causa um efeito específico, descrito na tabela abaixo:

Habilidade Custo (ap) Descrição
Fireball 50 Arremessa um projétil que causa 60% do poder mágico de dano num ponto central de impacto. Todos gladiadores num raio de impacto 2p sofrem 200% do poder mágico de dano de queimadura ao longo de 4s. Alvos mais distantes do centro do impacto sofrem menos dano de queimadura
Teleport 60 O gladiador imediatamente se transporta para outra localização. A distância máxima percorrida é limitada em 5p + 1p por ponto de poder mágico.
Charge 30 Corre em direção ao alvo com velocidade 4x. Ao alcançá-lo, realiza um ataque corpo-a-corpo que causa mais dano de acordo com a distância percorrida (entre 0% e 250% do dano físico), além de reduzir a velocidade de movimento do alvo por 5s. O valor da velocidade será alterado de acordo com a equação Vel=e-0.067 STR
Block 50 Reduz todo dano levado em 10% * (0.1 + STR/(STR+16)) por 7s. Caso o atacante não esteja no raio de visão do gladiador, o efeito da habilidade é reduzido pela metade
Assassinate 30 Realiza um ataque à distância contra o alvo. Ao acertar, caso o alvo não esteja lhe enxergando OU atordoado causa dano de 200% da Precisão. Caso o alvo não esteja lhe enxergando E esteja atordoado a habilidade causa dano 400% da Precisão.
Ambush 70 Torna-se invisível por 1s + (0.1s x AGI). O efeito da habilidade é cancelado ao realizar um ataque ou lançar uma habilidade, e o gladiador não recupera ap enquanto estiver invisível. Ataques realizados enquanto invisível atordoam o alvo por 1.5s

Ao usar suas habilidades, os gladiadores podem causar em si mesmos ou em outros gladiadores uma série de efeitos temporários, descritos a seguir:

Efeito Descrição
Queimadura Durante o tempo de duração do efeito, o gladiador continuamente recebe dano. O dano total da queimadura é dividido igualmente durante este tempo.
Movimentação O gladiador recebe um modificador que altera a velocidade de movimento, aumentando ou reduzindo-a.
Proteção O gladiador recebe proteção extra a danos, reduzindo o efeito de todo tipo de dano direto causado a ele. Caso o gladiador não enxergue a direção do ataque recebido, a eficácia da proteção é reduzida.
Invisibilidade Torna o gladiador invisível. Nenhum outro gladiador consegue detectar quem possuir este efeito. O efeito da invisibilidade acaba prematuramente caso o gladiador realize um ataque ou lance uma habilidade.
Atordoamento O gladiador com este efeito fica impossibilitado de realizar qualquer ação durante o tempo do atordoamento.

Para dar vida aos gladiadores, os competidores devem programar seu comportamento utilizando a sintaxe de uma linguagem de programação, por isso é recomendável que você tenha pelo menos um conhecimento básico de lógica de programação.

Atualmente a gladCode possui suporte para programação utilizando as linguagens Python, C, e Blocos. Mas se você conhece as estruturas básicas de qualquer linguagem imperativa, não vai achar difícil se adaptar.

O ambiente da simulação foi criado especialmente para a gladCode portanto existem funções específicas de entrada, que fazem com que o gladiador perceba o que está acontecendo na arena, e funções de saída que fazem com que o gladiador interaja com os elementos presentes na arena.

Para programar um gladiador, o código-fonte do programa deverá conter a função loop. Utilize o editor de gladiadores para criar o código de seu gladiador

O funcionamento é bem simples. Na função loop será colocado todo o comportamento do gladiador. A cada intervalo de tempo (0.1s) o gladiador irá tentar executar todas as tarefas descritas dentro desta função:

// Exemplo linguagem C
loop(){
    stepForward(); // função que faz mover para frente
}
# Exemplo linguagem Python
def loop():
    stepForward() # função que faz mover para frente
Exemplo em blocosFORWARD

No código acima, a cada intervalo de tempo (0.1s) o gladiador irá mover-se o quanto conseguir (depende de sua agilidade) para frente, resultando em sucessivas chamadas da função stepForward ao longo do tempo.

Porém, existem situações em que o gladiador não consegue executar todos os comando da função loop() em um único intervalo da simulação, como no caso abaixo:

// Exemplo linguagem C
loop(){
    int i;
    for (i=0 ; i<10 ; i++) // faz 10 chamadas da função stepForward
        stepForward();
    turnLeft(5); // função que rotaciona no sentido anti-horário
}
# Exemplo linguagem Python
def loop():
    for i in range(10): # faz 10 chamadas da função stepForward
        stepForward()
    turnLeft(5) # função que rotaciona no sentido anti-horário
Exemplo em blocos10FORWARDLEFT5

Neste caso o gladiador executa o que conseguir (1 chamada da função que move para frente), e a cada novo intervalo de tempo da simulação ele segue executando os próximos passos. Eventualmente, quando ele concluir todas as etapas descritas em sua função loop (as 10 chamadas de stepForward mais a chamada de turnLeft), ele irá começar novamente a função loop. Este processo somente encerrará quando o gladiador morrer, ou quando a simulação terminar.

Note que existem algumas funções que levam mais tempo para serem executadas, como por exemplo as funções de ataque (ex. attackMelee) e habilidade (ex. fireball). Neste caso o gladiador ficará esperando até que possa agir de novo para seguir a execução de seu código. Existem também as funções que não levam tempo algum de simulação para serem executadas, como as funções que detectam o ambiente (ex. getTargetX).

Para uma lista completa das funções existentes, suas finalidades e exemplos de utilização acesse a documentação.

Após criar seu primeiro gladiador você estará apto a participar das batalhas ranqueadas da gladCode. Através das batalhas ranqueadas seus gladiadores ganharão renome, que é a pontuação utilizada para classificação dos gladiadores.

A decisão de quais serão seus oponentes em uma batalha é feita através da posição no ranking que o gladiador ocupa. Para cada batalha, são selecionados os 10 gladiadores cujas posições no ranking geral são mais próximas do gladiador selecionado, e destes 10, 4 são sorteados aleatoriamente para a composição de seus oponentes na batalha.

Após cada batalha ranqueada, de acordo com o desemprenho que seu gladiator ovteve na mesma, ele ganhará uma determinada quantidade de renome. A quantidade de renome que um gladiador ganhará se baseia nos seguintes critérios:

  • Se o gladiador foi o vencedor da batalha
  • Quanto tempo o gladiador sobreviveu dentro da arena
  • O renome que o gladiador possui, comparado à média de renome de todos participantes da batalha
  • O quão próximo de 1000 de renome o gladiador está

A recompensa em renome obtida segue a seguinte fórmula:

rewardBase = ( (Ntime + 1.5 * win) - avgReward ) / bestReward * 10
reward = ( rewardBase / mmr * avgmmr ) * ( 1 + ((0.001 * mmr - 1) * lowmmr) )

Onde:

rewardBase = recompensa obtida, considerando somente o desempenho na batalha.
Ntime = tempo que o gladiador sobreviveu, normalizado (entre 0 e 1).
win = 1 caso o gladiador foi o vencedor, 0 caso contrário.
avgReward = rewardBase médio calculado entre todos gladiadores participantes.
bestReward = rewardBase obtido pelo gladiador vencedor da batalha.
reward = recompensa final obtida pelo gladiador.
mmr = renome que o gladiador possuia antes da batalha.
avgmmr = média de renome de todos gladiadores participantes, antes da batalha.
lowmmr = 0 caso o gladiador possua renome pelo menos 1000, 1 caso contrário.

Além da recompensa de renome, o mestre de um gladiador participante de uma batalha ranqueada ganha também uma quantidade de moedas de prata. Estas moedas servem para comprar itens no apotecário (loja de poções) que podem ser usados durante as batalhas.

A quantidade de prata ganha em uma batalha varia de acordo com o desempenho do gladiador durante a batalha, bem como o renome que aquele gladiador possui. A fórmula do ganho de prata é a seguinte:

silver = ( (190 + 0.21 * mmr) * (5 * win + 1) ) / 10 - 20

Onde:

silver = recompensa de moedas de prata obtida.
mmr = renome que o gladiador possuia antes da batalha.
win = 1 caso o gladiador foi o vencedor, 0 caso contrário.

Caso o mestre já tenha realizado mais de 20 batalhas nas últimas 24 horas, a recompensa de moedas de prata da batalha será de 1/10 da recompensa que normalmente seria recebida.

RenomeVitóriaDerrota
0940
2501254
5001579
75018814
100022020
150028330
200034641
250040951
300047262
350053572

As moedas de prata adquiridas em batalhas ranqueadas podem ser usadas para permitir que os gladiadores utilizem itens consumíveis durante as batalhas.

No menu POÇÕES do perfil fica o apotecário, que é a loja de poções. Sua loja de poções começa com equipamentos básicos, e poderá subir de nível para preparar poções mais poderosas.

Você pode adquirir poções pagando moedas de prata. Uma vez adquiridas, você aluga o serviço do apotecário durante determinado tempo, de acordo com o nível da loja. Durante este tempo você poderá usar cada item adquirido uma vez em cada combate que algum de seus gladiadores participar.

Apotecário
NívelDuraçãoCusto

Ao encomendar os itens do apotecário, você precisa possuir espaços (ou compartimentos) de itens livres no seu perfil. Você possui quatro espaços de itens bloqueados a princípio, e estes compartimentos são automaticamente desbloqueadas conforme seu nível de mestre aumenta, nos níveis 5, 15, 25 e 35. Para cada espaço desbloqueado, você pode possuir um item encomendado. Tais itens ficam visíveis em seus compartimentos durante o tempo em que estão ativos.

Para usar um item durante o combate, seu gladiador precisa usar a função useItem. Como argumento você deve informar uma String com o identificador do item desejado. Cada item encomendado e ativo só poderá ser usado uma vez durante cada batalha.

// Linguagem C
loop(){
    if (getHp() < 100){
        useItem("pot-hp-1");
    }
}
                
# Linguagem Python
def loop():
    if getHp() < 100:
        useItem("pot-hp-1")
                
Exemplo em blocos10FORWARDLEFT5

Lista de itens disponíveis

ItemNívelIdentif.EfeitoCusto