Réduction des dégâts PVP

Ce forum est destiné à recueillir les éventuels bugs rencontrés sur le jeu...
Avatar de l’utilisateur
Marlyza
Dieu du forum
Messages : 2535
Inscription : 15 déc. 2017 09:48

Re: Réduction des dégâts PVP

Message par Marlyza » 20 avr. 2021 10:51

Moi il y a plusieurs trucs qui me paraissent bizarres, dont:
:arrow: On commence à faire la réduction des dégâts avec le compteur stocké sur le perso, mais je pense que ce compteur n'est pas mise à jour si le perso active sa DLT et régénère ou s'il est soigné.
:arrow: La manière dont on borne à 4, est plus que douteuse (on calcul un compteur différentiel pour l'ajouter à la valeur actuelle, pourquoi ne pas calculer le compteur final ???)

Bref, c'est trop obscure/scabreux et c'est un sujet sensible, j'ai vraiment pas envie d'y toucher.
~~ Le monde est partagé en 10 catégories de personnes, ceux qui comprennent le binaire et les autres. ~~
Avatar de l’utilisateur
Phenix
Dieu du forum
Messages : 2475
Inscription : 14 nov. 2017 19:06
Contact :

Re: Réduction des dégâts PVP

Message par Phenix » 20 avr. 2021 13:17

Bon eh bien si vous avez dans vos contacts les gens qui avaient bossé sur le PvP, c'est le moment de les invoquer ^^
à priori azaghal, Merrick... d'autres ?

je peux tenter un message à Merrick, mais pas sûr qu'il soit motivé à venir codé sur un problème touffu comme ça, mais bon comme on a dégrossit, ça va peut-être l'encourager à au moins nous donner un avis sur la direction à prendre à ce sujet, d'un point de vue technique.
Avatar de l’utilisateur
Cook
Pilier
Messages : 977
Inscription : 10 juin 2004 13:27

Re: Réduction des dégâts PVP

Message par Cook » 22 avr. 2021 15:14

Marlyza a écrit :
20 avr. 2021 10:51
Moi il y a plusieurs trucs qui me paraissent bizarres, dont:
:arrow: On commence à faire la réduction des dégâts avec le compteur stocké sur le perso, mais je pense que ce compteur n'est pas mise à jour si le perso active sa DLT et régénère ou s'il est soigné.
:arrow: La manière dont on borne à 4, est plus que douteuse (on calcul un compteur différentiel pour l'ajouter à la valeur actuelle, pourquoi ne pas calculer le compteur final ???)

Bref, c'est trop obscure/scabreux et c'est un sujet sensible, j'ai vraiment pas envie d'y toucher.
Y a plein de trucs "bizarres" dans le pvp post réforme :p
Et pas possible de savoir si ce sont des choses voulues par la team ou des effets de bords indésirables :roll:


Mais le temps et les soins sont sensés diminuer le compteur pvp:
16) qu'est ce qui fait modifier le compteur pvp à la hausse
La bonne réponse était : Subir des attaques ou sorts offensifs avec dégâts direct lancés par un aventurier engendrant une perte de point de vie sous un seuil

17) qu'est ce qui fait modifier le compteur pvp à la baisse
La bonne réponse était : Activer sa DLT ou un temps supérieur à une dla de la cible depuis la dernière action de la cible
Des soins suffisant pour changer le domaine de blessure (délimités par les seuils)
Eclate tout sur son passage
Avatar de l’utilisateur
Marlyza
Dieu du forum
Messages : 2535
Inscription : 15 déc. 2017 09:48

Re: Réduction des dégâts PVP

Message par Marlyza » 22 avr. 2021 15:42

Ouai, tu as raison, il y a bien une baisse du compteur ailleurs du calcul des dégâts.

Code : Tout sélectionner

    /* compteurs pvp */
    select into v_compt_pvp
      perso_compt_pvp
    from perso
    where perso_cod = personnage
          and perso_dmodif_compt_pvp + (to_char(temps_tour,'99999999') || ' minutes')::interval < now();
    if found then
      if v_compt_pvp > 0 then
        update perso
        set perso_compt_pvp = perso_compt_pvp - 1,
          perso_dmodif_compt_pvp = now()
        where perso_cod = personnage;
      end if;
    end if;
:arrow: Baisse de 1 du compteur par activation de DLT

Code : Tout sélectionner

                /* pour les combats pvp difficulté de fuite */
                select into v_compt_pvp perso_compt_pvp from perso
                where perso_cod = num_perso;
                v_malus_pvp := v_compt_pvp * 15;
                v_competence_modifie := v_competence_init - malus_nb_persos - nb_lock_malus - v_malus_pvp;
:arrow: 15 de difficulté de fuite supplémentaire par point du compteur

Code : Tout sélectionner

CREATE FUNCTION public.soin_compteur_pvp(integer) RETURNS void
    LANGUAGE plpgsql
    AS $_$/*********************************************/
/* soin_compteur_pvp                         */
/*  $1 = perso sur lequel on fait les soins  */
/* Retour : void  			                     */
/*********************************************/
/* créé le 08/11/2009 par Blade              */
/*********************************************/
declare
	personnage alias for $1;
	v_compt_pvp integer;
  v_compt_pvp1 integer;    -- ajout azaghal pour garde fou
	v_pv integer;
	v_pv_max numeric;
	v_niveau integer;
		
begin
/*La fonction permet après des soins de recalculer le compteur pvp. A inclure dans toute fonction de soin */
	select into v_compt_pvp,v_pv,v_pv_max
		perso_compt_pvp,perso_pv,perso_pv_max
		from perso
		where perso_cod = personnage;
	if ((v_pv/v_pv_max) < 0.20) then
		v_niveau := 4;
	elsif ((v_pv/v_pv_max) < 0.33) then
		v_niveau := 3;
	elsif ((v_pv/v_pv_max) < 0.66) then
		v_niveau := 2;
	elsif  ((v_pv/v_pv_max) < 0.80) then
		v_niveau := 1;
	elsif  ((v_pv/v_pv_max) >= 0.80) then
		v_niveau := 0;
	end if;
	if v_compt_pvp < v_niveau then
		v_niveau = v_compt_pvp;
	end if;
	update perso
		set perso_compt_pvp = v_niveau
		where perso_cod = personnage;
end;$_$;

:arrow: Recalcul du compteur après des soins


Code : Tout sélectionner

CREATE FUNCTION public.trg_update_perso() RETURNS trigger
    LANGUAGE plpgsql
    AS $$/******************************/
/* Trigger pour mettre à jour */
/* la table de persos après   */
/* modifications              */
/******************************/
declare
  blessures_old integer;
  blessures_new integer;
  temp numeric;
begin
  -- En cas de soins, régénération, etc...
  if (NEW.perso_pv > OLD.perso_pv and OLD.perso_pv > 0) then
    temp := OLD.perso_pv / OLD.perso_pv_max;
    blessures_old := floor(4 - 4*temp) + cast(temp < 0.15 as integer); -- On convertit le ratio en seuil de blessure
    temp := NEW.perso_pv / NEW.perso_pv_max;
    blessures_new := floor(4 - 4*temp) + cast(temp < 0.15 as integer);
  -- On regarde si on a gagné des seuils.
    if (blessures_old > blessures_new) then
      NEW.perso_compt_pvp := max(0 , OLD.perso_compt_pvp + blessures_new - blessures_old);
    end if;
  end if;

  return NEW;
end;$$;
:arrow: Recalcul du compteur sur modification des PV du perso.


:arrow: Le compteur est aussi mis à jour en fonction des soins donnés par une dizaine de sorts runiques/divins
(je ne donne pas lesquels pour ne pas spoiler ceux qui ne les connaissent pas tous, mais ça inclus les sort de regains de PV par drain)

Donc ça enlève une grosse part d'ombre, malgré tout la mécanique est suffisamment compliquée, j'ai pas trop envie de toucher quoi que ce soit, les changements pourraient avoir un gros impact.
~~ Le monde est partagé en 10 catégories de personnes, ceux qui comprennent le binaire et les autres. ~~
Répondre