#include #include #include #include #include #include #include #include #include #include "const.h" #include "struct.h" #include "global.h" #include "graph.h" #include "boutons.h" #include "palette.h" #include "aide.h" #include "operatio.h" #include "divers.h" #include "erreurs.h" #include "clavier.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 int DriveBits = GetLogicalDrives(); int IndiceLecteur; int IndiceBit; // Sous Windows, on a la totale, presque aussi bien que sous DOS: 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) { // Cas particulier du lecteur ~ if (Drive[NumeroLecteur].Lettre == '~') { char * Home = getenv("HOME"); if (! Home) return -1; #ifdef __linux__ return chdir(Home); #else return ! SetCurrentDirectory(Home); #endif } #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); // Le reste est actuellement une copie du fichier INI par défaut: // Pas besoin ici. fclose(Handle); Section_d_aide_en_cours=0; Position_d_aide_en_cours=0; Pinceau_predefini_Largeur[ 0]= 1; Pinceau_predefini_Hauteur[ 0]= 1; Pinceau_Type [ 0]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 1]= 2; Pinceau_predefini_Hauteur[ 1]= 2; Pinceau_Type [ 1]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 2]= 3; Pinceau_predefini_Hauteur[ 2]= 3; Pinceau_Type [ 2]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 3]= 4; Pinceau_predefini_Hauteur[ 3]= 4; Pinceau_Type [ 3]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 4]= 5; Pinceau_predefini_Hauteur[ 4]= 5; Pinceau_Type [ 4]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 5]= 7; Pinceau_predefini_Hauteur[ 5]= 7; Pinceau_Type [ 5]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 6]= 8; Pinceau_predefini_Hauteur[ 6]= 8; Pinceau_Type [ 6]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 7]=12; Pinceau_predefini_Hauteur[ 7]=12; Pinceau_Type [ 7]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 8]=16; Pinceau_predefini_Hauteur[ 8]=16; Pinceau_Type [ 8]=FORME_PINCEAU_CARRE; Pinceau_predefini_Largeur[ 9]=16; Pinceau_predefini_Hauteur[ 9]=16; Pinceau_Type [ 9]=FORME_PINCEAU_CARRE_TRAME; Pinceau_predefini_Largeur[10]=15; Pinceau_predefini_Hauteur[10]=15; Pinceau_Type [10]=FORME_PINCEAU_LOSANGE; Pinceau_predefini_Largeur[11]= 5; Pinceau_predefini_Hauteur[11]= 5; Pinceau_Type [11]=FORME_PINCEAU_LOSANGE; Pinceau_predefini_Largeur[12]= 3; Pinceau_predefini_Hauteur[12]= 3; Pinceau_Type [12]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[13]= 4; Pinceau_predefini_Hauteur[13]= 4; Pinceau_Type [13]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[14]= 5; Pinceau_predefini_Hauteur[14]= 5; Pinceau_Type [14]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[15]= 6; Pinceau_predefini_Hauteur[15]= 6; Pinceau_Type [15]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[16]= 8; Pinceau_predefini_Hauteur[16]= 8; Pinceau_Type [16]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[17]=10; Pinceau_predefini_Hauteur[17]=10; Pinceau_Type [17]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[18]=12; Pinceau_predefini_Hauteur[18]=12; Pinceau_Type [18]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[19]=14; Pinceau_predefini_Hauteur[19]=14; Pinceau_Type [19]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[20]=16; Pinceau_predefini_Hauteur[20]=16; Pinceau_Type [20]=FORME_PINCEAU_ROND; Pinceau_predefini_Largeur[21]=15; Pinceau_predefini_Hauteur[21]=15; Pinceau_Type [21]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[22]=11; Pinceau_predefini_Hauteur[22]=11; Pinceau_Type [22]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[23]= 5; Pinceau_predefini_Hauteur[23]= 5; Pinceau_Type [23]=FORME_PINCEAU_ROND_TRAME; Pinceau_predefini_Largeur[24]= 2; Pinceau_predefini_Hauteur[24]= 1; Pinceau_Type [24]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[25]= 3; Pinceau_predefini_Hauteur[25]= 1; Pinceau_Type [25]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[26]= 4; Pinceau_predefini_Hauteur[26]= 1; Pinceau_Type [26]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[27]= 8; Pinceau_predefini_Hauteur[27]= 1; Pinceau_Type [27]=FORME_PINCEAU_BARRE_HORIZONTALE; Pinceau_predefini_Largeur[28]= 1; Pinceau_predefini_Hauteur[28]= 2; Pinceau_Type [28]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[29]= 1; Pinceau_predefini_Hauteur[29]= 3; Pinceau_Type [29]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[30]= 1; Pinceau_predefini_Hauteur[30]= 4; Pinceau_Type [30]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[31]= 1; Pinceau_predefini_Hauteur[31]= 8; Pinceau_Type [31]=FORME_PINCEAU_BARRE_VERTICALE; Pinceau_predefini_Largeur[32]= 3; Pinceau_predefini_Hauteur[32]= 3; Pinceau_Type [32]=FORME_PINCEAU_X; Pinceau_predefini_Largeur[33]= 5; Pinceau_predefini_Hauteur[33]= 5; Pinceau_Type [33]=FORME_PINCEAU_X; Pinceau_predefini_Largeur[34]= 5; Pinceau_predefini_Hauteur[34]= 5; Pinceau_Type [34]=FORME_PINCEAU_PLUS; Pinceau_predefini_Largeur[35]=15; Pinceau_predefini_Hauteur[35]=15; Pinceau_Type [35]=FORME_PINCEAU_PLUS; Pinceau_predefini_Largeur[36]= 2; Pinceau_predefini_Hauteur[36]= 2; Pinceau_Type [36]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[37]= 4; Pinceau_predefini_Hauteur[37]= 4; Pinceau_Type [37]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[38]= 8; Pinceau_predefini_Hauteur[38]= 8; Pinceau_Type [38]=FORME_PINCEAU_SLASH; Pinceau_predefini_Largeur[39]= 2; Pinceau_predefini_Hauteur[39]= 2; Pinceau_Type [39]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[40]= 4; Pinceau_predefini_Hauteur[40]= 4; Pinceau_Type [40]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[41]= 8; Pinceau_predefini_Hauteur[41]= 8; Pinceau_Type [41]=FORME_PINCEAU_ANTISLASH; Pinceau_predefini_Largeur[42]= 4; Pinceau_predefini_Hauteur[42]= 4; Pinceau_Type [42]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[43]= 8; Pinceau_predefini_Hauteur[43]= 8; Pinceau_Type [43]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[44]=13; Pinceau_predefini_Hauteur[44]=13; Pinceau_Type [44]=FORME_PINCEAU_ALEATOIRE; Pinceau_predefini_Largeur[45]= 3; Pinceau_predefini_Hauteur[45]= 3; Pinceau_Type [45]=FORME_PINCEAU_DIVERS; Pinceau_predefini_Largeur[46]= 3; Pinceau_predefini_Hauteur[46]= 3; Pinceau_Type [46]=FORME_PINCEAU_DIVERS; Pinceau_predefini_Largeur[47]= 7; Pinceau_predefini_Hauteur[47]= 7; Pinceau_Type [47]=FORME_PINCEAU_DIVERS; 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/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 * 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