From b3a0b6619e612da514886af312b733d69dac142d Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Thu, 21 Jun 2018 16:00:37 +0200 Subject: [PATCH 1/6] Added tiles and sprites, creating arenaGUI --- IAEngine.c | 198 ++++----- IAEngine.h | 28 +- arenaEngine.c | 317 ++++++------- arenaEngine.h | 95 ++-- arenaGUI.c | 26 +- arenaGUI.h | 15 +- data/icon_ia.png | Bin 0 -> 1100 bytes data/sprite_ia_1.png | Bin 0 -> 3252 bytes data/sprite_player_1.png | Bin 0 -> 3260 bytes data/tile_gold.png | Bin 0 -> 3192 bytes data/tile_grass.png | Bin 0 -> 3088 bytes data/tile_rock.png | Bin 0 -> 3001 bytes data/tile_tree.png | Bin 0 -> 3090 bytes data/tile_water.png | Bin 0 -> 2943 bytes fileHandler.c | 30 +- fileHandler.h | 12 +- logHelper.c | 152 +++---- logHelper.h | 22 +- main.c | 136 +++--- main.h | 14 + menuGUI.c | 38 +- menuGUI.h | 12 +- playerInterface.c | 936 +++++++++++++++++++-------------------- playerInterface.h | 98 ++-- 24 files changed, 1101 insertions(+), 1028 deletions(-) create mode 100644 data/icon_ia.png create mode 100644 data/sprite_ia_1.png create mode 100644 data/sprite_player_1.png create mode 100644 data/tile_gold.png create mode 100644 data/tile_grass.png create mode 100644 data/tile_rock.png create mode 100644 data/tile_tree.png create mode 100644 data/tile_water.png create mode 100644 main.h diff --git a/IAEngine.c b/IAEngine.c index 4be2cea..45e9772 100644 --- a/IAEngine.c +++ b/IAEngine.c @@ -1,99 +1,99 @@ -/* - * IAEngine.c - * - * Created on: 17 juin 2018 - * Author: isen - * - * Fonction qui va définir le comportement joueur(s) "ordinateur" - */ - -#include "playerInterface.h" -#include "SDL2/SDL.h" -#include -#include -#include - - - -int IAEngine(PLAYER * player1, PLAYER * player2) -{ - char Race[20]; - - //Player 1 est le joueur, player 2 le bot - if((player1 != NULL) & (player2 !=NULL)) - { - //On récupère les positions des 2 joueurs . L'IA sait où est le joueur - int Player1PositionX = player1->PositionX; - int Player1PositionY = player1->PositionY; - - int Player2PositionX = player2->PositionX; - int Player2PositionY = player2->PositionY; - int action; - - action = FindShortestPath(Player1PositionX,Player1PositionY,Player2PositionX,Player2PositionY); - - printf("Tour de l'IA\n"); - if(action == 5) - { - AttackPlayer(player1,player2); - } - else if ((action >= 1) && (action <= 4)) - { - ActionPlayer(player2,action); - } - } - return 0; -} - -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) -{ - int differenceX = abs(Player1PositionX - Player2PositionX); - int differenceY = abs(Player1PositionY - Player2PositionY); - - int action; - - - //Revoir cette partie il faut que les 2 joueurs soit sur la même ligne ou colone avec une différence de ligne ou colonne de 1 - if((abs(Player1PositionX - (Player2PositionX - 1)) == 1) || - (abs(Player1PositionX - (Player2PositionX + 1)) == 1) || - (abs(Player1PositionX - (Player2PositionY - 1)) == 1) || - (abs(Player1PositionX - (Player2PositionY + 1)) == 1)) - { - printf("Les 2 joueur sont à coté\n"); - printf("Le joueur 2 va combattre\n"); - action = 5; - } - - if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) - { - printf("Chemin plus court sur X\n"); - printf("Le joueur 2 va vers la gauche\n"); - action = 4; - } - else if(differenceX > abs(Player1PositionX - (Player2PositionX + 1))) - { - printf("Chemin plus court sur X\n"); - printf("Le joueur 2 va vers la droite\n"); - action = 2; - } - else if(differenceY > abs(Player1PositionY - (Player2PositionY + 1))) - { - printf("Chemin plus court sur Y\n"); - printf("Le joueur 2 va vers le bas\n"); - action = 3; - } - else if(differenceY > abs(Player1PositionY - (Player2PositionY - 1))) - { - printf("Chemin plus court sur Y\n"); - printf("Le joueur 2 va vers le haut\n"); - action = 1; - } - else - { - printf("Chemin plus long\n"); - action = 0; - } - return action; - -} - +/* + * IAEngine.c + * + * Created on: 17 juin 2018 + * Author: isen + * + * Fonction qui va définir le comportement joueur(s) "ordinateur" + */ + +#include "playerInterface.h" +#include "SDL2/SDL.h" +#include +#include +#include + + + +int IAEngine(PLAYER * player1, PLAYER * player2) +{ + char Race[20]; + + //Player 1 est le joueur, player 2 le bot + if((player1 != NULL) & (player2 !=NULL)) + { + //On récupère les positions des 2 joueurs . L'IA sait où est le joueur + int Player1PositionX = player1->PositionX; + int Player1PositionY = player1->PositionY; + + int Player2PositionX = player2->PositionX; + int Player2PositionY = player2->PositionY; + int action; + + action = FindShortestPath(Player1PositionX,Player1PositionY,Player2PositionX,Player2PositionY); + + printf("Tour de l'IA\n"); + if(action == 5) + { + AttackPlayer(player1,player2); + } + else if ((action >= 1) && (action <= 4)) + { + ActionPlayer(player2,action); + } + } + return 0; +} + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) +{ + int differenceX = abs(Player1PositionX - Player2PositionX); + int differenceY = abs(Player1PositionY - Player2PositionY); + + int action; + + + //Revoir cette partie il faut que les 2 joueurs soit sur la même ligne ou colone avec une différence de ligne ou colonne de 1 + if((abs(Player1PositionX - (Player2PositionX - 1)) == 1) || + (abs(Player1PositionX - (Player2PositionX + 1)) == 1) || + (abs(Player1PositionX - (Player2PositionY - 1)) == 1) || + (abs(Player1PositionX - (Player2PositionY + 1)) == 1)) + { + printf("Les 2 joueur sont à coté\n"); + printf("Le joueur 2 va combattre\n"); + action = 5; + } + + if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) + { + printf("Chemin plus court sur X\n"); + printf("Le joueur 2 va vers la gauche\n"); + action = 4; + } + else if(differenceX > abs(Player1PositionX - (Player2PositionX + 1))) + { + printf("Chemin plus court sur X\n"); + printf("Le joueur 2 va vers la droite\n"); + action = 2; + } + else if(differenceY > abs(Player1PositionY - (Player2PositionY + 1))) + { + printf("Chemin plus court sur Y\n"); + printf("Le joueur 2 va vers le bas\n"); + action = 3; + } + else if(differenceY > abs(Player1PositionY - (Player2PositionY - 1))) + { + printf("Chemin plus court sur Y\n"); + printf("Le joueur 2 va vers le haut\n"); + action = 1; + } + else + { + printf("Chemin plus long\n"); + action = 0; + } + return action; + +} + diff --git a/IAEngine.h b/IAEngine.h index 67ec141..f8ba607 100644 --- a/IAEngine.h +++ b/IAEngine.h @@ -1,14 +1,14 @@ -/* - * IAEngine.h - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#ifndef IAENGINE_H_ -#define IAENGINE_H_ - -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); -int IAEngine(PLAYER * player1, PLAYER * player2); - -#endif /* IAENGINE_H_ */ +/* + * IAEngine.h + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#ifndef IAENGINE_H_ +#define IAENGINE_H_ + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); +int IAEngine(PLAYER * player1, PLAYER * player2); + +#endif /* IAENGINE_H_ */ diff --git a/arenaEngine.c b/arenaEngine.c index 04163af..756ed83 100644 --- a/arenaEngine.c +++ b/arenaEngine.c @@ -1,150 +1,167 @@ -#include "arenaEngine.h" -#include -#include -#include "fileHandler.h" -#include "logHelper.h" - - -/* - * Arena generate functions - */ -ARENA_H_TILE* createHTile(ARENA_H_TILE* prevHTile) { - ARENA_H_TILE* tile_h = NULL; - - if (prevHTile == NULL) { - tile_h = calloc(1,sizeof(ARENA_H_TILE)); //Using calloc because of resetting all memory allocated to 0 - tile_h->type_id = 0; - tile_h->playerOnTile = NULL; - tile_h->nextRow = NULL; - tile_h->nextColumn = NULL; - } else if (prevHTile != NULL) { - tile_h = calloc(1,sizeof(ARENA_H_TILE)); - prevHTile->nextRow = tile_h; - tile_h->type_id = 0; - tile_h->playerOnTile = NULL; - tile_h->nextRow = NULL; - tile_h->nextColumn = NULL; - } - - return tile_h; -} - -ARENA_W_TILE* createWTile(ARENA_H_TILE* prevHTile, ARENA_W_TILE* prevWTile) { - ARENA_W_TILE* tile_w = NULL; - - if (prevHTile != NULL && prevWTile == NULL) { - tile_w = calloc(1,sizeof(ARENA_W_TILE)); - prevHTile->nextColumn = tile_w; - tile_w->type_id = 0; - tile_w->playerOnTile = NULL; - tile_w->nextColumn = NULL; - - return tile_w; - } else if (prevHTile == NULL && prevWTile != NULL) { - tile_w = calloc(1,sizeof(ARENA_W_TILE)); - prevWTile->nextColumn = tile_w; - tile_w->type_id = 0; - tile_w->playerOnTile = NULL; - tile_w->nextColumn = NULL; - } - - return NULL; -} - -ARENA_H_TILE* genNewArena(int size_h, int size_w) { - ARENA_H_TILE* arenaOrigin = NULL; - ARENA_H_TILE* TmpCursor_h = NULL; - ARENA_W_TILE* TmpCursor_w = NULL; - int i,j; - - for(i=0;inextColumn; - } - } - - return arenaOrigin; -} - - - -/* - * Arena delete functions - */ -void deleteWTile(ARENA_W_TILE* WTile) { - if (WTile->nextColumn != NULL) { - deleteWTile(WTile->nextColumn); - } - - free(WTile); -} - -void deleteHTile(ARENA_H_TILE* HTile) { - if (HTile->nextRow != NULL) { - deleteHTile(HTile->nextRow); - } - - deleteWTile(HTile->nextColumn); - free(HTile); -} - -void deleteArena(ARENA_H_TILE* arena) { - deleteHTile(arena); -} - - - -/* - * Arena status functions - */ -int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y) { - int type_id = -1; - int i; - - if (coord_y == 0) { - ARENA_H_TILE* tile_h = NULL; - - tile_h = arena; - if (coord_x != 0) { - for (i=0;inextRow; - } - } - - type_id = tile_h->type_id; - } else { - ARENA_W_TILE* tile_w = NULL; - ARENA_H_TILE* tile_h = NULL; - - tile_h = arena; - if (coord_x != 0) { - for (i=0;inextRow; - } - } - - tile_w = tile_h->nextColumn; - if (coord_y != 0) { - for (i=0;inextColumn; - } - } - - type_id = tile_w->type_id; - } - - return type_id; -} +#include +#include +#include "fileHandler.h" +#include "logHelper.h" +#include "main.h" +#include "arenaEngine.h" + + +/* + * Arena generate functions + */ +TILE* createTileList(void) { + TILE* origin = NULL; + + return origin; +} + +ARENA_H_TILE* createHTile(ARENA_H_TILE* prevHTile) { + ARENA_H_TILE* tile_h = NULL; + + if (prevHTile == NULL) { + tile_h = calloc(1,sizeof(ARENA_H_TILE)); //Using calloc because of resetting all memory allocated to 0 + tile_h->type_id = 0; + //tile_h->playerOnTile = NULL; + tile_h->nextRow = NULL; + tile_h->nextColumn = NULL; + } else if (prevHTile != NULL) { + tile_h = calloc(1,sizeof(ARENA_H_TILE)); + prevHTile->nextRow = tile_h; + tile_h->type_id = 0; + //tile_h->playerOnTile = NULL; + tile_h->nextRow = NULL; + tile_h->nextColumn = NULL; + } + + return tile_h; +} + +ARENA_W_TILE* createWTile(ARENA_H_TILE* prevHTile, ARENA_W_TILE* prevWTile) { + ARENA_W_TILE* tile_w = NULL; + + if (prevHTile != NULL && prevWTile == NULL) { + tile_w = calloc(1,sizeof(ARENA_W_TILE)); + prevHTile->nextColumn = tile_w; + tile_w->type_id = 0; + //tile_w->playerOnTile = NULL; + tile_w->nextColumn = NULL; + + return tile_w; + } else if (prevHTile == NULL && prevWTile != NULL) { + tile_w = calloc(1,sizeof(ARENA_W_TILE)); + prevWTile->nextColumn = tile_w; + tile_w->type_id = 0; + //tile_w->playerOnTile = NULL; + tile_w->nextColumn = NULL; + } + + return NULL; +} + +ARENA_H_TILE* genNewArena(int size_h, int size_w) { + ARENA_H_TILE* arenaOrigin = NULL; + ARENA_H_TILE* TmpCursor_h = NULL; + ARENA_W_TILE* TmpCursor_w = NULL; + int i,j; + + for(i=0;inextColumn; + } + } + + return arenaOrigin; +} + + + +/* + * Arena delete functions + */ +void deleteWTile(ARENA_W_TILE* WTile) { + if (WTile->nextColumn != NULL) { + deleteWTile(WTile->nextColumn); + } + + free(WTile); +} + +void deleteHTile(ARENA_H_TILE* HTile) { + if (HTile->nextRow != NULL) { + deleteHTile(HTile->nextRow); + } + + deleteWTile(HTile->nextColumn); + free(HTile); +} + +void deleteArena(ARENA_H_TILE* arena) { + deleteHTile(arena); +} + + + +/* + * Arena status functions + */ +int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y) { + int type_id = -1; + int i; + + if (coord_x > A_WIDTH || coord_y > A_HEIGHT) return -1; + + if (coord_y == 0) { + ARENA_H_TILE* tile_h = NULL; + + tile_h = arena; + if (coord_x != 0) { + for (i=0;inextRow; + } + } + + type_id = tile_h->type_id; + } else { + ARENA_W_TILE* tile_w = NULL; + ARENA_H_TILE* tile_h = NULL; + + tile_h = arena; + if (coord_x != 0) { + for (i=0;inextRow; + } + } + + tile_w = tile_h->nextColumn; + if (coord_y != 0) { + for (i=0;inextColumn; + } + } + + type_id = tile_w->type_id; + } + + return type_id; +} + +int isPlayerAdjacent(PLAYER* p1, PLAYER* p2) { + int adjPlayer = -1; + + if ((p1->PositionX-1 || p1->PositionX+1) == p2->PositionX && (p1->PositionY-1 || p1->PositionY+1) == p2->PositionY) adjPlayer = 1; + + return adjPlayer; +} diff --git a/arenaEngine.h b/arenaEngine.h index 972bcaf..aa569af 100644 --- a/arenaEngine.h +++ b/arenaEngine.h @@ -1,46 +1,49 @@ -#include "playerInterface.h" - -#ifndef ARENAENGINE_H_ -#define ARENAENGINE_H_ - - - -/* -typedef struct items{ - int type_id; - //texture? - int isFlat; - int minedId; - struct items *nextItem; -}ITEMS; -*/ - -typedef struct tileType{ - int type_id; - //texture? - int isGround; - int canBeMined; -}TILE; - -typedef struct arena_h_tile{ //Rows chained list - int type_id; - PLAYER* playerOnTile; - struct arena_h_tile *nextRow; - struct arena_w_tile *nextColumn; -}ARENA_H_TILE; - -typedef struct arena_w_tile{ //Columns chained list - int type_id; - PLAYER* playerOnTile; - struct arena_w_tile *nextColumn; -}ARENA_W_TILE; - - -//Generation functions -ARENA_H_TILE* genNewArena(int size_h, int size_w); -void deleteArena(ARENA_H_TILE* arena); - -//Status functions -int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y); - -#endif +#include "playerInterface.h" +#include + +#ifndef ARENAENGINE_H_ +#define ARENAENGINE_H_ + + + +/* +typedef struct items{ + int type_id; + //texture? + int isFlat; + int minedId; + struct items *nextItem; +}ITEMS; +*/ + +typedef struct tileType{ + int type_id; + SDL_Surface texture; + int isGround; + int canBeMined; + struct tileType *nextTile; +}TILE; + +typedef struct arena_h_tile{ //Rows chained list + int type_id; + //PLAYER* playerOnTile; + struct arena_h_tile *nextRow; + struct arena_w_tile *nextColumn; +}ARENA_H_TILE; + +typedef struct arena_w_tile{ //Columns chained list + int type_id; + //PLAYER* playerOnTile; + struct arena_w_tile *nextColumn; +}ARENA_W_TILE; + + +//Generation functions +TILE* createTileList(void); +ARENA_H_TILE* genNewArena(int size_h, int size_w); +void deleteArena(ARENA_H_TILE* arena); + +//Status functions +int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y); + +#endif diff --git a/arenaGUI.c b/arenaGUI.c index 7382c56..d8f35df 100644 --- a/arenaGUI.c +++ b/arenaGUI.c @@ -1,3 +1,23 @@ -#include -#include -#include "SDL2/SDL.h" +#include +#include +#include "logHelper.h" +#include +#include +#include +#include "arenaGUI.h" + +void displayArena(ARENA_H_TILE* arena, SDL_Window* window, SDL_Surface *res, int size_h, int size_w, int tile_size) { + SDL_Rect tmp_tile_coord; + int i,j; + + for (i=0; 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 literal 0 HcmV?d00001 diff --git a/data/tile_tree.png b/data/tile_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..eab6e466ccd17c323dca4d756b5bc4aac2237864 GIT binary patch literal 3090 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 gxp&2c@AP)!{@U|!Mz-q4 za!H0o1q&{*6BS$ikOLLFFl{C)u>}Q_){)K4uRFU_=jU=?M7A6dKK1}pjvL*Mj!6O2 z4nr-;&r5N%G&RXJa~0Jy44a}12Q+Rj;1HhkH3BYa->+6 zIWP$xS48N!zrKC&`nfihH+ zZwUfc1X>FSEg`{UuW-rF{m%B_^yJq56QLWI1*4{F_0ijx_s)+ER7$)a0Ifk|zC5wB zd+VtC&B^iQ&CP-Orm5D@W(#~vfVbctq>E$C_Vt}7P$=5F>g8yYIiUlSB2o4>xj!ax z;=DQU+Ar@d|9Y=t(X=7G%Wj?>8Ll?eeiB^r4&+M4Y*~cGAtZLAwKr66OYnrqPwI1J zz!K>BeqG|h$6MQf-ak}FQv-C4BSJ{-ysLNC0XRa?Is$pnp;Br2(+5K~D{vqeC)d8b zx6(7?5Mv1qkJvLdN+QXdck!ld{gD*t!oEE}zTG{L zk_pb$deabNwBZD}9t2n5`=`fuyGJIbFw&@LGC6gW<}LfUt3J?AXqoIluFTQ^T40es z0@{McQbFd%`lhXr2LtWs#mUu6->piK$e*^_cTSIPA06IoHaT~molG3;&whCQ-HWqp zTiavpoeSSPdZz4hJSia((nyl$3v-t}VwmWU(h8UmE_onpKusnUXv|cqK$bw?qjf1l z$}x&Ny?*iG%5c6g`}1r5ieC|mFZ}YJ(>G%WR$wtofBWX;`{UV_dYeD*(vkG_ z&Vd-E?sQL8F5=R?)sbTL+Wx)>jVdT+ti5&j$7k9^M(D%@)}Savag;DAG6%TRcJ7kz ztBsZtp#+wI(1~d1%(a7URf7KFp`~};GrH5(C3Azd#*Ndi#E*jx|CNocvBs7mSGdyN z;;*@72yyeQdu{6psXrX&Nbrcj72?i0d5_%}epv6P^NSzfFa7*ZLB=o4*rlurk;uf+(cNcVHIR=K)E_leD#|2d%obR0KYDdO-hQG?WUg=Tjc@O9v`j|q#RQ8U z-kcLyg@-n3hC=D9RtxlC>`S?8UJ;o9$@p--YAjcTE?ng&g|?8`Pw4Yy864qF*?BWI zfeSI#s^i@!gRT1XyVuj_=Nc+CRI1Frf5rJ~yDbey1SfjFmBMDJ*GR1;xD3(MalD`ToS?i_p5-+MCsKI1zBvWKB6-yGmb{4u~D;yXi<2(2O+ zbu4wYz1g3xT$pkLW|U_SOVPLvr?p5*=A}eFYOu07)Yuu_?C2^Rx@t|0B_(Sik%v%b zi;yqEoAnyAwSj8=;*`r!C=a(=95#x13*Np(PtRkw3`-)jg`;A#>$L{~~ip@b) zx*%rbS{KWRtfo-B@U-m*)sb-Z$2oP@eibHW4pUDoEBOzu_q=$l29NW43AnUSUCXe)J5fMVOxR~te&CXX;eGXkt3Dm*<@ zY3Z4&a1{j>L(qIk1t&!)ZD=+|pLZ2Z{=)rLXw^S{vZqaEZ=W4M{OOG>Mvp$(y?S(b zaV5kN(K#WJ8E);3cJ@J-GHz^YnJVO>pk-9}`3nsf>OxOcpWEn<^I@Zz+$XW9!cAou_Ja&V&o`6(IuCO2WqRF?kx+vGn!3WM?9IX`=o2v6L7_x9`O zPqnoT!`6;rXGf7P3hX%OB#fCF$JA_3937ACc4VwZ6M5Fm;xH|6g#j1Yw-N-+*y!!fZxCM6l}tP5B{^o0h;xX~PLH1GcH&FJ1P8*nlt z&RUOeMp(i8`NjFovy;m^JNgPM>Y}dEmL&>`1Y13S^Zc0-O>tL(5|RbE$DD-Yx4IG)Z-;gjRzBMeN@^@anHWW9dR9+NFu+XV8MblJ%22!g=(oRsZd8rM pS -#include -#include - -int resOpen(char* filename, FILE* f) { - char fLoc[128]; - - strcpy(fLoc, "resources/"); - strcat(fLoc, filename); - f = fopen(fLoc, "rb"); - - if (f != NULL) return 0; - - return -1; -} +#include +#include +#include + +int resOpen(char* filename, FILE* f) { + char fLoc[128]; + + strcpy(fLoc, "resources/"); + strcat(fLoc, filename); + f = fopen(fLoc, "rb"); + + if (f != NULL) return 0; + + return -1; +} diff --git a/fileHandler.h b/fileHandler.h index 7dfc698..5c307a7 100644 --- a/fileHandler.h +++ b/fileHandler.h @@ -1,6 +1,6 @@ -#ifndef FILEHANDLER_H_ -#define FILEHANDLER_H_ - -int resOpen(char* filename); - -#endif +#ifndef FILEHANDLER_H_ +#define FILEHANDLER_H_ + +int resOpen(char* filename); + +#endif diff --git a/logHelper.c b/logHelper.c index be3a773..06d1008 100644 --- a/logHelper.c +++ b/logHelper.c @@ -1,76 +1,76 @@ -#include -#include -#include -#include -#include "logHelper.h" - -FILE *log_file=NULL; - -int initialise_logger(){ - time_t raw_time; - struct tm *pdh; - time(&raw_time); - pdh = localtime(&raw_time); - char name[32]; - sprintf(name, "%04d-%02d-%02d.log", pdh->tm_year+1900, pdh->tm_mon+1, pdh->tm_mday); - log_file=fopen(name, "a"); - - if(log_file==NULL) //fichier innexistant - { - log_file=fopen(name,"w+"); - - if(log_file==NULL) { //Le prog n'a pas les droits en écriture - printf("\n****************************************************************\nATTENTION ! Le fichier de log ne peut être écris, aucune info ne sera enregistré !\n****************************************************************\n"); - return -1; - } - } - - return 0; -} - -void stop_logger() {fclose(log_file);} - -void addLogInfo(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[INFO][%s] %s\n", buffer, mess); - - stop_logger(); -} - -void addLogWarn(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[WARN][%s] %s\n", buffer, mess); - - stop_logger(); -} - -void addLogCritical(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[CRITICAL][%s] %s\n", buffer, mess); - - stop_logger(); -} +#include +#include +#include +#include +#include "logHelper.h" + +FILE *log_file=NULL; + +int initialise_logger(){ + time_t raw_time; + struct tm *pdh; + time(&raw_time); + pdh = localtime(&raw_time); + char name[32]; + sprintf(name, "%04d-%02d-%02d.log", pdh->tm_year+1900, pdh->tm_mon+1, pdh->tm_mday); + log_file=fopen(name, "a"); + + if(log_file==NULL) //fichier innexistant + { + log_file=fopen(name,"w+"); + + if(log_file==NULL) { //Le prog n'a pas les droits en écriture + printf("\n****************************************************************\nATTENTION ! Le fichier de log ne peut être écris, aucune info ne sera enregistré !\n****************************************************************\n"); + return -1; + } + } + + return 0; +} + +void stop_logger() {fclose(log_file);} + +void addLogInfo(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[INFO][%s] %s\n", buffer, mess); + + stop_logger(); +} + +void addLogWarn(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[WARN][%s] %s\n", buffer, mess); + + stop_logger(); +} + +void addLogCritical(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[CRITICAL][%s] %s\n", buffer, mess); + + stop_logger(); +} diff --git a/logHelper.h b/logHelper.h index 7b574b8..5da67ec 100644 --- a/logHelper.h +++ b/logHelper.h @@ -1,11 +1,11 @@ -#ifndef LOGGER_H_ -#define LOGGER_H_ - -int initialise_logger(); //Prépare le logger à écrire dans les fichiers de logs -void stop_logger(); - -void addLogInfo(char *mess); //Ajoute une entrée dans le fichier de log de type INFO -void addLogWarn(char *mess); -void addLogCritical(char *mess); //Ajoute une entrée dans le fichier de log de type CRITICAL - -#endif +#ifndef LOGGER_H_ +#define LOGGER_H_ + +int initialise_logger(); //Prépare le logger à écrire dans les fichiers de logs +void stop_logger(); + +void addLogInfo(char *mess); //Ajoute une entrée dans le fichier de log de type INFO +void addLogWarn(char *mess); +void addLogCritical(char *mess); //Ajoute une entrée dans le fichier de log de type CRITICAL + +#endif diff --git a/main.c b/main.c index 24ccd94..1d2a9cf 100644 --- a/main.c +++ b/main.c @@ -1,60 +1,76 @@ -/* - * main.c - * - * Created on: 17 juin 2018 - * Author: isen - */ - -//#include "IAEngine.h" -#include "playerInterface.h" -#include "SDL2/SDL.h" -#include -#include -#include "logHelper.h" -#include -#include -#include -#include "arenaEngine.h" - -#define A_HEIGHT 100 -#define A_WIDTH 100 - -void initDisplayLib() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - addLogCritical("Init SDL libs failed !"); - - exit(EXIT_FAILURE); - } -} - -void initResources() { - //resOpen(); -} - -int main(int argc, char *argv[]) { - ARENA_H_TILE* arena = NULL; - - // Création de la fenêtre - SDL_Window* pWindow = NULL; - pWindow = SDL_CreateWindow("Arena Survival Tournament",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,640,480,SDL_WINDOW_SHOWN); - - addLogInfo("Starting game..."); - initDisplayLib(); - initResources(); - - addLogInfo("Creating new arena..."); - arena = genNewArena(A_HEIGHT, A_WIDTH); - if (arena == NULL) { - addLogCritical("Error with arena generator !"); - exit(EXIT_FAILURE); - } - addLogInfo("Successfully created arena."); - - deleteArena(arena); - addLogInfo("Cleared arena."); - - - - return EXIT_SUCCESS; -} - +#include "main.h" +#include +#include +#include "logHelper.h" +#include +#include +#include +//#include +//#include +#include "arenaEngine.h" +#include "arenaGUI.h" +//#include "IAEngine.h" +#include "playerInterface.h" + + +void initDisplayLib() { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + addLogCritical("Init SDL libs failed !"); + + exit(EXIT_FAILURE); + } +} + +int main(int argc, char *argv[]) { + addLogInfo("Starting game..."); + addLogInfo("Try init SDL libs..."); + initDisplayLib(); + + addLogInfo("Load ressources in memory..."); + SDL_Surface *tile_grass = NULL, *tile_rock = NULL, *tile_tree = NULL, *tile_water = NULL, *sprite_player_act = NULL, *sprite_ia_act = NULL; + SDL_Surface *ressource[6] = {tile_grass, tile_rock, tile_tree, tile_water, sprite_player_act, sprite_ia_act}; + SDL_Surface *sprite_player[4] = {NULL}, *sprite_ia[4] = {NULL}; + tile_grass = IMG_Load("data/tile_grass.png"); + tile_rock = IMG_Load("data/tile_rock.png"); + tile_tree = IMG_Load("data/tile_tree.png"); + tile_water = IMG_Load("data/tile_water.png"); + + sprite_player[DOWN] = IMG_Load("data/sprite_player_1.png"); + //sprite_player[UP] = IMG_Load("data/sprite_player_2.png"); + //sprite_player[LEFT] = IMG_Load("data/sprite_player_3.png"); + //sprite_player[RIGHT] = IMG_Load("data/sprite_player_4.png"); + + sprite_ia[DOWN] = IMG_Load("data/sprite_ia_1.png"); + //sprite_ia[UP] = IMG_Load("data/sprite_ia_2.png"); + //sprite_ia[LEFT] = IMG_Load("data/sprite_ia_3.png"); + //sprite_ia[RIGHT] = IMG_Load("data/sprite_ia_4.png"); + + addLogInfo("Create SDL windows instance..."); + SDL_Window* gameWindows = SDL_CreateWindow("Arena Survival Tournament - alpha 0.2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOWS_WIDTH, WINDOWS_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); + + addLogInfo("Creating new arena..."); + ARENA_H_TILE* arena = NULL; + arena = genNewArena(A_HEIGHT, A_WIDTH); + if (arena == NULL) { + addLogCritical("Error with arena generator !"); + exit(EXIT_FAILURE); + } + addLogInfo("Successfully created arena."); + + addLogInfo("Display arena GUI..."); + sprite_player_act = sprite_player[DOWN]; + sprite_ia_act = sprite_ia[DOWN]; + displayArena(arena, gameWindows, tile_grass, A_HEIGHT, A_WIDTH, TILE_SIZE); + + + + + deleteArena(arena); + addLogInfo("Cleared arena."); + + SDL_Delay(5000); + addLogInfo("Unload SDL libs..."); + SDL_Quit(); + return EXIT_SUCCESS; +} + diff --git a/main.h b/main.h new file mode 100644 index 0000000..4fbb585 --- /dev/null +++ b/main.h @@ -0,0 +1,14 @@ +#ifndef MAIN_H_ +#define MAIN_H_ + +#define A_WIDTH 20 +#define A_HEIGHT 20 + +#define TILE_SIZE 32 +#define WINDOWS_WIDTH TILE_SIZE * A_WIDTH +#define WINDOWS_HEIGHT TILE_SIZE * A_HEIGHT + +enum {DOWN, UP, LEFT, RIGHT}; +enum {GRASS_T, ROCK_T, TREE_T, WATER_T, PLAYER_S, IA_S}; + +#endif diff --git a/menuGUI.c b/menuGUI.c index 52beb08..f40249e 100644 --- a/menuGUI.c +++ b/menuGUI.c @@ -1,19 +1,19 @@ -#include -#include -#include - -int createGameMenuWindows() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - printf("Erreur chargement librairie SDL ! %s\n",SDL_GetError()); - exit(EXIT_FAILURE); - } - - SDL_Window *main_test; - main_test = SDL_CreateWindow("My test windows", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 140, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); - SDL_Delay(5000); - SDL_DestroyWindow(main_test); - - SDL_Quit(); - return EXIT_SUCCESS; -} - +#include +#include +#include + +int createGameMenuWindows() { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + printf("Erreur chargement librairie SDL ! %s\n",SDL_GetError()); + exit(EXIT_FAILURE); + } + + SDL_Window *main_test; + main_test = SDL_CreateWindow("My test windows", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 140, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); + SDL_Delay(5000); + SDL_DestroyWindow(main_test); + + SDL_Quit(); + return EXIT_SUCCESS; +} + diff --git a/menuGUI.h b/menuGUI.h index cf4bccb..2ac4eaa 100644 --- a/menuGUI.h +++ b/menuGUI.h @@ -1,6 +1,6 @@ -#ifndef MENUGUI_H_ -#define MENUGUI_H_ - - - -#endif +#ifndef MENUGUI_H_ +#define MENUGUI_H_ + + + +#endif diff --git a/playerInterface.c b/playerInterface.c index 690b5ab..4914a15 100644 --- a/playerInterface.c +++ b/playerInterface.c @@ -1,468 +1,468 @@ -/* - * playerInterface.c - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#include "playerInterface.h" - -#include "SDL2/SDL.h" -#include -#include - - -#define ArenaMAX 100 - -int PlayerInterface(void) -{ - - PLAYER* List=NULL; - PLAYER* Element=NULL; - int id=0; - int numberAlive; - - PLAYER* player1=NULL; - PLAYER* player2=NULL; - - while(id<2) - { - id = id + 1; - Element = createPlayer(id); - List = insertRightPlaceRecursive(List,Element); - } - - displayList(List); - - player1 = SearchPlayer(List, 1); - player2 = SearchPlayer(List, 2); - - printf("Nom player 1 : %s\n",player1->Name); - printf("Nom player 2 : %s\n",player2->Name); - - numberAlive = NumberPlayerAlive(List); - printf("Nombre de joueur en vie : %i",numberAlive); - - - int action; - - - do - { - action=getEvent(); - - if(action == 1) - { - ActionPlayer(player1,1); //Déplacement vers le haut - } - else if(action == 2) - { - ActionPlayer(player1,2); //Déplacement vers la droite - } - else if(action == 3) - { - ActionPlayer(player1,3); //Déplacement vers le bas - } - else if(action == 4) - { - ActionPlayer(player1,4); //Déplacement vers la gauche - } - else if(action == 5) - { - //Regarder le perso en face, le plus près - AttackPlayer(player1,player2); //Voir quel player on choisit d'attaquer - } - - - //Tour de l'IA - IAEngine(player1,player2); - - } - - while(action != -1); - - return -1; - - //return 0; -} - - -int getEvent() -{ - int action; - SDL_Event event; - SDL_WaitEvent(&event); /* Récupération de l'événement dans event */ - - switch(event.type) /* Test du type d'événement */ - { - /* Si c'est un événement de type "Quitter" */ - case SDL_QUIT : printf("QUITTER\n"); - action = -1; - break; - case SDL_KEYUP: - switch(event.key.keysym.sym) //La valeur de touche - { - case SDLK_UP: printf("FLECHE DU HAUT\n"); - action = 1; - break; - case SDLK_DOWN: printf("FLECHE DU BAS\n"); - action = 3; - break; - case SDLK_RIGHT: printf("FLECHE DE DROITE\n"); - action = 2; - break; - case SDLK_LEFT: printf("FLECHE DE GAUCHE\n"); - action = 4; - break; - case SDLK_SPACE:printf("BARRE D'ESPACE\n"); - action = 5; - } - break; - } - return action; -} - - - - - - - -/* - - - ActionPlayer(player2,1); //Déplacement vers le haut - ActionPlayer(player2,2); //Déplacement vers la droite - ActionPlayer(player2,3); //Déplacement vers le bas - ActionPlayer(player2,4); //Déplacement vers la gauche - -*/ - - - //freeElement(List, 2); // Fonctionne - //freeList(List); // Fonctionne - - //displayList(List); - - /** Pour la simulation d'un combat, on rentre la lettre A au clavier - * Le joueur 1 va attaqué le joueur 2 et inversement - * On affiche le score des joueurs - * - * */ - //List = AttackPlayer(List, 1, 2); - -// SDL_Quit(); - - -/**Fonction qui crée un joueur - * - * */ -PLAYER* createPlayer(int Id) -{ - PLAYER* player=NULL; - //Utilisé la fonction de récupération de la taille de l'arène - - player=(PLAYER*)malloc(sizeof(PLAYER)); - if(player==NULL) - { - printf("ERREUR Allocation joueur "); - } - - printf("Entrer le nom du joueur\n"); - scanf("%s",player->Name); - printf("Nb PV?\n"); - scanf("%d",&player->HealthPoints); - player->Id = Id; - player->AttacksPoints = 10; - - if(Id == 1) - { - player->PositionX=0; - player->PositionY=0; - } - else if(Id ==2) - { - player->PositionX=ArenaMAX; - player->PositionY=0; - } - else if(Id ==3) - { - player->PositionX=0; - player->PositionY=ArenaMAX; - } - else - { - player->PositionX=ArenaMAX; - player->PositionY=ArenaMAX; - } - - player->suiv=NULL; - - return player; -} - -/**Fonction qui ajoute un joueur à la liste - * - * */ - -PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element) -{ - if(Head == NULL) - { - return Element; - } - - if(Element->Id < Head->Id) - { - Element->suiv = Head; - return Element; - } - else - { - if(Element->Id == Head->Id) - { - printf("Le joueur à l'id %d exite déja dans la liste\n",Element->Id); - free(Element); - return Head; - } - else - { - Head->suiv = insertRightPlaceRecursive(Head->suiv,Element); - return Head; - } - } -} - -void displayList(PLAYER * Head) -{ - if(Head == NULL) - { - printf("La liste est vide\n"); - } - while(Head != NULL) - { - printf("****Player %d****\n",Head->Id); - printf("Nom : %s\n",Head->Name); - Head = Head->suiv; - } -} - - -PLAYER * freeElement(PLAYER *Head, int Id) -{ - PLAYER * Element; - - if(Head == NULL) - { - printf("La liste est vide\n"); - } - - if(Id == Head->Id) - { - Element = Head; - Head = Head->suiv; - printf("Le joueur %d a été supprimé de la liste\n",Element->Id); - free(Element); - return Head; - } - else - { - Head->suiv = freeElement(Head->suiv,Id); - return Head; - } -} - - -PLAYER * freeList(PLAYER *Head) -{ - if(Head != NULL) - { - freeList(Head->suiv); - - } - free(Head); - Head=NULL; - - return Head; -} - -int NumberPlayerAlive(PLAYER *Head) -{ - int numberAlive=0; - if(Head == NULL) - { - printf("La liste est vide\n"); - return -1; - } - else - { - do - { - if(Head->HealthPoints > 0) - { - numberAlive = numberAlive + 1; - } - Head=Head->suiv; - } - while(Head != NULL); - return numberAlive; - } -} - -PLAYER * SearchPlayer(PLAYER *Head, int idPlayer) -{ - printf("Fonction Recherche\n"); - - if(Head == NULL) - { - printf("La liste est vide\n"); - } - - if(Head->Id == idPlayer) - { - printf("Trouvé\n"); - - printf(" Joueur %s\n",Head->Name); - return Head; - } - else - { - Head->suiv = SearchPlayer(Head->suiv,idPlayer); - - return Head->suiv; - } -} - - -void AttackPlayer( PLAYER *player1, PLAYER *player2) -{ - printf("Fonction Attaque\n"); - - - if((player1 != NULL) && (player2 != NULL)) - { - - while((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) - { - printf("\n\n** Tour **\n"); - - printf("Attaque Joueur %d sur joueur %d \n",player1->Id,player2->Id); - - player2->HealthPoints = player2->HealthPoints - player1->AttacksPoints; - - printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); - printf("Joueur %d : %s PV = %d\n ",player2->Id,player2->Name,player2->HealthPoints); - - if((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) - { - printf("\nAttaque Joueur %d sur joueur %d\n ",player2->Id,player1->Id); - player1->HealthPoints = player1->HealthPoints - player2->AttacksPoints; - - printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); - printf("Joueur %d : %s PV = %d \n",player2->Id,player2->Name,player2->HealthPoints); - } - } - - if(player1->HealthPoints > player2->HealthPoints) - { - printf("Combat finie \n Le joueur 1 a gagné le combat\n"); - } - else if(player1->HealthPoints < player2->HealthPoints) - { - printf("Combat finie \n Le joueur 2 a gagné le combat\n"); - } - else - { - printf("Combat finie \n Les 2 joueurs sont morts"); - } - } -} - - -void ActionPlayer(PLAYER * player, int action) -{ - /* action = 1 --> Déplacement d'1 carreau vers le haut - * action = 2 --> Déplacement d'1 carreau vers la droite - * action = 3 --> Déplacement d'1 carreau vers le bas - * action = 4 --> Déplacement d'1 carreau vers la gauche - * - * */ - - if(player != NULL) - { - // récupère la position du personnage. La position de l'instance sur l'arène est récupérer par une fonction - int positionX = player->PositionX; - int positionY = player->PositionY; - - - - printf("\n**** Player %s ****",player->Name); - - if(action == 1) - { - printf("On veut aller vers le haut\n"); - - if(positionY-1 >= 0) - { - player->PositionY = positionY-1; - printf("Déplacement de 1 vers le haut\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers le haut\n"); - } - } - else if(action == 2) - { - printf("On veut aller vers la droite\n"); - - if(positionX + 1 <= ArenaMAX) - { - player->PositionX = positionX + 1; - printf("Déplacement de 1 vers la droite\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers la droite\n"); - } - } - else if(action == 3) - { - printf("On veut aller vers le bas\n"); - - if(positionY + 1 <= ArenaMAX) - { - player->PositionY = positionY + 1; - printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers le bas\n"); - } - } - else if(action == 4) - { - printf("On veut aller vers la gauche\n"); - - if(positionX - 1 >= 0) - { - player->PositionX = positionX - 1; - printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers la gauche\n"); - } - } - else - { - printf("Autre action\n"); - } - } - else - { - printf("Echec, le joueur est NULL\n"); - } -} - - +/* + * playerInterface.c + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#include "playerInterface.h" + +#include "SDL2/SDL.h" +#include +#include + + +#define ArenaMAX 100 + +int PlayerInterface(void) +{ + + PLAYER* List=NULL; + PLAYER* Element=NULL; + int id=0; + int numberAlive; + + PLAYER* player1=NULL; + PLAYER* player2=NULL; + + while(id<2) + { + id = id + 1; + Element = createPlayer(id); + List = insertRightPlaceRecursive(List,Element); + } + + displayList(List); + + player1 = SearchPlayer(List, 1); + player2 = SearchPlayer(List, 2); + + printf("Nom player 1 : %s\n",player1->Name); + printf("Nom player 2 : %s\n",player2->Name); + + numberAlive = NumberPlayerAlive(List); + printf("Nombre de joueur en vie : %i",numberAlive); + + + int action; + + + do + { + action=getEvent(); + + if(action == 1) + { + ActionPlayer(player1,1); //Déplacement vers le haut + } + else if(action == 2) + { + ActionPlayer(player1,2); //Déplacement vers la droite + } + else if(action == 3) + { + ActionPlayer(player1,3); //Déplacement vers le bas + } + else if(action == 4) + { + ActionPlayer(player1,4); //Déplacement vers la gauche + } + else if(action == 5) + { + //Regarder le perso en face, le plus près + AttackPlayer(player1,player2); //Voir quel player on choisit d'attaquer + } + + + //Tour de l'IA + IAEngine(player1,player2); + + } + + while(action != -1); + + return -1; + + //return 0; +} + + +int getEvent() +{ + int action; + SDL_Event event; + SDL_WaitEvent(&event); /* Récupération de l'événement dans event */ + + switch(event.type) /* Test du type d'événement */ + { + /* Si c'est un événement de type "Quitter" */ + case SDL_QUIT : printf("QUITTER\n"); + action = -1; + break; + case SDL_KEYUP: + switch(event.key.keysym.sym) //La valeur de touche + { + case SDLK_UP: printf("FLECHE DU HAUT\n"); + action = 1; + break; + case SDLK_DOWN: printf("FLECHE DU BAS\n"); + action = 3; + break; + case SDLK_RIGHT: printf("FLECHE DE DROITE\n"); + action = 2; + break; + case SDLK_LEFT: printf("FLECHE DE GAUCHE\n"); + action = 4; + break; + case SDLK_SPACE:printf("BARRE D'ESPACE\n"); + action = 5; + } + break; + } + return action; +} + + + + + + + +/* + + + ActionPlayer(player2,1); //Déplacement vers le haut + ActionPlayer(player2,2); //Déplacement vers la droite + ActionPlayer(player2,3); //Déplacement vers le bas + ActionPlayer(player2,4); //Déplacement vers la gauche + +*/ + + + //freeElement(List, 2); // Fonctionne + //freeList(List); // Fonctionne + + //displayList(List); + + /** Pour la simulation d'un combat, on rentre la lettre A au clavier + * Le joueur 1 va attaqué le joueur 2 et inversement + * On affiche le score des joueurs + * + * */ + //List = AttackPlayer(List, 1, 2); + +// SDL_Quit(); + + +/**Fonction qui crée un joueur + * + * */ +PLAYER* createPlayer(int Id) +{ + PLAYER* player=NULL; + //Utilisé la fonction de récupération de la taille de l'arène + + player=(PLAYER*)malloc(sizeof(PLAYER)); + if(player==NULL) + { + printf("ERREUR Allocation joueur "); + } + + printf("Entrer le nom du joueur\n"); + scanf("%s",player->Name); + printf("Nb PV?\n"); + scanf("%d",&player->HealthPoints); + player->Id = Id; + player->AttacksPoints = 10; + + if(Id == 1) + { + player->PositionX=0; + player->PositionY=0; + } + else if(Id ==2) + { + player->PositionX=ArenaMAX; + player->PositionY=0; + } + else if(Id ==3) + { + player->PositionX=0; + player->PositionY=ArenaMAX; + } + else + { + player->PositionX=ArenaMAX; + player->PositionY=ArenaMAX; + } + + player->suiv=NULL; + + return player; +} + +/**Fonction qui ajoute un joueur à la liste + * + * */ + +PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element) +{ + if(Head == NULL) + { + return Element; + } + + if(Element->Id < Head->Id) + { + Element->suiv = Head; + return Element; + } + else + { + if(Element->Id == Head->Id) + { + printf("Le joueur à l'id %d exite déja dans la liste\n",Element->Id); + free(Element); + return Head; + } + else + { + Head->suiv = insertRightPlaceRecursive(Head->suiv,Element); + return Head; + } + } +} + +void displayList(PLAYER * Head) +{ + if(Head == NULL) + { + printf("La liste est vide\n"); + } + while(Head != NULL) + { + printf("****Player %d****\n",Head->Id); + printf("Nom : %s\n",Head->Name); + Head = Head->suiv; + } +} + + +PLAYER * freeElement(PLAYER *Head, int Id) +{ + PLAYER * Element; + + if(Head == NULL) + { + printf("La liste est vide\n"); + } + + if(Id == Head->Id) + { + Element = Head; + Head = Head->suiv; + printf("Le joueur %d a été supprimé de la liste\n",Element->Id); + free(Element); + return Head; + } + else + { + Head->suiv = freeElement(Head->suiv,Id); + return Head; + } +} + + +PLAYER * freeList(PLAYER *Head) +{ + if(Head != NULL) + { + freeList(Head->suiv); + + } + free(Head); + Head=NULL; + + return Head; +} + +int NumberPlayerAlive(PLAYER *Head) +{ + int numberAlive=0; + if(Head == NULL) + { + printf("La liste est vide\n"); + return -1; + } + else + { + do + { + if(Head->HealthPoints > 0) + { + numberAlive = numberAlive + 1; + } + Head=Head->suiv; + } + while(Head != NULL); + return numberAlive; + } +} + +PLAYER * SearchPlayer(PLAYER *Head, int idPlayer) +{ + printf("Fonction Recherche\n"); + + if(Head == NULL) + { + printf("La liste est vide\n"); + } + + if(Head->Id == idPlayer) + { + printf("Trouvé\n"); + + printf(" Joueur %s\n",Head->Name); + return Head; + } + else + { + Head->suiv = SearchPlayer(Head->suiv,idPlayer); + + return Head->suiv; + } +} + + +void AttackPlayer( PLAYER *player1, PLAYER *player2) +{ + printf("Fonction Attaque\n"); + + + if((player1 != NULL) && (player2 != NULL)) + { + + while((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) + { + printf("\n\n** Tour **\n"); + + printf("Attaque Joueur %d sur joueur %d \n",player1->Id,player2->Id); + + player2->HealthPoints = player2->HealthPoints - player1->AttacksPoints; + + printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); + printf("Joueur %d : %s PV = %d\n ",player2->Id,player2->Name,player2->HealthPoints); + + if((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) + { + printf("\nAttaque Joueur %d sur joueur %d\n ",player2->Id,player1->Id); + player1->HealthPoints = player1->HealthPoints - player2->AttacksPoints; + + printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); + printf("Joueur %d : %s PV = %d \n",player2->Id,player2->Name,player2->HealthPoints); + } + } + + if(player1->HealthPoints > player2->HealthPoints) + { + printf("Combat finie \n Le joueur 1 a gagné le combat\n"); + } + else if(player1->HealthPoints < player2->HealthPoints) + { + printf("Combat finie \n Le joueur 2 a gagné le combat\n"); + } + else + { + printf("Combat finie \n Les 2 joueurs sont morts"); + } + } +} + + +void ActionPlayer(PLAYER * player, int action) +{ + /* action = 1 --> Déplacement d'1 carreau vers le haut + * action = 2 --> Déplacement d'1 carreau vers la droite + * action = 3 --> Déplacement d'1 carreau vers le bas + * action = 4 --> Déplacement d'1 carreau vers la gauche + * + * */ + + if(player != NULL) + { + // récupère la position du personnage. La position de l'instance sur l'arène est récupérer par une fonction + int positionX = player->PositionX; + int positionY = player->PositionY; + + + + printf("\n**** Player %s ****",player->Name); + + if(action == 1) + { + printf("On veut aller vers le haut\n"); + + if(positionY-1 >= 0) + { + player->PositionY = positionY-1; + printf("Déplacement de 1 vers le haut\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers le haut\n"); + } + } + else if(action == 2) + { + printf("On veut aller vers la droite\n"); + + if(positionX + 1 <= ArenaMAX) + { + player->PositionX = positionX + 1; + printf("Déplacement de 1 vers la droite\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers la droite\n"); + } + } + else if(action == 3) + { + printf("On veut aller vers le bas\n"); + + if(positionY + 1 <= ArenaMAX) + { + player->PositionY = positionY + 1; + printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers le bas\n"); + } + } + else if(action == 4) + { + printf("On veut aller vers la gauche\n"); + + if(positionX - 1 >= 0) + { + player->PositionX = positionX - 1; + printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers la gauche\n"); + } + } + else + { + printf("Autre action\n"); + } + } + else + { + printf("Echec, le joueur est NULL\n"); + } +} + + diff --git a/playerInterface.h b/playerInterface.h index 5003f1e..c2b8bb1 100644 --- a/playerInterface.h +++ b/playerInterface.h @@ -1,49 +1,49 @@ -/* - * playerInterface.h - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#ifndef PLAYERINTERFACE_H_ -#define PLAYERINTERFACE_H_ - -/** Structure d'un joueur (IA ou utilisateur) - * - * */ -typedef struct Player -{ - int Id; - char Name[35]; - char Race[20]; - - int HealthPoints; - int AttacksPoints; - int DefensePoints; - - int PositionX; - int PositionY; - //char Weapons[Max_Weapons]; - - //int Coins; - - struct Player * suiv; - -}PLAYER; - -//Prototypes - -PLAYER* createPlayer(int Id); -PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element); -void displayList(PLAYER * Head); -PLAYER * freeElement(PLAYER *Head, int Id); -PLAYER * freeList(PLAYER *Head); - -PLAYER * SearchPlayer(PLAYER *Head, int idPlayer); -void AttackPlayer( PLAYER *player1, PLAYER *player2); -void ActionPlayer(PLAYER * player, int action); - -int NumberPlayerAlive(PLAYER *Head); -int getEvent(void); - -#endif /* PLAYERINTERFACE_H_ */ +/* + * playerInterface.h + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#ifndef PLAYERINTERFACE_H_ +#define PLAYERINTERFACE_H_ + +/** Structure d'un joueur (IA ou utilisateur) + * + * */ +typedef struct Player +{ + int Id; + char Name[35]; + char Race[20]; + + int HealthPoints; + int AttacksPoints; + int DefensePoints; + + int PositionX; + int PositionY; + //char Weapons[Max_Weapons]; + + //int Coins; + + struct Player * suiv; + +}PLAYER; + +//Prototypes + +PLAYER* createPlayer(int Id); +PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element); +void displayList(PLAYER * Head); +PLAYER * freeElement(PLAYER *Head, int Id); +PLAYER * freeList(PLAYER *Head); + +PLAYER * SearchPlayer(PLAYER *Head, int idPlayer); +void AttackPlayer( PLAYER *player1, PLAYER *player2); +void ActionPlayer(PLAYER * player, int action); + +int NumberPlayerAlive(PLAYER *Head); +int getEvent(void); + +#endif /* PLAYERINTERFACE_H_ */ From 2566ef569c5a1bd8efbfe9b34c27ef141674b18b Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Thu, 21 Jun 2018 20:27:58 +0200 Subject: [PATCH 2/6] Random gen arena prototype --- .gitignore | 3 + ArenaSurvivalTournament.doxyfile | 2492 ++++++++++++++++++++++++++++++ IAEngine.c | 14 +- arenaEngine.c | 143 +- arenaEngine.h | 33 +- arenaGUI.c | 17 +- arenaGUI.h | 3 +- data/sprite_ia_0.png | Bin 0 -> 3252 bytes data/sprite_ia_1.png | Bin 3252 -> 3018 bytes data/sprite_ia_2.png | Bin 0 -> 2968 bytes data/sprite_ia_3.png | Bin 0 -> 2947 bytes data/sprite_player_0.png | Bin 0 -> 3260 bytes data/sprite_player_1.png | Bin 3260 -> 3370 bytes data/sprite_player_2.png | Bin 0 -> 2893 bytes data/sprite_player_3.png | Bin 0 -> 2907 bytes main.c | 26 +- main.h | 7 +- playerInterface.c | 11 +- playerInterface.h | 32 +- 19 files changed, 2708 insertions(+), 73 deletions(-) create mode 100644 ArenaSurvivalTournament.doxyfile create mode 100644 data/sprite_ia_0.png create mode 100644 data/sprite_ia_2.png create mode 100644 data/sprite_ia_3.png create mode 100644 data/sprite_player_0.png create mode 100644 data/sprite_player_2.png create mode 100644 data/sprite_player_3.png diff --git a/.gitignore b/.gitignore index c6127b3..ffcc4e0 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,9 @@ *.su *.idb *.pdb +docs\ +latex\ +html\ # Kernel Module Compile Results *.mod* diff --git a/ArenaSurvivalTournament.doxyfile b/ArenaSurvivalTournament.doxyfile new file mode 100644 index 0000000..f269e9b --- /dev/null +++ b/ArenaSurvivalTournament.doxyfile @@ -0,0 +1,2492 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = ArenaSurvivalTournament + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = alpha0.2 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = . + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /