Posté le: 24/04/11 11:39 Sujet du message: Sauvegarde d'entier comprimee
Voila j'ai compris le fonctionnement d'un système de save pour rpg mais j'arrive toujours pas a sauvegarder des variables a 6 chiffres ( le gold par exemple ). C'est pas que j'y arrive pas mais c est que je ne veux pas gaspillez 6 lettres de mon code pour l'or. J'ai entendu dire que grâce aux chiffres Alpha on pouvait diminuer la taille du code.
Alors j'aimerai bien savoir comment les utiliser en détails car je veux save des variables et pas seulement l'or.
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 24/04/11 12:03 Sujet du message:
Aucune idée de ce que tu veux dire par "chiffre alpha", mais tu peux changer la base, choisir une autre base que la base décimale, plus la base sera grande moins il te faudra de caractères.
Si tu tiens compte de la casse (majuscule/minuscule), rien qu'en utilisant les lettres de l'alphabet tu as à disposition 26*2 caractères, à cela tu peux bien sur ajouter les chiffres de 0 à 9, ce qui nous fait donc une base de 62 (52 +10).
Tu peux encore augmenter la base en ajoutant des caractères spéciaux tel que "/" "_" , "." , etc ...
Avec une base de 62 il te faut un seul caractère pour coder les valeur numériques de 0 à 61 (62¹ -1), pour une valeur inférieure ou égale 3843 (62² -1) il faut 2 caractères, pour une valeur inférieure ou égale à 238327 (62³ -1) il te faut 3 caractères, etc ...
Mais un tel code n'est pas terrible car non crypté. _________________
Le violet, c'est moche.
Dernière édition par Troll-Brain le 24/04/11 13:38; édité 1 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 24/04/11 13:00 Sujet du message:
Heu....
Ben en fait, c'est exactement la même chose .
Simplement, comme dans ton tuto ils n'utilisent que les majuscules et les chiffres, ça fait une base de 36 au lieu de 62.
Je crois que "AlphaNumber" veut dire "Nombres AlphaNumériques" = "Nombres qui utilisent des lettres et des chiffres". En fait, c'est juste un système de "bases". _________________
Ps: Il le dit lui meme que sa reduit la taille par 2 si tu met le double de caractheres mais que sa sere uniquement pour les nbrs tres larges _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 24/04/11 13:49 Sujet du message:
Wareditor a écrit:
C'est bon je crois comprendre
Ps: Il le dit lui meme que sa reduit la taille par 2 si tu met le double de caractheres mais que sa sere uniquement pour les nbrs tres larges
Ca ne veut rien dire "réduit la taille par 2" et "uniquement pour les nombres très larges".
Ex :
36³ - 1 = 46655 ; 36² -1 = 1295
62³ - 1 = 238327 ; 62² - 1 = 3843
Autant utiliser la base la plus forte possible, et pour que le joueur fasse bien la distinction entre les minuscules, majuscules,chiffres et caractères spéciaux tu peux coloriser le string :
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 24/04/11 14:16 Sujet du message:
Je ne me suis jamais intéressé au cryptage, de toute façon tant que la map est jouable, le script est accessible, donc on peut toujours accéder à l'algorithme de cryptage. _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 24/04/11 16:13 Sujet du message:
Le meilleur système de cryptage (W3) que j'ai vu, c'est dans la map "Warlock" qui utilise un système de wait pas facile à décrypter même quand on a accès au code.
Sinon, quand j'avais commencé mon système de Save/Load, je sauvegardais l'heure de la journée et je l'utilisais pour changer de base (càd que si l'or était codé par "AFH", il fallait utiliser l'heure de la journée pour avoir accès à la base : "AFH" pouvait vouloir dire "10 *62² + 16 *62 + 18" ou "25 *62² + 31 *62 + 33" selon l'heure).
Mais je suis sûr que je l'ai uploadé quelque part, je le retrouve et je te montre (ce sera en jass, par contre, mais comme c'est surtout du calcul...).
EDIT : Oulà, je me souvenais plus qu'il était si long ^^'. Et il est même pas fini (m'enfin y'a de bonnes bases). Voilà :
Secret:
Jass:
//================================================================================
// Mots De Passe
//================================================================================
function ChangeBase takes string s, string table, integer length returns integer
local integer i=0
local integer j
local integer base=StringLength(table)
local integer res=0
local boolean IsValid
if (StringLength(s)!=length) then
return -1
endif
loop
exitwhen i>=length
set j=0
set IsValid=false
loop
exitwhen j>=base
if (SubString(s,i,i+1)==SubString(table,j,j+1)) then
set res=res+j*R2I(Pow(base,i))
set IsValid=true
endif
set j=j+1
endloop
if (not(IsValid)) then
return -1
endif
set i=i+1
endloop
return res
endfunction
function ChangeBase2 takes integer value, string table, integer length returns string
local integer i=0
local integer tempValue
local integer base=StringLength(table)
local string res=""
loop
exitwhen i>=length
set tempValue=ModuloInteger(value,R2I(Pow(base,i+1)))/R2I(Pow(base,i))
set res=res+SubString(table,tempValue,tempValue+1)
set i=i+1
endloop
return res
endfunction
function IntegerRecognize takes string s, string table, integer Length returns integer
local integer i=0
local integer j=0
if (StringLength(s)!=Length) then
set udg_BooleanVariable=false
return -1
endif
loop
exitwhen i>=Length
if (SubString(s,i,i+1)!=SubString(table,0,1)) then
set j=i
endif
set i=i+1
endloop
set i=0
loop
exitwhen i>=StringLength(table)
if (SubString(s,j,j+1)==SubString(table,i,i+1)) then
return udg_CodeInteger[i+j*StringLength(table)]
endif
set i=i+1
endloop
set udg_BooleanVariable=false
return -1
endfunction
function IntegerRecognize2 takes integer value, string table, integer Length returns string
local integer i=0
local integer j
local string res=""
loop
exitwhen udg_CodeInteger[i]==value
set i=i+1
endloop
set j=i
set i=0
loop
exitwhen i>=Length
if (j<StringLength(table)*(i+1) and j>=StringLength(table)*i) then
set res=res+SubString(table,j,j+1)
else
set res=res+SubString(table,0,1)
endif
set i=i+1
endloop
return res
endfunction
function DecodeTime takes string s returns real
local real res
set res=ChangeBase(SubString(s,0,3),"2X3FONT5PLUS1CDEMAH8YU",3)
if (res==-1) then
set udg_BooleanVariable=false
endif
set res=ModuloReal(res*0.01,24)
return res
endfunction
function DecodeNbJoueur takes string s returns integer
local integer res=ChangeBase(SubString(s,0,3),"2X3FONT5PLUS1CDEMAH8YU",3)
if (res==-1 or res>2400*CST_NBJOUEURMAX) then
set udg_BooleanVariable=false
return 0
endif
return res/2400+1
endfunction
function DecodePlayerIAttribut takes string s, integer codeIndex, integer nbJoueur, string whichAttribut returns integer
local integer P=S2I(SubString(whichAttribut,StringLength(whichAttribut)-1,StringLength(whichAttribut))-1
local integer Min
local integer Length
local integer modulo=nbJoueur*10
local string table="ZuDj3aHfAvNn7eUrIdGqQzLtPo5iWmBwFl8cKgSxYh0yTC2pOJs4Ek1RbV6MX9"
local boolean RecognizeType=true
set whichAttribut=SubString(whichAttribut,0,StringLength(whichAttribut)-1)
if (whichAttribut=="Hero") then
set udg_CodeInteger[0]='Gard'
set udg_CodeInteger[1]='HVMB'
set udg_CodeInteger[2]='UVMN'
set udg_CodeInteger[3]='EVCD'
set Min=ModuloInteger(P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*3+1,codeIndex+P*3+5)
elseif (whichAttribut=="Xp") then
set RecognizeType=false
set Min=ModuloInteger(nbJoueur+P+codeIndex,modulo)
set Length=3
set table=SubStringLoop(table,codeIndex+P+31,codeIndex+P+31)
elseif (whichAttribut=="Arme") then
set udg_CodeInteger[0]='Inul'
set udg_CodeInteger[1]='IBa1'
set udg_CodeInteger[2]='IBa2'
set udg_CodeInteger[3]='IBa3'
set udg_CodeInteger[4]='IBa4'
set udg_CodeInteger[5]='IBa5'
set udg_CodeInteger[6]='IBa6'
set Min=ModuloInteger(4*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*P+12,codeIndex+P*P+19)
elseif (whichAttribut=="Casque") then
set udg_CodeInteger[0]='Inul'
set Min=ModuloInteger(5*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*P*2+37,codeIndex+P*P*2+38)
elseif (whichAttribut=="Bouclier") then
set udg_CodeInteger[0]='Inul'
set Min=ModuloInteger(6*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*2+20,codeIndex+P*2+21)
elseif (whichAttribut=="Armure") then
set udg_CodeInteger[0]='Inul'
set Min=ModuloInteger(7*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*12+28,codeIndex+P*12+29)
elseif (whichAttribut=="Gant") then
set udg_CodeInteger[0]='Inul'
set Min=ModuloInteger(8*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P+9,codeIndex+P+10)
elseif (whichAttribut=="Accessoire") then
set udg_CodeInteger[0]='Inul'
set Min=ModuloInteger(9*nbJoueur+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,P*codeIndex+50,P*codeIndex+51)
endif
if (RecognizeType) then
return IntegerRecognize(SubStringLoop(s,Min,Min+Length),table,Length)
endif
return ChangeBase(SubStringLoop(s,Min,Min+Length),table,Length)
endfunction
function EncodeTP takes integer codeIndex returns string
return ChangeBase2(codeIndex,"2X3FONT5PLUS1CDEMAH8YU",3)
endfunction
function EncodePlayerIAttribut takes string whichAttribut, integer codeIndex, integer value returns string
local integer P=S2I(SubString(whichAttribut,StringLength(whichAttribut)-1,StringLength(whichAttribut)))-1
local integer Length
local integer modulo=udg_NombreJoueurs*10
local string table="ZuDj3aHfAvNn7eUrIdGqQzLtPo5iWmBwFl8cKgSxYh0yTC2pOJs4Ek1RbV6MX9"
local boolean RecognizeType=true
set whichAttribut=SubString(whichAttribut,0,StringLength(whichAttribut)-1)
if (whichAttribut=="Hero") then
set udg_CodeInteger[0]='Gard'
set udg_CodeInteger[1]='HVMB'
set udg_CodeInteger[2]='UVMN'
set udg_CodeInteger[3]='EVCD'
set udg_EntierVariable=ModuloInteger(P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*3+1,codeIndex+P*3+5)
elseif (whichAttribut=="Xp") then
set RecognizeType=false
set udg_EntierVariable=ModuloInteger(udg_NombreJoueurs+P+codeIndex,modulo)
set Length=3
set table=SubStringLoop(table,codeIndex+P+31,codeIndex+P+31)
elseif (whichAttribut=="Arme") then
set udg_CodeInteger[0]='Inul'
set udg_CodeInteger[1]='IBa1'
set udg_CodeInteger[2]='IBa2'
set udg_CodeInteger[3]='IBa3'
set udg_CodeInteger[4]='IBa4'
set udg_CodeInteger[5]='IBa5'
set udg_CodeInteger[6]='IBa6'
set udg_EntierVariable=ModuloInteger(4*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*P+12,codeIndex+P*P+19)
elseif (whichAttribut=="Casque") then
set udg_CodeInteger[0]='Inul'
set udg_EntierVariable=ModuloInteger(5*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*P*2+37,codeIndex+P*P*2+38)
elseif (whichAttribut=="Bouclier") then
set udg_CodeInteger[0]='Inul'
set udg_EntierVariable=ModuloInteger(6*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*2+20,codeIndex+P*2+21)
elseif (whichAttribut=="Armure") then
set udg_CodeInteger[0]='Inul'
set udg_EntierVariable=ModuloInteger(7*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P*12+28,codeIndex+P*12+29)
elseif (whichAttribut=="Gant") then
set udg_CodeInteger[0]='Inul'
set udg_EntierVariable=ModuloInteger(8*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,codeIndex+P+9,codeIndex+P+10)
elseif (whichAttribut=="Accessoire") then
set udg_CodeInteger[0]='Inul'
set udg_EntierVariable=ModuloInteger(9*udg_NombreJoueurs+P+codeIndex,modulo)
set Length=1
set table=SubStringLoop(table,P*codeIndex+50,P*codeIndex+51)
endif
if (RecognizeType) then
return IntegerRecognize2(value,table,Length)
endif
return ChangeBase2(value,table,Length)
endfunction
function ReplaceCodeString takes string s, string value, integer minPos returns string
local integer loopedPos=StringLength(value)+minPos-StringLength(s)
if (minPos==0) then
return value+SubString(s,StringLength(value),StringLength(s))
elseif (loopedPos>0) then
return SubString(value,StringLength(value)-loopedPos,StringLength(value))+SubString(s,loopedPos,minPos)+SubString(value,0,StringLength(value)-loopedPos)+SubString(s,minPos+StringLength(value),StringLength(s))
endif
return SubString(s,0,minPos)+value+SubString(s,minPos+StringLength(value),StringLength(s))
endfunction
function EncodeMain takes nothing returns nothing
local string res
local string temp=""
local integer codeIndex=2400*(udg_NombreJoueurs-1)+R2I(GetFloatGameState(GAME_STATE_TIME_OF_DAY)*100)
local integer i=1
call DisplayTimedTextToForce(udg_Joueurs,30,"TRIGSTR_1890")
if (udg_Heros[1]==null) then
call DisplayTimedTextToForce(udg_Joueurs,30,"Mot de Passe : XU5BNE")
return
endif
set res=EncodeTP(codeIndex)
loop
exitwhen i>udg_NombreJoueurs
set temp=temp+" "
set i=i+1
endloop
set i=1
loop
exitwhen i>udg_NombreJoueurs
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Hero"+I2S(i),codeIndex,GetUnitTypeId(udg_Heros[i])),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Xp"+I2S(i),codeIndex,GetHeroXP(udg_Heros[i])),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Arme"+I2S(i),codeIndex,udg_ArmesHeros[i]),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Casque"+I2S(i),codeIndex,udg_CasquesHeros[i]),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Bouclier"+I2S(i),codeIndex,udg_BouclierHeros[i]),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Armure"+I2S(i),codeIndex,udg_ArmuresHeros[i]),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Gant"+I2S(i),codeIndex,udg_GantsHeros[i]),udg_EntierVariable)
set temp=ReplaceCodeString(temp,EncodePlayerIAttribut("Accessoire"+I2S(i),codeIndex,udg_AccessoiresHeros[i]),udg_EntierVariable)
set i=i+1
endloop
set res=res+temp
call DisplayTimedTextToForce(udg_Joueurs,30,"Mot de Passe : "+res)
endfunction
function DecodeMain takes nothing returns nothing
local string s=SubString(GetEventPlayerChatString(),5,100)
local string temp
local integer i=1
local integer codeIndex
local real Time
local integer NbJoueur
local integer array HeroType
local integer array HeroXp
local integer array HeroItem
call ReloadGameCachesFromDisk()
if (s=="XU5BNE") then
call DisplayCineFilter(false)
call EnableUserUI(true)
call DestroyTrigger(GetTriggeringTrigger())
call TriggerExecute(gg_trg_Cinematique_Debut)
return
endif
set udg_BooleanVariable=true
set Time=DecodeTime(s)
set NbJoueur=DecodeNbJoueur(s)
set codeIndex=ChangeBase(SubString(s,0,3),"2X3FONT5PLUS1CDEMAH8YU",3)
set temp=SubString(s,3,3+10*NbJoueur)
loop
exitwhen i>NbJoueur
set HeroType[i]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Hero"+I2S(i))
set HeroXp[i]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Xp"+I2S(i))
set HeroItem[i]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Arme"+I2S(i))
set HeroItem[i+4]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Casque"+I2S(i))
set HeroItem[i+8]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Bouclier"+I2S(i))
set HeroItem[i+12]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Armure"+I2S(i))
set HeroItem[i+16]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Gant"+I2S(i))
set HeroItem[i+20]=DecodePlayerIAttribut(temp,codeIndex,NbJoueur,"Accessoire"+I2S(i))
set i=i+1
endloop
if (udg_BooleanVariable) then
call ClearTextMessages()
call SetFloatGameState(GAME_STATE_TIME_OF_DAY,Time)
set i=1
loop
exitwhen i>NbJoueur
set udg_Heros[i]=CreateUnit(ConvertedPlayer(i),HeroType[i],-800,800,270)
call SetHeroXP(udg_Heros[i],HeroXp[i],false)
call UnitAddItemById(udg_Heros[i],HeroItem[i])
set udg_ArmesHeros[i]=HeroItem[i]
call UnitAddItemById(udg_Heros[i],HeroItem[i+4])
set udg_CasquesHeros[i]=HeroItem[i+4]
call UnitAddItemById(udg_Heros[i],HeroItem[i+8])
set udg_BouclierHeros[i]=HeroItem[i+8]
call UnitAddItemById(udg_Heros[i],HeroItem[i+12])
set udg_ArmuresHeros[i]=HeroItem[i+12]
call UnitAddItemById(udg_Heros[i],HeroItem[i+16])
set udg_GantsHeros[i]=HeroItem[i+16]
call UnitAddItemById(udg_Heros[i],HeroItem[i+20])
set udg_AccessoiresHeros[i]=HeroItem[i+20]
set i=i+1
endloop
call PanCameraTo(-800,800)
call DestroyTrigger(GetTriggeringTrigger())
else
call DisplayTimedTextToPlayer(Player(0),0,0,30,"|cffff0000Erreur De Chargement|r")
endif
endfunction
EDIT 2: T'aurais pu me le dire qu'il manquait une partie ! On va dire que le nom est suffisamment explicite et que t'avais tout compris.
Jass:
function SubStringLoop takes string s, integer min, integer max returns string
local integer length=StringLength(s)
set min=ModuloInteger(min,length)
set max=ModuloInteger(max,length)
if (min>=max) then
return SubString(s,min,length)+SubString(s,0,max)
endif
return SubString(s,min,max)
endfunction
"XU5BNE" était le mot de passe de base quand rien n'avait été fait. J'avais déjà un sacré sens de l'humour à l'époque (que je n'ai pas perdu puisque je te conseille de comprendre ce code).
Le plus important, c'est dans la fonction "ChangeBase" et "ChangeBase2" (le suffixe "2" signifiant qu'il s'agit de l'encodage et pas du décodage). Les "Recognizes" sont utiles pour les IDs (parce que ce sont de très grands nombres et qu'on en utilise peu). Et le udg_BooleanVariable est mis sur false dès que le code est estimé incorrect.
Il y avait 4 joueurs maximum (les objets de tous les joueurs étaient tous dans la même variable déployée).
La partie "Encode" est sans doute plus facile à comprendre.
La table "ZuDj3aHfAvNn7eUrIdGqQzLtPo5iWmBwFl8cKgSxYh0yTC2pOJs4Ek1RbV6MX9" est l'ensemble des caractères que j'utilise mais la table "2X3FONT5PLUS1CDEMAH8YU" est une table de 'translation' qui me permet de changer de base dynamiquement. En plus de ça, je "fais tourner" le code (sauf les 3 premières lettres qui sont l'heure = TimePlayed dans EncodeTP).
Évidemment, il y a des variables (comme Heros[] ou les IDs des objets) qui sont spécifiques à ma map. C'est juste pour te donner une idée (et avoir ton suicide sur la conscience ).
Pour info, ça vient de la version RPG de ma map. _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 24/04/11 17:19 Sujet du message:
Nop, c'est juste mon propre MdP sur la map d'Archer Wars (1000000 de kills et 3 deaths, et ouais ... , bon c'est juste pour débloquer les persos jouables).
En relisant, un truc que j'ai mis quelque temps à comprendre, c'est que le "udg_EntierVariable" est modifié dans la fonction "EncodePlayerIAttribut" pour être utilisé dans "ReplaceCodeString". J'avais tout mis en 1 ligne mais c'est moins lisible du coup.
Sinon, surtout ne te surmène pas trop. Il est sans doute pas trop difficile à cracker quand on y a accès (mais difficile sinon).
Tu peux aussi demander à jk2pach qui en a fait plusieurs et Rommstein qui a fait un tuto. _________________
Sinon y'a ptetre quelqu'un qui a envie de recoder un SHA-1 ou un MD5 ? :p
J'ai une lib d'opérateurs binaires en jass si vous voulez =p _________________
Bêta Systems:70% Bêta Spells:13% Bêta Arts & graphics:70%
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 02/05/11 23:15 Sujet du message:
profet a écrit:
Sinon y'a ptetre quelqu'un qui a envie de recoder un SHA-1 ou un MD5 ? :p
J'ai une lib d'opérateurs binaires en jass si vous voulez =p
Même si c'était plus du flood qu'autre chose, y'a un truc qui m'échappe.
Normalement le résultat de ces algorithmes n'est pas réversible, non ?
Si c'est bien le cas alors ça devrait être assez useless car il faut bien récupérer les données tel que le niveau du héros, l'or en possession toussa toussa dans le code.
Ca serait "utile" que pour des mots de passe, cheatcode, ...
Bref là ou l'on a pas besoin d'y extraire des données autre que la signature en elle même donnée par les algorithmes en fonction de l'entrée du joueur.
Eclairez ma lanterne si j'ai trébuché dans les méandres de l'ignorance. _________________
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum