Sujet n°2119
Posté par Krosk le 8 Nov - 11:10 (2008)
Titre : Capacités évolutives by Krosk
[Script] Capacités évolutives
by Krosk
 

./2110.html

empire1601 s'est essayé à permettre aux capacités d'évoluer en puissance. Voici une solution alternative.

Morceau de code à copier dans Pokemon_Custom, tout à la fin, après les derniers end.


La formule d'augmentation de la puissance d'un skill est la suivante : puissance de base + PAS_PUIS * (nombre_d'utilisation / PAS_UTIL).

En gros, tous les PAS_UTIL utilisations, votre capacité augmente de PAS_PUIS en puissance.

Code:


module POKEMON_S
  # Capacités évolutives
  class Skill
    PAS_UTIL = 20
    PAS_PUIS = 10
    
    alias initialize_temp initialize
    def initialize(id)
      initialize_temp(id)
      @use_number = 0
    end
    
    def power
      @use_number = 0 if @use_number == nil # Protection indéfinition
      return Skill_Info.base_damage(id) + PAS_PUIS * (@use_number / PAS_UTIL)
    end
    
    alias use_temp use
    def use
      use_temp
      @use_number = 0 if @use_number == nil # Protection indéfinition
      @use_number += 1 if @usable
    end
  end
end


Posté par Dark' le 8 Nov - 12:38 (2008)
Je le prends, celui là !

Si j'ai bien compris :

L'attaque aura cette puissance :
Code:

Puissance normal + X fois le nombre d'utilisation divisé par Y


Avec X et Y des nombres réglables...

Mettons qu'une attaque ai 100 de puissance, je l'utilise 10 fois, ça donne ça ?

Code:
100+10*10/20 = 100+100/20 = 100+5 = 105


C'est bien ça ? Dans ce cas, pourquoi avoir mis 20 et 10 plutôt que 2 et 1 ?

Posté par Empire1601 le 8 Nov - 13:00 (2008)
Merci de t'être penché sur ce script  Petit saligaud mal élevé
Comme ça, ils auront quelque chose qui marche Clin d'œil foireux

Posté par Krosk le 8 Nov - 13:02 (2008)
mettre 2 et 1 est différent de mettre 20 et 10, car la division effectuée est euclidienne (après édit du script, car j'avais oublié les parenthèses!).

Grimper de 10 de puissance toutes les 20 utilisations, ce n'est pas pareil que grimper de 1 de puissance toutes les 2 utilisaitons. L'une est une évolution par palliers et l'autre est une évolution graduelle.

Posté par Dark' le 8 Nov - 13:30 (2008)
D'accord, merci Krosk !

Donc, si je reprends avec mes mots, on a ça :

Code:
Puissance normal + X fois (le nombre d'utilisation divisé par Y)


Avec X et Y des nombres réglables.

Mettons qu'une attaque ai 100 de puissance, je l'utilise 10 fois, ça donne ça ?

Code:
100+10*(10/20) = 100 + 10*0.2 = 105


Et avec 1 et 2 :

Code:
100+1*(10/2) = 100 + 1*5 = 105


C'est pareil, non ?

Et je pense que ça reste ainsi quelques soit le nombre d'utilisation et la puissance...

Après test sur Excel, c'est bien le cas.

A moins que...

Quand tu dis Euclidienne, tu veux dire que dans mon exemple du haut :

100+10*(10/20) = 100 + 10*0.2 = 100

Car 0.2 est enregistré par le script comme 0 ?

Dans ce cas, je comprends mieux


PS : Désolé si je pose tant de questions qui paraisse évidentes, mais j'ai toujours eu un esprit embrouillé, et si je ne suis pas certain, je m'y perds tellement que ça me gène atrocement !

Posté par Krosk le 8 Nov - 13:38 (2008)
Le symbole / en ruby est la division, mais quand la division se fait entre 2 entiers, elle devient euclidienne (et donc donne un entier). La division est exacte quand au moin l'un des 2 nombres est un flottant (à virgules).
10 / 20 = 0
Mais 10.0 / 20 = 0.2
et 10 / 20.0 = 0.2


autre exemple, 55 / 10 = 5

Posté par Dark' le 8 Nov - 14:30 (2008)
Merci beaucoup ! J'avais déjà lu quelques choses sur ça quelque part, mais je n'y avais pas prêté grande attention !

Posté par Angi-MK le 8 Nov - 16:33 (2008)
Hey merci Krosk de t'être intéressé à ma suggestion mais dis moi, je remet les script POKEMON et POKEMON_Battle_core 2 comme ils étaient à l'origine ?
Parce que sinon le bug persiste et moi tout seul je ne comprend pas le probleme... Lordork chez mémé

EDIT:Ouais ça marche avec les scripts d'origines ! Merci à tout ceux qui ce sont penché sur mon idée :D !

Posté par Droledami le 8 Nov - 22:02 (2008)
C'est vraiment une bonne idée Bouche extensiblek:

Posté par Mini' le 8 Nov - 23:28 (2008)
Superbe Idée !
Je pensais que c'était irréalisable mais vous venez de me prouvez le contraire ^^'
Bravo tout le monde ! ; )
Est-ce que je l'inclurai dans mon jeu ?   Yeux motorisés

Posté par Angi-MK le 10 Nov - 07:22 (2008)
J'ai une nouvelle idée, enfin j'ai envie de pousser celle là ^,^"
Serait-il possible de faire que quand l'attaque deviens plus puissante elle perde des PP ?
Jusqu'a une limite de 10 (et non 5 comme les CT les plus puissante) ce qui ferait que l'on garderais plutôt un charge de force 100 avec 10 PP qu'un ultra laser de 100 avec 5 PP :idea:


Et ensuite j'ai une autre question, est ce que l'attaque à une limite avec la modification que tu as effectuer ou bien si on l'utilise 10000 fois elle deviens ultime ?
Ce serait un moyen de faire la différence entre 2 POKEMON de niveau 100...? :mrgreen:

Posté par Krosk le 10 Nov - 16:46 (2008)
La limitation en PP est possible, suffit de modifier un peu le code. (Je posterai la modif plus tard)

L'attaque peut devenir ultime, il n'y a pas de limitation en puissance. Mais ca peut devenir ridicule si charge est plus fort qu'ultralaser...

Posté par PiVa le 10 Nov - 18:38 (2008)
Krosk a écrit:
Mais ca peut devenir ridicule si charge est plus fort qu'ultralaser...

Bah tu sais quand on regarde pokémon a la TV, la puissance des attaques, c'est tout et n'importequoi... mais dans les jeux vaut mieux mettre une limitation.

Mister-K a écrit:


Ce serait un moyen de faire la différence entre 2 POKEMON de niveau 100...? :mrgreen:

C'est sur mais les combats où tu tue tous le monde en un coup, c a pu vraiment d'intérêt, après vient la stratègie et la logique auquel ce rajoute les objets pour battre les LVL 100. 

En tous cas bravo pour ce joli morceau de script.

A bientôt.

Posté par Angi-MK le 28 Déc - 12:43 (2008)
ok j'ai revus le sujet, je vais tenter de refaire ton calcul mais d'une autre manière, c'est à dire au début gagner quelque chose comme +1 toutes les 10 attaques pour avancer progressivement vers un +1 toutes les 50 attaques.
C'est faisable ?
(je connais pas assez le Ruby pour le faire :mrgreen: )
mais j'aurais aussi besoin d'une soustraction de PP à chaque points gagné Clin d'œil foireux SVP Bouche extensiblek:

-En gros je veux passer en suite géométrique+arithmétique (aritméticogéometrique) pour fixer une "semi" limite-

Posté par Angi-MK le 2 Jan - 07:20 (2009)
Non  Lordork chez mémé ?

Posté par Sphinx le 2 Jan - 10:26 (2009)
Clin d'œil foireux ca doit être faisable, mais faudrait avoir des détails très précis pour qu'on puisse t'aider Clin d'œil foireux

Posté par Angi-MK le 2 Jan - 11:11 (2009)


En fait ça augmente de moins en moins vite...


Très mal schématisé, je sais Clin d'œil foireux ...


(les chiffres données ne sont que des exemples)

Posté par Sphinx le 2 Jan - 11:21 (2009)
^_^" T'aurais une formule plutôt ?



>> PS : ptite question, y a t il moyen de pouvoir intégrer 2 choses :
1°) que seules certaines attaques (ou certains ID effets) soient concernés
2°) que le nbre d'utilisation se remette à 0 si on change d'attaque (exemple : le poké utilise vive-att plusieurs fois, il peut utiliser la vitesse des attaques précédentes. Mais s'il s'arrête pr lancer une autre attaque, ben... ^_^ quand il repart, il ne peut pas bénéficier de ce bonus précédent, puisqu'il s'est arrêté Imbécile heureux)

Posté par Angi-MK le 2 Jan - 12:02 (2009)
variable"1" > convertir en nombre entier > variable"2" ( variable"2" = partie_entière(variable"1") ) = puissance de l'attaque
variable"3" = nombre de fois lancée ( le "n" dans la suite définie après )



variable"1"(n+1) == variable"1"(n) + (1/n) x 0,05 x variable"1"(n)
variable"2"(n+1) == Partie_entière(variable"1"(n))

( ici donc n=variable"3" )

Posté par Angi-MK le 3 Jan - 12:48 (2009)
Bahhhh.... ?

Posté par Sphinx le 3 Jan - 14:01 (2009)
^_^" g pas tt compris ds les calculs lol xP


X : dégâts du tour précédent
Y : nbre de lancements
Z : dégâts finaux (ceux qui seront infligés)

Z = entier(X + (1/Y) x 0,05 x X)

C'est bien ca ?

Posté par PiVa le 3 Jan - 17:18 (2009)
En français sa donne quoi car là ça fait brouillon  :?

Posté par Angi-MK le 4 Jan - 02:51 (2009)
c'est pourtant bien expliqué,

la variable 1 représente la puissance de l'attaque (avec virgule exemple 20.26535215)
la variable 2 représente la puissance de l'attaque (arrondis en nombre entier exemple 20)
la variable 3 le nombre de fois ou l'attaque est lancé...

exemple:

une attaque a une puissance 20,
tu la lance une fois:
 la variable 1 = 20 (donc la variable 2 aussi)
 la variable 3 devient 1

il suffit d'appliquer la formule que j'ai donné Mollasse enragé ??

Posté par Krosk le 8 Jan - 11:27 (2009)
Pour simuler une courbe pareil, tu peut aussi appliquer une fonction racine (ou log éventuellement)).
Code:
return Skill_Info.base_damage(id) + Math.sqrt(PAS_PUIS * (@use_number / PAS_UTIL)).to_i

Il faudra jouer sur les paramètres PAS_PUIS et PAS_UTIL (qui perdent leur sens original) pour avoir l'augmentation désirée

Posté par Angi-MK le 12 Jan - 18:03 (2009)
Je fais comment exactement Lordork chez mémé Clin d'œil foireux

Posté par Krosk le 15 Jan - 23:49 (2009)
regarde dans le morceau de script que j'ai posé en tete de topic, y'a une ligne "return ...". Change là par celle que j'ai donné au post précédent.

Posté par Sphinx le 16 Jan - 19:35 (2009)
>> krosk, peut on limiter cet effet qu'à certaines attaques ?

Posté par Empire1601 le 16 Jan - 20:38 (2009)
Je crois qu'il y a quelque chose qui y ressemble pour frénésie non Yeux motorisés ?

Posté par Suicune31 le 17 Jan - 02:47 (2009)
Taillade est le meilleur exemple je pense . . .

Posté par Krosk le 17 Jan - 13:14 (2009)
Sphinx a écrit:
>> krosk, peut on limiter cet effet qu'à certaines attaques ?


Bien sur. Suffit de donner une condition avant le retour genre
Code:
    def power
      @use_number = 0 if @use_number == nil # Protection indéfinition
      if @id == xx
        return Skill_Info.base_damage(id) + PAS_PUIS * (@use_number / PAS_UTIL)
      else
        return Skill_Info.base_damage(id)
      end
    end

Posté par Sphinx le 17 Jan - 14:10 (2009)
ah oki Imbécile heureux ^_^ Jle prendrai ptêtre pr mon jeu alrs Imbécile heureux (@id c le n° de l'attaque, si g tt compris)

Posté par Angi-MK le 17 Jan - 17:33 (2009)
Oui, tu as juste à le remplacer par l'id de l'attaque (ça marche nickel Imbécile heureux )

Posté par Shimo le 31 Jan - 21:49 (2009)
Et supposons que l'on veuillent faire plusieurs capacitées pouvant évoluer mais pas à la même vitesse ; par exemple une qui gagne 10 de puissance toutes les
10 utilisation et une autre qui gagne 250 de puissance toutes les 250 utilisations (exemple un petit peu bizzare je l'accorde :lol: ).
Suffit-il de copier le morceau de script :
Code:
 class Skill
    PAS_UTIL = 1
    PAS_PUIS = 10
   
    alias initialize_temp initialize
    def initialize(id)
      initialize_temp(id)
      @use_number = 0
    end
   
    def power
      @use_number = 0 if @use_number == nil # Protection indéfinition
      if @id == 468
        return Skill_Info.base_damage(id) + PAS_PUIS * (@use_number / PAS_UTIL)
      else
        return Skill_Info.base_damage(id)
      end
    end
   
    alias use_temp use
    def use
      use_temp
      @use_number = 0 if @use_number == nil # Protection indéfinition
      @use_number += 1 if @usable
    end
  end
end

Une seconde fois ou y a t'il une démarche particulière à suivre?

Merko d'avance celui, celle ou ceux qui me répondra(-drons) ^-^

Posté par Sphinx le 31 Jan - 23:30 (2009)
Code:
 class Skill
    PAS_UTIL = 1
    PAS_PUIS = 10
   
    alias initialize_temp initialize
    def initialize(id)
      initialize_temp(id)
      @use_number = 0
    end
   
    def power
      @use_number = 0 if @use_number == nil # Protection indéfinition
      if @id == 468
        return Skill_Info.base_damage(id) + PAS_PUIS * (@use_number / PAS_UTIL)
      elsif @id == XXXX #<========================================== là tu mets l'ID de ton attaque à la place du XXXX
        return Skill_Info.base_damage(id) + YYYY * (@use_number / ZZZZ) #<========= Les YYYY (bonus obtenu) et ZZZZ (nbre d'utilisations) sont à remplacer par les valeurs correspondantes
      else
        return Skill_Info.base_damage(id)
      end
    end
   
    alias use_temp use
    def use
      use_temp
      @use_number = 0 if @use_number == nil # Protection indéfinition
      @use_number += 1 if @usable
    end
  end
end


>> T'as juste à mettre :
Code:
      elsif @id == XXXX #<========================================== là tu mets l'ID de ton attaque à la place du XXXX
        return Skill_Info.base_damage(id) + YYYY * (@use_number / ZZZZ) #<========= Les YYYY (bonus obtenu) et ZZZZ (nbre d'utilisations) sont à remplacer par les valeurs correspondantes

autant que nécessaire, au même endroit que moi =) (elsif signifie "sinon si" Clin d'œil foireux)

Posté par Shimo le 1 Fév - 10:29 (2009)
Youpi! Merci, merci , merci! :mrgreen:
Tout marche super bien ! Je me suis même amusé à faire la même attaque (en ajoutant + et X à la FF) qui évolue plus lentement mais plus aussi Petit saligaud mal élevé
C'est vraiment cool !

B-R-A-V-O K-R-O-S-K !!! Bouche extensiblek: B-R-A-V-O S-P-H-I-N-X !!! Bouche extensiblek:

PS : Oublié de préciser : Bravo à Mister-K et à Empire 1604 (j'espère que c'est les bon chiffres :mdr: ) d'avoir eu cette superbe idée. ^-^

Posté par Angi-MK le 2 Fév - 18:22 (2009)
Amélia a écrit:
PS : Oublié de préciser : Bravo à Mister-K et à Empire 1604 (j'espère que c'est les bon chiffres :mdr: ) d'avoir eu cette superbe idée. ^-^


C'est 1601 Petit saligaud mal élevé