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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#1

Message 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...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#2

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#3

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message par mikell »

Ecrire en hexa ? tiens tiens ça me rappelle quelque chose
http://www.autoitscript.fr/forum/viewto ... =3&t=10880
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#5

Message 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.
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#6

Message 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...
Modifié en dernier par clark17 le ven. 28 mars 2014 11:38, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#7

Message par jguinch »

clark17 : merci d'utiliser la balise Spoiler pour le code. Ca évite d'avoir un ascenseur de 3 kilomètres. :wink:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#8

Message par clark17 »

Désolé, je n’avais pas fait attention à ça, c'est corrigé.
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#9

Message 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.
clark17
Niveau 4
Niveau 4
Messages : 70
Enregistré le : ven. 23 sept. 2011 02:12
Status : Hors ligne

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

#10

Message 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.
Répondre