Interprétation MapData déchiffrée 1.29

Inscrit
6 Aout 2017
Messages
3
Reactions
0
#1
Bonjour,

Mon système de déchiffrage semble fonctionner correctement mais j'en viens à me demander comment interpréter correctement ces données désormais.


J'imagine que parmi ces 10 caractères pour une cellule se cachent le type de cellule (case normale, soleil de changement de carte, case bloquante, ...)


Me basant sur ce que j'ai pu lire j'ai produit le code suivant :

C#:
        private static readonly string ZKARRAY2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
        public static int HashCodeIndex(char c) { return ZKARRAY2.IndexOf(c); }

        private Cell UncompressCell(string data)
        {
            Cell decompressedCell = default(Cell);

            int[] decompressedData = new int[10];

            for (int i = data.Length - 1; i >= 0; i--) { decompressedData[i] = HashCodeIndex(data[i]); }


            decompressedCell.Movement = ((decompressedData[2] & 56) >> 3);
            decompressedCell.LayerObject2Num = ((decompressedData[0] & 2) << 12) + ((decompressedData[7] & 1) << 12) + (decompressedData[8] << 6) + decompressedData[9];
            decompressedCell.LayerObject2Interactive = Convert.ToBoolean((decompressedData[7] & 2) >> 1);

            return decompressedCell;
        }

Je souhaiterai désormais comprendre ce que sont ici Movement, LayerObject2Num et LayerObject2Interactive ...



PS : Si d'ailleurs quelqu'un pouvait me donner un peu plus de détails sur ce morceau de code de maxoubot car celui-ci utilise des constantes partout, ça rend la compréhension assez difficile :

Code:
For i As Integer = 1 To 500

                    If (.mapDataActuel(i).movement = 2) Then

                        Dim x As Integer = getX(i)
                        Dim y As Integer = getY(i)

                        If ((x - 1) = y) Then
                            .changeurGauche = i
                        ElseIf ((x - 27) = y) Then
                            .changeurDroite = i
                        ElseIf ((x + y) = 31) Then
                            .changeurBas = i
                        ElseIf (y < 0) Then
                            y = Math.Abs(y)
                            If (x - y = 1) Then
                                .changeurHaut = i
                            End If
                        End If

                    End If

                Next

En particulier les méthodes getX et getY qui sont bourrées de constantes
 
Dernière édition:
Inscrit
29 Aout 2016
Messages
10
Reactions
0
#3
Je souhaiterai désormais comprendre ce que sont ici Movement, LayerObject2Num et LayerObject2Interactive
Alors si je me souviens bien,
  • Movement c'est pour determiner si le joueur peut marcher sur la case ou non
  • LayerObject2Num c'est l'identifiant de l'objet à mettre sur le 2e layer (bien souvent des portes, zaap, etc...)
  • LayerObject2Interactive ça défini si l'objet défini ci-dessus peut être "cliquable". Si il est à true et que tu passe ta souris dessus il sera en surbrillance et pourra éventuellement afficher un context menu si tu clique (mais là j'ai un doute)
Edit:

J'ai retrouvé mes notes. J'avais oublié à quel point c'était le bordel leur sérialisation...

Cell data: Hhaaeaaaaa

0: H: 33
1: h: 7
2: a: 0
3: a: 0
4: e: 4
5: a: 0
6: a: 0
7: a: 0
8: a: 0
9: a: 0

Active ? -> [0] & 32 >> 5
Line of sight ? -> [0] & 1
Layer ground rot -> [1] & 48 >> 4
Ground level -> [1] & 15
Movement -> [2] & 56 >> 3
Layer ground num -> ([0] & 24 << 6) + ([2] & 7 << 6) + [3]
Ground slop -> [4] & 60 >> 2
Layer ground flip ? -> [4] & 2 >> 1
Layer object 1 num -> ([0] & 4 << 11) + ([4] & 1 << 12) + ([5] << 6) + [6]
Layer object 1 rot -> [7] && 48 >> 4
Layer object 1 flip ? -> [7] & 8 >> 3
Layer object 2 flip ? -> [7] & 4 >> 2
Layer object 2 interactive ? -> [7] & 2 >> 1
Layer object 2 num -> ([0] & 2 << 12) + ([7] & 1 << 12) + ([8] << 6) + [9]

Active: boolean
Line of sight: boolean
Ground rotation: 0-4
Ground level: 0-15
Movement: 0-7
Ground num: 0-2047
Ground slop: 0-15
Ground flip: boolean
Object 1 num: 0-16383
Object 1 rotation: 0-4
Object 1 flip: boolean
Object 2 num: 0-16383
Object 2 interactive: boolean
Object 2 flip: boolean
 
Dernière édition:
Inscrit
12 Avril 2014
Messages
22
Reactions
5
#4
Environ 500 cases sur une map (je sais plus combien exactement sur 1.29). Les numéros de cellule sont affectés d'en haut à gauche à en bas à droite. Doit y avoir une trentaine de cellules en largeur et une vingtaine en hauteur.

  • getX doit te retourner le numéro de colonne de la cellule (plutôt à gauche ou à droite de la map)
  • getY doit te retourner le numéro de ligne de la cellule (plutôt en haut ou en bas de la map)
Ensuite il fait des vérifications pour savoir si c'est un soleil ou non j'imagine. Mais l'algo doit être en grande partie inspiré du client.
 
Haut Bas