Réduction des dégâts PVP

Ce forum est destiné à recueillir les éventuels bugs rencontrés sur le jeu...
Répondre
Avatar de l’utilisateur
Cook
Pilier
Messages : 977
Inscription : 10 juin 2004 13:27

Réduction des dégâts PVP

Message par Cook » 10 déc. 2020 11:28

Il semblerait qu'il y ait un bug sur la réduction des dégâts :
Dès qu'on passe le premier seuil, on a droit à la réduction de dégâts maximale...

viewtopic.php?p=280883#p280883

Au passage... ca ne vous dirait pas de lisser tout ça?

Dégâts infligés/2 du début à la fin?
Devoir infliger 200% de la vie de lacible c'est bien suffisant comme réduction, non?
Eclate tout sur son passage
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 » 13 déc. 2020 01:48

Quelque chose a été changé? Autre cible et pas de soucis...
Eclate tout sur son passage
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 » 16 déc. 2020 13:27

Autre cible :
Pas de réduction sur les PL mais bien sur les frappes...

=> y a quelque chose qui déconne...
Eclate tout sur son passage
Avatar de l’utilisateur
pnarcade
Ami des souterrains de Delain
Messages : 2963
Inscription : 25 avr. 2012 14:28
Localisation : Dresden

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

Message par pnarcade » 19 déc. 2020 09:47

Peux pas dire j'ai pas trouvé de cibles depuis des mois :-(

PKs, PKes, on vous exploite on vous spolie!!

Si qqun connait un dev qui aurait le temps de s'occuper de notre jeu préféré, ce serait le moment ! ^^
Thenshirock vous couche tous avec sa grosse arbalète.

-Qu'est ce que je vous sers?
-Causette!
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 » 19 déc. 2020 11:22

Il n'y a pas eu de modification niveau PvP depuis un sacré bout de temps normalement. (je n'ai pas vu passer de modifs)

Il y a peut-être un paramètre que tu as oublié dans tes calculs ?
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 » 19 déc. 2020 17:25

Aucun...

Quand sur des PLs ca me met que les dégâts liés à l'initiative pour chaque projectile sont égaux aux dégâts du jet initial, y a pas de réduction...
Alors que les frappes avant et après ce PL étaient réduites...

Quand les dégâts après armure, sont réduits à moins du tiers, on est au dernier seuil... or avec une cible au stade touché seulement, et qui peut soutenir cette frappe sans réduction sans passer blessé, c'est juste impossible d'arriver à ce résultat sans que quelque chose déconne...

Je ne dis pas qu'il y a eu modif des paramètres du pvp mais que les params du pvp plantent suite à l'utilisation de certains sorts... (lié à l'une ou l'autre migration ou autre modif?)

Le combat où j'ai pas eu de pb (a priori) était purement physique (que des frappes, pas de sorts offensifs)

Je ne saurais pas dire si le problème est récent ou non...
Je fais pas le calcul à chaque combat...

Mais pour le premier, c'était bien trop flagrant pour être ignoré...
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 » 19 déc. 2020 21:14

pnarcade a écrit :
19 déc. 2020 09:47
Si qqun connait un dev qui aurait le temps de s'occuper de notre jeu préféré, ce serait le moment ! ^^
C'est vrai que j'ai un peu lâché l'affaire cette année.
Mais avec les confinements et le télétravail, j'ai jamais eu autant de boulot :cherche: .
J''avoue quand même qu'après le boulot je me suis bouffé pas mal de série :mrgreen: :mrgreen: !
ça va peut-être finir un jour cette histoire, j'espère !
~~ Le monde est partagé en 10 catégories de personnes, ceux qui comprennent le binaire et les autres. ~~
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 » 24 déc. 2020 12:09

N'oubliez pas qu'il y a des cas particuliers:
:arrow: En arène le comportement est différent
:arrow: Les attaquants/cibles sous Malédiction/Bénédiction d'ECATIS.

J'ai trouvé un truc étrange aussi:
Le niveau de PVP est calculé après l'attaque et sert pour l'attaque suivante, si la victime a été soignée entre les 2 attaques, c'est quand même le niveau de PVP calculé après la première attaque et donc avant les soins qui est pris en compte.
:arrow: ça peut grandement fausser les résultats visibles.

Ce qui est sûr c'est que j'ai pas trop envie d'y mettre les doigts (sauf éventuellement comme le dit Cook, pour faire reforme en vue de simplification).
~~ Le monde est partagé en 10 catégories de personnes, ceux qui comprennent le binaire et les autres. ~~
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 » 24 déc. 2020 20:35

- Les combats ne sont pas déroulés en arène
- pas de béné ou malédiction d'écatis sur moi et mes cibles n'avaient aucun rang de prêtrise d'écatis + que des interactions récentes avec des monstres
- pas de soins sur les cibles (aucune action de leur part pendant les combats et les constats)
- si le niveau de pvp est calculé sur la dernière attaque et non l'état de santé actuel, y a un souci de cohérence avec les seuils et les explications données par Azaghal
cf : viewtopic.php?p=213931&sid=8908e16180a7 ... ab#p213931

Pnarcade avait calculé, dans le même topic, le % de PVs à infliger au total pour down une cible avec le calcul actuel tel qu'il devrait marcher : 208% des PVs max (mais vu qu'il y a des arrondis inférieurs, ça doit être légèrement plus)

si on réforme en faisant "dégâts pvp" = "dégâts infligés *0,5" (arrondi inférieur), ca simplifiera bien les choses et permettra d'évacuer tous les bugs cachés derrière les formules actuelles...

Lancer Malédiction d'écatis permettrait de faire "dégâts pvp" = "dégâts infligés *0,6" (arrondi inférieur)

Eventuellement implémenter un autre sort divin de même niveau (de Falis par exemple, vu que c'est la soeur jumelle d'Ecatis) qui permettrait de ne subir que "dégâts pvp" = "dégâts infligés *0,4" (arrondi inférieur)
Eclate tout sur son passage
Avatar de l’utilisateur
pnarcade
Ami des souterrains de Delain
Messages : 2963
Inscription : 25 avr. 2012 14:28
Localisation : Dresden

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

Message par pnarcade » 19 janv. 2021 18:41

Hello,

Ivy a constaté le même bug.
Le perso 5407439 attaque le 19.01.2021 à 18h30 55s le perso . Degats théorique 27, après réduction des degats: 7. Idem à 18h30 51
À 18h30 35: 15 points de dégats théoriques, reduits à 4 avec les seuils PvP, il est maintenant touché.
A priori par contre boule de magma (quand il est indemne) a bien fonctionné.
Capture d'ecran avec dates à dispo pour étudier le PB mais Cook a bel et bien raison les seuils PvP sont bugués. :cherche:
Thenshirock vous couche tous avec sa grosse arbalète.

-Qu'est ce que je vous sers?
-Causette!
Avatar de l’utilisateur
Fullkro
Gros bill du forum
Messages : 1244
Inscription : 17 févr. 2004 21:09
Localisation : en plein jardin, à planter du RADIS

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

Message par Fullkro » 21 janv. 2021 17:39

Y a pas que les seuils qui soient bugué dans le pvp :D
Oui, oui, pn, t'as réussi à me faire revenir sur le fofo :mrgreen:
---
Pour aider delain, clique sur cette bannière.
Image
Kal Skirata
Newbie
Messages : 8
Inscription : 10 mars 2021 20:17

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

Message par Kal Skirata » 18 avr. 2021 11:01

Je suis en train de combattre un veilleur en zone pvp de la taupinière...

Hier vers 19h il s'est pris deux boules de magma, il a joué ce matin et était au stade touché avant mes frappes de la matinée...

Toutes mes frappes ont "bénéficié" de la réduction max alors que vu le délai écoulé depuis les BdMs, le fait d'avoir rejoué et le stade de blessure, j'aurais dû avoir droit à la première réduction, voire pas de réduction...


Ordo Skirata (perso n°5493969) est mon fam qui a laché les frappes... hors spécial, les dégâts après armure sont de 5 à 8 => toutes mes frappes sont passées à 2...


Possible de faire quelque chose?

Deg/2 pour tout le pvp serait beaucoup plus vivable que ce système obscur et buggué...
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 » 19 avr. 2021 14:02

Je ne saurais pas le corriger moi-même mais on a peut-être un 2e DBA qui pourrait donner un coup de main à Marlyza.
Faudrait faire un "audit" du code pour se rendre compte du boulot à faire, peut-être que ça peut être grandement simplifié effectivement


Pour vous avancer un peu, voici les 1ers éléments que j'ai trouvé

Dans fonctions_sql/deb_tour_degats.sql

Code : Tout sélectionner

valeur_pvp integer;           -- Valeur numérique des PV ingligés, corrigés de l’atténuation PVP

Code : Tout sélectionner

-- Effet: Perte ou gain de PVs
(...)
elsif ligne.perso_cod != v_source then	-- Perte de PVs (dégâts)
			valeur_pvp := effectue_degats_perso(ligne.perso_cod, valeur, v_source);
			code_retour := code_retour || '<br />' || v_nom_efaseur || ' inflige ' || valeur_pvp::text || ' dégâts à ' || ligne.perso_nom;
			if v_bloque_magie = 1 then
				code_retour := code_retour || ' (résisté)';
			end if;

Code : Tout sélectionner

-- On gère les dégâts
			if ligne.perso_pv <= valeur_pvp then
				-- on a tué l’adversaire !!
https://github.com/Merrick28/delain/blo ... general.sh >>
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 » 19 avr. 2021 14:15

En réalité _sql/deb_tour_degats.sql
:arrow: C'est le code exécuté lorsqu'il y a un EA dégâts/soins

La reduction des dégats PvP, c'est le code ci-dessous, ça date de 2007

Code : Tout sélectionner

--
-- Name: effectue_degats(integer, integer, integer); Type: FUNCTION; Schema: public; Owner: delain
--

CREATE FUNCTION public.effectue_degats(integer, integer, integer) RETURNS integer
    LANGUAGE plpgsql
    AS $_$/*********************************************/
/* effectue_degats                           */
/*  $1 = perso sur lequel on fait les dégats */
/*  $2 = degats de base                      */
/*  $3 = type de perso effectuant les degs   */
/* Retour : dégats rééls                     */
/*********************************************/
/* créé le 30/05/2007 par Merrick            */
/*********************************************/
declare
	code_retour integer;
	personnage alias for $1;
	v_degats alias for $2;
	v_type_att alias for $3;
	--
	v_type_perso integer;
	v_compt_pvp integer;
        v_compt_pvp1 integer;    -- ajout azaghal pour garde fou
	v_pv numeric;
	v_pv_max numeric;
	v_test text;
	v_anc_niveau integer;
	v_nv_niveau integer;
	v_correction_1 numeric;
	v_correction_2 numeric;
	v_correction_3 numeric;
	v_ratio numeric;
	v_marge_pv integer;
	v_degats_restants integer;
        nb_sort_tour integer;


begin
	v_correction_1 := 0.7;
	v_correction_2 := 0.45;
	v_correction_3 := 0.25;

        -- ajout azaghal, en cas de sorts de malédiction d'écatis, les seuils sont moins puissants
	if valeur_bonus(personnage, 'MEC') <> 0 then
	 v_correction_1 := 0.8;
	 v_correction_2 := 0.55;
	 v_correction_3 := 0.35;
       end if;

	v_degats_restants := v_degats;
	--
	-- test sur le perso cible et attaquant
	--
	select into v_type_perso , v_compt_pvp , v_pv , v_pv_max
		perso_type_perso , perso_compt_pvp , perso_pv , perso_pv_max
		from perso
		where perso_cod = personnage;
	if v_type_perso = 2 then
		return v_degats;
	end if;
	if v_type_att = 2 then
		return v_degats;
	end if;
        -- test arène : pas de réforme si on est dans une arène
        if est_dans_arene(personnage) then
                return v_degats;
        end if;
	--
	-- a priori, on peut commencer à y aller maintenant
	--
	code_retour := 0;

	while (v_degats_restants > 0) loop
		if v_compt_pvp = 1 then
			v_degats_restants := ceil(v_degats_restants*v_correction_1);
		elsif v_compt_pvp = 2 then
			v_degats_restants := ceil(v_degats_restants*v_correction_2);
		elsif v_compt_pvp >= 3 then
			v_degats_restants := ceil(v_degats_restants*v_correction_3);
		end if;
		-- Marge restante avant de changer de seuil de blessures
		v_ratio := (v_pv - code_retour - 1) / cast(v_pv_max as numeric);
		-- Pour des seuils à 0.8, 0.66, 0.33, 0.2 * pv_max
		v_marge_pv := 1 + floor(v_pv_max * (v_ratio - floor(3*v_ratio) / cast(3 as numeric) 
			- 0.20 * cast(v_ratio < 0.33 and v_ratio > 0.20 as integer)
			- 0.13 * cast(v_ratio > 0.80 as integer)));

		if (v_degats_restants < v_marge_pv) then
			code_retour := code_retour + v_degats_restants;
			v_degats_restants := 0; -- On quitte la boucle
		else
			v_degats_restants := v_degats_restants - v_marge_pv;
			code_retour := code_retour + v_marge_pv;
			-- On restaure les degats restants, pour le prochain passage dans la boucle
			if (v_compt_pvp = 1) then
				v_degats_restants := floor(v_degats_restants / v_correction_1);
			elsif (v_compt_pvp = 2) then
				v_degats_restants := floor(v_degats_restants / v_correction_2);
			elsif (v_compt_pvp >= 3) then
				v_degats_restants := floor(v_degats_restants / v_correction_3);
			end if;
			v_compt_pvp := v_compt_pvp + 1;
			if (code_retour >= v_pv) then -- La cible est décédée. On arrête le massacre
				v_degats_restants := 0;
			end if;
		end if;
	end loop;




	--
	-- on est bien d'accord les dégats vont être effectués par un joueur, il faut donc mettre les compteurs à jour
	-- même si c'est pas encore vrai :)
	--
	if ((v_pv/v_pv_max) < 0.20) then
		v_anc_niveau := 4;
	elsif ((v_pv/v_pv_max) < 0.33) then
		v_anc_niveau := 3;
	elsif ((v_pv/v_pv_max) < 0.66) then
		v_anc_niveau := 2;
	elsif  ((v_pv/v_pv_max) < 0.80) then
		v_anc_niveau := 1;
	elsif  ((v_pv/v_pv_max) >= 0.80) then
		v_anc_niveau := 0;
	end if;
	-- nouveau niveau
	v_pv := v_pv - code_retour;
	if ((v_pv/v_pv_max) < 0.20) then
		v_nv_niveau := 4;
	elsif ((v_pv/v_pv_max) < 0.33) then
		v_nv_niveau := 3;
	elsif ((v_pv/v_pv_max) < 0.66) then
		v_nv_niveau := 2;
	elsif  ((v_pv/v_pv_max) < 0.80) then
		v_nv_niveau := 1;
	elsif  ((v_pv/v_pv_max) >= 0.80) then
		v_nv_niveau := 0;
	end if;
	v_compt_pvp := v_nv_niveau - v_anc_niveau;

        -- garde fou compteur pvp bloqué à 4 max ajout azaghal
	select into v_compt_pvp1 
		perso_compt_pvp 
		from perso
		where perso_cod = personnage;
        v_compt_pvp1 := v_compt_pvp1 + v_compt_pvp;
        if v_compt_pvp1 > 4 then
        v_compt_pvp := 4 - v_compt_pvp1;
        end if;
        -- evidemment on ne permet pas d'ajout negatif
        if v_compt_pvp < 0 then
        v_compt_pvp = 0;
        end if;

	update perso
		set perso_compt_pvp = perso_compt_pvp + v_compt_pvp
		where perso_cod = personnage;
	return code_retour;
end;$_$;
~~ Le monde est partagé en 10 catégories de personnes, ceux qui comprennent le binaire et les autres. ~~
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 » 19 avr. 2021 19:13

Du coup, le malus de pvs de la brûlure de BdM peut-elle faire planter la fonction "v_compt_pvp" ?
15) Quel est le malus en % de fuite pour chaque point du compteur pvp
(attention il a été modifié il y a peu)
La bonne réponse était 15%*compteur pvp !(avec respect de la limite de 10% mini).
Donc une cible peut avoir au maximum 45% de malus de fuite et cela sera très souvent 30% !!
cette phrase ne colle pas vraiment avec le calcul du compteur pvp... vu qu'il semble pouvoir aller jusqu'à 4 :cherche:


Sans tout réformer (pour les seuils et réductions), ce serait pas possible de sortir "v_compt_pvp" de la boucle "while (v_degats_restants > 0) loop" en définissant les seuils à partir desquels les réductions s'appliquent et garder les réductions actuelles :

Seuil 1 = 0.80 *v_pv_max
Seuil 2 = 0.66 *v_pv_max
Seuil 3 = 0.33 *v_pv_max
arrondis inf

Et faire :
Entre v_pv_max et seuil 1 : deg infligés * 1
Entre seuil 1 et seuil 2 : deg infligés * v_correction_1
Entre seuil 2 et seuil 3 : deg infligés * v_correction_2
Au-delà de seuil 3 : deg infligés * v_correction_3

avec une vérif sur le passage des seuils comme cela semble être fait pour une application progressive des dégâts

Et virer les formules de :
v_anc_niveau
v_nv_niveau

et définir pour la fuite : v_compt_pvp = 1 + 1 (si v_pv<seuil 2) + 1 (si v_pv<seuil 3)
Eclate tout sur son passage
Répondre