Page 1 sur 1

[..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 17:19
par clark17
Bonjour à tous,

Je cherche à créer un petit mod pour un jeu que j'affectionne particulièrement (Capitalism Lab).
Ce que je veux modifier se trouve dans un fichier *.RES qui contient des BDD au format DBF.

En ouvrant ce fichier RES avec un éditeur Héxa je me suis rendu compte qu'il y avait plusieurs DBF inclus à l'intérieur.
En regardant un exemple de DBF correctement formaté je suis rendu compte qu'un DBF commencé par le caractère Héxa 03 puis terminé avec le caractère 1a.

Je me suis donc fait un fichier ressource exemple (CAPMOD.RES) comme ceci:
Image
Le jaune représente 3 fichiers DBF à l'intérieur de CAPMOD.RES.

J'ai donc pondu ce code qui est censé extraire le premier dbf (billionnaires.dbf) rencontré:

Code : Tout sélectionner

#include<File.au3>

;Ouverture du fichier CAPMOD.RES
$fichier_a_ouvrir = "CAPMOD.RES"
$fichier = FileOpen($fichier_a_ouvrir, 16)
$contenu_fichier = FileRead($fichier)
FileClose($fichier)

;Ecriture du fichier BILLIONAIRES.DBF
_Ecrire_dbf($contenu_fichier, 'billionaires.dbf', 1)

Func _Ecrire_dbf($fichier_source, $nom_fichier, $num_chaine)
    Local $marqueur_debut = '03'
    Local $marqueur_fin = '1a'
    Local $recherche = '(' &$marqueur_debut& '.+?' &$marqueur_fin& ')'
    MsgBox(0, "CAPMOD.RES", $recherche)

    $resultat_recherche = StringRegExpReplace ($fichier_source, '(?:.*?' &$recherche& '){' &$num_chaine& '}.*' , '$1' )
    MsgBox(0, "CAPMOD.RES", $resultat_recherche)

    ;$fichier_a_ecrire = FileOpen("billionaires.dbf", 18)
    ;FileWrite($fichier_a_ecrire, $resultat_recherche)
EndFunc
 
Malheureusement, ça ne fonctionne pas. Il me ressort la totalité du fichier CAPMOD.RES...

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 18:18
par mikell
Pourquoi tu ne vas pas au plus simple ?

Code : Tout sélectionner

$res = StringRegExp($fichier_source, '(03.+?1a)', 3)
;_ArrayDisplay($res)   ; liste les chaines qui correspondent

$ancienne_chaine = $res[1]   ; le chiffre selon l'occurence
$nouvelle_chaine = "xxx"
$fs = StringReplace($fichier_source, $ancienne_chaine, $nouvelle_chaine)

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 19:00
par clark17
Merci pour ton code qui est beaucoup plus simple en effet!
Mon erreur était de ne pas respecter la case ;-) En Héxa c'est 1A et non 1a...

Bon du coup j'ai adapté ton code, le fonctionnement est presque correct:

Code : Tout sélectionner

;Ce script extrait différentes ressources contenu dans CAPMOD.RES

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=ico\read.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include<File.au3>

;Renseignement sur le programme
$boite = MsgBox(1, "Caplab Extractor", "Place CAPMOD.RES in the same folder of this tool and click OK.")
If $boite = 2 Then Exit

;Création de la fenêtre de progression
ProgressOn("Caplab Extractor", "wait few seconds...")
ProgressSet(0, "Open CAPMOD.RES")

;Ouverture du fichier CAPMOD.RES
$fichier_a_ouvrir = "CAPMOD.RES"
$fichier = FileOpen($fichier_a_ouvrir, 16)
$contenu_fichier = FileRead($fichier)
FileClose($fichier)
ProgressSet(50, "Processing billionaires.dbf")

;Ecriture du fichier BILLIONAIRES.DBF
_Ecrire_dbf($contenu_fichier, 'billionaires.dbf', 0)
ProgressSet(60, "Processing compagnies.dbf")

;Ecriture du fichier COMPAGNIES.DBF
_Ecrire_dbf($contenu_fichier, 'compagnies.dbf', 1)
ProgressSet(70, "Processing logos.dbf")

;Ecriture du fichier LOGOS.DBF
_Ecrire_dbf($contenu_fichier, 'logos.dbf', 2)
ProgressSet(80, "Processing persons.dbf")

;Ecriture du fichier PERSONS.DBF
_Ecrire_dbf($contenu_fichier, 'persons.dbf', 3)
ProgressSet(90, "Processing product_names.dbf")

;Ecriture du fichier PRODUCT_NAMES.DBF
_Ecrire_dbf($contenu_fichier, 'product_names.dbf', 4)

;Fin de la fenêtre de progression
ProgressSet(100, "Done", "Complete")
Sleep(500)
ProgressOff()

;Message de réussite
MsgBox(0, "Extract Done", "Extrac from CAPMOD.RES is a success.")

Func _Ecrire_dbf($fichier_source, $fichier_destination, $num_chaine)
    Local $marqueur_debut = '03'
    Local $marqueur_fin = '1A'
    Local $recherche = '(' &$marqueur_debut& '.+?' &$marqueur_fin& ')'

    $resultat_recherche = StringRegExp($fichier_source, $recherche, 3)

    $fichier_a_ecrire = FileOpen($fichier_destination, 18)
    FileWrite($fichier_a_ecrire, $resultat_recherche[$num_chaine])
EndFunc
 
Le seul souci c'est que les fichiers DBF générés le sont sous forme de texte et non en byte. Pourtant mon file open est avec le flag 18 (16 + 2).
Sous l'éditeur Héxa ca donne ceci:
Image

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 19:42
par mikell
Ecrire en hexa ? tiens tiens ça me rappelle quelque chose
http://www.autoitscript.fr/forum/viewto ... =3&t=10880

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 21:10
par clark17
Ce post résume mon précédent projet qui lui exporter et importer des csv dans un binaire. Du coup pour écrire dans le *.RES je transformais mon string en binaire avec binary. La mon problème c'est que c'est déjà des bits... Du coup je n'ai pas besoin de le transformer, juste lui indiquer que c'est des bits et non du texte.

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : jeu. 27 mars 2014 21:15
par clark17
Du coup en m'inspirant de mon précédent script j'essaye avec ce code:

Code : Tout sélectionner

$text = '03FF1A'

MsgBox(0, "", $text)

$fichier_a_ecrire = FileOpen('test.res', 18)
FileWrite($fichier_a_ecrire, "0x" & $text)
 
La pas de problème le code écrit bien en binaire dans le fichier test.res. Celui-ci est correcte.

Maintenant je fais la même chose dans mon code et la cela ne fonctionne pas:
► Afficher le texte
Avec ce code la il continue à m'interpréter mon string comme du texte...

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : ven. 28 mars 2014 10:28
par jguinch
clark17 : merci d'utiliser la balise Spoiler pour le code. Ca évite d'avoir un ascenseur de 3 kilomètres. :wink:

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : ven. 28 mars 2014 11:39
par clark17
Désolé, je n’avais pas fait attention à ça, c'est corrigé.

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : ven. 28 mars 2014 14:19
par clark17
Ce script va me rendre fou :x

En fait il n'y a que le premier fichier (billionaires.dbf) qui est foireux. Les 4 autres sont correct.

En regardant le contenu de $tableau_recherche[0] il appert effectivement que le contenu est erroné. Cependant je ne comprend pas pourquoi...
► Afficher le texte
Le tableau ligne 0 commence comme ceci:

Code : Tout sélectionner

03100FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD
 
Alors que dans mon fichier CAPMOD.RES le dbf commence comme ça:

Code : Tout sélectionner

03 00 0C 01 09 01
 
Au cas où une âme charitable se sent pour m'aider voici le fichier CAPMOD.RES.

Re: [..] Extraire des ressources d'un fichier *.RES

Posté : ven. 28 mars 2014 15:06
par clark17
Bon j'ai compris pourquoi ça ne fonctionne pas pour le premier.
Dans ma chaine de caractère plus haut ce trouve ces deux bits:

Code : Tout sélectionner

00 31
Du coup le pattern me renvoi a partir d'ici jusqu'au prochain 1a...

La solution que j'ai trouvé c'est d'ajouter un espace tous les 2 caractères afin de les séparer en bits. Et avant d'écrire le fichier je retire les espaces.

Ça donne donc ceci:
► Afficher le texte
Ça fonctionne correctement, toutefois l'ajout d'espace est assez consommateur de ressource processeur. Il doit surement y avoir une solution plus élégante, mais la je sèche.