#define TAILLE_FICHIER_DATA 84369 // Taille du fichier GFX2.DAT #include #include #include #include #include #include #include #include #include #include "const.h" #include "struct.h" #include "global.h" #include "modesvdo.h" #include "graph.h" #include "boutons.h" #include "palette.h" #include "aide.h" #include "operatio.h" #include "divers.h" #include "erreurs.h" #include "errno.h" #ifndef __linux__ #include "windows.h" #endif // Chercher le répertoire contenant GFX2.EXE void Chercher_repertoire_du_programme(char * Chaine) { #ifdef __WATCOMC__ GetCurrentDirectory(255,Repertoire_du_programme); strcat(Repertoire_du_programme,"\\"); #else puts("Chercher_repertoire_du_programme: implémentation incomplète"); Repertoire_du_programme[0]=0; //On va travailler dans le dossier courant ... #endif } word Drive_Touche[26]= { 0x041E, 0x0430, 0x042E, 0x0420, 0x0412, 0x0421, 0x0422, 0x0423, 0x0417, 0x0424, 0x0425, 0x0426, 0x0432, 0x0431, 0x0418, 0x0419, 0x0410, 0x0413, 0x041F, 0x0414, 0x0416, 0x042F, 0x0411, 0x042D, 0x0415, 0x042C }; // Ajouter un lecteur à la liste de lecteurs void Ajouter_lecteur(byte Numero, char Lettre, byte Type) { Drive[Nb_drives].Lettre=Lettre; Drive[Nb_drives].Type =Type; Drive[Nb_drives].Touche=Drive_Touche[Numero]; Nb_drives++; } // Rechercher la liste et le type des lecteurs de la machine void Rechercher_drives(void) { #ifdef __linux__ //Sous linux, il n'y a pas de lecteurs, on va juste mettre // un disque dur qui pointera vers la racine, // et un autre vers le home directory de l'utilisateur. Ajouter_lecteur(0,'/', LECTEUR_HDD); Ajouter_lecteur(1,'~', LECTEUR_HDD); #else // Sous Windows, on a la totale, presque aussi bien que sous DOS: int DriveBits = GetLogicalDrives(); int IndiceLecteur; int IndiceBit; IndiceLecteur = 0; for (IndiceBit=0; IndiceBit<26 && IndiceLecteur<23; IndiceBit++) { if ( (1 << IndiceBit) & DriveBits ) { // On a ce lecteur, il faut maintenant déterminer son type "physique". // pour profiter des jolies icones de X-man. int TypeLecteur; char CheminLecteur[]="A:\\"; // Cette API Windows est étrange, je dois m'y faire... CheminLecteur[0]='A'+IndiceBit; switch (GetDriveType(CheminLecteur)) { case DRIVE_CDROM: TypeLecteur=LECTEUR_CDROM; break; case DRIVE_REMOTE: TypeLecteur=LECTEUR_NETWORK; break; case DRIVE_REMOVABLE: TypeLecteur=LECTEUR_FLOPPY_3_5; break; case DRIVE_FIXED: TypeLecteur=LECTEUR_HDD; break; default: TypeLecteur=LECTEUR_NETWORK; break; } Ajouter_lecteur(IndiceBit, 'A'+IndiceBit, TypeLecteur); IndiceLecteur++; } } #endif } // Active un lecteur, changeant normalement le répertoire en cours. // Renvoie 0 si ok, -1 si problème. int ActiverLecteur(int NumeroLecteur) { #ifdef __linux__ char NomLecteur[]=" "; NomLecteur[0]=Drive[NumeroLecteur].Lettre; return chdir(NomLecteur); #else char NomLecteur[]="A:\\"; NomLecteur[0]=Drive[NumeroLecteur].Lettre; return ! SetCurrentDirectory(NomLecteur); #endif } // Fonction de décryptage #define DECRYPT_TAILLE_CLE 14 byte Decrypt_compteur=0; const char Decrypt_cle[DECRYPT_TAILLE_CLE]="Sunset Design"; byte Decrypt(byte Octet) { byte Temp; Temp=Octet ^ Decrypt_cle[Decrypt_compteur]; if ((++Decrypt_compteur)>=(DECRYPT_TAILLE_CLE-1)) Decrypt_compteur=0; return Temp; } // Décryptage d'une donnée void Decrypte(byte * Donnee,int Taille) { int Indice; for (Indice=0;Indice>Pos_X)) ? 1 : 0); // Lecture de la fonte alternative if (fread(Fonte_temporaire,1,2048,Handle)!=2048) Erreur(ERREUR_DAT_CORROMPU); for (Indice=0;Indice<256;Indice++) for (Pos_X=0;Pos_X<8;Pos_X++) for (Pos_Y=0;Pos_Y<8;Pos_Y++) Fonte_fun[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); free(Fonte_temporaire); Fonte=Fonte_systeme; // Lecture de la fonte 6x8: (spéciale aide) if (fread(Fonte_help,1,315*6*8,Handle)!=(315*6*8)) Erreur(ERREUR_DAT_CORROMPU); // Lecture des différentes sections de l'aide: // Pour chaque section "Indice" de l'aide: for (Indice=0;Indice>1); Pinceau_predefini_Decalage_Y[Indice]=(Pinceau_predefini_Hauteur[Indice]>>1); } Curseur_Decalage_X[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_Y[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_X[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_X[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_Y[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_X[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_Y[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_X[FORME_CURSEUR_HORIZONTAL]=7; Curseur_Decalage_Y[FORME_CURSEUR_HORIZONTAL]=3; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; } // Initialisation des boutons: // Action factice: void Rien_du_tout(void) {} // Initialiseur d'un bouton: void Initialiser_bouton(byte Numero, word Decalage_X , word Decalage_Y, word Largeur , word Hauteur, byte Forme, fonction_action Gauche , fonction_action Droite, fonction_action Desenclencher, byte Famille) { Bouton[Numero].Decalage_X =Decalage_X; Bouton[Numero].Decalage_Y =Decalage_Y; Bouton[Numero].Largeur =Largeur-1; Bouton[Numero].Hauteur =Hauteur-1; Bouton[Numero].Enfonce =0; Bouton[Numero].Forme =Forme; Bouton[Numero].Gauche =Gauche; Bouton[Numero].Droite =Droite; Bouton[Numero].Desenclencher =Desenclencher; Bouton[Numero].Famille =Famille; } // Initiliseur de tous les boutons: void Initialisation_des_boutons(void) { byte Indice_bouton; for (Indice_bouton=0;Indice_bouton>8) { case 0 : Config_Touche[Ordonnancement[Indice2]&0xFF]=CFG_Infos_touche.Touche; break; case 1 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_gauche = CFG_Infos_touche.Touche; break; case 2 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_droite = CFG_Infos_touche.Touche; break; } } else goto Erreur_lecture_config; } } } else { if (fseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_MODES_VIDEO: // Modes vidéo if ((Chunk.Taille/5/*sizeof(CFG_Mode_video)*/)!=NB_MODES_VIDEO) goto Erreur_lecture_config; for (Indice=1; Indice<=NB_MODES_VIDEO; Indice++) { fread(&(CFG_Mode_video.Etat),1,1,Handle); fread(&(CFG_Mode_video.Largeur),1,2,Handle); if (fread(&(CFG_Mode_video.Hauteur),1,2,Handle)!=2) goto Erreur_lecture_config; else { for (Indice2=0; ( (Indice2>6)) ) ); Indice2++); if (Indice2>8) { case 0 : CFG_Infos_touche.Touche=Config_Touche[Ordonnancement[Indice]&0xFF]; break; case 1 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche; break; case 2 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite; break; } CFG_Infos_touche.Touche2=0x00FF; #if SDL_BYTEORDER == SDL_BIG_ENDIAN CFG_Infos_touche.Touche=bswap_16(CFG_Infos_touche.Touche); CFG_Infos_touche.Touche2=bswap_16(CFG_Infos_touche.Touche2); CFG_Infos_touche.Numero=bswap_16(CFG_Infos_touche.Numero); #endif if (fwrite(&CFG_Infos_touche,1,sizeof(CFG_Infos_touche),Handle)!=sizeof(CFG_Infos_touche)) goto Erreur_sauvegarde_config; } // Sauvegarde de l'état de chaque mode vidéo Chunk.Numero=CHUNK_MODES_VIDEO; Chunk.Taille=NB_MODES_VIDEO*5 /*sizeof(CFG_Mode_video)*/; #if SDL_BYTEORDER == SDL_BIG_ENDIAN //On remet les octets dans l'ordre "normal" Chunk.Taille=bswap_16(Chunk.Taille); #endif if (fwrite(&(Chunk.Numero),1,sizeof(byte),Handle)!=sizeof(byte)||fwrite(&(Chunk.Taille),1,sizeof(word),Handle)!=sizeof(word)) goto Erreur_sauvegarde_config; for (Indice=0; Indice