Sujet n°4781
Posté par Sphinx le 8 Aoû - 20:32 (2009)
Titre : 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 ?

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


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.
haut



Ca c'est l'étape on ne peut plus simple... Collez ce qui suit dans un nouveau script :
Code
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 !
haut



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 :

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 :

haut



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.
haut


    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.
haut

Posté par Angi-MK le 8 Aoû - 20:36 (2009)
Excellent ce script, merci !
Très utiles comme tu dis, quel gain de temps !

Posté par anonymate le 14 Aoû - 19:08 (2009)
Merci ! Merci!
Moi, Je prends Imbécile heureux

Posté par Neptis le 14 Aoû - 20:07 (2009)
Intéressant, ça va me servir.
Merci et bravo!