opentibiabr / otservbr-global-archived

Archived, read-only repository. New repository: https://github.com/opentibiabr/otservbr-global
GNU General Public License v2.0
331 stars 333 forks source link

Enforced/Bless Formulas #712

Closed Lycanzito closed 4 years ago

Lycanzito commented 4 years ago

a)Fazer a formula correta para - death%/bless ( Reavaliar as blesses perda de experiência/skills : pvp&pve)

b)Fazer a formula correta para Ganho de exp ao matar alguem (Reavaliar a perda/ganho de experiência: pvp Enforced) / Colocar as condições de level 50 - 50 + no ganho de experiência. Colocar limite de ganho de experiência com base na experiência TOTAL do jogador.

dudantas commented 4 years ago

Please create a clearer issue. I'am can't quite understand what you mean. If possible use images or gifs and give more information, better organize the issue too, it is very confusing.

Lycanzito commented 4 years ago

@dudantas Vou ser mais claro ^^, desculpe a demora.

a) A perda de experiência atualmente ao morrer para monstros ou players está incorreta, a perda com/sem bless estão igualmente erradas. Deveriam seguir essas formulas: https://tibia-death-calculator.herokuapp.com/

b) Em relação a este quesito, é simplesmente isso: Deve-se Ignorar o que conhecemos hoje no config lua como levelrange e usar: Você ganhará experiência se você matar um personagem cujo nível multiplicado por 1.1 e arredondado para o próximo número inteiro é maior que o seu próprio nível, p. Ex. Um nível 40 só obterá experiência se seu oponente for nível 38 ou superior.

quantidade de experiência que você ganhará é limitada:

Para nível 50 e acima disso, a quantidade máxima de experiência que você pode ganhar por morte é limitada a 200% dos pontos de experiência atuais do seu personagem. (por exemplo, se o total de experiência do personagem é 2kk, ele ganhará no máximo 4kk ao matar alguem, mesmo que esse alguem perca mais de 10kk de experiência, por exemplo). Abaixo de 50, a quantidade máxima de experiência que você pode ganhar por morte é limitada a 25% dos pontos de experiência do seu personagem atual. Apenas as suas cinco primeiras mortes do mesmo jogador durante um server save (geralmente o período de tempo entre dois server saves) irá conceder experiência.( em outras palavras, se o player for morto mais do que 5 vezes, a função de ganho de experiencia é excluida para o jogador que já ganhou experiencia anteriormente dele), Além disso, a quantidade de experiência que você ganha é reduzida em 10% com cada morte.

lBaah commented 4 years ago

Não está claro se está perdendo mais ou menos do que deveria. O link que você passou é uma calculadora, não dá formula.

Lycanzito commented 4 years ago

Não está claro se está perdendo mais ou menos do que deveria. O link que você passou é uma calculadora, não dá formula.

Opa meu querido, segue algumas prints de como está se comportando atualmente ( de maneira errada)

image image

image image

fora isso, as blessings estão também se comportando de maneira errada no iventário ao possuir todas as blessings, o set fica brilhoso( só deveria ficar assim, com as adventurers blessings) image

Lycanzito commented 4 years ago

Qualquer dúvida, pode me perguntar =)

lBaah commented 4 years ago

Fica melhor se você colocar um char level 100 e morrer com/sem bless e comparar a perda de EXP com o site que você falou.

Aqui pode ser encontrada a formula: https://tibia.fandom.com/wiki/Death Bem como essa função é usada para fazer esse calculo: https://github.com/opentibiabr/otservbr-global/blob/develop/src/player.cpp#L4085

double Player::getLostPercent() const { int32_t blessingCount = 0; uint8_t maxBlessing = (operatingSystem == CLIENTOS_NEW_WINDOWS) ? 8 : 6; for (int i = 1; i <= maxBlessing; i++) { if (hasBlessing(i)) { blessingCount++; // contamos quantas bless o player tem } }

int32_t deathLosePercent = g_config.getNumber(ConfigManager::DEATH_LOSE_PERCENT); if (deathLosePercent != -1) { // só é aplicado se for alterada a % no config if (isPromoted()) { deathLosePercent -= 3; }

  deathLosePercent -= blessingCount;
  return std::max<int32_t>(0, deathLosePercent) / 100.;

}

double lossPercent; if (level >= 25) { double tmpLevel = level + (levelPercent / 100.); // a formula a seguir calcula o % de perda total antes de aplicar os redutores lossPercent = ((tmpLevel + 50) 50 ((tmpLevel tmpLevel) - (5 tmpLevel) + 8)) / experience; } else { lossPercent = 10; // para level 25-, a perda é de 10% }

double percentReduction = 0; if (isPromoted()) { percentReduction += 30; // se for promotion, a redução aplicada SOBRE lossPercent é de 30% } // soma-se a quantidade de bless multiplicando pela redução de cada bless (8%) percentReduction += blessingCount * 8; return lossPercent-(1 - (percentReduction / 100.)) / 100.; // aplica as reduções e retorna o valor em % }

Usando o site que você falou, calculei o seguinte: Para level 100, com XP total de 15,694,800 (sem bless, sem promotion) a perda deve ser de 713,100 (PVP)

Vamos calcular: lossPercent = ((100 + 50) 50 ((100 100) - (5 100) + 8)) / 15694800 = 4.54% 15694800-4,54% = 14982256 15694800-14982256 = 712544 A perda total de XP sem bless é de 712,544.

Vamos aplicar sobre os 4,54, a redução de promotion, que deve resultar em 30% menos de perda. No site, calculado em 499,170 (PVP) 4,54%-30% = 3,17% 15694800-3,17% = 15197274 15694800-15197274 = 497,526

Lembrando, estou usando apenas 2 casas decimais, devido a isso a diferença no calculo. Se você usar todas casas de precisão, o valor é EXATAMENTE IGUAL ao site que você passou.

Agora vou aplicar a redução das blessings sobre 3,17%. As blessings são aplicadas de uma forma, do meu ponto de vista, estranha. percentReduction += 30 (promotion) percentReduction += 7 * 8; percentReduction = 86

4,54%-(1-(86/100))/100 = 4,53%

Isso significa que a redução da bless não está sendo aplicada corretamente. A fórmula que está retornando (lossPercent-(1 - (percentReduction / 100.)) / 100.;) retorna a XP e não a porcentagem.

Nesse caso, ((level+50)*50(level*level-5*level+8)/experience)*(promotionReduction/100)*(blessReduction/100) seria a fórmula aproximada, considerando a informação do Fandom e o site que você passou (não usei as casas decimais para precisão) para retornar a porcentagem que deveria ser retirada da XP/skill total.

Ou seja, a função deveria se parecer com o seguinte:

double Player::getLostPercent() const { int32_t blessingCount = 0; uint8_t maxBlessing = (operatingSystem == CLIENTOS_NEW_WINDOWS) ? 8 : 6; for (int i = 1; i <= maxBlessing; i++) { if (hasBlessing(i)) { blessingCount++; // contamos quantas bless o player tem } }

int32_t deathLosePercent = g_config.getNumber(ConfigManager::DEATH_LOSE_PERCENT); if (deathLosePercent != -1) { // só é aplicado se for alterada a % no config if (isPromoted()) { deathLosePercent -= 3; }

  deathLosePercent -= blessingCount;
  return std::max<int32_t>(0, deathLosePercent) / 100.;

}

double blessReduction = 0; if (blessCount > 0){ blessReduction = blessingCount*8; }

double promotionReduction = 0; if (isPromoted()) { promotionReduction = 30; }

double lossPercent; if (level >= 25) { // a formula a seguir calcula o % de perda total lossPercent = ((level+50)50(levellevel-5level+8)/experience)(promotionReduction/100)*(blessReduction/100); } else { lossPercent = 10; // para level 25-, a perda é de 10% }

return lossPercent; }

Eu calculei isso usando uma calculadora de bolso.

Lycanzito commented 4 years ago

Fica melhor se você colocar um char level 100 e morrer com/sem bless e comparar a perda de EXP com o site que você falou.

Aqui pode ser encontrada a formula: https://tibia.fandom.com/wiki/Death Bem como essa função é usada para fazer esse calculo: https://github.com/opentibiabr/otservbr-global/blob/develop/src/player.cpp#L4085

double Player::getLostPercent() const { int32_t blessingCount = 0; uint8_t maxBlessing = (operatingSystem == CLIENTOS_NEW_WINDOWS) ? 8 : 6; for (int i = 1; i <= maxBlessing; i++) { if (hasBlessing(i)) { blessingCount++; // contamos quantas bless o player tem } } int32_t deathLosePercent = g_config.getNumber(ConfigManager::DEATH_LOSE_PERCENT); if (deathLosePercent != -1) { // só é aplicado se for alterada a % no config if (isPromoted()) { deathLosePercent -= 3; }

  deathLosePercent -= blessingCount;
  return std::max<int32_t>(0, deathLosePercent) / 100.;

} double lossPercent; if (level >= 25) { double tmpLevel = level + (levelPercent / 100.); // a formula a seguir calcula o % de perda total antes de aplicar os redutores lossPercent = ((tmpLevel + 50) 50 ((tmpLevel tmpLevel) - (5 tmpLevel) + 8)) / experience; } else { lossPercent = 10; // para level 25-, a perda é de 10% } double percentReduction = 0; if (isPromoted()) { percentReduction += 30; // se for promotion, a redução aplicada SOBRE lossPercent é de 30% } // soma-se a quantidade de bless multiplicando pela redução de cada bless (8%) percentReduction += blessingCount * 8; return lossPercent-(1 - (percentReduction / 100.)) / 100.; // aplica as reduções e retorna o valor em % }

Usando o site que você falou, calculei o seguinte: Para level 100, com XP total de 15,694,800 (sem bless, sem promotion) a perda deve ser de 713,100 (PVP)

Vamos calcular: lossPercent = ((100 + 50) 50 ((100 100) - (5 100) + 8)) / 15694800 = 4.54% 15694800-4,54% = 14982256 15694800-14982256 = 712544 A perda total de XP sem bless é de 712,544.

Vamos aplicar sobre os 4,54, a redução de promotion, que deve resultar em 30% menos de perda. No site, calculado em 499,170 (PVP) 4,54%-30% = 3,17% 15694800-3,17% = 15197274 15694800-15197274 = 497,526

Lembrando, estou usando apenas 2 casas decimais, devido a isso a diferença no calculo. Se você usar todas casas de precisão, o valor é EXATAMENTE IGUAL ao site que você passou.

Agora vou aplicar a redução das blessings sobre 3,17%. As blessings são aplicadas de uma forma, do meu ponto de vista, estranha. percentReduction += 30 (promotion) percentReduction += 7 * 8; percentReduction = 86

4,54%-(1-(86/100))/100 = 4,53%

Isso significa que a redução da bless não está sendo aplicada corretamente. A fórmula que está retornando (lossPercent-(1 - (percentReduction / 100.)) / 100.;) retorna a XP e não a porcentagem.

Nesse caso, ((level+50)*50(level*level-5*level+8)/experience)*(promotionReduction/100)*(blessReduction/100) seria a fórmula aproximada, considerando a informação do Fandom e o site que você passou (não usei as casas decimais para precisão) para retornar a porcentagem que deveria ser retirada da XP/skill total.

Ou seja, a função deveria se parecer com o seguinte:

double Player::getLostPercent() const { int32_t blessingCount = 0; uint8_t maxBlessing = (operatingSystem == CLIENTOS_NEW_WINDOWS) ? 8 : 6; for (int i = 1; i <= maxBlessing; i++) { if (hasBlessing(i)) { blessingCount++; // contamos quantas bless o player tem } } int32_t deathLosePercent = g_config.getNumber(ConfigManager::DEATH_LOSE_PERCENT); if (deathLosePercent != -1) { // só é aplicado se for alterada a % no config if (isPromoted()) { deathLosePercent -= 3; }

  deathLosePercent -= blessingCount;
  return std::max<int32_t>(0, deathLosePercent) / 100.;

} double blessReduction = 0; if (blessCount > 0){ blessReduction = blessingCount8; } double promotionReduction = 0; if (isPromoted()) { promotionReduction = 30; } double lossPercent; if (level >= 25) { // a formula a seguir calcula o % de perda total lossPercent = ((level+50)_50(level_level-5level+8)/experience)(promotionReduction/100)(blessReduction/100); } else { lossPercent = 10; // para level 25-, a perda é de 10% } return lossPercent; }

Eu calculei isso usando uma calculadora de bolso.

holy shit :O bem.. o importante é que seja mostrado que as formulas estão erradas.. ^.^ para que seja configurado como um bug.. Ainda está como "unconfirmed". Dai alguém poderá trabalhar em cima =)