Pokémon Script Project Forum Index

Manuel | Search
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

Lister les attaques

 
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts
Previous topic :: Next topic   
Author Message
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sat 8 Aug - 20:32 (2009)    Post subject: Lister les attaques

Combien d'entre vous ont voulu créer de nouvelles attaques... C'est bien beau, mais combien d'entre vous ont voulu créer une nouvelle attaque, qui reproduisait les mêmes effets qu'une autre attaque ?
  • Un vampigraine de feu ?
  • Un cage éclair psychique ?
  • Un claquoir roche ?

Mais si chacun connait une bonne partie des attaques existantes, voire toutes les attaques même, qui pourra me dire de tête que l'attaque DANSE FLEUR est à l'ID 80 ? C'est bien dommage de pas le savoir par coeur, mais qui pourra vous le reprocher ?

Et pourtant, il existe un moyen si simple... C'est pas joli joli de le faire à l'école, lors d'un contrôle, mais un bon aide-mémoire règle souvent les problèmes...

Ce que je vous propose aujourd'hui :

Un générateur de listes des attaques

I) Introduction
II) Installation
III) Ze coin off ze scripteurs
IV) Explications
V) Le mot de la fin

    I) Introduction

Ouh la ! Je vois vos têtes pâlir... Rassurez vous, ca n'a rien de barbare, il s'agit simplement d'un script qui crée un tableau contenant toutes les attaques classées par ordre alphabétique (pratique quand on a le nom sans l'ID) ainsi que des infos utiles (soit pour les makers, soit pour les joueurs, soit pour tous) comme le type de chaque attaque, sa description, son ID effet, sa précision, et bien d'autres données.


    II) Installation

Ca c'est l'étape on ne peut plus simple... Collez ce qui suit dans un nouveau script :
Code:
def make_skills_list
  t = Time.now
  file = File.open("Attaques.txt", "w")
 
  tab_skills = []
  tab_skills_name = []
  for id in 1...$data_skills.size
    skill = $data_skills[id]
    tab_skills[id] = []
    tab_skills_name[id] = skill.name.remove_accents.upcase # Nom de l'attaque
    tab_skills[id][0] = skill.name.remove_accents.upcase # Nom de l'attaque
    tab_skills[id][1] = skill.power.to_s # ID effet
    tab_skills[id][2] = skill.description.remove_accents # Description
    tab_skills[id][3] = skill.pdef_f.to_s + " %" # % chance effet
    tab_skills[id][4] = type_name(skill.element_set[0]) # Type
    phy_spe_sta = case skill.str_f when 0 then "PHYSIQUE" when 1 then "SPECIALE" when 2 then "STATUT" end
    tab_skills[id][5] = phy_spe_sta # Phy / Spé / Sta
    tab_skills[id][6] = skill.sp_cost.to_s # PP max
    tab_skills[id][7] = skill.hit.to_s + " %" # Précision
    tab_skills[id][8] = (skill.atk_f + skill.eva_f).to_s # Dégâts
  end
  temp_skills_name = tab_skills_name.clone
  temp_skills_name.shift
 
  atk = 0
  desc = 0
  types = 0
  for i in tab_skills
    next if i == nil
    atk = i[0].size if atk < i[0].size
    desc = i[2].size if desc < i[2].size
    types = i[4].size if types < i[4].size
  end
 
  Graphics.update
  n = 0
  file.write("-" * (104 + atk + desc + types) + "\n")
  file.write("|..ID..|" + "ATTAQUE".center(atk + 4, ".") + "|..ID EFFET..|" + "DESCRIPTION".center(desc + 4, ".") + "|..% EFFET..|" + "TYPE".center(types + 4, ".") + "|..PHY / SPE / STA..|..PP MAX..|..PRECISION..|..DEGATS..|" + "\n")
  file.write("-" * (104 + atk + desc + types) + "\n")
  # "|  ID  |       ATTAQUE       |  ID EFFET  |       DESCRIPTION       |  % EFFET  |   TYPE   |  PHY / SPE / STA  |  PP MAX  |  PRECISION  |  DEGATS  |"
  until(temp_skills_name.empty?)
    n += 1
    Graphics.update if n % 50 == 0
    temp = temp_skills_name[0]
    for i in 1...temp_skills_name.size
      temp = temp_skills_name[i] if temp != nil and temp_skills_name[i].before(temp)
    end
    id = tab_skills_name.index(temp)
    next if tab_skills[id].nil?
    string = "|" + ("." * (5 - (id.to_s.size))) + id.to_s + ".|" # "|   ID |"
    string += ".." + tab_skills[id][0].left(0, atk, ".") + "..|" # "       ATTAQUE       |"
    string += ".." + tab_skills[id][1].center(8, ".") + "..|" # "  ID EFFET  |"
    string += ".." + tab_skills[id][2].left(0, desc, ".") + "..|" # "       DESCRIPTION       |"
    string += ".." + tab_skills[id][3].center(7, ".") + "..|" # "  % EFFET  |"
    string += ".." + tab_skills[id][4].left(0, types, ".") + "..|" # "   TYPE   |"
    string += ".." + tab_skills[id][5].left(0, 15, ".") + "..|" # "  PHY / SPE / STA  |"
    string += ".." + tab_skills[id][6].center(6, ".") + "..|" # "  PP MAX  |"
    string += ".." + tab_skills[id][7].center(9, ".") + "..|" # "  PRECISION  |"
    string += ".." + tab_skills[id][8].center(6, ".") + "..|" # "  DEGATS  |"
    file.write(string + "\n")
    temp_skills_name.delete(temp)
  end
  file.write("-" * (92 + atk + desc + types))
  file.close
   print "Liste des attaques générée en #{(Time.now - t)} secondes."
end

class String
 
  def before(oth_str)
    return if oth_str == nil
    dec_self = 0
    dec_oth_str = 0
    tab_lettres = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    for i in 0...[self.size, oth_str.size].min
      dec_self += 1 until tab_lettres.include?(self.upcase[i + dec_self..i + dec_self])
      dec_oth_str += 1 until tab_lettres.include?(oth_str.upcase[i + dec_oth_str..i + dec_oth_str])
      if self.upcase[i + dec_self..i + dec_self] != oth_str.upcase[i + dec_oth_str..i + dec_oth_str]
        print self.upcase[i + dec_self..i + dec_self] + " : " + tab_lettres.index(self.upcase[i + dec_self..i + dec_self]).to_s + " - " + oth_str.upcase[i + dec_oth_str..i + dec_oth_str] + " : " + tab_lettres.index(oth_str.upcase[i + dec_oth_str..i + dec_oth_str]).to_s if [tab_lettres.index(self.upcase[i + dec_self..i + dec_self]), tab_lettres.index(oth_str.upcase[i + dec_oth_str..i + dec_oth_str])].include?(nil)
        return tab_lettres.index(self.upcase[i + dec_self..i + dec_self]) < tab_lettres.index(oth_str.upcase[i + dec_oth_str..i + dec_oth_str])
      end
    end
    return false
  end
 
  def left(left, total, car = " ")
    return self if self.size > total
    return (car * left) + self + (car * (total - self.size - left))
  end
 
  def remove_accents
    txt = self
    tab = [[["à", "â", "ä", "ã", "@"], "a"],
               [["é", "ê", "è", "ë", "€"], "e"],
               [["î", "ì", "ï"], "i"],
               [["ô", "ò", "ö", "õ"], "o"],
               [["û", "ù", "ü"], "u"],
               [["ç"], "c"],
               [["$"], "s"],
               [["£"], "l"]
              ]
    txt = self
    for i in tab
      for j in i[0]
        txt = txt.gsub(j, i[1])
      end
    end
    return txt
  end
 
end

def type_name(nb)
  return "AUCUN" if nb.nil? or nb <= 0 or nb > 25
  return $data_system.elements[nb].remove_accents.upcase
end

Et c'est fini !


    II) Ze coin off ze scripteurs

Pour ceux qui ont atterris là par accident, vous avez le droit d'aller directement lire les explications.
Pour les besoins de la création de l'aide mémoire, j'ai créé plusieurs fonctions qui s'applique sur les chaines de caractères. En voici le détail :
  • true / false self.before(oth_str) :
      Compare self et oth_str et renvoie true si self est classé avant oth_str dans le dictionnaire, renvoie false sinon. Si le mot contient des symboles particuliers, cette fonction les ignorera et comparera les caractères suivants.
      Exemple :
      "voler".before("vol-au-vent") #> false (par ordre alphabétique, vol-au-vent sera classé avant voler)
      "voler".before("vol marchand") #> true (par ordre alphabétique, vol marchand sera classé après voler)
      Les espaces, apostrophes et trais d'unions sont simplement ignorés. Cette fonction a été mise au point et adaptée aux noms d'attaques avant tout, d'où la prise en charge des "-", "'" et " ".

  • str self.left(left, total, car = " ") :
      Ajoute autant de fois le caractère car pour atteindre total caractères dont left caractères à gauche. Si car n'est pas précisé, ce sera un espace.
      Exemple :
      "voler".left(2, 10) #> " voler " (ca mettra voler sur 10 caractères, dont 2 à gauche. Le caractère qui servira au remplissage sera un espace.)
      "voler".left(4, 15, "-") #> "----voler------" (ca mettra voler sur 15 caractères, dont 4 à gauche. Le caractère qui servira au remplissage sera "-")
      Je me suis servi de cette fonction pour aligner le tableau.

  • str self.remove_accents :
      Retire les caractères spéciaux et les remplace par des lettres minuscules.
      Exemple :
      "volé".remove_accents #> "vole" (le é est devenu e)
      "$€£".remove_accents #> "sel" (le $ est devenu s, le € est devenu e et le £ est devenu l)
      Je me suis servi de cette fonction parce que Wordpad a du mal à gérer les caractères spéciaux tels que les accents entre autre.

J'ai également adapté une autre fonction indispensable, qui n'appartient à aucune classe et donc qui peut être utilisé depuis n'importe quel script ou n'importe quel évent :
  • str type_name(nb) :
      Renvoie le nom du type d'ID nb.
      Exemple :
      type_name(2) #> "FEU"
      type_name(10) #> "VOL"
      type_name(15) #> "DRAGON"
      Cette fonction était indispensable pour la conversion du n° du type en nom. Mais au départ, j'avais mis cette création au démarrage du programme, et la méthode qui convertit l'ID en nom de type Pokemon_Battle_Core ne marchaient pas. Je suis donc passé par $data_system (une variable qui contient l'onglet Système de la base de données) et plus précisément par $data_system.elements qui contient la liste des types. Par la suite, j'ai modifié l'appel de la fonction principale (make_skills_list) mais comme cette fonction existait déjà et était simple à utiliser, je l'ai gardée. Dans PSP, seules les 25 premières lignes sont utilisées, donc la fonction renverra toujours "AUCUN" si vous cherchez à convertir un n° inférieur à 1 ou supérieur à 25. Sinon, ca renverra le nom du type tel qu'il est dans la base de données, en retirant toutefois les caractères spéciaux (remove_accents) et en transformant toutes les lettres en majuscules (upcase).



    IV) Explications

Dans un évent ou un script, mettez ceci :
Code:
make_skills_list

Ca créera un fichier texte appelé "Attaques.txt", qui contiendra toutes les attaques de votre jeu triées par ordre alphabétique.
NB : Bloc note (le programme qui gère les fichiers .txt sur Windows) massacre la mise en forme, je vous conseille donc de l'ouvrir avec Wordpad ou Notepad (installé aussi dans les windows) pour apprécier le tableau.


    V) Le mot de la fin

C'est un script que je trouve utile voire indispensable pour quiconque ne connait pas par coeur les ID des différentes attaques. Ca peut ainsi vous permettre de créer une liste pour vos joueurs, ou au moins pour vous, pour que vous puissiez créer vos attaques basées sur des existantes, plus simplement.


Last edited by Sphinx on Sat 8 Aug - 22:23 (2009); edited 2 times in total
Back to top
Publicité






PostPosted: Sat 8 Aug - 20:32 (2009)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Angi-MK
Membre


Joined: 29 Oct 2008
Posts: 2,303
Localisation: Québec
Masculin

PostPosted: Sat 8 Aug - 20:36 (2009)    Post subject: Lister les attaques

Excellent ce script, merci !
Très utiles comme tu dis, quel gain de temps !
Back to top
Visit poster’s website
anonymate
Guest





PostPosted: Fri 14 Aug - 19:08 (2009)    Post subject: Lister les attaques

Merci ! Merci!
Moi, Je prends Imbécile heureux
Back to top
Neptis
Guest





PostPosted: Fri 14 Aug - 20:07 (2009)    Post subject: Lister les attaques

Intéressant, ça va me servir.
Merci et bravo!
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  

Index | Free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)